|  | // 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) | 
|  | } | 
|  | } |