Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / tools@v0.0.0-20201105173854-bc9fc8d8c4bc / refactor / importgraph / graph_test.go
diff --git a/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201105173854-bc9fc8d8c4bc/refactor/importgraph/graph_test.go b/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201105173854-bc9fc8d8c4bc/refactor/importgraph/graph_test.go
new file mode 100644 (file)
index 0000000..e342323
--- /dev/null
@@ -0,0 +1,119 @@
+// Copyright 2015 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.
+
+// Incomplete std lib sources on Android.
+
+// +build !android
+
+package importgraph_test
+
+import (
+       "go/build"
+       "sort"
+       "strings"
+       "testing"
+
+       "golang.org/x/tools/go/packages/packagestest"
+       "golang.org/x/tools/refactor/importgraph"
+
+       _ "crypto/hmac" // just for test, below
+)
+
+const this = "golang.org/x/tools/refactor/importgraph"
+
+func TestBuild(t *testing.T) {
+       exported := packagestest.Export(t, packagestest.GOPATH, []packagestest.Module{
+               {Name: "golang.org/x/tools/refactor/importgraph", Files: packagestest.MustCopyFileTree(".")}})
+       defer exported.Cleanup()
+
+       var gopath string
+       for _, env := range exported.Config.Env {
+               if !strings.HasPrefix(env, "GOPATH=") {
+                       continue
+               }
+               gopath = strings.TrimPrefix(env, "GOPATH=")
+       }
+       if gopath == "" {
+               t.Fatal("Failed to fish GOPATH out of env: ", exported.Config.Env)
+       }
+
+       var buildContext = build.Default
+       buildContext.GOPATH = gopath
+
+       forward, reverse, errors := importgraph.Build(&buildContext)
+
+       // Test direct edges.
+       // We throw in crypto/hmac to prove that external test files
+       // (such as this one) are inspected.
+       for _, p := range []string{"go/build", "testing", "crypto/hmac"} {
+               if !forward[this][p] {
+                       t.Errorf("forward[importgraph][%s] not found", p)
+               }
+               if !reverse[p][this] {
+                       t.Errorf("reverse[%s][importgraph] not found", p)
+               }
+       }
+
+       // Test non-existent direct edges
+       for _, p := range []string{"errors", "reflect"} {
+               if forward[this][p] {
+                       t.Errorf("unexpected: forward[importgraph][%s] found", p)
+               }
+               if reverse[p][this] {
+                       t.Errorf("unexpected: reverse[%s][importgraph] found", p)
+               }
+       }
+
+       // Test Search is reflexive.
+       if !forward.Search(this)[this] {
+               t.Errorf("irreflexive: forward.Search(importgraph)[importgraph] not found")
+       }
+       if !reverse.Search(this)[this] {
+               t.Errorf("irrefexive: reverse.Search(importgraph)[importgraph] not found")
+       }
+
+       // Test Search is transitive.  (There is no direct edge to these packages.)
+       for _, p := range []string{"errors", "reflect", "unsafe"} {
+               if !forward.Search(this)[p] {
+                       t.Errorf("intransitive: forward.Search(importgraph)[%s] not found", p)
+               }
+               if !reverse.Search(p)[this] {
+                       t.Errorf("intransitive: reverse.Search(%s)[importgraph] not found", p)
+               }
+       }
+
+       // Test strongly-connected components.  Because A's external
+       // test package can depend on B, and vice versa, most of the
+       // standard libraries are mutually dependent when their external
+       // tests are considered.
+       //
+       // For any nodes x, y in the same SCC, y appears in the results
+       // of both forward and reverse searches starting from x
+       if !forward.Search("fmt")["io"] ||
+               !forward.Search("io")["fmt"] ||
+               !reverse.Search("fmt")["io"] ||
+               !reverse.Search("io")["fmt"] {
+               t.Errorf("fmt and io are not mutually reachable despite being in the same SCC")
+       }
+
+       // debugging
+       if false {
+               for path, err := range errors {
+                       t.Logf("%s: %s", path, err)
+               }
+               printSorted := func(direction string, g importgraph.Graph, start string) {
+                       t.Log(direction)
+                       var pkgs []string
+                       for pkg := range g.Search(start) {
+                               pkgs = append(pkgs, pkg)
+                       }
+                       sort.Strings(pkgs)
+                       for _, pkg := range pkgs {
+                               t.Logf("\t%s", pkg)
+                       }
+               }
+               printSorted("forward", forward, this)
+               printSorted("reverse", reverse, this)
+       }
+}