github.com/vanstinator/golangci-lint@v0.0.0-20240223191551-cc572f00d9d1/pkg/golinters/govet_test.go (about) 1 package golinters 2 3 import ( 4 "testing" 5 6 "golang.org/x/exp/slices" 7 "golang.org/x/tools/go/analysis" 8 "golang.org/x/tools/go/analysis/passes/asmdecl" 9 "golang.org/x/tools/go/analysis/passes/assign" 10 "golang.org/x/tools/go/analysis/passes/atomic" 11 "golang.org/x/tools/go/analysis/passes/bools" 12 "golang.org/x/tools/go/analysis/passes/buildtag" 13 "golang.org/x/tools/go/analysis/passes/cgocall" 14 "golang.org/x/tools/go/analysis/passes/shadow" 15 16 "github.com/vanstinator/golangci-lint/pkg/config" 17 ) 18 19 func TestGovet(t *testing.T) { 20 // Checking that every default analyzer is in "all analyzers" list. 21 checkList := append([]*analysis.Analyzer{}, defaultAnalyzers...) 22 checkList = append(checkList, shadow.Analyzer) // special case, used in analyzersFromConfig 23 24 for _, defaultAnalyzer := range checkList { 25 found := slices.ContainsFunc(allAnalyzers, func(a *analysis.Analyzer) bool { 26 return a.Name == defaultAnalyzer.Name 27 }) 28 if !found { 29 t.Errorf("%s is not in allAnalyzers", defaultAnalyzer.Name) 30 } 31 } 32 } 33 34 func sortAnalyzers(a, b *analysis.Analyzer) int { 35 if a.Name < b.Name { 36 return -1 37 } 38 39 if a.Name > b.Name { 40 return 1 41 } 42 43 return 0 44 } 45 46 func TestGovetSorted(t *testing.T) { 47 // Keeping analyzers sorted so their order match the import order. 48 t.Run("All", func(t *testing.T) { 49 if !slices.IsSortedFunc(allAnalyzers, sortAnalyzers) { 50 t.Error("please keep all analyzers list sorted by name") 51 } 52 }) 53 54 t.Run("Default", func(t *testing.T) { 55 if !slices.IsSortedFunc(defaultAnalyzers, sortAnalyzers) { 56 t.Error("please keep default analyzers list sorted by name") 57 } 58 }) 59 } 60 61 func TestGovetAnalyzerIsEnabled(t *testing.T) { 62 defaultAnalyzers := []*analysis.Analyzer{ 63 asmdecl.Analyzer, 64 assign.Analyzer, 65 atomic.Analyzer, 66 bools.Analyzer, 67 buildtag.Analyzer, 68 cgocall.Analyzer, 69 } 70 for _, tc := range []struct { 71 Enable []string 72 Disable []string 73 EnableAll bool 74 DisableAll bool 75 76 Name string 77 Enabled bool 78 }{ 79 {Name: "assign", Enabled: true}, 80 {Name: "cgocall", Enabled: false, DisableAll: true}, 81 {Name: "errorsas", Enabled: false}, 82 {Name: "bools", Enabled: false, Disable: []string{"bools"}}, 83 {Name: "unsafeptr", Enabled: true, Enable: []string{"unsafeptr"}}, 84 {Name: "shift", Enabled: true, EnableAll: true}, 85 {Name: "shadow", EnableAll: true, Disable: []string{"shadow"}, Enabled: false}, 86 } { 87 cfg := &config.GovetSettings{ 88 Enable: tc.Enable, 89 Disable: tc.Disable, 90 EnableAll: tc.EnableAll, 91 DisableAll: tc.DisableAll, 92 } 93 if enabled := isAnalyzerEnabled(tc.Name, cfg, defaultAnalyzers); enabled != tc.Enabled { 94 t.Errorf("%+v", tc) 95 } 96 } 97 }