// 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 cmdtest

import (
	"io/ioutil"
	"strings"
	"testing"

	"golang.org/x/tools/gopls/internal/lsp/protocol"
	"golang.org/x/tools/gopls/internal/lsp/source"
	"golang.org/x/tools/gopls/internal/lsp/tests"
	"golang.org/x/tools/gopls/internal/span"
)

// Diagnostics runs the "gopls check" command on a single file, parses
// its diagnostics, and compares against the expectations defined by
// markers in the source file.
func (r *runner) Diagnostics(t *testing.T, uri span.URI, want []*source.Diagnostic) {
	out, _ := r.runGoplsCmd(t, "check", uri.Filename())

	content, err := ioutil.ReadFile(uri.Filename())
	if err != nil {
		t.Fatal(err)
	}
	mapper := protocol.NewMapper(uri, content)

	// Parse command output into a set of diagnostics.
	var got []*source.Diagnostic
	for _, line := range strings.Split(out, "\n") {
		if line == "" {
			continue // skip blank
		}
		parts := strings.SplitN(line, ": ", 2) // "span: message"
		if len(parts) != 2 {
			t.Fatalf("output line not of form 'span: message': %q", line)
		}
		spn, message := span.Parse(parts[0]), parts[1]
		rng, err := mapper.SpanRange(spn)
		if err != nil {
			t.Fatal(err)
		}
		// Set only the fields needed by DiffDiagnostics.
		got = append(got, &source.Diagnostic{
			URI:     uri,
			Range:   rng,
			Message: message,
		})
	}

	// Don't expect fields that we can't populate from the command output.
	for _, diag := range want {
		if diag.Source == "no_diagnostics" {
			continue // see DiffDiagnostics
		}
		diag.Source = ""
		diag.Severity = 0
	}

	tests.CompareDiagnostics(t, uri, want, got)
}
