github.com/cockroachdb/tools@v0.0.0-20230222021103-a6d27438930d/go/analysis/analysistest/analysistest_test.go (about)

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