flamenco/pkg/crosspath/crosspath_test.go
Sybren A. Stüvel fd730351b5 Crosspath: add IsRoot(path) bool function
Add a function that can determine whether the given path is considered
a "root path". Considers `/`, `X:`, `X:\` and `X:/` root paths, where `X`
is any upper or lower case Latin letters.
2022-06-23 16:40:46 +02:00

203 lines
5.8 KiB
Go

package crosspath
// SPDX-License-Identifier: GPL-3.0-or-later
import (
"path"
"path/filepath"
"runtime"
"testing"
"github.com/stretchr/testify/assert"
)
func TestBase(t *testing.T) {
tests := []struct {
expect, input string
}{
{".", ""},
{"justafile.txt", "justafile.txt"},
{"with spaces.txt", "/Linux path/with spaces.txt"},
{"awésom.tar.gz", "C:\\ünicode\\is\\awésom.tar.gz"},
{"Resource with ext.ension", "\\\\?\\UNC\\ComputerName\\SharedFolder\\Resource with ext.ension"},
}
for _, test := range tests {
assert.Equal(t, test.expect, Base(test.input))
}
}
func TestDir(t *testing.T) {
// Just to show how path.Dir() behaves:
assert.Equal(t, ".", path.Dir(""))
assert.Equal(t, ".", path.Dir("justafile.txt"))
tests := []struct {
expect, input string
}{
// Follow path.Dir() when it comes to empty directories:
{".", ""},
{".", "justafile.txt"},
{"/", "/"},
{"/", "/file-at-root"},
{"C:", "C:\\file-at-root"},
{"/Linux path", "/Linux path/with spaces.txt"},
{"/Mixed path/with", "/Mixed path\\with/slash.txt"},
{"C:/ünicode/is", "C:\\ünicode\\is\\awésom.tar.gz"},
{"//SERVER/ünicode/is", "\\\\SERVER\\ünicode\\is\\awésom.tar.gz"},
{"//?/UNC/ComputerName/SharedFolder", "\\\\?\\UNC\\ComputerName\\SharedFolder\\Resource"},
}
for _, test := range tests {
assert.Equal(t,
test.expect, Dir(test.input),
"for input %q", test.input)
}
}
func TestJoin(t *testing.T) {
// Just to show how path.Join() behaves:
assert.Equal(t, "", path.Join())
assert.Equal(t, "", path.Join(""))
assert.Equal(t, "", path.Join("", ""))
assert.Equal(t, "a/b", path.Join("", "", "a", "", "b", ""))
tests := []struct {
expect string
input []string
}{
// Should behave the same as path.Join():
{"", []string{}},
{"", []string{""}},
{"", []string{"", ""}},
{"a/b", []string{"", "", "a", "", "b", ""}},
{"/file-at-root", []string{"/", "file-at-root"}},
{"C:/file-at-root", []string{"C:", "file-at-root"}},
{"/Linux path/with spaces.txt", []string{"/Linux path", "with spaces.txt"}},
{"C:/ünicode/is/awésom.tar.gz", []string{"C:\\ünicode", "is\\awésom.tar.gz"}},
{"//SERVER/mount/dir/file.txt", []string{"\\\\SERVER", "mount", "dir", "file.txt"}},
{"//?/UNC/ComputerName/SharedFolder/Resource", []string{"\\\\?\\UNC\\ComputerName", "SharedFolder\\Resource"}},
}
for _, test := range tests {
assert.Equal(t,
test.expect, Join(test.input...),
"for input %q", test.input)
}
}
func TestStem(t *testing.T) {
tests := []struct {
expect, input string
}{
{"", ""},
{"stem", "stem.txt"},
{"stem.tar", "stem.tar.gz"},
{"file", "/path/to/file.txt"},
{"file", "C:\\path\\to\\file.txt"},
{"file", "C:\\path\\to/mixed/slashes/file.txt"},
{"file", "C:\\path/to\\mixed/slashes\\file.txt"},
{"Resource with ext", "\\\\?\\UNC\\ComputerName\\SharedFolder\\Resource with ext.ension"},
}
for _, test := range tests {
assert.Equal(t,
test.expect, Stem(test.input),
"for input %q", test.input)
}
}
func TestToNative_native_backslash(t *testing.T) {
if filepath.Separator != '\\' {
t.Skipf("skipping backslash-specific test on %q with path separator %q",
runtime.GOOS, filepath.Separator)
}
tests := []struct {
expect, input string
}{
{"", ""},
{".", "."},
{"\\some\\simple\\path", "/some/simple/path"},
{"C:\\path\\to\\file.txt", "C:\\path\\to\\file.txt"},
{"C:\\path\\to\\mixed\\slashes\\file.txt", "C:\\path\\to/mixed/slashes/file.txt"},
{"\\\\?\\UNC\\ComputerName\\SharedFolder\\Resource with ext.ension",
"\\\\?\\UNC\\ComputerName\\SharedFolder\\Resource with ext.ension"},
{"\\\\?\\UNC\\ComputerName\\SharedFolder\\Resource with ext.ension",
"//?/UNC/ComputerName/SharedFolder/Resource with ext.ension"},
}
for _, test := range tests {
assert.Equal(t,
test.expect, ToNative(test.input),
"for input %q", test.input)
}
}
func TestToNative_native_slash(t *testing.T) {
if filepath.Separator != '/' {
t.Skipf("skipping backslash-specific test on %q with path separator %q",
runtime.GOOS, filepath.Separator)
}
tests := []struct {
expect, input string
}{
{"", ""},
{".", "."},
{"/some/simple/path", "/some/simple/path"},
{"C:/path/to/file.txt", "C:\\path\\to\\file.txt"},
{"C:/path/to/mixed/slashes/file.txt", "C:\\path\\to/mixed/slashes/file.txt"},
{"//?/UNC/ComputerName/SharedFolder/Resource with ext.ension",
"\\\\?\\UNC\\ComputerName\\SharedFolder\\Resource with ext.ension"},
{"//?/UNC/ComputerName/SharedFolder/Resource with ext.ension",
"//?/UNC/ComputerName/SharedFolder/Resource with ext.ension"},
}
for _, test := range tests {
assert.Equal(t,
test.expect, ToNative(test.input),
"for input %q", test.input)
}
}
// This test should be skipped on every platform. It's there just to detect that
// the above two tests haven't run.
func TestToNative_unsupported(t *testing.T) {
if filepath.Separator == '/' || filepath.Separator == '\\' {
t.Skipf("skipping test on %q with path separator %q",
runtime.GOOS, filepath.Separator)
}
t.Fatalf("ToNative not supported on this platform %q with path separator %q",
runtime.GOOS, filepath.Separator)
}
func TestIsRoot(t *testing.T) {
tests := []struct {
name string
path string
want bool
}{
{"empty", "", false},
{"UNIX", "/", true},
{"Drive only", "C:", true},
{"Drive and slash", "C:/", true},
{"Drive and backslash", `C:\`, true},
{"backslash", `\`, false},
{"just letters", "just letters", false},
{"subdir of root", "/subdir", false},
{"subdir of drive", "C:\\subdir", false},
{"indirectly root", "/subdir/..", false},
{"UNC notation", `\\NAS\Share\`, false},
{"Slashed UNC notation", `//NAS/Share/`, false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := IsRoot(tt.path); got != tt.want {
t.Errorf("IsRoot() = %v, want %v", got, tt.want)
}
})
}
}