blob: 56daf678c4316bd158a6bcadbce538ce351ae50c [file] [log] [blame]
// Copyright 2024 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package settings_test
import (
"encoding/json"
"fmt"
"os/exec"
"strings"
"testing"
"golang.org/x/tools/gopls/internal/doc"
"golang.org/x/tools/internal/testenv"
)
// TestVetSuite ensures that gopls's analyser suite is a superset of vet's.
//
// This test may fail spuriously if gopls/doc/generate.TestGenerated
// fails. In that case retry after re-running the JSON generator.
func TestVetSuite(t *testing.T) {
testenv.NeedsTool(t, "go")
// Read gopls' suite from the API JSON.
goplsAnalyzers := make(map[string]bool)
var api doc.API
if err := json.Unmarshal([]byte(doc.JSON), &api); err != nil {
t.Fatal(err)
}
for _, a := range api.Analyzers {
goplsAnalyzers[a.Name] = true
}
// Read vet's suite by parsing its help message.
cmd := exec.Command("go", "tool", "vet", "help")
cmd.Stdout = new(strings.Builder)
if err := cmd.Run(); err != nil {
t.Fatalf("failed to run vet: %v", err)
}
out := fmt.Sprint(cmd.Stdout)
_, out, _ = strings.Cut(out, "Registered analyzers:\n\n")
out, _, _ = strings.Cut(out, "\n\n")
for _, line := range strings.Split(out, "\n") {
name := strings.Fields(line)[0]
if !goplsAnalyzers[name] {
t.Errorf("gopls lacks vet analyzer %q", name)
}
}
}