198 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			198 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package test
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"sort"
 | |
| 	"strings"
 | |
| 	"testing"
 | |
| 
 | |
| 	"github.com/golangci/golangci-lint/pkg/lint/lintersdb"
 | |
| 	"github.com/golangci/golangci-lint/test/testshared"
 | |
| )
 | |
| 
 | |
| func inSlice(s []string, v string) bool {
 | |
| 	for _, sv := range s {
 | |
| 		if sv == v {
 | |
| 			return true
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return false
 | |
| }
 | |
| 
 | |
| func getEnabledByDefaultFastLintersExcept(except ...string) []string {
 | |
| 	m := lintersdb.NewManager(nil, nil)
 | |
| 	ebdl := m.GetAllEnabledByDefaultLinters()
 | |
| 	var ret []string
 | |
| 	for _, lc := range ebdl {
 | |
| 		if lc.IsSlowLinter() {
 | |
| 			continue
 | |
| 		}
 | |
| 
 | |
| 		if !inSlice(except, lc.Name()) {
 | |
| 			ret = append(ret, lc.Name())
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return ret
 | |
| }
 | |
| 
 | |
| func getAllFastLintersWith(with ...string) []string {
 | |
| 	linters := lintersdb.NewManager(nil, nil).GetAllSupportedLinterConfigs()
 | |
| 	ret := append([]string{}, with...)
 | |
| 	for _, lc := range linters {
 | |
| 		if lc.IsSlowLinter() {
 | |
| 			continue
 | |
| 		}
 | |
| 		ret = append(ret, lc.Name())
 | |
| 	}
 | |
| 
 | |
| 	return ret
 | |
| }
 | |
| 
 | |
| func getEnabledByDefaultLinters() []string {
 | |
| 	ebdl := lintersdb.NewManager(nil, nil).GetAllEnabledByDefaultLinters()
 | |
| 	var ret []string
 | |
| 	for _, lc := range ebdl {
 | |
| 		ret = append(ret, lc.Name())
 | |
| 	}
 | |
| 
 | |
| 	return ret
 | |
| }
 | |
| 
 | |
| func getEnabledByDefaultFastLintersWith(with ...string) []string {
 | |
| 	ebdl := lintersdb.NewManager(nil, nil).GetAllEnabledByDefaultLinters()
 | |
| 	ret := append([]string{}, with...)
 | |
| 	for _, lc := range ebdl {
 | |
| 		if lc.IsSlowLinter() {
 | |
| 			continue
 | |
| 		}
 | |
| 
 | |
| 		ret = append(ret, lc.Name())
 | |
| 	}
 | |
| 
 | |
| 	return ret
 | |
| }
 | |
| 
 | |
| //nolint:funlen
 | |
| func TestEnabledLinters(t *testing.T) {
 | |
| 	cases := []struct {
 | |
| 		name           string
 | |
| 		cfg            string
 | |
| 		enabledLinters []string
 | |
| 		args           []string
 | |
| 		noImplicitFast bool
 | |
| 	}{
 | |
| 		{
 | |
| 			name: "disable govet in config",
 | |
| 			cfg: `
 | |
| 			linters:
 | |
| 				disable:
 | |
| 					- govet
 | |
| 			`,
 | |
| 			enabledLinters: getEnabledByDefaultFastLintersExcept("govet"),
 | |
| 		},
 | |
| 		{
 | |
| 			name: "enable golint in config",
 | |
| 			cfg: `
 | |
| 			linters:
 | |
| 				enable:
 | |
| 					- golint
 | |
| 			`,
 | |
| 			enabledLinters: getEnabledByDefaultFastLintersWith("golint"),
 | |
| 		},
 | |
| 		{
 | |
| 			name:           "disable govet in cmd",
 | |
| 			args:           []string{"-Dgovet"},
 | |
| 			enabledLinters: getEnabledByDefaultFastLintersExcept("govet"),
 | |
| 		},
 | |
| 		{
 | |
| 			name: "enable gofmt in cmd and enable golint in config",
 | |
| 			args: []string{"-Egofmt"},
 | |
| 			cfg: `
 | |
| 			linters:
 | |
| 				enable:
 | |
| 					- golint
 | |
| 			`,
 | |
| 			enabledLinters: getEnabledByDefaultFastLintersWith("golint", "gofmt"),
 | |
| 		},
 | |
| 		{
 | |
| 			name: "fast option in config",
 | |
| 			cfg: `
 | |
| 			linters:
 | |
| 				fast: true
 | |
| 			`,
 | |
| 			enabledLinters: getEnabledByDefaultFastLintersWith(),
 | |
| 			noImplicitFast: true,
 | |
| 		},
 | |
| 		{
 | |
| 			name: "explicitly unset fast option in config",
 | |
| 			cfg: `
 | |
| 			linters:
 | |
| 				fast: false
 | |
| 			`,
 | |
| 			enabledLinters: getEnabledByDefaultLinters(),
 | |
| 			noImplicitFast: true,
 | |
| 		},
 | |
| 		{
 | |
| 			name:           "set fast option in command-line",
 | |
| 			args:           []string{"--fast"},
 | |
| 			enabledLinters: getEnabledByDefaultFastLintersWith(),
 | |
| 			noImplicitFast: true,
 | |
| 		},
 | |
| 		{
 | |
| 			name: "fast option in command-line has higher priority to enable",
 | |
| 			cfg: `
 | |
| 			linters:
 | |
| 				fast: false
 | |
| 			`,
 | |
| 			args:           []string{"--fast"},
 | |
| 			enabledLinters: getEnabledByDefaultFastLintersWith(),
 | |
| 			noImplicitFast: true,
 | |
| 		},
 | |
| 		{
 | |
| 			name: "fast option in command-line has higher priority to disable",
 | |
| 			cfg: `
 | |
| 			linters:
 | |
| 				fast: true
 | |
| 			`,
 | |
| 			args:           []string{"--fast=false"},
 | |
| 			enabledLinters: getEnabledByDefaultLinters(),
 | |
| 			noImplicitFast: true,
 | |
| 		},
 | |
| 		{
 | |
| 			name:           "fast option combined with enable and enable-all",
 | |
| 			args:           []string{"--enable-all", "--fast", "--enable=unused"},
 | |
| 			enabledLinters: getAllFastLintersWith("unused"),
 | |
| 			noImplicitFast: true,
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	testshared.InstallGolangciLint(t)
 | |
| 
 | |
| 	for _, c := range cases {
 | |
| 		c := c
 | |
| 		t.Run(c.name, func(t *testing.T) {
 | |
| 			t.Parallel()
 | |
| 
 | |
| 			args := []string{"--verbose"}
 | |
| 			if !c.noImplicitFast {
 | |
| 				args = append(args, "--fast")
 | |
| 			}
 | |
| 
 | |
| 			r := testshared.NewRunnerBuilder(t).
 | |
| 				WithCommand("linters").
 | |
| 				WithArgs(args...).
 | |
| 				WithArgs(c.args...).
 | |
| 				WithConfig(c.cfg).
 | |
| 				Runner().
 | |
| 				Run()
 | |
| 
 | |
| 			sort.StringSlice(c.enabledLinters).Sort()
 | |
| 
 | |
| 			r.ExpectOutputContains(fmt.Sprintf("Active %d linters: [%s]",
 | |
| 				len(c.enabledLinters), strings.Join(c.enabledLinters, " ")))
 | |
| 		})
 | |
| 	}
 | |
| }
 | 
