blob: 0665b4b7af01a7c313544afc01607d33ca32aceb [file] [log] [blame]
// Copyright 2019 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 cmd_test
import (
"context"
"fmt"
"strings"
"testing"
"golang.org/x/tools/go/packages/packagestest"
"golang.org/x/tools/internal/lsp/cmd"
"golang.org/x/tools/internal/lsp/source"
"golang.org/x/tools/internal/span"
"golang.org/x/tools/internal/tool"
)
type diagnostics map[string][]source.Diagnostic
func (l diagnostics) collect(spn span.Span, msgSource, msg string) {
fname, err := spn.URI().Filename()
if err != nil {
return
}
//TODO: diagnostics with range
spn = span.New(spn.URI(), spn.Start(), span.Point{})
l[fname] = append(l[fname], source.Diagnostic{
Span: spn,
Message: msg,
Source: msgSource,
Severity: source.SeverityError,
})
}
func (l diagnostics) test(t *testing.T, e *packagestest.Exported) {
count := 0
for fname, want := range l {
if len(want) == 1 && want[0].Message == "" {
continue
}
args := []string{"-remote=internal"}
args = append(args, "check", fname)
app := &cmd.Application{}
app.Config = *e.Config
out := captureStdOut(t, func() {
tool.Main(context.Background(), app, args)
})
// parse got into a collection of reports
got := map[string]struct{}{}
for _, l := range strings.Split(out, "\n") {
// parse and reprint to normalize the span
bits := strings.SplitN(l, ": ", 2)
if len(bits) == 2 {
spn := span.Parse(strings.TrimSpace(bits[0]))
spn = span.New(spn.URI(), spn.Start(), span.Point{})
l = fmt.Sprintf("%s: %s", spn, strings.TrimSpace(bits[1]))
}
got[l] = struct{}{}
}
for _, diag := range want {
expect := fmt.Sprintf("%v: %v", diag.Span, diag.Message)
_, found := got[expect]
if !found {
t.Errorf("missing diagnostic %q", expect)
} else {
delete(got, expect)
}
}
for extra, _ := range got {
t.Errorf("extra diagnostic %q", extra)
}
count += len(want)
}
if count != expectedDiagnosticsCount {
t.Errorf("got %v diagnostics expected %v", count, expectedDiagnosticsCount)
}
}