--- /dev/null
+// Copyright 2018 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 packagestest_test
+
+import (
+ "os"
+ "path/filepath"
+ "testing"
+
+ "golang.org/x/tools/go/packages/packagestest"
+)
+
+var testdata = []packagestest.Module{{
+ Name: "golang.org/fake1",
+ Files: map[string]interface{}{
+ "a.go": packagestest.Symlink("testdata/a.go"),
+ "b.go": "invalid file contents",
+ },
+ Overlay: map[string][]byte{
+ "b.go": []byte("package fake1"),
+ "c.go": []byte("package fake1"),
+ },
+}, {
+ Name: "golang.org/fake2",
+ Files: map[string]interface{}{
+ "other/a.go": "package fake2",
+ },
+}, {
+ Name: "golang.org/fake2/v2",
+ Files: map[string]interface{}{
+ "other/a.go": "package fake2",
+ },
+}, {
+ Name: "golang.org/fake3@v1.0.0",
+ Files: map[string]interface{}{
+ "other/a.go": "package fake3",
+ },
+}, {
+ Name: "golang.org/fake3@v1.1.0",
+ Files: map[string]interface{}{
+ "other/a.go": "package fake3",
+ },
+}}
+
+type fileTest struct {
+ module, fragment, expect string
+ check func(t *testing.T, exported *packagestest.Exported, filename string)
+}
+
+func checkFiles(t *testing.T, exported *packagestest.Exported, tests []fileTest) {
+ for _, test := range tests {
+ expect := filepath.Join(exported.Temp(), filepath.FromSlash(test.expect))
+ got := exported.File(test.module, test.fragment)
+ if got == "" {
+ t.Errorf("File %v missing from the output", expect)
+ } else if got != expect {
+ t.Errorf("Got file %v, expected %v", got, expect)
+ }
+ if test.check != nil {
+ test.check(t, exported, got)
+ }
+ }
+}
+
+func checkLink(expect string) func(t *testing.T, exported *packagestest.Exported, filename string) {
+ expect = filepath.FromSlash(expect)
+ return func(t *testing.T, exported *packagestest.Exported, filename string) {
+ if target, err := os.Readlink(filename); err != nil {
+ t.Errorf("Error checking link %v: %v", filename, err)
+ } else if target != expect {
+ t.Errorf("Link %v does not match, got %v expected %v", filename, target, expect)
+ }
+ }
+}
+
+func checkContent(expect string) func(t *testing.T, exported *packagestest.Exported, filename string) {
+ return func(t *testing.T, exported *packagestest.Exported, filename string) {
+ if content, err := exported.FileContents(filename); err != nil {
+ t.Errorf("Error reading %v: %v", filename, err)
+ } else if string(content) != expect {
+ t.Errorf("Content of %v does not match, got %v expected %v", filename, string(content), expect)
+ }
+ }
+}
+
+func TestGroupFilesByModules(t *testing.T) {
+ for _, tt := range []struct {
+ testdir string
+ want []packagestest.Module
+ }{
+ {
+ testdir: "testdata/groups/one",
+ want: []packagestest.Module{
+ {
+ Name: "testdata/groups/one",
+ Files: map[string]interface{}{
+ "main.go": true,
+ },
+ },
+ {
+ Name: "example.com/extra",
+ Files: map[string]interface{}{
+ "help.go": true,
+ },
+ },
+ },
+ },
+ {
+ testdir: "testdata/groups/two",
+ want: []packagestest.Module{
+ {
+ Name: "testdata/groups/two",
+ Files: map[string]interface{}{
+ "main.go": true,
+ "expect/yo.go": true,
+ "expect/yo_test.go": true,
+ },
+ },
+ {
+ Name: "example.com/extra",
+ Files: map[string]interface{}{
+ "yo.go": true,
+ "geez/help.go": true,
+ },
+ },
+ {
+ Name: "example.com/extra/v2",
+ Files: map[string]interface{}{
+ "me.go": true,
+ "geez/help.go": true,
+ },
+ },
+ {
+ Name: "example.com/tempmod",
+ Files: map[string]interface{}{
+ "main.go": true,
+ },
+ },
+ {
+ Name: "example.com/what@v1.0.0",
+ Files: map[string]interface{}{
+ "main.go": true,
+ },
+ },
+ {
+ Name: "example.com/what@v1.1.0",
+ Files: map[string]interface{}{
+ "main.go": true,
+ },
+ },
+ },
+ },
+ } {
+ t.Run(tt.testdir, func(t *testing.T) {
+ got, err := packagestest.GroupFilesByModules(tt.testdir)
+ if err != nil {
+ t.Fatalf("could not group files %v", err)
+ }
+ if len(got) != len(tt.want) {
+ t.Fatalf("%s: wanted %d modules but got %d", tt.testdir, len(tt.want), len(got))
+ }
+ for i, w := range tt.want {
+ g := got[i]
+ if filepath.FromSlash(g.Name) != filepath.FromSlash(w.Name) {
+ t.Fatalf("%s: wanted module[%d].Name to be %s but got %s", tt.testdir, i, filepath.FromSlash(w.Name), filepath.FromSlash(g.Name))
+ }
+ for fh := range w.Files {
+ if _, ok := g.Files[fh]; !ok {
+ t.Fatalf("%s, module[%d]: wanted %s but could not find", tt.testdir, i, fh)
+ }
+ }
+ for fh := range g.Files {
+ if _, ok := w.Files[fh]; !ok {
+ t.Fatalf("%s, module[%d]: found unexpected file %s", tt.testdir, i, fh)
+ }
+ }
+ }
+ })
+ }
+}