// 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
}
