mirror of
https://github.com/golang/go.git
synced 2025-05-05 23:53:05 +00:00
now there are no more race conditions in the jsonrpc or server code make connected pipe (rather than direct API) the default in the tests to make sure we stay clean. Change-Id: Id1ffede795a660dbf7b265b9e0419c60cf83c6e8 Reviewed-on: https://go-review.googlesource.com/c/tools/+/170181 Run-TryBot: Ian Cottrell <iancottrell@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Rebecca Stambler <rstambler@golang.org>
80 lines
2.1 KiB
Go
80 lines
2.1 KiB
Go
// 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)
|
|
}
|
|
}
|