Skip to content

Commit 3418337

Browse files
authored
new checker 'equal-values' (#223)
* new checker 'equal-values' * self-review fixes
1 parent de820d7 commit 3418337

17 files changed

+664
-15
lines changed

CONTRIBUTING.md

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,9 @@ By default, we disable the checker if we doubt its 100% usefulness.
5959

6060
Create new `TimeCompareTestsGenerator` in `internal/testgen/gen_time_compare.go`.
6161

62-
See examples in adjacent files.
62+
See examples in adjacent files, e.g. [internal/testgen/gen_regexp.go](internal/testgen/gen_regexp.go).
6363

64-
In the first iteration, these can be a very simple tests for debugging checker's proof of concept.
64+
In the first iteration, these can be a simple tests for debugging checker's proof of concept.
6565
And after the implementation of the checker, you can add various cycles, variables, etc. to the template.
6666

6767
`GoldenTemplate` is usually an `ErroredTemplate` with some strings replaced.
@@ -211,19 +211,6 @@ func (s *ServiceIntegrationSuite) TearDownTest() {
211211

212212
---
213213

214-
### equal-values
215-
216-
```go
217-
❌ assert.Equal(t, int64(100), price.Amount)
218-
✅ assert.EqualValues(t, 100, price.Amount)
219-
```
220-
221-
**Autofix**: true. <br>
222-
**Enabled by default**: maybe? <br>
223-
**Reason**: Code simplification.
224-
225-
---
226-
227214
### float-compare
228215

229216
1) Support other tricky cases

README.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ https://golangci-lint.run/usage/linters/#testifylint
9797
| [contains](#contains) |||
9898
| [empty](#empty) |||
9999
| [encoded-compare](#encoded-compare) |||
100+
| [equal-values](#equal-values) |||
100101
| [error-is-as](#error-is-as) || 🤏 |
101102
| [error-nil](#error-nil) |||
102103
| [expected-actual](#expected-actual) |||
@@ -308,6 +309,30 @@ needed.
308309

309310
---
310311

312+
### equal-values
313+
314+
```go
315+
316+
assert.EqualValues(t, 42, result.IntField)
317+
assert.NotEqualValues(t, 42, result.IntField)
318+
// And other variations with similar types (strings, numerics, structs, etc.)...
319+
320+
321+
assert.Equal(t, 42, result.IntField)
322+
assert.NotEqual(t, 42, result.IntField)
323+
```
324+
325+
**Autofix**: true. <br>
326+
**Enabled by default**: true. <br>
327+
**Reason**: Using more appropriate and more error-proof `testify` API.
328+
329+
In additional:
330+
331+
1. Overflow-underflow issues are [covered by testify itself](https://github.com/stretchr/testify/pull/1531).
332+
2. Nil comparisons are covered by [nil-compare](#nil-compare).
333+
334+
---
335+
311336
### error-is-as
312337

313338
```go

analyzer/analyzer_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ func TestTestifyLint_NotDefaultCases(t *testing.T) {
6868
dir: "encoded-compare-issue198",
6969
flags: map[string]string{"disable-all": "true", "enable": checkers.NewEncodedCompare().Name()},
7070
},
71+
{
72+
dir: "equal-values-different-pkg",
73+
flags: map[string]string{"disable-all": "true", "enable": checkers.NewEqualValues().Name()},
74+
},
7175
{
7276
dir: "error-as-target",
7377
flags: map[string]string{"disable-all": "true", "enable": checkers.NewErrorIsAs().Name()},

analyzer/checkers_factory_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ func Test_newCheckers(t *testing.T) {
2727
checkers.NewEncodedCompare(),
2828
checkers.NewExpectedActual(),
2929
checkers.NewLen(),
30+
checkers.NewEqualValues(),
3031
checkers.NewRegexp(),
3132
checkers.NewSuiteExtraAssertCall(),
3233
checkers.NewSuiteDontUsePkg(),
@@ -46,6 +47,7 @@ func Test_newCheckers(t *testing.T) {
4647
checkers.NewEncodedCompare(),
4748
checkers.NewExpectedActual(),
4849
checkers.NewLen(),
50+
checkers.NewEqualValues(),
4951
checkers.NewRegexp(),
5052
checkers.NewSuiteExtraAssertCall(),
5153
checkers.NewSuiteDontUsePkg(),

analyzer/testdata/src/checkers-default/equal-values/equal_values_test.go

Lines changed: 141 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
// Code generated by testifylint/internal/testgen. DO NOT EDIT.
2+
3+
package equalvalues
4+
5+
import (
6+
"crypto/tls"
7+
"testing"
8+
9+
"github.com/stretchr/testify/assert"
10+
)
11+
12+
type S []string
13+
14+
type Request struct{ ID string }
15+
type RequestWithTags struct {
16+
ID string `json:"name"`
17+
}
18+
type Arg struct{ ID string }
19+
20+
func TestEqualValuesChecker(t *testing.T) {
21+
var (
22+
i int
23+
i8 int8
24+
i16 int16
25+
i32 int32
26+
i64 int64
27+
)
28+
var (
29+
ui uint
30+
ui8 uint8
31+
ui16 uint16
32+
ui32 uint32
33+
ui64 uint64
34+
)
35+
var (
36+
str string
37+
req Request
38+
reqWithTags RequestWithTags
39+
dto Arg
40+
ss struct{ int }
41+
m map[string]string
42+
mm map[any]any
43+
b []byte
44+
f func() bool
45+
)
46+
tlsConf := new(tls.Config)
47+
48+
// Invalid.
49+
{
50+
assert.Equal(t, 42, i) // want "equal-values: use assert\\.Equal"
51+
assert.Equalf(t, 42, i, "msg with args %d %s", 42, "42") // want "equal-values: use assert\\.Equalf"
52+
assert.Equal(t, int8(42), i8) // want "equal-values: use assert\\.Equal"
53+
assert.Equalf(t, int8(42), i8, "msg with args %d %s", 42, "42") // want "equal-values: use assert\\.Equalf"
54+
assert.Equal(t, int16(42), i16) // want "equal-values: use assert\\.Equal"
55+
assert.Equalf(t, int16(42), i16, "msg with args %d %s", 42, "42") // want "equal-values: use assert\\.Equalf"
56+
assert.Equal(t, int32(42), i32) // want "equal-values: use assert\\.Equal"
57+
assert.Equalf(t, int32(42), i32, "msg with args %d %s", 42, "42") // want "equal-values: use assert\\.Equalf"
58+
assert.Equal(t, int64(42), i64) // want "equal-values: use assert\\.Equal"
59+
assert.Equalf(t, int64(42), i64, "msg with args %d %s", 42, "42") // want "equal-values: use assert\\.Equalf"
60+
assert.Equal(t, uint(42), ui) // want "equal-values: use assert\\.Equal"
61+
assert.Equalf(t, uint(42), ui, "msg with args %d %s", 42, "42") // want "equal-values: use assert\\.Equalf"
62+
assert.Equal(t, uint8(42), ui8) // want "equal-values: use assert\\.Equal"
63+
assert.Equalf(t, uint8(42), ui8, "msg with args %d %s", 42, "42") // want "equal-values: use assert\\.Equalf"
64+
assert.Equal(t, uint16(42), ui16) // want "equal-values: use assert\\.Equal"
65+
assert.Equalf(t, uint16(42), ui16, "msg with args %d %s", 42, "42") // want "equal-values: use assert\\.Equalf"
66+
assert.Equal(t, uint32(42), ui32) // want "equal-values: use assert\\.Equal"
67+
assert.Equalf(t, uint32(42), ui32, "msg with args %d %s", 42, "42") // want "equal-values: use assert\\.Equalf"
68+
assert.Equal(t, uint64(42), ui64) // want "equal-values: use assert\\.Equal"
69+
assert.Equalf(t, uint64(42), ui64, "msg with args %d %s", 42, "42") // want "equal-values: use assert\\.Equalf"
70+
assert.Equal(t, "42", str) // want "equal-values: use assert\\.Equal"
71+
assert.Equalf(t, "42", str, "msg with args %d %s", 42, "42") // want "equal-values: use assert\\.Equalf"
72+
assert.Equal(t, req, req) // want "equal-values: use assert\\.Equal"
73+
assert.Equalf(t, req, req, "msg with args %d %s", 42, "42") // want "equal-values: use assert\\.Equalf"
74+
assert.Equal(t, struct{ int }{}, ss) // want "equal-values: use assert\\.Equal"
75+
assert.Equalf(t, struct{ int }{}, ss, "msg with args %d %s", 42, "42") // want "equal-values: use assert\\.Equalf"
76+
assert.Equal(t, map[any]any{}, mm) // want "equal-values: use assert\\.Equal"
77+
assert.Equalf(t, map[any]any{}, mm, "msg with args %d %s", 42, "42") // want "equal-values: use assert\\.Equalf"
78+
assert.Equal(t, []byte(nil), b) // want "equal-values: use assert\\.Equal"
79+
assert.Equalf(t, []byte(nil), b, "msg with args %d %s", 42, "42") // want "equal-values: use assert\\.Equalf"
80+
assert.Equal(t, map[string]string(nil), m) // want "equal-values: use assert\\.Equal"
81+
assert.Equalf(t, map[string]string(nil), m, "msg with args %d %s", 42, "42") // want "equal-values: use assert\\.Equalf"
82+
assert.Equal(t, (*tls.Config)(nil), tlsConf) // want "equal-values: use assert\\.Equal"
83+
assert.Equalf(t, (*tls.Config)(nil), tlsConf, "msg with args %d %s", 42, "42") // want "equal-values: use assert\\.Equalf"
84+
assert.NotEqual(t, 42, i) // want "equal-values: use assert\\.NotEqual"
85+
assert.NotEqualf(t, 42, i, "msg with args %d %s", 42, "42") // want "equal-values: use assert\\.NotEqualf"
86+
}
87+
88+
// Valid.
89+
{
90+
assert.Equal(t, 42, i)
91+
assert.Equalf(t, 42, i, "msg with args %d %s", 42, "42")
92+
assert.Equal(t, int8(42), i8)
93+
assert.Equalf(t, int8(42), i8, "msg with args %d %s", 42, "42")
94+
assert.Equal(t, int16(42), i16)
95+
assert.Equalf(t, int16(42), i16, "msg with args %d %s", 42, "42")
96+
assert.Equal(t, int32(42), i32)
97+
assert.Equalf(t, int32(42), i32, "msg with args %d %s", 42, "42")
98+
assert.Equal(t, int64(42), i64)
99+
assert.Equalf(t, int64(42), i64, "msg with args %d %s", 42, "42")
100+
assert.Equal(t, uint(42), ui)
101+
assert.Equalf(t, uint(42), ui, "msg with args %d %s", 42, "42")
102+
assert.Equal(t, uint8(42), ui8)
103+
assert.Equalf(t, uint8(42), ui8, "msg with args %d %s", 42, "42")
104+
assert.Equal(t, uint16(42), ui16)
105+
assert.Equalf(t, uint16(42), ui16, "msg with args %d %s", 42, "42")
106+
assert.Equal(t, uint32(42), ui32)
107+
assert.Equalf(t, uint32(42), ui32, "msg with args %d %s", 42, "42")
108+
assert.Equal(t, uint64(42), ui64)
109+
assert.Equalf(t, uint64(42), ui64, "msg with args %d %s", 42, "42")
110+
assert.Equal(t, "42", str)
111+
assert.Equalf(t, "42", str, "msg with args %d %s", 42, "42")
112+
assert.Equal(t, req, req)
113+
assert.Equalf(t, req, req, "msg with args %d %s", 42, "42")
114+
assert.Equal(t, struct{ int }{}, ss)
115+
assert.Equalf(t, struct{ int }{}, ss, "msg with args %d %s", 42, "42")
116+
assert.Equal(t, map[any]any{}, mm)
117+
assert.Equalf(t, map[any]any{}, mm, "msg with args %d %s", 42, "42")
118+
assert.Equal(t, []byte(nil), b)
119+
assert.Equalf(t, []byte(nil), b, "msg with args %d %s", 42, "42")
120+
assert.Equal(t, map[string]string(nil), m)
121+
assert.Equalf(t, map[string]string(nil), m, "msg with args %d %s", 42, "42")
122+
assert.Equal(t, (*tls.Config)(nil), tlsConf)
123+
assert.Equalf(t, (*tls.Config)(nil), tlsConf, "msg with args %d %s", 42, "42")
124+
assert.NotEqual(t, 42, i)
125+
assert.NotEqualf(t, 42, i, "msg with args %d %s", 42, "42")
126+
assert.EqualValues(t, 2048, mm["Etype"])
127+
assert.EqualValuesf(t, 2048, mm["Etype"], "msg with args %d %s", 42, "42")
128+
assert.EqualValues(t, req, dto)
129+
assert.EqualValuesf(t, req, dto, "msg with args %d %s", 42, "42")
130+
assert.EqualValues(t, req, reqWithTags)
131+
assert.EqualValuesf(t, req, reqWithTags, "msg with args %d %s", 42, "42")
132+
assert.EqualValues(t, S{"1"}, []string{"1"})
133+
assert.EqualValuesf(t, S{"1"}, []string{"1"}, "msg with args %d %s", 42, "42")
134+
assert.EqualValues(t, f, (func())(nil))
135+
assert.EqualValuesf(t, f, (func())(nil), "msg with args %d %s", 42, "42")
136+
assert.EqualValues(t, (func())(nil), f)
137+
assert.EqualValuesf(t, (func())(nil), f, "msg with args %d %s", 42, "42")
138+
assert.NotEqualValues(t, 2048, mm["Etype"])
139+
assert.NotEqualValuesf(t, 2048, mm["Etype"], "msg with args %d %s", 42, "42")
140+
}
141+
}

0 commit comments

Comments
 (0)