package filesystem

import "testing"

func TestJoinPaths(t *testing.T) {
	var ts = []struct {
		trusted   string
		untrusted string
		expected  string
	}{
		{"", "", "."},
		{"", ".", "."},
		{"", "d/e/f", `d\e\f`},
		{"", "./d/e/f", `d\e\f`},
		{"", "../d/e/f", `d\e\f`},
		{"", "/d/e/f", `d\e\f`},
		{"", "../../../windows/system.ini", `windows\system.ini`},
		{"", `C:\windows\system.ini`, `windows\system.ini`},
		{"", `..\..\..\..\C:\windows\system.ini`, `windows\system.ini`},
		{"", `\\server\a\b\c`, `server\a\b\c`},
		{"", `..\..\..\..\\server\a\b\c`, `server\a\b\c`},

		{".", "", "."},
		{".", ".", "."},
		{".", "d/e/f", `d\e\f`},
		{".", "./d/e/f", `d\e\f`},
		{".", "../d/e/f", `d\e\f`},
		{".", "/d/e/f", `d\e\f`},
		{".", "../../../windows/system.ini", `windows\system.ini`},
		{".", `C:\windows\system.ini`, `windows\system.ini`},
		{".", `..\..\..\..\C:\windows\system.ini`, `windows\system.ini`},
		{".", `\\server\a\b\c`, `server\a\b\c`},
		{".", `..\..\..\..\\server\a\b\c`, `server\a\b\c`},

		{"./", "", "."},
		{"./", ".", "."},
		{"./", "d/e/f", `d\e\f`},
		{"./", "./d/e/f", `d\e\f`},
		{"./", "../d/e/f", `d\e\f`},
		{"./", "/d/e/f", `d\e\f`},
		{"./", "../../../windows/system.ini", `windows\system.ini`},
		{"./", `C:\windows\system.ini`, `windows\system.ini`},
		{"./", `..\..\..\..\C:\windows\system.ini`, `windows\system.ini`},
		{"./", `\\server\a\b\c`, `server\a\b\c`},
		{"./", `..\..\..\..\\server\a\b\c`, `server\a\b\c`},

		{"a/b/c", "", `a\b\c`},
		{"a/b/c", ".", `a\b\c`},
		{"a/b/c", "d/e/f", `a\b\c\d\e\f`},
		{"a/b/c", "./d/e/f", `a\b\c\d\e\f`},
		{"a/b/c", "../d/e/f", `a\b\c\d\e\f`},
		{"a/b/c", "../../../windows/system.ini", `a\b\c\windows\system.ini`},
		{"a/b/c", `C:\windows\system.ini`, `a\b\c\C:\windows\system.ini`},
		{"a/b/c", `..\..\..\..\C:\windows\system.ini`, `a\b\c\C:\windows\system.ini`},
		{"a/b/c", `\\server\a\b\c`, `a\b\c\server\a\b\c`},
		{"a/b/c", `..\..\..\..\\server\a\b\c`, `a\b\c\server\a\b\c`},

		{"/a/b/c", "", `\a\b\c`},
		{"/a/b/c", ".", `\a\b\c`},
		{"/a/b/c", "d/e/f", `\a\b\c\d\e\f`},
		{"/a/b/c", "./d/e/f", `\a\b\c\d\e\f`},
		{"/a/b/c", "../d/e/f", `\a\b\c\d\e\f`},
		{"/a/b/c", "../../../windows/system.ini", `\a\b\c\windows\system.ini`},
		{"/a/b/c", `C:\windows\system.ini`, `\a\b\c\C:\windows\system.ini`},
		{"/a/b/c", `..\..\..\..\C:\windows\system.ini`, `\a\b\c\C:\windows\system.ini`},
		{"/a/b/c", `\\server\a\b\c`, `\a\b\c\server\a\b\c`},
		{"/a/b/c", `..\..\..\..\\server\a\b\c`, `\a\b\c\server\a\b\c`},

		{"./a/b/c", "", `a\b\c`},
		{"./a/b/c", ".", `a\b\c`},
		{"./a/b/c", "d/e/f", `a\b\c\d\e\f`},
		{"./a/b/c", "./d/e/f", `a\b\c\d\e\f`},
		{"./a/b/c", "../d/e/f", `a\b\c\d\e\f`},
		{"./a/b/c", "../../../windows/system.ini", `a\b\c\windows\system.ini`},
		{"./a/b/c", `C:\windows\system.ini`, `a\b\c\C:\windows\system.ini`},
		{"./a/b/c", `..\..\..\..\C:\windows\system.ini`, `a\b\c\C:\windows\system.ini`},
		{"./a/b/c", `\\server\a\b\c`, `a\b\c\server\a\b\c`},
		{"./a/b/c", `..\..\..\..\\server\a\b\c`, `a\b\c\server\a\b\c`},

		{"../a/b/c", "", `..\a\b\c`},
		{"../a/b/c", ".", `..\a\b\c`},
		{"../a/b/c", "d/e/f", `..\a\b\c\d\e\f`},
		{"../a/b/c", "./d/e/f", `..\a\b\c\d\e\f`},
		{"../a/b/c", "../d/e/f", `..\a\b\c\d\e\f`},
		{"../a/b/c", "../../../windows/system.ini", `..\a\b\c\windows\system.ini`},
		{"../a/b/c", `C:\windows\system.ini`, `..\a\b\c\C:\windows\system.ini`},
		{"../a/b/c", `..\..\..\..\C:\windows\system.ini`, `..\a\b\c\C:\windows\system.ini`},
		{"../a/b/c", `\\server\a\b\c`, `..\a\b\c\server\a\b\c`},
		{"../a/b/c", `..\..\..\..\\server\a\b\c`, `..\a\b\c\server\a\b\c`},

		{"C:/a/b/c", "", `C:\a\b\c`},
		{"C:/a/b/c", ".", `C:\a\b\c`},
		{"C:/a/b/c", "d/e/f", `C:\a\b\c\d\e\f`},
		{"C:/a/b/c", "./d/e/f", `C:\a\b\c\d\e\f`},
		{"C:/a/b/c", "../d/e/f", `C:\a\b\c\d\e\f`},
		{"C:/a/b/c", "../../../windows/system.ini", `C:\a\b\c\windows\system.ini`},
		{"C:/a/b/c", `C:\windows\system.ini`, `C:\a\b\c\C:\windows\system.ini`},
		{"C:/a/b/c", `..\..\..\..\C:\windows\system.ini`, `C:\a\b\c\C:\windows\system.ini`},
		{"C:/a/b/c", `\\server\a\b\c`, `C:\a\b\c\server\a\b\c`},
		{"C:/a/b/c", `..\..\..\..\\server\a\b\c`, `C:\a\b\c\server\a\b\c`},

		{`\\server\a\b\c`, "", `\\server\a\b\c`},
		{`\\server\a\b\c`, ".", `\\server\a\b\c`},
		{`\\server\a\b\c`, "d/e/f", `\\server\a\b\c\d\e\f`},
		{`\\server\a\b\c`, "./d/e/f", `\\server\a\b\c\d\e\f`},
		{`\\server\a\b\c`, "../d/e/f", `\\server\a\b\c\d\e\f`},
		{`\\server\a\b\c`, "../../../windows/system.ini", `\\server\a\b\c\windows\system.ini`},
		{`\\server\a\b\c`, `C:\windows\system.ini`, `\\server\a\b\c\C:\windows\system.ini`},
		{`\\server\a\b\c`, `..\..\..\C:\windows\system.ini`, `\\server\a\b\c\C:\windows\system.ini`},
		{`\\server\a\b\c`, `\\server\a\b\c`, `\\server\a\b\c\server\a\b\c`},
		{`\\server\a\b\c`, `..\..\..\\server\a\b\c`, `\\server\a\b\c\server\a\b\c`},
	}

	for _, c := range ts {
		r := JoinPaths(c.trusted, c.untrusted)
		if r != c.expected {
			t.Fatalf("expected '%s', got '%s'. Inputs = '%s', '%s'", c.expected, r, c.trusted, c.untrusted)
		}
	}
}