From 626997c53dcd30ef6bfb631893b50d27b7ef3efc Mon Sep 17 00:00:00 2001 From: ccoVeille <3875889+ccoVeille@users.noreply.github.com> Date: Thu, 6 Jun 2024 19:13:19 +0200 Subject: [PATCH 1/2] compares: refactor test before adding more use cases --- internal/testgen/gen_compares.go | 50 ++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/internal/testgen/gen_compares.go b/internal/testgen/gen_compares.go index 1b2a46f..bef0372 100644 --- a/internal/testgen/gen_compares.go +++ b/internal/testgen/gen_compares.go @@ -30,33 +30,41 @@ func (g ComparesTestsGenerator) TemplateData() any { ) } + var invalidAssertions []Assertion //nolint:prealloc + for checker, oppositeChecker := range map[string]string{ + "True": "False", + } { + invalidAssertions = append(invalidAssertions, + Assertion{Fn: checker, Argsf: "a == b", ReportMsgf: report, ProposedFn: "Equal", ProposedArgsf: "a, b"}, + Assertion{Fn: checker, Argsf: "a != b", ReportMsgf: report, ProposedFn: "NotEqual", ProposedArgsf: "a, b"}, + Assertion{Fn: checker, Argsf: "a > b", ReportMsgf: report, ProposedFn: "Greater", ProposedArgsf: "a, b"}, + Assertion{Fn: checker, Argsf: "a >= b", ReportMsgf: report, ProposedFn: "GreaterOrEqual", ProposedArgsf: "a, b"}, + Assertion{Fn: checker, Argsf: "a < b", ReportMsgf: report, ProposedFn: "Less", ProposedArgsf: "a, b"}, + Assertion{Fn: checker, Argsf: "a <= b", ReportMsgf: report, ProposedFn: "LessOrEqual", ProposedArgsf: "a, b"}, + Assertion{Fn: oppositeChecker, Argsf: "a == b", ReportMsgf: report, ProposedFn: "NotEqual", ProposedArgsf: "a, b"}, + Assertion{Fn: oppositeChecker, Argsf: "a != b", ReportMsgf: report, ProposedFn: "Equal", ProposedArgsf: "a, b"}, + Assertion{Fn: oppositeChecker, Argsf: "a > b", ReportMsgf: report, ProposedFn: "LessOrEqual", ProposedArgsf: "a, b"}, + Assertion{Fn: oppositeChecker, Argsf: "a >= b", ReportMsgf: report, ProposedFn: "Less", ProposedArgsf: "a, b"}, + Assertion{Fn: oppositeChecker, Argsf: "a < b", ReportMsgf: report, ProposedFn: "GreaterOrEqual", ProposedArgsf: "a, b"}, + Assertion{Fn: oppositeChecker, Argsf: "a <= b", ReportMsgf: report, ProposedFn: "Greater", ProposedArgsf: "a, b"}, + ) + } + + invalidAssertions = append(invalidAssertions, + Assertion{Fn: "True", Argsf: "ptrA == ptrB", ReportMsgf: report, ProposedFn: "Same", ProposedArgsf: "ptrA, ptrB"}, + Assertion{Fn: "True", Argsf: "ptrA != ptrB", ReportMsgf: report, ProposedFn: "NotSame", ProposedArgsf: "ptrA, ptrB"}, + Assertion{Fn: "False", Argsf: "ptrA == ptrB", ReportMsgf: report, ProposedFn: "NotSame", ProposedArgsf: "ptrA, ptrB"}, + Assertion{Fn: "False", Argsf: "ptrA != ptrB", ReportMsgf: report, ProposedFn: "Same", ProposedArgsf: "ptrA, ptrB"}, + ) + return struct { CheckerName CheckerName InvalidAssertions []Assertion ValidAssertions []Assertion IgnoredAssertions []Assertion }{ - CheckerName: CheckerName(checker), - InvalidAssertions: []Assertion{ - {Fn: "True", Argsf: "a == b", ReportMsgf: report, ProposedFn: "Equal", ProposedArgsf: "a, b"}, - {Fn: "True", Argsf: "a != b", ReportMsgf: report, ProposedFn: "NotEqual", ProposedArgsf: "a, b"}, - {Fn: "True", Argsf: "a > b", ReportMsgf: report, ProposedFn: "Greater", ProposedArgsf: "a, b"}, - {Fn: "True", Argsf: "a >= b", ReportMsgf: report, ProposedFn: "GreaterOrEqual", ProposedArgsf: "a, b"}, - {Fn: "True", Argsf: "a < b", ReportMsgf: report, ProposedFn: "Less", ProposedArgsf: "a, b"}, - {Fn: "True", Argsf: "a <= b", ReportMsgf: report, ProposedFn: "LessOrEqual", ProposedArgsf: "a, b"}, - - {Fn: "False", Argsf: "a == b", ReportMsgf: report, ProposedFn: "NotEqual", ProposedArgsf: "a, b"}, - {Fn: "False", Argsf: "a != b", ReportMsgf: report, ProposedFn: "Equal", ProposedArgsf: "a, b"}, - {Fn: "False", Argsf: "a > b", ReportMsgf: report, ProposedFn: "LessOrEqual", ProposedArgsf: "a, b"}, - {Fn: "False", Argsf: "a >= b", ReportMsgf: report, ProposedFn: "Less", ProposedArgsf: "a, b"}, - {Fn: "False", Argsf: "a < b", ReportMsgf: report, ProposedFn: "GreaterOrEqual", ProposedArgsf: "a, b"}, - {Fn: "False", Argsf: "a <= b", ReportMsgf: report, ProposedFn: "Greater", ProposedArgsf: "a, b"}, - - {Fn: "True", Argsf: "ptrA == ptrB", ReportMsgf: report, ProposedFn: "Same", ProposedArgsf: "ptrA, ptrB"}, - {Fn: "True", Argsf: "ptrA != ptrB", ReportMsgf: report, ProposedFn: "NotSame", ProposedArgsf: "ptrA, ptrB"}, - {Fn: "False", Argsf: "ptrA == ptrB", ReportMsgf: report, ProposedFn: "NotSame", ProposedArgsf: "ptrA, ptrB"}, - {Fn: "False", Argsf: "ptrA != ptrB", ReportMsgf: report, ProposedFn: "Same", ProposedArgsf: "ptrA, ptrB"}, - }, + CheckerName: CheckerName(checker), + InvalidAssertions: invalidAssertions, ValidAssertions: []Assertion{ {Fn: "Equal", Argsf: "a, b"}, {Fn: "NotEqual", Argsf: "a, b"}, From 1eb5934a8f43d09422d826ac93987ae2e40e882d Mon Sep 17 00:00:00 2001 From: ccoVeille <3875889+ccoVeille@users.noreply.github.com> Date: Thu, 6 Jun 2024 19:18:08 +0200 Subject: [PATCH 2/2] compares: add Zero and Empty Fixes: #110 --- README.md | 4 ++ .../compares/compares_test.go | 48 +++++++++++++++++++ .../compares/compares_test.go.golden | 48 +++++++++++++++++++ internal/checkers/compares.go | 8 +++- internal/testgen/gen_compares.go | 4 +- 5 files changed, 109 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e33302c..962689b 100644 --- a/README.md +++ b/README.md @@ -190,6 +190,10 @@ assert.True(t, a >= b) assert.True(t, a < b) assert.True(t, a <= b) assert.False(t, a == b) +assert.NotEmpty(t, a == b) +assert.NotZero(t, a == b) +assert.Zero(t, a == b) +assert.Empty(t, a == b) // And so on... ✅ diff --git a/analyzer/testdata/src/checkers-default/compares/compares_test.go b/analyzer/testdata/src/checkers-default/compares/compares_test.go index 192fe5c..5a04963 100644 --- a/analyzer/testdata/src/checkers-default/compares/compares_test.go +++ b/analyzer/testdata/src/checkers-default/compares/compares_test.go @@ -39,6 +39,54 @@ func TestComparesChecker(t *testing.T) { assert.Falsef(t, a < b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.GreaterOrEqualf" assert.False(t, a <= b) // want "compares: use assert\\.Greater" assert.Falsef(t, a <= b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.Greaterf" + assert.NotEmpty(t, a == b) // want "compares: use assert\\.Equal" + assert.NotEmptyf(t, a == b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.Equalf" + assert.NotEmpty(t, a != b) // want "compares: use assert\\.NotEqual" + assert.NotEmptyf(t, a != b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.NotEqualf" + assert.NotEmpty(t, a > b) // want "compares: use assert\\.Greater" + assert.NotEmptyf(t, a > b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.Greaterf" + assert.NotEmpty(t, a >= b) // want "compares: use assert\\.GreaterOrEqual" + assert.NotEmptyf(t, a >= b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.GreaterOrEqualf" + assert.NotEmpty(t, a < b) // want "compares: use assert\\.Less" + assert.NotEmptyf(t, a < b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.Lessf" + assert.NotEmpty(t, a <= b) // want "compares: use assert\\.LessOrEqual" + assert.NotEmptyf(t, a <= b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.LessOrEqualf" + assert.Empty(t, a == b) // want "compares: use assert\\.NotEqual" + assert.Emptyf(t, a == b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.NotEqualf" + assert.Empty(t, a != b) // want "compares: use assert\\.Equal" + assert.Emptyf(t, a != b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.Equalf" + assert.Empty(t, a > b) // want "compares: use assert\\.LessOrEqual" + assert.Emptyf(t, a > b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.LessOrEqualf" + assert.Empty(t, a >= b) // want "compares: use assert\\.Less" + assert.Emptyf(t, a >= b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.Lessf" + assert.Empty(t, a < b) // want "compares: use assert\\.GreaterOrEqual" + assert.Emptyf(t, a < b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.GreaterOrEqualf" + assert.Empty(t, a <= b) // want "compares: use assert\\.Greater" + assert.Emptyf(t, a <= b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.Greaterf" + assert.NotZero(t, a == b) // want "compares: use assert\\.Equal" + assert.NotZerof(t, a == b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.Equalf" + assert.NotZero(t, a != b) // want "compares: use assert\\.NotEqual" + assert.NotZerof(t, a != b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.NotEqualf" + assert.NotZero(t, a > b) // want "compares: use assert\\.Greater" + assert.NotZerof(t, a > b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.Greaterf" + assert.NotZero(t, a >= b) // want "compares: use assert\\.GreaterOrEqual" + assert.NotZerof(t, a >= b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.GreaterOrEqualf" + assert.NotZero(t, a < b) // want "compares: use assert\\.Less" + assert.NotZerof(t, a < b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.Lessf" + assert.NotZero(t, a <= b) // want "compares: use assert\\.LessOrEqual" + assert.NotZerof(t, a <= b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.LessOrEqualf" + assert.Zero(t, a == b) // want "compares: use assert\\.NotEqual" + assert.Zerof(t, a == b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.NotEqualf" + assert.Zero(t, a != b) // want "compares: use assert\\.Equal" + assert.Zerof(t, a != b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.Equalf" + assert.Zero(t, a > b) // want "compares: use assert\\.LessOrEqual" + assert.Zerof(t, a > b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.LessOrEqualf" + assert.Zero(t, a >= b) // want "compares: use assert\\.Less" + assert.Zerof(t, a >= b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.Lessf" + assert.Zero(t, a < b) // want "compares: use assert\\.GreaterOrEqual" + assert.Zerof(t, a < b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.GreaterOrEqualf" + assert.Zero(t, a <= b) // want "compares: use assert\\.Greater" + assert.Zerof(t, a <= b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.Greaterf" assert.True(t, ptrA == ptrB) // want "compares: use assert\\.Same" assert.Truef(t, ptrA == ptrB, "msg with args %d %s", 42, "42") // want "compares: use assert\\.Samef" assert.True(t, ptrA != ptrB) // want "compares: use assert\\.NotSame" diff --git a/analyzer/testdata/src/checkers-default/compares/compares_test.go.golden b/analyzer/testdata/src/checkers-default/compares/compares_test.go.golden index 3f3d057..d692774 100644 --- a/analyzer/testdata/src/checkers-default/compares/compares_test.go.golden +++ b/analyzer/testdata/src/checkers-default/compares/compares_test.go.golden @@ -15,6 +15,54 @@ func TestComparesChecker(t *testing.T) { // Invalid. { + assert.Equal(t, a, b) // want "compares: use assert\\.Equal" + assert.Equalf(t, a, b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.Equalf" + assert.NotEqual(t, a, b) // want "compares: use assert\\.NotEqual" + assert.NotEqualf(t, a, b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.NotEqualf" + assert.Greater(t, a, b) // want "compares: use assert\\.Greater" + assert.Greaterf(t, a, b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.Greaterf" + assert.GreaterOrEqual(t, a, b) // want "compares: use assert\\.GreaterOrEqual" + assert.GreaterOrEqualf(t, a, b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.GreaterOrEqualf" + assert.Less(t, a, b) // want "compares: use assert\\.Less" + assert.Lessf(t, a, b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.Lessf" + assert.LessOrEqual(t, a, b) // want "compares: use assert\\.LessOrEqual" + assert.LessOrEqualf(t, a, b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.LessOrEqualf" + assert.NotEqual(t, a, b) // want "compares: use assert\\.NotEqual" + assert.NotEqualf(t, a, b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.NotEqualf" + assert.Equal(t, a, b) // want "compares: use assert\\.Equal" + assert.Equalf(t, a, b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.Equalf" + assert.LessOrEqual(t, a, b) // want "compares: use assert\\.LessOrEqual" + assert.LessOrEqualf(t, a, b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.LessOrEqualf" + assert.Less(t, a, b) // want "compares: use assert\\.Less" + assert.Lessf(t, a, b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.Lessf" + assert.GreaterOrEqual(t, a, b) // want "compares: use assert\\.GreaterOrEqual" + assert.GreaterOrEqualf(t, a, b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.GreaterOrEqualf" + assert.Greater(t, a, b) // want "compares: use assert\\.Greater" + assert.Greaterf(t, a, b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.Greaterf" + assert.Equal(t, a, b) // want "compares: use assert\\.Equal" + assert.Equalf(t, a, b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.Equalf" + assert.NotEqual(t, a, b) // want "compares: use assert\\.NotEqual" + assert.NotEqualf(t, a, b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.NotEqualf" + assert.Greater(t, a, b) // want "compares: use assert\\.Greater" + assert.Greaterf(t, a, b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.Greaterf" + assert.GreaterOrEqual(t, a, b) // want "compares: use assert\\.GreaterOrEqual" + assert.GreaterOrEqualf(t, a, b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.GreaterOrEqualf" + assert.Less(t, a, b) // want "compares: use assert\\.Less" + assert.Lessf(t, a, b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.Lessf" + assert.LessOrEqual(t, a, b) // want "compares: use assert\\.LessOrEqual" + assert.LessOrEqualf(t, a, b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.LessOrEqualf" + assert.NotEqual(t, a, b) // want "compares: use assert\\.NotEqual" + assert.NotEqualf(t, a, b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.NotEqualf" + assert.Equal(t, a, b) // want "compares: use assert\\.Equal" + assert.Equalf(t, a, b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.Equalf" + assert.LessOrEqual(t, a, b) // want "compares: use assert\\.LessOrEqual" + assert.LessOrEqualf(t, a, b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.LessOrEqualf" + assert.Less(t, a, b) // want "compares: use assert\\.Less" + assert.Lessf(t, a, b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.Lessf" + assert.GreaterOrEqual(t, a, b) // want "compares: use assert\\.GreaterOrEqual" + assert.GreaterOrEqualf(t, a, b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.GreaterOrEqualf" + assert.Greater(t, a, b) // want "compares: use assert\\.Greater" + assert.Greaterf(t, a, b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.Greaterf" assert.Equal(t, a, b) // want "compares: use assert\\.Equal" assert.Equalf(t, a, b, "msg with args %d %s", 42, "42") // want "compares: use assert\\.Equalf" assert.NotEqual(t, a, b) // want "compares: use assert\\.NotEqual" diff --git a/internal/checkers/compares.go b/internal/checkers/compares.go index bdde03d..1c1f5e5 100644 --- a/internal/checkers/compares.go +++ b/internal/checkers/compares.go @@ -16,6 +16,10 @@ import ( // assert.True(t, a < b) // assert.True(t, a <= b) // assert.False(t, a == b) +// assert.NotEmpty(t, a == b) +// assert.NotZero(t, a == b) +// assert.Zero(t, a == b) +// assert.Empty(t, a == b) // ... // // and requires @@ -48,9 +52,9 @@ func (checker Compares) Check(pass *analysis.Pass, call *CallMeta) *analysis.Dia var tokenToProposedFn map[token.Token]string switch call.Fn.NameFTrimmed { - case "True": + case "True", "NotZero", "NotEmpty": tokenToProposedFn = tokenToProposedFnInsteadOfTrue - case "False": + case "False", "Zero", "Empty": tokenToProposedFn = tokenToProposedFnInsteadOfFalse default: return nil diff --git a/internal/testgen/gen_compares.go b/internal/testgen/gen_compares.go index bef0372..8e0ac0b 100644 --- a/internal/testgen/gen_compares.go +++ b/internal/testgen/gen_compares.go @@ -32,7 +32,9 @@ func (g ComparesTestsGenerator) TemplateData() any { var invalidAssertions []Assertion //nolint:prealloc for checker, oppositeChecker := range map[string]string{ - "True": "False", + "True": "False", + "NotEmpty": "Empty", + "NotZero": "Zero", } { invalidAssertions = append(invalidAssertions, Assertion{Fn: checker, Argsf: "a == b", ReportMsgf: report, ProposedFn: "Equal", ProposedArgsf: "a, b"},