diff --git a/.golangci.reference.yml b/.golangci.reference.yml index 3dded806666a..08eaf5910e45 100644 --- a/.golangci.reference.yml +++ b/.golangci.reference.yml @@ -402,6 +402,19 @@ linters-settings: # Default: false custom-order: true + ginkgolinter: + # Suppress the wrong length assertion warning + # Default: false + suppress-len-assertion: true + + # Suppress the wrong nil assertion warning + # Default: false + suppress-nil-assertion: true + + # Suppress the wrong error assertion warning + # Default: false + suppress-err-assertion: true + gocognit: # Minimal code complexity to report # Default: 30 (but we recommend 10-20) diff --git a/go.mod b/go.mod index 0dc27ac73f85..b202cb87760c 100644 --- a/go.mod +++ b/go.mod @@ -186,3 +186,5 @@ require ( gopkg.in/yaml.v2 v2.4.0 // indirect mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b // indirect ) + +require github.com/nunnatsa/ginkgolinter v0.5.0 diff --git a/go.sum b/go.sum index 323f98d53f03..c71950d7f087 100644 --- a/go.sum +++ b/go.sum @@ -394,6 +394,8 @@ github.com/nishanths/exhaustive v0.9.2 h1:PyEzIQZ4lpGBXsKc83syhC18JQPtsEMh2aAUG6 github.com/nishanths/exhaustive v0.9.2/go.mod h1:VjHsn6MdEX4ydfLwt658YcdPxSDKOlqSjpkeGJPCamo= github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk= github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= +github.com/nunnatsa/ginkgolinter v0.5.0 h1:6vw2YeZF0RcadPDEpaScp9XSDPXM3EXRz592aY7mNZE= +github.com/nunnatsa/ginkgolinter v0.5.0/go.mod h1:4DRX9L2s1+wYCExepD/mg2IqTn+xEXq2JMirL2n3fOI= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo/v2 v2.3.1 h1:8SbseP7qM32WcvE6VaN6vfXxv698izmsJ1UQX9ve7T8= diff --git a/pkg/config/linters_settings.go b/pkg/config/linters_settings.go index 22293abe7f79..269424e87b37 100644 --- a/pkg/config/linters_settings.go +++ b/pkg/config/linters_settings.go @@ -40,6 +40,9 @@ var defaultLintersSettings = LintersSettings{ Sections: []string{"standard", "default"}, SkipGenerated: true, }, + GinkgoLinter: GinkgolinterSettings{ + SuppressLenAssertion: false, + }, Gocognit: GocognitSettings{ MinComplexity: 30, }, @@ -150,6 +153,7 @@ type LintersSettings struct { Forbidigo ForbidigoSettings Funlen FunlenSettings Gci GciSettings + GinkgoLinter GinkgolinterSettings Gocognit GocognitSettings Goconst GoConstSettings Gocritic GoCriticSettings @@ -321,6 +325,12 @@ type GciSettings struct { CustomOrder bool `mapstructure:"custom-order"` } +type GinkgolinterSettings struct { + SuppressLenAssertion bool `mapstructure:"suppress-len-assertion"` + SuppressNilAssertion bool `mapstructure:"suppress-nil-assertion"` + SuppressErrAssertion bool `mapstructure:"suppress-err-assertion"` +} + type GocognitSettings struct { MinComplexity int `mapstructure:"min-complexity"` } diff --git a/pkg/golinters/ginkgolinter.go b/pkg/golinters/ginkgolinter.go new file mode 100644 index 000000000000..a1a5749eb394 --- /dev/null +++ b/pkg/golinters/ginkgolinter.go @@ -0,0 +1,40 @@ +package golinters + +import ( + "github.com/nunnatsa/ginkgolinter" + "golang.org/x/tools/go/analysis" + + "github.com/golangci/golangci-lint/pkg/config" + "github.com/golangci/golangci-lint/pkg/golinters/goanalysis" +) + +func NewGinkgoLinter(cfg *config.GinkgolinterSettings) *goanalysis.Linter { + a := ginkgolinter.NewAnalyzer() + + cfgMap := make(map[string]map[string]interface{}) + if cfg != nil { + settings := make(map[string]interface{}) + if cfg.SuppressLenAssertion { + settings["suppress-len-assertion"] = true + } + + if cfg.SuppressNilAssertion { + settings["suppress-nil-assertion"] = true + } + + if cfg.SuppressErrAssertion { + settings["suppress-err-assertion"] = true + } + + if len(settings) > 0 { + cfgMap[a.Name] = settings + } + } + + return goanalysis.NewLinter( + a.Name, + a.Doc, + []*analysis.Analyzer{a}, + cfgMap, + ).WithLoadMode(goanalysis.LoadModeTypesInfo) +} diff --git a/pkg/lint/lintersdb/manager.go b/pkg/lint/lintersdb/manager.go index 3867025f24a7..4d970dd16621 100644 --- a/pkg/lint/lintersdb/manager.go +++ b/pkg/lint/lintersdb/manager.go @@ -118,6 +118,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config { forbidigoCfg *config.ForbidigoSettings funlenCfg *config.FunlenSettings gciCfg *config.GciSettings + ginkgolinterCfg *config.GinkgolinterSettings gocognitCfg *config.GocognitSettings goconstCfg *config.GoConstSettings gocriticCfg *config.GoCriticSettings @@ -194,6 +195,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config { forbidigoCfg = &m.cfg.LintersSettings.Forbidigo funlenCfg = &m.cfg.LintersSettings.Funlen gciCfg = &m.cfg.LintersSettings.Gci + ginkgolinterCfg = &m.cfg.LintersSettings.GinkgoLinter gocognitCfg = &m.cfg.LintersSettings.Gocognit goconstCfg = &m.cfg.LintersSettings.Goconst gocriticCfg = &m.cfg.LintersSettings.Gocritic @@ -430,6 +432,12 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config { WithPresets(linter.PresetFormatting, linter.PresetImport). WithURL("https://github.com/daixiang0/gci"), + linter.NewConfig(golinters.NewGinkgoLinter(ginkgolinterCfg)). + WithSince("v1.51.0"). + WithLoadForGoAnalysis(). + WithPresets(linter.PresetStyle). + WithURL("https://github.com/nunnatsa/ginkgolinter"), + linter.NewConfig(golinters.NewGochecknoglobals()). WithSince("v1.12.0"). WithPresets(linter.PresetStyle). diff --git a/test/linters_test.go b/test/linters_test.go index 159e76c8bb56..58af3e1c6cb2 100644 --- a/test/linters_test.go +++ b/test/linters_test.go @@ -30,6 +30,7 @@ func TestTypecheck(t *testing.T) { func TestSourcesFromTestdataSubDir(t *testing.T) { subDirs := []string{ "loggercheck", + "ginkgolinter", } for _, dir := range subDirs { diff --git a/test/testdata/ginkgolinter/configs/ginkgolinter_default.yml b/test/testdata/ginkgolinter/configs/ginkgolinter_default.yml new file mode 100644 index 000000000000..c093840eb593 --- /dev/null +++ b/test/testdata/ginkgolinter/configs/ginkgolinter_default.yml @@ -0,0 +1,2 @@ +linters-settings: + ginkgolinter: {} \ No newline at end of file diff --git a/test/testdata/ginkgolinter/configs/ginkgolinter_suppress_err.yml b/test/testdata/ginkgolinter/configs/ginkgolinter_suppress_err.yml new file mode 100644 index 000000000000..080942d0c802 --- /dev/null +++ b/test/testdata/ginkgolinter/configs/ginkgolinter_suppress_err.yml @@ -0,0 +1,3 @@ +linters-settings: + ginkgolinter: + suppress-err-assertion: true diff --git a/test/testdata/ginkgolinter/configs/ginkgolinter_suppress_len.yml b/test/testdata/ginkgolinter/configs/ginkgolinter_suppress_len.yml new file mode 100644 index 000000000000..db9e0a285d7f --- /dev/null +++ b/test/testdata/ginkgolinter/configs/ginkgolinter_suppress_len.yml @@ -0,0 +1,3 @@ +linters-settings: + ginkgolinter: + suppress-len-assertion: true diff --git a/test/testdata/ginkgolinter/configs/ginkgolinter_suppress_nil.yml b/test/testdata/ginkgolinter/configs/ginkgolinter_suppress_nil.yml new file mode 100644 index 000000000000..d15ab8c3edd7 --- /dev/null +++ b/test/testdata/ginkgolinter/configs/ginkgolinter_suppress_nil.yml @@ -0,0 +1,3 @@ +linters-settings: + ginkgolinter: + suppress-nil-assertion: true diff --git a/test/testdata/ginkgolinter/ginkgolinter.go b/test/testdata/ginkgolinter/ginkgolinter.go new file mode 100644 index 000000000000..8af228a41aed --- /dev/null +++ b/test/testdata/ginkgolinter/ginkgolinter.go @@ -0,0 +1,51 @@ +//golangcitest:args --disable-all -Eginkgolinter +package ginkgolinter + +import ( + "errors" + . "github.com/onsi/gomega" +) + +func LenUsecase() { + var fakeVarUnderTest []int + Expect(fakeVarUnderTest).Should(BeEmpty()) // valid + Expect(fakeVarUnderTest).ShouldNot(HaveLen(5)) // valid + + Expect(len(fakeVarUnderTest)).Should(Equal(0)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.Should\\(BeEmpty\\(\\)\\). instead" + Expect(len(fakeVarUnderTest)).ShouldNot(Equal(2)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.ShouldNot\\(HaveLen\\(2\\)\\). instead" + Expect(len(fakeVarUnderTest)).To(BeNumerically("==", 0)) // // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.To\\(BeEmpty\\(\\)\\). instead" + + fakeVarUnderTest = append(fakeVarUnderTest, 3) + Expect(len(fakeVarUnderTest)).ShouldNot(Equal(0)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.ShouldNot\\(BeEmpty\\(\\)\\). instead" + Expect(len(fakeVarUnderTest)).Should(Equal(1)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.Should\\(HaveLen\\(1\\)\\). instead" + Expect(len(fakeVarUnderTest)).To(BeNumerically(">", 0)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.ToNot\\(BeEmpty\\(\\)\\). instead" + Expect(len(fakeVarUnderTest)).To(BeNumerically(">=", 1)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.ToNot\\(BeEmpty\\(\\)\\). instead" + Expect(len(fakeVarUnderTest)).To(BeNumerically("!=", 0)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.ToNot\\(BeEmpty\\(\\)\\). instead" +} + +func NilUsecase() { + y := 5 + x := &y + Expect(x == nil).To(Equal(true)) // want "ginkgo-linter: wrong nil assertion; consider using .Expect\\(x\\)\\.To\\(BeNil\\(\\)\\). instead" + Expect(nil == x).To(Equal(true)) // want "ginkgo-linter: wrong nil assertion; consider using .Expect\\(x\\)\\.To\\(BeNil\\(\\)\\). instead" + Expect(x != nil).To(Equal(true)) // want "ginkgo-linter: wrong nil assertion; consider using .Expect\\(x\\)\\.ToNot\\(BeNil\\(\\)\\). instead" + Expect(x == nil).To(BeTrue()) // want "ginkgo-linter: wrong nil assertion; consider using .Expect\\(x\\)\\.To\\(BeNil\\(\\)\\). instead" + Expect(x == nil).To(BeFalse()) // want "ginkgo-linter: wrong nil assertion; consider using .Expect\\(x\\)\\.ToNot\\(BeNil\\(\\)\\). instead" +} +func BooleanUsecase() { + x := true + Expect(x).To(Equal(true)) // want "ginkgo-linter: wrong boolean assertion; consider using .Expect\\(x\\)\\.To\\(BeTrue\\(\\)\\). instead" + x = false + Expect(x).To(Equal(false)) // want "ginkgo-linter: wrong boolean assertion; consider using .Expect\\(x\\)\\.To\\(BeFalse\\(\\)\\). instead" +} + +func ErrorUsecase() { + err := errors.New("fake error") + funcReturnsErr := func() error { return err } + + Expect(err).To(BeNil()) // want "ginkgo-linter: wrong error assertion; consider using .Expect\\(err\\)\\.ToNot\\(HaveOccurred\\(\\)\\). instead" + Expect(err == nil).To(Equal(true)) // want "ginkgo-linter: wrong error assertion; consider using .Expect\\(err\\)\\.ToNot\\(HaveOccurred\\(\\)\\). instead" + Expect(err == nil).To(BeFalse()) // want "ginkgo-linter: wrong error assertion; consider using .Expect\\(err\\)\\.To\\(HaveOccurred\\(\\)\\). instead" + Expect(err != nil).To(BeTrue()) // want "ginkgo-linter: wrong error assertion; consider using .Expect\\(err\\)\\.To\\(HaveOccurred\\(\\)\\). instead" + Expect(funcReturnsErr()).To(BeNil()) // want "ginkgo-linter: wrong error assertion; consider using .Expect\\(funcReturnsErr\\(\\)\\)\\.To\\(Succeed\\(\\)\\). instead" +} diff --git a/test/testdata/ginkgolinter/ginkgolinter_suppress_err.go b/test/testdata/ginkgolinter/ginkgolinter_suppress_err.go new file mode 100644 index 000000000000..7663e2cb2290 --- /dev/null +++ b/test/testdata/ginkgolinter/ginkgolinter_suppress_err.go @@ -0,0 +1,52 @@ +//golangcitest:config_path configs/ginkgolinter_suppress_err.yml +//golangcitest:args --disable-all -Eginkgolinter +package ginkgolinter + +import ( + "errors" + . "github.com/onsi/gomega" +) + +func LenUsecase_err() { + var fakeVarUnderTest []int + Expect(fakeVarUnderTest).Should(BeEmpty()) // valid + Expect(fakeVarUnderTest).ShouldNot(HaveLen(5)) // valid + + Expect(len(fakeVarUnderTest)).Should(Equal(0)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.Should\\(BeEmpty\\(\\)\\). instead" + Expect(len(fakeVarUnderTest)).ShouldNot(Equal(2)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.ShouldNot\\(HaveLen\\(2\\)\\). instead" + Expect(len(fakeVarUnderTest)).To(BeNumerically("==", 0)) // // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.To\\(BeEmpty\\(\\)\\). instead" + + fakeVarUnderTest = append(fakeVarUnderTest, 3) + Expect(len(fakeVarUnderTest)).ShouldNot(Equal(0)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.ShouldNot\\(BeEmpty\\(\\)\\). instead" + Expect(len(fakeVarUnderTest)).Should(Equal(1)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.Should\\(HaveLen\\(1\\)\\). instead" + Expect(len(fakeVarUnderTest)).To(BeNumerically(">", 0)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.ToNot\\(BeEmpty\\(\\)\\). instead" + Expect(len(fakeVarUnderTest)).To(BeNumerically(">=", 1)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.ToNot\\(BeEmpty\\(\\)\\). instead" + Expect(len(fakeVarUnderTest)).To(BeNumerically("!=", 0)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.ToNot\\(BeEmpty\\(\\)\\). instead" +} + +func NilUsecase_err() { + y := 5 + x := &y + Expect(x == nil).To(Equal(true)) // want "ginkgo-linter: wrong nil assertion; consider using .Expect\\(x\\)\\.To\\(BeNil\\(\\)\\). instead" + Expect(nil == x).To(Equal(true)) // want "ginkgo-linter: wrong nil assertion; consider using .Expect\\(x\\)\\.To\\(BeNil\\(\\)\\). instead" + Expect(x != nil).To(Equal(true)) // want "ginkgo-linter: wrong nil assertion; consider using .Expect\\(x\\)\\.ToNot\\(BeNil\\(\\)\\). instead" + Expect(x == nil).To(BeTrue()) // want "ginkgo-linter: wrong nil assertion; consider using .Expect\\(x\\)\\.To\\(BeNil\\(\\)\\). instead" + Expect(x == nil).To(BeFalse()) // want "ginkgo-linter: wrong nil assertion; consider using .Expect\\(x\\)\\.ToNot\\(BeNil\\(\\)\\). instead" +} +func BooleanUsecase_err() { + x := true + Expect(x).To(Equal(true)) // want "ginkgo-linter: wrong boolean assertion; consider using .Expect\\(x\\)\\.To\\(BeTrue\\(\\)\\). instead" + x = false + Expect(x).To(Equal(false)) // want "ginkgo-linter: wrong boolean assertion; consider using .Expect\\(x\\)\\.To\\(BeFalse\\(\\)\\). instead" +} + +func ErrorUsecase_err() { + err := errors.New("fake error") + funcReturnsErr := func() error { return err } + + Expect(err).To(BeNil()) + Expect(err == nil).To(Equal(true)) + Expect(err == nil).To(BeFalse()) + Expect(err != nil).To(BeTrue()) + Expect(funcReturnsErr()).To(BeNil()) +} diff --git a/test/testdata/ginkgolinter/ginkgolinter_suppress_len.go b/test/testdata/ginkgolinter/ginkgolinter_suppress_len.go new file mode 100644 index 000000000000..0d1e33eae13c --- /dev/null +++ b/test/testdata/ginkgolinter/ginkgolinter_suppress_len.go @@ -0,0 +1,52 @@ +//golangcitest:config_path configs/ginkgolinter_suppress_len.yml +//golangcitest:args --disable-all -Eginkgolinter +package ginkgolinter + +import ( + "errors" + . "github.com/onsi/gomega" +) + +func LenUsecase_len() { + var fakeVarUnderTest []int + Expect(fakeVarUnderTest).Should(BeEmpty()) // valid + Expect(fakeVarUnderTest).ShouldNot(HaveLen(5)) // valid + + Expect(len(fakeVarUnderTest)).Should(Equal(0)) + Expect(len(fakeVarUnderTest)).ShouldNot(Equal(2)) + Expect(len(fakeVarUnderTest)).To(BeNumerically("==", 0)) + + fakeVarUnderTest = append(fakeVarUnderTest, 3) + Expect(len(fakeVarUnderTest)).ShouldNot(Equal(0)) + Expect(len(fakeVarUnderTest)).Should(Equal(1)) + Expect(len(fakeVarUnderTest)).To(BeNumerically(">", 0)) + Expect(len(fakeVarUnderTest)).To(BeNumerically(">=", 1)) + Expect(len(fakeVarUnderTest)).To(BeNumerically("!=", 0)) +} + +func NilUsecase_len() { + y := 5 + x := &y + Expect(x == nil).To(Equal(true)) // want "ginkgo-linter: wrong nil assertion; consider using .Expect\\(x\\)\\.To\\(BeNil\\(\\)\\). instead" + Expect(nil == x).To(Equal(true)) // want "ginkgo-linter: wrong nil assertion; consider using .Expect\\(x\\)\\.To\\(BeNil\\(\\)\\). instead" + Expect(x != nil).To(Equal(true)) // want "ginkgo-linter: wrong nil assertion; consider using .Expect\\(x\\)\\.ToNot\\(BeNil\\(\\)\\). instead" + Expect(x == nil).To(BeTrue()) // want "ginkgo-linter: wrong nil assertion; consider using .Expect\\(x\\)\\.To\\(BeNil\\(\\)\\). instead" + Expect(x == nil).To(BeFalse()) // want "ginkgo-linter: wrong nil assertion; consider using .Expect\\(x\\)\\.ToNot\\(BeNil\\(\\)\\). instead" +} +func BooleanUsecase_len() { + x := true + Expect(x).To(Equal(true)) // want "ginkgo-linter: wrong boolean assertion; consider using .Expect\\(x\\)\\.To\\(BeTrue\\(\\)\\). instead" + x = false + Expect(x).To(Equal(false)) // want "ginkgo-linter: wrong boolean assertion; consider using .Expect\\(x\\)\\.To\\(BeFalse\\(\\)\\). instead" +} + +func ErrorUsecase_len() { + err := errors.New("fake error") + funcReturnsErr := func() error { return err } + + Expect(err).To(BeNil()) // want "ginkgo-linter: wrong error assertion; consider using .Expect\\(err\\)\\.ToNot\\(HaveOccurred\\(\\)\\). instead" + Expect(err == nil).To(Equal(true)) // want "ginkgo-linter: wrong error assertion; consider using .Expect\\(err\\)\\.ToNot\\(HaveOccurred\\(\\)\\). instead" + Expect(err == nil).To(BeFalse()) // want "ginkgo-linter: wrong error assertion; consider using .Expect\\(err\\)\\.To\\(HaveOccurred\\(\\)\\). instead" + Expect(err != nil).To(BeTrue()) // want "ginkgo-linter: wrong error assertion; consider using .Expect\\(err\\)\\.To\\(HaveOccurred\\(\\)\\). instead" + Expect(funcReturnsErr()).To(BeNil()) // want "ginkgo-linter: wrong error assertion; consider using .Expect\\(funcReturnsErr\\(\\)\\)\\.To\\(Succeed\\(\\)\\). instead" +} diff --git a/test/testdata/ginkgolinter/ginkgolinter_suppress_nil.go b/test/testdata/ginkgolinter/ginkgolinter_suppress_nil.go new file mode 100644 index 000000000000..f1a30473e5ec --- /dev/null +++ b/test/testdata/ginkgolinter/ginkgolinter_suppress_nil.go @@ -0,0 +1,52 @@ +//golangcitest:args --disable-all -Eginkgolinter +//golangcitest:config_path configs/ginkgolinter_suppress_nil.yml +package ginkgolinter + +import ( + "errors" + . "github.com/onsi/gomega" +) + +func LenUsecase_nil() { + var fakeVarUnderTest []int + Expect(fakeVarUnderTest).Should(BeEmpty()) // valid + Expect(fakeVarUnderTest).ShouldNot(HaveLen(5)) // valid + + Expect(len(fakeVarUnderTest)).Should(Equal(0)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.Should\\(BeEmpty\\(\\)\\). instead" + Expect(len(fakeVarUnderTest)).ShouldNot(Equal(2)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.ShouldNot\\(HaveLen\\(2\\)\\). instead" + Expect(len(fakeVarUnderTest)).To(BeNumerically("==", 0)) // // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.To\\(BeEmpty\\(\\)\\). instead" + + fakeVarUnderTest = append(fakeVarUnderTest, 3) + Expect(len(fakeVarUnderTest)).ShouldNot(Equal(0)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.ShouldNot\\(BeEmpty\\(\\)\\). instead" + Expect(len(fakeVarUnderTest)).Should(Equal(1)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.Should\\(HaveLen\\(1\\)\\). instead" + Expect(len(fakeVarUnderTest)).To(BeNumerically(">", 0)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.ToNot\\(BeEmpty\\(\\)\\). instead" + Expect(len(fakeVarUnderTest)).To(BeNumerically(">=", 1)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.ToNot\\(BeEmpty\\(\\)\\). instead" + Expect(len(fakeVarUnderTest)).To(BeNumerically("!=", 0)) // want "ginkgo-linter: wrong length assertion; consider using .Expect\\(fakeVarUnderTest\\)\\.ToNot\\(BeEmpty\\(\\)\\). instead" +} + +func NilUsecase_nil() { + y := 5 + x := &y + Expect(x == nil).To(Equal(true)) + Expect(nil == x).To(Equal(true)) + Expect(x != nil).To(Equal(true)) + Expect(x == nil).To(BeTrue()) + Expect(x == nil).To(BeFalse()) +} +func BooleanUsecase_nil() { + x := true + Expect(x).To(Equal(true)) // want "ginkgo-linter: wrong boolean assertion; consider using .Expect\\(x\\)\\.To\\(BeTrue\\(\\)\\). instead" + x = false + Expect(x).To(Equal(false)) // want "ginkgo-linter: wrong boolean assertion; consider using .Expect\\(x\\)\\.To\\(BeFalse\\(\\)\\). instead" +} + +func ErrorUsecase_nil() { + err := errors.New("fake error") + funcReturnsErr := func() error { return err } + + Expect(err).To(BeNil()) // want "ginkgo-linter: wrong error assertion; consider using .Expect\\(err\\)\\.ToNot\\(HaveOccurred\\(\\)\\). instead" + Expect(err == nil).To(Equal(true)) // want "ginkgo-linter: wrong error assertion; consider using .Expect\\(err\\)\\.ToNot\\(HaveOccurred\\(\\)\\). instead" + Expect(err == nil).To(BeFalse()) // want "ginkgo-linter: wrong error assertion; consider using .Expect\\(err\\)\\.To\\(HaveOccurred\\(\\)\\). instead" + Expect(err != nil).To(BeTrue()) // want "ginkgo-linter: wrong error assertion; consider using .Expect\\(err\\)\\.To\\(HaveOccurred\\(\\)\\). instead" + Expect(funcReturnsErr()).To(BeNil()) // want "ginkgo-linter: wrong error assertion; consider using .Expect\\(funcReturnsErr\\(\\)\\)\\.To\\(Succeed\\(\\)\\). instead" +} diff --git a/test/testdata/ginkgolinter/go.mod b/test/testdata/ginkgolinter/go.mod new file mode 100644 index 000000000000..48dca07b5779 --- /dev/null +++ b/test/testdata/ginkgolinter/go.mod @@ -0,0 +1,12 @@ +module ginkgolinter + +go 1.19 + +require github.com/onsi/gomega v1.24.1 + +require ( + github.com/google/go-cmp v0.5.9 // indirect + golang.org/x/net v0.2.0 // indirect + golang.org/x/text v0.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/test/testdata/ginkgolinter/go.sum b/test/testdata/ginkgolinter/go.sum new file mode 100644 index 000000000000..a3d1dba1a6c3 --- /dev/null +++ b/test/testdata/ginkgolinter/go.sum @@ -0,0 +1,15 @@ +github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/onsi/ginkgo/v2 v2.5.0 h1:TRtrvv2vdQqzkwrQ1ke6vtXf7IK34RBUJafIy1wMwls= +github.com/onsi/gomega v1.24.1 h1:KORJXNNTzJXzu4ScJWssJfJMnJ+2QJqhoQSRwNlze9E= +github.com/onsi/gomega v1.24.1/go.mod h1:3AOiACssS3/MajrniINInwbfOOtfZvplPzuRSmvt1jM= +golang.org/x/net v0.2.0 h1:sZfSu1wtKLGlWI4ZZayP0ck9Y73K1ynO6gqzTdBVdPU= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A= +golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=