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  }