internal/lsp: first pass at some hover tests

This uses golden files to hold the hover text as they are no more fragile than
hard coding the text in the tests, and much easier to update.
We need a lot more tests, and ones with actual comments, but this is a start and
at least adds the machienery it would take.

Change-Id: Ia2f79257642759e4c2f972d4037f258134e0fb33
Reviewed-on: https://go-review.googlesource.com/c/tools/+/174380
Run-TryBot: Ian Cottrell <iancottrell@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
diff --git a/internal/lsp/lsp_test.go b/internal/lsp/lsp_test.go
index 9fcf9fd..f51dcb0 100644
--- a/internal/lsp/lsp_test.go
+++ b/internal/lsp/lsp_test.go
@@ -9,6 +9,7 @@
 	"context"
 	"fmt"
 	"go/token"
+	"io/ioutil"
 	"os"
 	"os/exec"
 	"sort"
@@ -340,10 +341,15 @@
 			Position:     loc.Range.Start,
 		}
 		var locs []protocol.Location
+		var hover *protocol.Hover
 		if d.IsType {
 			locs, err = r.server.TypeDefinition(context.Background(), params)
 		} else {
 			locs, err = r.server.Definition(context.Background(), params)
+			if err != nil {
+				t.Fatalf("failed for %v: %v", d.Src, err)
+			}
+			hover, err = r.server.Hover(context.Background(), params)
 		}
 		if err != nil {
 			t.Fatalf("failed for %v: %v", d.Src, err)
@@ -358,6 +364,19 @@
 		} else if def != d.Def {
 			t.Errorf("for %v got %v want %v", d.Src, def, d.Def)
 		}
+		if hover != nil {
+			tag := fmt.Sprintf("hover-%d-%d", d.Def.Start().Line(), d.Def.Start().Column())
+			filename, err := d.Def.URI().Filename()
+			if err != nil {
+				t.Fatalf("failed for %v: %v", d.Def, err)
+			}
+			expectHover := string(r.data.Golden(tag, filename, func(golden string) error {
+				return ioutil.WriteFile(golden, []byte(hover.Contents.Value), 0666)
+			}))
+			if hover.Contents.Value != expectHover {
+				t.Errorf("for %v got %q want %q", d.Src, hover.Contents.Value, expectHover)
+			}
+		}
 	}
 }
 
