1package analysistest_test
2
3import (
4	"fmt"
5	"log"
6	"os"
7	"reflect"
8	"strings"
9	"testing"
10
11	"golang.org/x/tools/go/analysis/analysistest"
12	"golang.org/x/tools/go/analysis/passes/findcall"
13	"golang.org/x/tools/internal/testenv"
14)
15
16func init() {
17	// This test currently requires GOPATH mode.
18	// Explicitly disabling module mode should suffice, but
19	// we'll also turn off GOPROXY just for good measure.
20	if err := os.Setenv("GO111MODULE", "off"); err != nil {
21		log.Fatal(err)
22	}
23	if err := os.Setenv("GOPROXY", "off"); err != nil {
24		log.Fatal(err)
25	}
26}
27
28// TestTheTest tests the analysistest testing infrastructure.
29func TestTheTest(t *testing.T) {
30	testenv.NeedsTool(t, "go")
31
32	// We'll simulate a partly failing test of the findcall analysis,
33	// which (by default) reports calls to functions named 'println'.
34	findcall.Analyzer.Flags.Set("name", "println")
35
36	filemap := map[string]string{
37		"a/b.go": `package main // want package:"found"
38
39func main() {
40	// The expectation is ill-formed:
41	print() // want: "diagnostic"
42	print() // want foo"fact"
43	print() // want foo:
44	print() // want "\xZZ scan error"
45
46	// A diagnostic is reported at this line, but the expectation doesn't match:
47	println("hello, world") // want "wrong expectation text"
48
49	// An unexpected diagnostic is reported at this line:
50	println() // trigger an unexpected diagnostic
51
52	// No diagnostic is reported at this line:
53	print()	// want "unsatisfied expectation"
54
55	// OK
56	println("hello, world") // want "call of println"
57
58	// OK /* */-form.
59	println("안녕, 세계") /* want "call of println" */
60
61	// OK  (nested comment)
62	println("Γειά σου, Κόσμε") // some comment // want "call of println"
63
64	// OK (nested comment in /**/)
65	println("你好,世界") /* some comment // want "call of println" */
66
67	// OK (multiple expectations on same line)
68	println(); println() // want "call of println(...)" "call of println(...)"
69}
70
71// OK (facts and diagnostics on same line)
72func println(...interface{}) { println() } // want println:"found" "call of println(...)"
73
74`,
75		"a/b.go.golden": `package main // want package:"found"
76
77func main() {
78	// The expectation is ill-formed:
79	print() // want: "diagnostic"
80	print() // want foo"fact"
81	print() // want foo:
82	print() // want "\xZZ scan error"
83
84	// A diagnostic is reported at this line, but the expectation doesn't match:
85	println_TEST_("hello, world") // want "wrong expectation text"
86
87	// An unexpected diagnostic is reported at this line:
88	println_TEST_() // trigger an unexpected diagnostic
89
90	// No diagnostic is reported at this line:
91	print() // want "unsatisfied expectation"
92
93	// OK
94	println_TEST_("hello, world") // want "call of println"
95
96	// OK /* */-form.
97	println_TEST_("안녕, 세계") /* want "call of println" */
98
99	// OK  (nested comment)
100	println_TEST_("Γειά σου, Κόσμε") // some comment // want "call of println"
101
102	// OK (nested comment in /**/)
103	println_TEST_("你好,世界") /* some comment // want "call of println" */
104
105	// OK (multiple expectations on same line)
106	println_TEST_()
107	println_TEST_() // want "call of println(...)" "call of println(...)"
108}
109
110// OK (facts and diagnostics on same line)
111func println(...interface{}) { println_TEST_() } // want println:"found" "call of println(...)"
112`,
113		"a/b_test.go": `package main
114
115// Test file shouldn't mess with things (issue #40574)
116`,
117	}
118	dir, cleanup, err := analysistest.WriteFiles(filemap)
119	if err != nil {
120		t.Fatal(err)
121	}
122	defer cleanup()
123
124	var got []string
125	t2 := errorfunc(func(s string) { got = append(got, s) }) // a fake *testing.T
126	analysistest.RunWithSuggestedFixes(t2, dir, findcall.Analyzer, "a")
127
128	want := []string{
129		`a/b.go:5: in 'want' comment: unexpected ":"`,
130		`a/b.go:6: in 'want' comment: got String after foo, want ':'`,
131		`a/b.go:7: in 'want' comment: got EOF, want regular expression`,
132		`a/b.go:8: in 'want' comment: invalid char escape`,
133		`a/b.go:11:9: diagnostic "call of println(...)" does not match pattern "wrong expectation text"`,
134		`a/b.go:14:9: unexpected diagnostic: call of println(...)`,
135		`a/b.go:11: no diagnostic was reported matching "wrong expectation text"`,
136		`a/b.go:17: no diagnostic was reported matching "unsatisfied expectation"`,
137		// duplicate copies of each message from the test package (see issue #40574)
138		`a/b.go:5: in 'want' comment: unexpected ":"`,
139		`a/b.go:6: in 'want' comment: got String after foo, want ':'`,
140		`a/b.go:7: in 'want' comment: got EOF, want regular expression`,
141		`a/b.go:8: in 'want' comment: invalid char escape`,
142		`a/b.go:11:9: diagnostic "call of println(...)" does not match pattern "wrong expectation text"`,
143		`a/b.go:14:9: unexpected diagnostic: call of println(...)`,
144		`a/b.go:11: no diagnostic was reported matching "wrong expectation text"`,
145		`a/b.go:17: no diagnostic was reported matching "unsatisfied expectation"`,
146	}
147	if !reflect.DeepEqual(got, want) {
148		t.Errorf("got:\n%s\nwant:\n%s",
149			strings.Join(got, "\n"),
150			strings.Join(want, "\n"))
151	}
152}
153
154type errorfunc func(string)
155
156func (f errorfunc) Errorf(format string, args ...interface{}) {
157	f(fmt.Sprintf(format, args...))
158}
159