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

import (
	"testing"

	"golang.org/x/pkgsite/internal/stdlib"
)

func TestSeriesPathForModule(t *testing.T) {
	for _, test := range []struct {
		modulePath, wantSeriesPath string
	}{
		{
			modulePath:     "github.com/foo",
			wantSeriesPath: "github.com/foo",
		},
		{
			modulePath:     "github.com/foo/v2",
			wantSeriesPath: "github.com/foo",
		},
		{
			modulePath:     "std",
			wantSeriesPath: "std",
		},
		{
			modulePath:     "gopkg.in/russross/blackfriday.v2",
			wantSeriesPath: "gopkg.in/russross/blackfriday",
		},
	} {
		t.Run(test.modulePath, func(t *testing.T) {
			if got := SeriesPathForModule(test.modulePath); got != test.wantSeriesPath {
				t.Errorf("SeriesPathForModule(%q) = %q; want = %q", test.modulePath, got, test.wantSeriesPath)
			}
		})
	}
}

func TestMajorVersionForModule(t *testing.T) {
	for _, test := range []struct {
		in, want string
	}{
		{"m.com", ""},
		{"m.com/v2", "v2"},
		{"gopkg.in/m.v1", "v1"},
		{"m.com/v2.1", ""},
		{"", ""},
	} {
		got := MajorVersionForModule(test.in)
		if got != test.want {
			t.Errorf("%q: got %q, want %q", test.in, got, test.want)
		}
	}
}

func TestSeriesPathAndMajorVersion(t *testing.T) {
	for _, test := range []struct {
		in             string
		wantSeriesPath string
		wantVersion    int
	}{
		{"m.com", "m.com", 1},
		{"m.com/v123", "m.com", 123},
		{"gopkg.in/m.v1", "gopkg.in/m", 1},
		{"gopkg.in/m.v35", "gopkg.in/m", 35},
		{"m.com/v1.2", "", 0},
	} {
		gotSeriesPath, gotVersion := SeriesPathAndMajorVersion(test.in)
		if gotSeriesPath != test.wantSeriesPath || gotVersion != test.wantVersion {
			t.Errorf("SeriesPathAndMajorVersion(%q) = (%s, %d), want (%s, %d)",
				test.in, gotSeriesPath, gotVersion, test.wantSeriesPath, test.wantVersion)
		}
	}
}

func TestV1Path(t *testing.T) {
	for _, test := range []struct {
		modulePath, suffix string
		want               string
	}{
		{"mod.com/foo", "bar", "mod.com/foo/bar"},
		{"mod.com/foo/v2", "bar", "mod.com/foo/bar"},
		{"std", "bar/baz", "bar/baz"},
	} {
		p := test.suffix
		if test.modulePath != stdlib.ModulePath {
			p = test.modulePath + "/" + test.suffix
		}
		got := V1Path(p, test.modulePath)
		if got != test.want {
			t.Errorf("V1Path(%q, %q) = %q, want %q",
				test.modulePath, p, got, test.want)
		}
	}
}
