golangci-lint/pkg/golinters/govet_test.go
Oleksandr Redko 521a6763ce
dev: replace raw loops with funcs from slices and maps (#4299)
Co-authored-by: Fernandez Ludovic <ldez@users.noreply.github.com>
2024-01-04 22:43:50 +01:00

98 lines
2.6 KiB
Go

package golinters
import (
"testing"
"golang.org/x/exp/slices"
"golang.org/x/tools/go/analysis"
"golang.org/x/tools/go/analysis/passes/asmdecl"
"golang.org/x/tools/go/analysis/passes/assign"
"golang.org/x/tools/go/analysis/passes/atomic"
"golang.org/x/tools/go/analysis/passes/bools"
"golang.org/x/tools/go/analysis/passes/buildtag"
"golang.org/x/tools/go/analysis/passes/cgocall"
"golang.org/x/tools/go/analysis/passes/shadow"
"github.com/golangci/golangci-lint/pkg/config"
)
func TestGovet(t *testing.T) {
// Checking that every default analyzer is in "all analyzers" list.
checkList := append([]*analysis.Analyzer{}, defaultAnalyzers...)
checkList = append(checkList, shadow.Analyzer) // special case, used in analyzersFromConfig
for _, defaultAnalyzer := range checkList {
found := slices.ContainsFunc(allAnalyzers, func(a *analysis.Analyzer) bool {
return a.Name == defaultAnalyzer.Name
})
if !found {
t.Errorf("%s is not in allAnalyzers", defaultAnalyzer.Name)
}
}
}
func sortAnalyzers(a, b *analysis.Analyzer) int {
if a.Name < b.Name {
return -1
}
if a.Name > b.Name {
return 1
}
return 0
}
func TestGovetSorted(t *testing.T) {
// Keeping analyzers sorted so their order match the import order.
t.Run("All", func(t *testing.T) {
if !slices.IsSortedFunc(allAnalyzers, sortAnalyzers) {
t.Error("please keep all analyzers list sorted by name")
}
})
t.Run("Default", func(t *testing.T) {
if !slices.IsSortedFunc(defaultAnalyzers, sortAnalyzers) {
t.Error("please keep default analyzers list sorted by name")
}
})
}
func TestGovetAnalyzerIsEnabled(t *testing.T) {
defaultAnalyzers := []*analysis.Analyzer{
asmdecl.Analyzer,
assign.Analyzer,
atomic.Analyzer,
bools.Analyzer,
buildtag.Analyzer,
cgocall.Analyzer,
}
for _, tc := range []struct {
Enable []string
Disable []string
EnableAll bool
DisableAll bool
Name string
Enabled bool
}{
{Name: "assign", Enabled: true},
{Name: "cgocall", Enabled: false, DisableAll: true},
{Name: "errorsas", Enabled: false},
{Name: "bools", Enabled: false, Disable: []string{"bools"}},
{Name: "unsafeptr", Enabled: true, Enable: []string{"unsafeptr"}},
{Name: "shift", Enabled: true, EnableAll: true},
{Name: "shadow", EnableAll: true, Disable: []string{"shadow"}, Enabled: false},
} {
cfg := &config.GovetSettings{
Enable: tc.Enable,
Disable: tc.Disable,
EnableAll: tc.EnableAll,
DisableAll: tc.DisableAll,
}
if enabled := isAnalyzerEnabled(tc.Name, cfg, defaultAnalyzers); enabled != tc.Enabled {
t.Errorf("%+v", tc)
}
}
}