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  }