// Copyright 2020 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 regtest

import (
	"log"
	"testing"
)

// This test passes (TestHoverOnError in definition_test.go) without
// the //line directive
func TestHoverFailure(t *testing.T) {
	const mod = `
-- go.mod --
module mod.com
-- a.y --
DWIM(main)

-- main.go --
//line a.y:1
package main

func main() {
	var err error
	err.Error()
}`
	withOptions(SkipLogs()).run(t, mod, func(t *testing.T, env *Env) {
		env.OpenFile("main.go")
		content, _ := env.Hover("main.go", env.RegexpSearch("main.go", "Error"))
		// without the //line comment content would be non-nil
		if content != nil {
			t.Fatalf("expected nil hover content for Error")
		}
	})
}

// badPackageDup contains a duplicate definition of the 'a' const.
// this is from diagnostics_test.go,
const badPackageDup = `
-- go.mod --
module mod.com
-- a.go --
package consts

const a = 1
-- b.go --
package consts
//line gen.go:5
const a = 2
`

func TestFailingDiagnosticClearingOnEdit(t *testing.T) {
	runner.Run(t, badPackageDup, func(t *testing.T, env *Env) {
		log.SetFlags(log.Lshortfile)
		env.OpenFile("b.go")
		env.Await(env.AnyDiagnosticAtCurrentVersion("a.go"))
		// no diagnostics for either b.go or 'gen.go', but there should be
		env.Await(NoDiagnostics("b.go"))

		// Fix the error by editing the const name in b.go to `b`.
		env.RegexpReplace("b.go", "(a) = 2", "b")
		env.Await(
			EmptyDiagnostics("a.go"),
			// expected, as there have never been any diagnostics for b.go
			NoDiagnostics("b.go"),
		)
	})
}
