1
0
mirror of https://github.com/mgechev/revive.git synced 2025-04-15 11:36:48 +02:00
revive/fixtures/cognitive-complexity.go

219 lines
4.3 KiB
Go
Raw Normal View History

2019-12-14 08:27:06 +01:00
// Test of cognitive complexity.
// Package pkg ...
package pkg
import (
"fmt"
ast "go/ast"
"log"
)
2019-12-14 09:01:22 +01:00
// Test IF and Boolean expr
2019-12-14 08:27:06 +01:00
func f(x int) bool { // MATCH /function f has cognitive complexity 3 (> max enabled 0)/
2019-12-14 09:01:22 +01:00
if x > 0 && true || false { // +3
2019-12-14 08:27:06 +01:00
return true
} else {
log.Printf("non-positive x: %d", x)
}
return false
}
2019-12-14 09:01:22 +01:00
// Test IF
2019-12-14 08:27:06 +01:00
func g(f func() bool) string { // MATCH /function g has cognitive complexity 1 (> max enabled 0)/
2019-12-14 09:01:22 +01:00
if ok := f(); ok { // +1
2019-12-14 08:27:06 +01:00
return "it's okay"
} else {
return "it's NOT okay!"
}
}
2019-12-14 09:01:22 +01:00
// Test Boolean expr
2019-12-14 08:27:06 +01:00
func h(a, b, c, d, e, f bool) bool { // MATCH /function h has cognitive complexity 2 (> max enabled 0)/
return a && b && c || d || e && f //FIXME: complexity should be 3
}
func i(a, b, c, d, e, f bool) bool { // MATCH /function i has cognitive complexity 2 (> max enabled 0)/
2019-12-14 09:01:22 +01:00
result := a && b && c || d || e // +2
2019-12-14 08:27:06 +01:00
return result
}
func j(a, b, c, d, e, f bool) bool { // MATCH /function j has cognitive complexity 2 (> max enabled 0)/
2019-12-14 09:01:22 +01:00
result := z(a && !(b && c)) // +2
2019-12-14 08:27:06 +01:00
return result
}
2019-12-14 09:01:22 +01:00
// Test Switch expr
2019-12-14 08:27:06 +01:00
func k(a, b, c, d, e, f bool) bool { // MATCH /function k has cognitive complexity 1 (> max enabled 0)/
2019-12-14 09:01:22 +01:00
switch expr { // +1
2019-12-14 08:27:06 +01:00
case cond1:
case cond2:
default:
}
return result
}
2019-12-14 09:01:22 +01:00
// Test nesting FOR expr + nested IF
2019-12-14 08:27:06 +01:00
func l() { // MATCH /function l has cognitive complexity 6 (> max enabled 0)/
2019-12-14 09:01:22 +01:00
for i := 1; i <= max; i++ { // +1
for j := 2; j < i; j++ { // +1 +1(nesting)
if i%j == 0 { // +1 +2(nesting)
2019-12-14 08:27:06 +01:00
continue
}
}
total += i
}
return total
}
2019-12-14 09:01:22 +01:00
// Test nesting IF
2019-12-14 08:27:06 +01:00
func m() { // MATCH /function m has cognitive complexity 6 (> max enabled 0)/
2019-12-14 09:01:22 +01:00
if i <= max { // +1
if j < i { // +1 +1(nesting)
if i%j == 0 { // +1 +2(nesting)
2019-12-14 08:27:06 +01:00
return 0
}
}
total += i
}
return total
}
2019-12-14 09:01:22 +01:00
// Test nesting IF + nested FOR
2019-12-14 08:27:06 +01:00
func n() { // MATCH /function n has cognitive complexity 6 (> max enabled 0)/
2019-12-14 09:01:22 +01:00
if i > max { // +1
for j := 2; j < i; j++ { // +1 +1(nesting)
if i%j == 0 { // +1 +2(nesting)
2019-12-14 08:27:06 +01:00
continue
}
}
total += i
}
return total
}
2019-12-14 09:01:22 +01:00
// Test nesting
2019-12-14 08:27:06 +01:00
func o() { // MATCH /function o has cognitive complexity 12 (> max enabled 0)/
2019-12-14 09:01:22 +01:00
if i > max { // +1
if j < i { // +1 +1(nesting)
if i%j == 0 { // +1 +2(nesting)
2019-12-14 08:27:06 +01:00
return
}
}
total += i
}
2019-12-14 09:01:22 +01:00
if i > max { // +1
if j < i { // +1 +1(nesting)
if i%j == 0 { // +1 +2(nesting)
2019-12-14 08:27:06 +01:00
return
}
}
total += i
}
}
2019-12-14 09:01:22 +01:00
// Tests TYPE SWITCH
2019-12-14 08:27:06 +01:00
func p() { // MATCH /function p has cognitive complexity 1 (> max enabled 0)/
2019-12-14 09:01:22 +01:00
switch n := n.(type) { // +1
2019-12-14 08:27:06 +01:00
case *ast.IfStmt:
targets := []ast.Node{n.Cond, n.Body, n.Else}
v.walk(targets...)
return nil
case *ast.ForStmt:
v.walk(n.Body)
return nil
case *ast.TypeSwitchStmt:
v.walk(n.Body)
return nil
case *ast.BinaryExpr:
v.complexity += v.binExpComplexity(n)
2019-12-14 09:01:22 +01:00
return nil
2019-12-14 08:27:06 +01:00
}
}
2019-12-14 09:01:22 +01:00
// Test RANGE
2019-12-14 08:27:06 +01:00
func q() { // MATCH /function q has cognitive complexity 1 (> max enabled 0)/
2019-12-14 09:01:22 +01:00
for _, t := range targets { // +1
2019-12-14 08:27:06 +01:00
ast.Walk(v, t)
}
}
2019-12-14 09:01:22 +01:00
// Tests SELECT
2019-12-14 08:27:06 +01:00
func r() { // MATCH /function r has cognitive complexity 1 (> max enabled 0)/
2019-12-14 09:01:22 +01:00
select { // +1
2019-12-14 08:27:06 +01:00
case c <- x:
x, y = y, x+y
case <-quit:
fmt.Println("quit")
return
}
}
2019-12-14 09:01:22 +01:00
// Test jump to label
2019-12-14 08:27:06 +01:00
func s() { // MATCH /function s has cognitive complexity 3 (> max enabled 0)/
FirstLoop:
2019-12-14 09:01:22 +01:00
for i := 0; i < 10; i++ { // +1
2019-12-14 08:27:06 +01:00
break
}
2019-12-14 09:01:22 +01:00
for i := 0; i < 10; i++ { // +1
break FirstLoop // +1
2019-12-14 08:27:06 +01:00
}
}
func t() { // MATCH /function t has cognitive complexity 2 (> max enabled 0)/
FirstLoop:
2019-12-14 09:01:22 +01:00
for i := 0; i < 10; i++ { // +1
goto FirstLoop // +1
2019-12-14 08:27:06 +01:00
}
}
func u() { // MATCH /function u has cognitive complexity 3 (> max enabled 0)/
FirstLoop:
2019-12-14 09:01:22 +01:00
for i := 0; i < 10; i++ { // +1
2019-12-14 08:27:06 +01:00
continue
}
2019-12-14 09:01:22 +01:00
for i := 0; i < 10; i++ { // +1
continue FirstLoop // +1
2019-12-14 08:27:06 +01:00
}
}
2019-12-14 09:01:22 +01:00
// Tests FUNC LITERAL
2019-12-14 08:27:06 +01:00
func v() { // MATCH /function v has cognitive complexity 2 (> max enabled 0)/
myFunc := func(b bool) {
2019-12-14 09:01:22 +01:00
if b { // +1 +1(nesting)
2019-12-14 08:27:06 +01:00
}
}
}
func w() { // MATCH /function w has cognitive complexity 3 (> max enabled 0)/
defer func(b bool) {
2019-12-14 09:01:22 +01:00
if b { // +1 +1(nesting)
2019-12-14 08:27:06 +01:00
}
2019-12-14 09:01:22 +01:00
}(false || true) // +1
2019-12-14 08:27:06 +01:00
}
2019-12-14 09:01:22 +01:00
// Test from Cognitive Complexity white paper
2019-12-14 08:27:06 +01:00
func sumOfPrimes(max int) int { // MATCH /function sumOfPrimes has cognitive complexity 7 (> max enabled 0)/
total := 0
OUT:
2019-12-14 09:01:22 +01:00
for i := 1; i <= max; i++ { // +1
for j := 2; j < i; j++ { // +1 +1(nesting)
if i%j == 0 { // +1 +2(nesting)
continue OUT // +1
2019-12-14 08:27:06 +01:00
}
}
total += i
}
return total
}