Skip to content

Commit bff320f

Browse files
authored
useless-assert: support bool ops (#91)
* useless-assert: support bool ops * useless-assert: fix test sort * useless-assert: fix test sort
1 parent ee2bbf8 commit bff320f

File tree

4 files changed

+70
-6
lines changed

4 files changed

+70
-6
lines changed

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,8 @@ Currently the checker guards against assertion of the same variable:
584584
❌ assert.Equal(t, tt.value, tt.value)
585585
assert.ElementsMatch(t, users, users)
586586
// And so on...
587+
assert.True(t, num > num)
588+
assert.False(t, num == num)
587589
```
588590

589591
More complex cases are [open for contribution](CONTRIBUTING.md#useless-assert).

analyzer/testdata/src/checkers-default/useless-assert/useless_assert_test.go

+25
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/checkers/useless_assert.go

+22-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package checkers
22

33
import (
4+
"go/ast"
5+
46
"golang.org/x/tools/go/analysis"
57

68
"github.com/Antonboom/testifylint/internal/analysisutil"
@@ -13,6 +15,8 @@ import (
1315
// assert.Equal(t, tt.value, tt.value)
1416
// assert.ElementsMatch(t, users, users)
1517
// ...
18+
// assert.True(t, num > num)
19+
// assert.False(t, num == num)
1620
//
1721
// 2) Open for contribution...
1822
type UselessAssert struct{}
@@ -22,6 +26,8 @@ func NewUselessAssert() UselessAssert { return UselessAssert{} }
2226
func (UselessAssert) Name() string { return "useless-assert" }
2327

2428
func (checker UselessAssert) Check(pass *analysis.Pass, call *CallMeta) *analysis.Diagnostic {
29+
var first, second ast.Node
30+
2531
switch call.Fn.NameFTrimmed {
2632
case
2733
"Contains",
@@ -55,14 +61,25 @@ func (checker UselessAssert) Check(pass *analysis.Pass, call *CallMeta) *analysi
5561
"Subset",
5662
"WithinDuration",
5763
"YAMLEq":
58-
default:
59-
return nil
60-
}
64+
if len(call.Args) < 2 {
65+
return nil
66+
}
67+
first, second = call.Args[0], call.Args[1]
68+
69+
case "True", "False":
70+
if len(call.Args) < 1 {
71+
return nil
72+
}
6173

62-
if len(call.Args) < 2 {
74+
be, ok := call.Args[0].(*ast.BinaryExpr)
75+
if !ok {
76+
return nil
77+
}
78+
first, second = be.X, be.Y
79+
80+
default:
6381
return nil
6482
}
65-
first, second := call.Args[0], call.Args[1]
6683

6784
if analysisutil.NodeString(pass.Fset, first) == analysisutil.NodeString(pass.Fset, second) {
6885
return newDiagnostic(checker.Name(), call, "asserting of the same variable", nil)

internal/testgen/gen_useless_assert.go

+21-1
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,27 @@ func (g UselessAssertTestsGenerator) TemplateData() any {
5656
twoSideAssertions = append(twoSideAssertions,
5757
Assertion{Fn: fn, Argsf: args, ReportMsgf: sameVarReport})
5858
}
59+
60+
for _, args := range []string{
61+
"num > num",
62+
"num < num",
63+
"num >= num",
64+
"num <= num",
65+
"num == num",
66+
"num != num",
67+
} {
68+
for _, fn := range []string{"True", "False"} {
69+
twoSideAssertions = append(twoSideAssertions,
70+
Assertion{Fn: fn, Argsf: args, ReportMsgf: sameVarReport})
71+
}
72+
}
73+
5974
sort.Slice(twoSideAssertions, func(i, j int) bool {
60-
return twoSideAssertions[i].Fn < twoSideAssertions[j].Fn
75+
lhs, rhs := twoSideAssertions[i], twoSideAssertions[j]
76+
if lhs.Fn == rhs.Fn {
77+
return lhs.Argsf < rhs.Argsf
78+
}
79+
return lhs.Fn < rhs.Fn
6180
})
6281

6382
return struct {
@@ -112,6 +131,7 @@ func {{ .CheckerName.AsTestName }}(t *testing.T) {
112131
var err error
113132
var elapsed time.Time
114133
var str string
134+
var num int
115135
var tc testCase
116136
117137
// Invalid.

0 commit comments

Comments
 (0)