| // Copyright 2019 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 fetch | |
| import ( | |
| "path" | |
| "sort" | |
| "testing" | |
| "github.com/google/go-cmp/cmp" | |
| "golang.org/x/pkgsite/internal/stdlib" | |
| ) | |
| func TestDirectoryPaths(t *testing.T) { | |
| for _, test := range []struct { | |
| name, modulePath string | |
| packageSuffixes []string | |
| want []string | |
| }{ | |
| { | |
| name: "no packages", | |
| modulePath: "github.com/empty/module", | |
| want: []string{"github.com/empty/module"}, | |
| }, | |
| { | |
| name: "only root package", | |
| modulePath: "github.com/russross/blackfriday", | |
| packageSuffixes: []string{""}, | |
| want: []string{"github.com/russross/blackfriday"}, | |
| }, | |
| { | |
| name: "multiple packages and directories", | |
| modulePath: "github.com/elastic/go-elasticsearch/v7", | |
| packageSuffixes: []string{ | |
| "esapi", | |
| "estransport", | |
| "esutil", | |
| "internal/version", | |
| }, | |
| want: []string{ | |
| "github.com/elastic/go-elasticsearch/v7", | |
| "github.com/elastic/go-elasticsearch/v7/esapi", | |
| "github.com/elastic/go-elasticsearch/v7/estransport", | |
| "github.com/elastic/go-elasticsearch/v7/esutil", | |
| "github.com/elastic/go-elasticsearch/v7/internal", | |
| "github.com/elastic/go-elasticsearch/v7/internal/version", | |
| }, | |
| }, | |
| { | |
| name: "std lib", | |
| modulePath: stdlib.ModulePath, | |
| packageSuffixes: []string{"cmd/go"}, | |
| want: []string{"cmd", "cmd/go", "std"}, | |
| }, | |
| } { | |
| t.Run(test.name, func(t *testing.T) { | |
| var packages []*packageMeta | |
| for _, suffix := range test.packageSuffixes { | |
| packages = append(packages, samplePackageMeta(test.modulePath, suffix)) | |
| } | |
| got := unitPaths(test.modulePath, packages) | |
| sort.Strings(got) | |
| if diff := cmp.Diff(test.want, got); diff != "" { | |
| t.Errorf("unitPaths(%q, %q) mismatch (-want +got):\n%s", | |
| test.modulePath, test.packageSuffixes, diff) | |
| } | |
| }) | |
| } | |
| } | |
| // samplePackageMeta constructs a package with the given module path and suffix. | |
| // | |
| // If modulePath is the standard library, the package path is the | |
| // suffix, which must not be empty. Otherwise, the package path | |
| // is the concatenation of modulePath and suffix. | |
| // | |
| // The package name is last component of the package path. | |
| func samplePackageMeta(modulePath, suffix string) *packageMeta { | |
| p := constructFullPath(modulePath, suffix) | |
| return &packageMeta{ | |
| name: path.Base(p), | |
| path: p, | |
| } | |
| } | |
| func constructFullPath(modulePath, suffix string) string { | |
| if modulePath != stdlib.ModulePath { | |
| return path.Join(modulePath, suffix) | |
| } | |
| return suffix | |
| } |