github.com/zmb3/gogetdoc@v0.0.0-20190228002656-b37376c5da6a/main_test.go (about) 1 package main 2 3 import ( 4 "go/token" 5 "os" 6 "path/filepath" 7 "runtime" 8 "strconv" 9 "strings" 10 "testing" 11 12 "golang.org/x/tools/go/packages" 13 "golang.org/x/tools/go/packages/packagestest" 14 ) 15 16 func TestParseValidPos(t *testing.T) { 17 fname, offset, err := parsePos("foo.go:#123") 18 if fname != "foo.go" { 19 t.Errorf("want foo.go, got %v", fname) 20 } 21 if offset != 123 { 22 t.Errorf("want 123, got %v", 123) 23 } 24 if err != nil { 25 t.Error(err) 26 } 27 } 28 29 func TestParseEmptyPos(t *testing.T) { 30 _, _, err := parsePos("") 31 if err == nil { 32 t.Error("expected error") 33 } 34 } 35 36 func TestParseInvalidPos(t *testing.T) { 37 for _, input := range []string{ 38 "foo.go:123", 39 "foo.go#123", 40 "foo.go#:123", 41 "123", 42 "foo.go::123", 43 "foo.go##123", 44 "#:123", 45 } { 46 if _, _, err := parsePos(input); err == nil { 47 t.Errorf("expected %v to be invalid", input) 48 } 49 } 50 } 51 52 func TestRunInvalidPos(t *testing.T) { 53 dir := filepath.Join(".", "testdata", "package") 54 mods := []packagestest.Module{ 55 {Name: "somepkg", Files: packagestest.MustCopyFileTree(dir)}, 56 } 57 packagestest.TestAll(t, func(t *testing.T, exporter packagestest.Exporter) { 58 if exporter == packagestest.Modules && !modulesSupported() { 59 t.Skip("Skipping modules test on", runtime.Version()) 60 } 61 exported := packagestest.Export(t, exporter, mods) 62 defer exported.Cleanup() 63 64 teardown := setup(exported.Config) 65 defer teardown() 66 67 filename := exported.File("somepkg", "idents.go") 68 _, err := Run(filename, 5000, nil) 69 if err == nil { 70 t.Fatal("expected invalid pos error") 71 } 72 }) 73 } 74 75 // github.com/zmb3/gogetdoc/issues/44 76 func TestInterfaceDecls(t *testing.T) { 77 mods := []packagestest.Module{ 78 { 79 Name: "rabbit", 80 Files: packagestest.MustCopyFileTree(filepath.Join(".", "testdata", "interface-decls")), 81 }, 82 } 83 // TODO: convert to packagestest.TestAll 84 exported := packagestest.Export(t, packagestest.GOPATH, mods) 85 defer exported.Cleanup() 86 87 teardown := setup(exported.Config) 88 defer teardown() 89 90 filename := exported.File("rabbit", "rabbit.go") 91 92 if expectErr := exported.Expect(map[string]interface{}{ 93 "decl": func(p token.Position, decl string) { 94 doc, err := Run(filename, p.Offset, nil) 95 if err != nil { 96 t.Error(err) 97 } 98 if doc.Decl != decl { 99 t.Errorf("bad decl, want %q, got %q", decl, doc.Decl) 100 } 101 }, 102 }); expectErr != nil { 103 t.Fatal(expectErr) 104 } 105 } 106 107 func modulesSupported() bool { 108 v := strings.TrimPrefix(runtime.Version(), "go") 109 parts := strings.Split(v, ".") 110 if len(parts) < 2 { 111 return false 112 } 113 minor, err := strconv.Atoi(parts[1]) 114 if err != nil { 115 return false 116 } 117 return minor >= 11 118 } 119 120 func setup(cfg *packages.Config) func() { 121 originalDir, err := os.Getwd() 122 if err != nil { 123 panic(err) 124 } 125 err = os.Chdir(cfg.Dir) 126 if err != nil { 127 panic(err) 128 } 129 130 setEnv := func(env []string) { 131 for _, assignment := range env { 132 if i := strings.Index(assignment, "="); i > 0 { 133 os.Setenv(assignment[:i], assignment[i+1:]) 134 } 135 } 136 } 137 originalEnv := os.Environ() 138 setEnv(cfg.Env) 139 os.Setenv("PWD", cfg.Dir) // https://go-review.googlesource.com/c/tools/+/143517/ 140 141 return func() { 142 os.Chdir(originalDir) 143 setEnv(originalEnv) 144 } 145 } 146 147 func TestIssue52(t *testing.T) { 148 dir := filepath.Join(".", "testdata", "issue52") 149 mods := []packagestest.Module{ 150 {Name: "issue52", Files: packagestest.MustCopyFileTree(dir)}, 151 } 152 packagestest.TestAll(t, func(t *testing.T, exporter packagestest.Exporter) { 153 if exporter == packagestest.Modules && !modulesSupported() { 154 t.Skip("Skipping modules test on", runtime.Version()) 155 } 156 exported := packagestest.Export(t, exporter, mods) 157 defer exported.Cleanup() 158 159 teardown := setup(exported.Config) 160 defer teardown() 161 162 filename := exported.File("issue52", "main.go") 163 164 for _, test := range []struct { 165 Pos int 166 Doc string 167 }{ 168 {64, "V this works\n"}, 169 {66, "Foo this doesn't work but should\n"}, 170 } { 171 doc, err := Run(filename, test.Pos, nil) 172 if err != nil { 173 t.Fatalf("issue52, pos %d: %v", test.Pos, err) 174 } 175 if doc.Doc != test.Doc { 176 t.Errorf("issue52, pos %d, invalid decl: want %q, got %q", test.Pos, test.Doc, doc.Doc) 177 } 178 } 179 }) 180 }