// Copyright 2020 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 main

import (
	"runtime"
	"testing"
)

func TestHasPathPrefix(t *testing.T) {
	for _, test := range []struct {
		desc, path, prefix string
		want               bool
	}{
		{
			desc:   "empty_prefix",
			path:   "a/b",
			prefix: "",
			want:   true,
		}, {
			desc:   "partial_prefix",
			path:   "a/b",
			prefix: "a",
			want:   true,
		}, {
			desc:   "full_prefix",
			path:   "a/b",
			prefix: "a/b",
			want:   true,
		}, {
			desc:   "partial_component",
			path:   "aa/b",
			prefix: "a",
			want:   false,
		},
	} {
		t.Run(test.desc, func(t *testing.T) {
			if got := hasPathPrefix(test.path, test.prefix); got != test.want {
				t.Errorf("hasPathPrefix(%q, %q): got %v, want %v", test.path, test.prefix, got, test.want)
			}
		})
	}
}

func TestHasFilePathPrefix(t *testing.T) {
	type test struct {
		desc, path, prefix string
		want               bool
	}
	var tests []test
	if runtime.GOOS == "windows" {
		tests = []test{
			{
				desc:   "empty_prefix",
				path:   `c:\a\b`,
				prefix: "",
				want:   true,
			}, {
				desc:   "drive_prefix",
				path:   `c:\a\b`,
				prefix: `c:\`,
				want:   true,
			}, {
				desc:   "partial_prefix",
				path:   `c:\a\b`,
				prefix: `c:\a`,
				want:   true,
			}, {
				desc:   "full_prefix",
				path:   `c:\a\b`,
				prefix: `c:\a\b`,
				want:   true,
			}, {
				desc:   "partial_component",
				path:   `c:\aa\b`,
				prefix: `c:\a`,
				want:   false,
			},
		}
	} else {
		tests = []test{
			{
				desc:   "empty_prefix",
				path:   "/a/b",
				prefix: "",
				want:   true,
			}, {
				desc:   "partial_prefix",
				path:   "/a/b",
				prefix: "/a",
				want:   true,
			}, {
				desc:   "full_prefix",
				path:   "/a/b",
				prefix: "/a/b",
				want:   true,
			}, {
				desc:   "partial_component",
				path:   "/aa/b",
				prefix: "/a",
				want:   false,
			},
		}
	}
	for _, test := range tests {
		t.Run(test.desc, func(t *testing.T) {
			if got := hasFilePathPrefix(test.path, test.prefix); got != test.want {
				t.Errorf("hasFilePathPrefix(%q, %q): got %v, want %v", test.path, test.prefix, got, test.want)
			}
		})
	}
}

func TestTrimPathPrefix(t *testing.T) {
	for _, test := range []struct {
		desc, path, prefix, want string
	}{
		{
			desc:   "empty_prefix",
			path:   "a/b",
			prefix: "",
			want:   "a/b",
		}, {
			desc:   "abs_empty_prefix",
			path:   "/a/b",
			prefix: "",
			want:   "/a/b",
		}, {
			desc:   "partial_prefix",
			path:   "a/b",
			prefix: "a",
			want:   "b",
		}, {
			desc:   "full_prefix",
			path:   "a/b",
			prefix: "a/b",
			want:   "",
		}, {
			desc:   "partial_component",
			path:   "aa/b",
			prefix: "a",
			want:   "aa/b",
		},
	} {
		t.Run(test.desc, func(t *testing.T) {
			if got := trimPathPrefix(test.path, test.prefix); got != test.want {
				t.Errorf("trimPathPrefix(%q, %q): got %q, want %q", test.path, test.prefix, got, test.want)
			}
		})
	}
}
