Skip to content

Commit ea890b3

Browse files
mmorel-35Antonboom
andauthored
error-nil: support Empty and Zero error (#153)
* error-nil: support empty and notempty error * review fixes * review fixes --------- Co-authored-by: Anton Telyshev <anton.telishev@yandex.ru>
1 parent 44419da commit ea890b3

5 files changed

Lines changed: 98 additions & 14 deletions

File tree

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,12 +340,16 @@ logic, but without autofix.
340340
```go
341341
342342
assert.Nil(t, err)
343-
assert.NotNil(t, err)
343+
assert.Empty(t, err)
344+
assert.Zero(t, err)
344345
assert.Equal(t, nil, err)
345346
assert.EqualValues(t, nil, err)
346347
assert.Exactly(t, nil, err)
347348
assert.ErrorIs(t, err, nil)
348349

350+
assert.NotNil(t, err)
351+
assert.NotEmpty(t, err)
352+
assert.NotZero(t, err)
349353
assert.NotEqual(t, nil, err)
350354
assert.NotEqualValues(t, nil, err)
351355
assert.NotErrorIs(t, err, nil)

analyzer/testdata/src/checkers-default/error-nil/error_nil_test.go

Lines changed: 33 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

analyzer/testdata/src/checkers-default/error-nil/error_nil_test.go.golden

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,18 @@ import (
1212

1313
func TestErrorNilChecker(t *testing.T) {
1414
var err error
15+
var errs []error
1516

1617
// Invalid.
1718
{
1819
assert.NoError(t, err) // want "error-nil: use assert\\.NoError"
1920
assert.NoErrorf(t, err, "msg with args %d %s", 42, "42") // want "error-nil: use assert\\.NoErrorf"
20-
assert.Error(t, err) // want "error-nil: use assert\\.Error"
21-
assert.Errorf(t, err, "msg with args %d %s", 42, "42") // want "error-nil: use assert\\.Errorf"
21+
assert.NoError(t, err) // want "error-nil: use assert\\.NoError"
22+
assert.NoErrorf(t, err, "msg with args %d %s", 42, "42") // want "error-nil: use assert\\.NoErrorf"
23+
assert.NoError(t, err) // want "error-nil: use assert\\.NoError"
24+
assert.NoErrorf(t, err, "msg with args %d %s", 42, "42") // want "error-nil: use assert\\.NoErrorf"
25+
assert.NoError(t, err) // want "error-nil: use assert\\.NoError"
26+
assert.NoErrorf(t, err, "msg with args %d %s", 42, "42") // want "error-nil: use assert\\.NoErrorf"
2227
assert.NoError(t, err) // want "error-nil: use assert\\.NoError"
2328
assert.NoErrorf(t, err, "msg with args %d %s", 42, "42") // want "error-nil: use assert\\.NoErrorf"
2429
assert.NoError(t, err) // want "error-nil: use assert\\.NoError"
@@ -39,8 +44,12 @@ func TestErrorNilChecker(t *testing.T) {
3944
assert.Errorf(t, err, "msg with args %d %s", 42, "42") // want "error-nil: use assert\\.Errorf"
4045
assert.Error(t, err) // want "error-nil: use assert\\.Error"
4146
assert.Errorf(t, err, "msg with args %d %s", 42, "42") // want "error-nil: use assert\\.Errorf"
42-
assert.NoError(t, err) // want "error-nil: use assert\\.NoError"
43-
assert.NoErrorf(t, err, "msg with args %d %s", 42, "42") // want "error-nil: use assert\\.NoErrorf"
47+
assert.Error(t, err) // want "error-nil: use assert\\.Error"
48+
assert.Errorf(t, err, "msg with args %d %s", 42, "42") // want "error-nil: use assert\\.Errorf"
49+
assert.Error(t, err) // want "error-nil: use assert\\.Error"
50+
assert.Errorf(t, err, "msg with args %d %s", 42, "42") // want "error-nil: use assert\\.Errorf"
51+
assert.Error(t, err) // want "error-nil: use assert\\.Error"
52+
assert.Errorf(t, err, "msg with args %d %s", 42, "42") // want "error-nil: use assert\\.Errorf"
4453
assert.Error(t, err) // want "error-nil: use assert\\.Error"
4554
assert.Errorf(t, err, "msg with args %d %s", 42, "42") // want "error-nil: use assert\\.Errorf"
4655
}
@@ -67,6 +76,26 @@ func TestErrorNilChecker(t *testing.T) {
6776
assert.NotEqualf(t, err, err, "msg with args %d %s", 42, "42")
6877
assert.NotEqual(t, nil, nil)
6978
assert.NotEqualf(t, nil, nil, "msg with args %d %s", 42, "42")
79+
assert.Empty(t, err.Error())
80+
assert.Emptyf(t, err.Error(), "msg with args %d %s", 42, "42")
81+
assert.NotEmpty(t, err.Error())
82+
assert.NotEmptyf(t, err.Error(), "msg with args %d %s", 42, "42")
83+
assert.Zero(t, err.Error())
84+
assert.Zerof(t, err.Error(), "msg with args %d %s", 42, "42")
85+
assert.NotZero(t, err.Error())
86+
assert.NotZerof(t, err.Error(), "msg with args %d %s", 42, "42")
87+
assert.Nil(t, errs)
88+
assert.Nilf(t, errs, "msg with args %d %s", 42, "42")
89+
assert.NotNil(t, errs)
90+
assert.NotNilf(t, errs, "msg with args %d %s", 42, "42")
91+
assert.Empty(t, errs)
92+
assert.Emptyf(t, errs, "msg with args %d %s", 42, "42")
93+
assert.NotEmpty(t, errs)
94+
assert.NotEmptyf(t, errs, "msg with args %d %s", 42, "42")
95+
assert.Zero(t, errs)
96+
assert.Zerof(t, errs, "msg with args %d %s", 42, "42")
97+
assert.NotZero(t, errs)
98+
assert.NotZerof(t, errs, "msg with args %d %s", 42, "42")
7099
}
71100
}
72101

internal/checkers/error_nil.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,16 @@ import (
1212
// ErrorNil detects situations like
1313
//
1414
// assert.Nil(t, err)
15-
// assert.NotNil(t, err)
15+
// assert.Empty(t, err)
16+
// assert.Zero(t, err)
1617
// assert.Equal(t, nil, err)
1718
// assert.EqualValues(t, nil, err)
1819
// assert.Exactly(t, nil, err)
1920
// assert.ErrorIs(t, err, nil)
2021
//
22+
// assert.NotNil(t, err)
23+
// assert.NotEmpty(t, err)
24+
// assert.NotZero(t, err)
2125
// assert.NotEqual(t, nil, err)
2226
// assert.NotEqualValues(t, nil, err)
2327
// assert.NotErrorIs(t, err, nil)
@@ -40,12 +44,12 @@ func (checker ErrorNil) Check(pass *analysis.Pass, call *CallMeta) *analysis.Dia
4044

4145
proposedFn, survivingArg, replacementEndPos := func() (string, ast.Expr, token.Pos) {
4246
switch call.Fn.NameFTrimmed {
43-
case "Nil":
47+
case "Nil", "Empty", "Zero":
4448
if len(call.Args) >= 1 && isError(pass, call.Args[0]) {
4549
return noErrorFn, call.Args[0], call.Args[0].End()
4650
}
4751

48-
case "NotNil":
52+
case "NotNil", "NotEmpty", "NotZero":
4953
if len(call.Args) >= 1 && isError(pass, call.Args[0]) {
5054
return errorFn, call.Args[0], call.Args[0].End()
5155
}

internal/testgen/gen_error_nil.go

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,18 +51,23 @@ func (g ErrorNilTestsGenerator) TemplateData() any {
5151
},
5252
InvalidAssertions: []Assertion{
5353
{Fn: "Nil", Argsf: "err", ReportMsgf: report, ProposedFn: "NoError"},
54-
{Fn: "NotNil", Argsf: "err", ReportMsgf: report, ProposedFn: "Error"},
54+
{Fn: "Empty", Argsf: "err", ReportMsgf: report, ProposedFn: "NoError"},
55+
{Fn: "Zero", Argsf: "err", ReportMsgf: report, ProposedFn: "NoError"},
5556
{Fn: "Equal", Argsf: "err, nil", ReportMsgf: report, ProposedFn: "NoError", ProposedArgsf: "err"},
5657
{Fn: "Equal", Argsf: "nil, err", ReportMsgf: report, ProposedFn: "NoError", ProposedArgsf: "err"},
5758
{Fn: "EqualValues", Argsf: "err, nil", ReportMsgf: report, ProposedFn: "NoError", ProposedArgsf: "err"},
5859
{Fn: "EqualValues", Argsf: "nil, err", ReportMsgf: report, ProposedFn: "NoError", ProposedArgsf: "err"},
5960
{Fn: "Exactly", Argsf: "err, nil", ReportMsgf: report, ProposedFn: "NoError", ProposedArgsf: "err"},
6061
{Fn: "Exactly", Argsf: "nil, err", ReportMsgf: report, ProposedFn: "NoError", ProposedArgsf: "err"},
62+
{Fn: "ErrorIs", Argsf: "err, nil", ReportMsgf: report, ProposedFn: "NoError", ProposedArgsf: "err"},
63+
64+
{Fn: "NotNil", Argsf: "err", ReportMsgf: report, ProposedFn: "Error"},
65+
{Fn: "NotEmpty", Argsf: "err", ReportMsgf: report, ProposedFn: "Error"},
66+
{Fn: "NotZero", Argsf: "err", ReportMsgf: report, ProposedFn: "Error"},
6167
{Fn: "NotEqual", Argsf: "err, nil", ReportMsgf: report, ProposedFn: "Error", ProposedArgsf: "err"},
6268
{Fn: "NotEqual", Argsf: "nil, err", ReportMsgf: report, ProposedFn: "Error", ProposedArgsf: "err"},
6369
{Fn: "NotEqualValues", Argsf: "err, nil", ReportMsgf: report, ProposedFn: "Error", ProposedArgsf: "err"},
6470
{Fn: "NotEqualValues", Argsf: "nil, err", ReportMsgf: report, ProposedFn: "Error", ProposedArgsf: "err"},
65-
{Fn: "ErrorIs", Argsf: "err, nil", ReportMsgf: report, ProposedFn: "NoError", ProposedArgsf: "err"},
6671
{Fn: "NotErrorIs", Argsf: "err, nil", ReportMsgf: report, ProposedFn: "Error", ProposedArgsf: "err"},
6772
},
6873
ValidAssertions: []Assertion{
@@ -76,6 +81,18 @@ func (g ErrorNilTestsGenerator) TemplateData() any {
7681
{Fn: "Equal", Argsf: "nil, nil"},
7782
{Fn: "NotEqual", Argsf: "err, err"},
7883
{Fn: "NotEqual", Argsf: "nil, nil"},
84+
85+
{Fn: "Empty", Argsf: "err.Error()"},
86+
{Fn: "NotEmpty", Argsf: "err.Error()"},
87+
{Fn: "Zero", Argsf: "err.Error()"},
88+
{Fn: "NotZero", Argsf: "err.Error()"},
89+
90+
{Fn: "Nil", Argsf: "errs"},
91+
{Fn: "NotNil", Argsf: "errs"},
92+
{Fn: "Empty", Argsf: "errs"},
93+
{Fn: "NotEmpty", Argsf: "errs"},
94+
{Fn: "Zero", Argsf: "errs"},
95+
{Fn: "NotZero", Argsf: "errs"},
7996
},
8097
}
8198
}
@@ -106,6 +123,7 @@ import (
106123
107124
func {{ .CheckerName.AsTestName }}(t *testing.T) {
108125
var err error
126+
var errs []error
109127
110128
// Invalid.
111129
{

0 commit comments

Comments
 (0)