diff --git a/internal/lsp/testdata/godef/a/a.hover-14-6.golden.go b/internal/lsp/testdata/godef/a/a.hover-14-6.golden.go
new file mode 100644
index 0000000..b2551e2
--- /dev/null
+++ b/internal/lsp/testdata/godef/a/a.hover-14-6.golden.go
@@ -0,0 +1 @@
+var err error
\ No newline at end of file
diff --git a/internal/lsp/testdata/godef/a/a.hover-7-6.golden.go b/internal/lsp/testdata/godef/a/a.hover-7-6.golden.go
new file mode 100644
index 0000000..41c681e
--- /dev/null
+++ b/internal/lsp/testdata/godef/a/a.hover-7-6.golden.go
@@ -0,0 +1 @@
+type a.A string
\ No newline at end of file
diff --git a/internal/lsp/testdata/godef/a/a.hover-9-6.golden.go b/internal/lsp/testdata/godef/a/a.hover-9-6.golden.go
new file mode 100644
index 0000000..16285ac
--- /dev/null
+++ b/internal/lsp/testdata/godef/a/a.hover-9-6.golden.go
@@ -0,0 +1 @@
+func a.Stuff()
\ No newline at end of file
diff --git a/internal/lsp/testdata/godef/a/random.hover-13-2.golden.go b/internal/lsp/testdata/godef/a/random.hover-13-2.golden.go
new file mode 100644
index 0000000..08a5f3c
--- /dev/null
+++ b/internal/lsp/testdata/godef/a/random.hover-13-2.golden.go
@@ -0,0 +1 @@
+field x int
\ No newline at end of file
diff --git a/internal/lsp/testdata/godef/a/random.hover-16-15.golden.go b/internal/lsp/testdata/godef/a/random.hover-16-15.golden.go
new file mode 100644
index 0000000..861a9a9
--- /dev/null
+++ b/internal/lsp/testdata/godef/a/random.hover-16-15.golden.go
@@ -0,0 +1 @@
+func (*Pos).Sum() int
\ No newline at end of file
diff --git a/internal/lsp/testdata/godef/a/random.hover-3-6.golden.go b/internal/lsp/testdata/godef/a/random.hover-3-6.golden.go
new file mode 100644
index 0000000..8daadc7
--- /dev/null
+++ b/internal/lsp/testdata/godef/a/random.hover-3-6.golden.go
@@ -0,0 +1 @@
+func Random() int
\ No newline at end of file
diff --git a/internal/lsp/testdata/godef/a/random.hover-8-14.golden.go b/internal/lsp/testdata/godef/a/random.hover-8-14.golden.go
new file mode 100644
index 0000000..a1dcda2
--- /dev/null
+++ b/internal/lsp/testdata/godef/a/random.hover-8-14.golden.go
@@ -0,0 +1 @@
+var y int
\ No newline at end of file
diff --git a/internal/lsp/testdata/godef/a/random.hover-8-6.golden.go b/internal/lsp/testdata/godef/a/random.hover-8-6.golden.go
new file mode 100644
index 0000000..f97ad9d
--- /dev/null
+++ b/internal/lsp/testdata/godef/a/random.hover-8-6.golden.go
@@ -0,0 +1 @@
+func Random2(y int) int
\ No newline at end of file
diff --git a/internal/lsp/testdata/godef/b/b.hover-11-6.golden.go b/internal/lsp/testdata/godef/b/b.hover-11-6.golden.go
new file mode 100644
index 0000000..63622cd
--- /dev/null
+++ b/internal/lsp/testdata/godef/b/b.hover-11-6.golden.go
@@ -0,0 +1 @@
+type S2 struct{F1 string; F2 int; *a.A}
\ No newline at end of file
diff --git a/internal/lsp/testdata/godef/b/b.hover-12-2.golden.go b/internal/lsp/testdata/godef/b/b.hover-12-2.golden.go
new file mode 100644
index 0000000..718de00
--- /dev/null
+++ b/internal/lsp/testdata/godef/b/b.hover-12-2.golden.go
@@ -0,0 +1 @@
+field F1 string
\ No newline at end of file
diff --git a/internal/lsp/testdata/godef/b/b.hover-13-2.golden.go b/internal/lsp/testdata/godef/b/b.hover-13-2.golden.go
new file mode 100644
index 0000000..e66621c
--- /dev/null
+++ b/internal/lsp/testdata/godef/b/b.hover-13-2.golden.go
@@ -0,0 +1 @@
+field F2 int
\ No newline at end of file
diff --git a/internal/lsp/testdata/godef/b/b.hover-5-6.golden.go b/internal/lsp/testdata/godef/b/b.hover-5-6.golden.go
new file mode 100644
index 0000000..12dd895
--- /dev/null
+++ b/internal/lsp/testdata/godef/b/b.hover-5-6.golden.go
@@ -0,0 +1 @@
+type S1 struct{F1 int; S2; a.A}
\ No newline at end of file
diff --git a/internal/lsp/testdata/godef/b/b.hover-6-2.golden.go b/internal/lsp/testdata/godef/b/b.hover-6-2.golden.go
new file mode 100644
index 0000000..709c455
--- /dev/null
+++ b/internal/lsp/testdata/godef/b/b.hover-6-2.golden.go
@@ -0,0 +1 @@
+field F1 int
\ No newline at end of file
diff --git a/internal/lsp/testdata/godef/b/b.hover-7-2.golden.go b/internal/lsp/testdata/godef/b/b.hover-7-2.golden.go
new file mode 100644
index 0000000..fa14bfa
--- /dev/null
+++ b/internal/lsp/testdata/godef/b/b.hover-7-2.golden.go
@@ -0,0 +1 @@
+field S2 S2
\ No newline at end of file
diff --git a/internal/lsp/testdata/godef/broken/unclosedIf.hover-7-7.golden.go b/internal/lsp/testdata/godef/broken/unclosedIf.hover-7-7.golden.go
new file mode 100644
index 0000000..857d09d
--- /dev/null
+++ b/internal/lsp/testdata/godef/broken/unclosedIf.hover-7-7.golden.go
@@ -0,0 +1 @@
+var myUnclosedIf string
\ No newline at end of file