.gitignore added
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / tools@v0.1.0 / cmd / guru / unit_test.go
diff --git a/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.1.0/cmd/guru/unit_test.go b/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.1.0/cmd/guru/unit_test.go
new file mode 100644 (file)
index 0000000..699e6a1
--- /dev/null
@@ -0,0 +1,105 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+       "fmt"
+       "go/build"
+       "io/ioutil"
+       "os"
+       "path/filepath"
+       "runtime"
+       "strings"
+       "testing"
+)
+
+// Unit tests for internal guru functions
+
+func TestIssue17515(t *testing.T) {
+       // Tests handling of symlinks in function guessImportPath
+       // If we have Go code inside $HOME/go/src and create a symlink $HOME/src to it
+       // there are 4 possible cases that need to be tested:
+       // (1) absolute & absolute: GOPATH=$HOME/go/src file=$HOME/go/src/test/test.go
+       // (2) absolute & symlink:  GOPATH=$HOME/go/src file=$HOME/src/test/test.go
+       // (3) symlink & symlink:   GOPATH=$HOME/src file=$HOME/src/test/test.go
+       // (4) symlink & absolute:  GOPATH=$HOME/src file= $HOME/go/src/test/test.go
+
+       // Create a temporary home directory under /tmp
+       home, err := ioutil.TempDir(os.TempDir(), "home")
+       if err != nil {
+               t.Errorf("Unable to create a temporary directory in %s", os.TempDir())
+       }
+
+       defer os.RemoveAll(home)
+
+       // create filepath /tmp/home/go/src/test/test.go
+       if err = os.MkdirAll(home+"/go/src/test", 0755); err != nil {
+               t.Fatal(err)
+       }
+
+       var buildContext = build.Default
+
+       // Success test cases
+       type SuccessTest struct {
+               gopath, filename, wantSrcdir string
+       }
+
+       successTests := []SuccessTest{
+               {home + "/go", home + "/go/src/test/test.go", filepath.FromSlash(home + "/go/src")},
+       }
+
+       // Add symlink cases if not on Windows, Plan 9
+       if runtime.GOOS != "windows" && runtime.GOOS != "plan9" {
+               // symlink between /tmp/home/go/src and /tmp/home/src
+               if err := os.Symlink(home+"/go/src", home+"/src"); err != nil {
+                       t.Fatal(err)
+               }
+
+               successTests = append(successTests, []SuccessTest{
+                       {home + "/go", home + "/src/test/test.go", filepath.FromSlash(home + "/go/src")},
+                       {home, home + "/go/src/test/test.go", filepath.FromSlash(home + "/src")},
+                       {home, home + "/src/test/test.go", filepath.FromSlash(home + "/src")},
+               }...)
+       }
+
+       for _, test := range successTests {
+               buildContext.GOPATH = test.gopath
+               srcdir, importPath, err := guessImportPath(test.filename, &buildContext)
+               if srcdir != test.wantSrcdir || importPath != "test" || err != nil {
+                       t.Errorf("guessImportPath(%q, %q) = %q, %q, %q; want %q, %q, %q",
+                               test.filename, test.gopath, srcdir, importPath, err, test.wantSrcdir, "test", "nil")
+               }
+       }
+       // Function to format expected error message
+       errFormat := func(fpath string) string {
+               return fmt.Sprintf("can't evaluate symlinks of %s", fpath)
+       }
+
+       // Failure test cases
+       type FailTest struct {
+               gopath, filename, wantErr string
+       }
+
+       failTests := []FailTest{
+               {home + "/go", home + "/go/src/fake/test.go", errFormat(filepath.FromSlash(home + "/go/src/fake"))},
+       }
+
+       if runtime.GOOS != "windows" && runtime.GOOS != "plan9" {
+               failTests = append(failTests, []FailTest{
+                       {home + "/go", home + "/src/fake/test.go", errFormat(filepath.FromSlash(home + "/src/fake"))},
+                       {home, home + "/src/fake/test.go", errFormat(filepath.FromSlash(home + "/src/fake"))},
+                       {home, home + "/go/src/fake/test.go", errFormat(filepath.FromSlash(home + "/go/src/fake"))},
+               }...)
+       }
+
+       for _, test := range failTests {
+               buildContext.GOPATH = test.gopath
+               srcdir, importPath, err := guessImportPath(test.filename, &buildContext)
+               if !strings.HasPrefix(fmt.Sprint(err), test.wantErr) {
+                       t.Errorf("guessImportPath(%q, %q) = %q, %q, %q; want %q, %q, %q",
+                               test.filename, test.gopath, srcdir, importPath, err, "", "", test.wantErr)
+               }
+       }
+}