|
|
@@ -0,0 +1,117 @@
|
|
|
+// Copyright 2014 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 webdav
|
|
|
+
|
|
|
+import (
|
|
|
+ "path/filepath"
|
|
|
+ "testing"
|
|
|
+)
|
|
|
+
|
|
|
+func TestDir(t *testing.T) {
|
|
|
+ testCases := []struct {
|
|
|
+ dir, name, want string
|
|
|
+ }{
|
|
|
+ {"/", "", "/"},
|
|
|
+ {"/", "/", "/"},
|
|
|
+ {"/", ".", "/"},
|
|
|
+ {"/", "./a", "/a"},
|
|
|
+ {"/", "..", "/"},
|
|
|
+ {"/", "..", "/"},
|
|
|
+ {"/", "../", "/"},
|
|
|
+ {"/", "../.", "/"},
|
|
|
+ {"/", "../a", "/a"},
|
|
|
+ {"/", "../..", "/"},
|
|
|
+ {"/", "../bar/a", "/bar/a"},
|
|
|
+ {"/", "../baz/a", "/baz/a"},
|
|
|
+ {"/", "...", "/..."},
|
|
|
+ {"/", ".../a", "/.../a"},
|
|
|
+ {"/", ".../..", "/"},
|
|
|
+ {"/", "a", "/a"},
|
|
|
+ {"/", "a/./b", "/a/b"},
|
|
|
+ {"/", "a/../../b", "/b"},
|
|
|
+ {"/", "a/../b", "/b"},
|
|
|
+ {"/", "a/b", "/a/b"},
|
|
|
+ {"/", "a/b/c/../../d", "/a/d"},
|
|
|
+ {"/", "a/b/c/../../../d", "/d"},
|
|
|
+ {"/", "a/b/c/../../../../d", "/d"},
|
|
|
+ {"/", "a/b/c/d", "/a/b/c/d"},
|
|
|
+
|
|
|
+ {"/foo/bar", "", "/foo/bar"},
|
|
|
+ {"/foo/bar", "/", "/foo/bar"},
|
|
|
+ {"/foo/bar", ".", "/foo/bar"},
|
|
|
+ {"/foo/bar", "./a", "/foo/bar/a"},
|
|
|
+ {"/foo/bar", "..", "/foo/bar"},
|
|
|
+ {"/foo/bar", "../", "/foo/bar"},
|
|
|
+ {"/foo/bar", "../.", "/foo/bar"},
|
|
|
+ {"/foo/bar", "../a", "/foo/bar/a"},
|
|
|
+ {"/foo/bar", "../..", "/foo/bar"},
|
|
|
+ {"/foo/bar", "../bar/a", "/foo/bar/bar/a"},
|
|
|
+ {"/foo/bar", "../baz/a", "/foo/bar/baz/a"},
|
|
|
+ {"/foo/bar", "...", "/foo/bar/..."},
|
|
|
+ {"/foo/bar", ".../a", "/foo/bar/.../a"},
|
|
|
+ {"/foo/bar", ".../..", "/foo/bar"},
|
|
|
+ {"/foo/bar", "a", "/foo/bar/a"},
|
|
|
+ {"/foo/bar", "a/./b", "/foo/bar/a/b"},
|
|
|
+ {"/foo/bar", "a/../../b", "/foo/bar/b"},
|
|
|
+ {"/foo/bar", "a/../b", "/foo/bar/b"},
|
|
|
+ {"/foo/bar", "a/b", "/foo/bar/a/b"},
|
|
|
+ {"/foo/bar", "a/b/c/../../d", "/foo/bar/a/d"},
|
|
|
+ {"/foo/bar", "a/b/c/../../../d", "/foo/bar/d"},
|
|
|
+ {"/foo/bar", "a/b/c/../../../../d", "/foo/bar/d"},
|
|
|
+ {"/foo/bar", "a/b/c/d", "/foo/bar/a/b/c/d"},
|
|
|
+
|
|
|
+ {"/foo/bar/", "", "/foo/bar"},
|
|
|
+ {"/foo/bar/", "/", "/foo/bar"},
|
|
|
+ {"/foo/bar/", ".", "/foo/bar"},
|
|
|
+ {"/foo/bar/", "./a", "/foo/bar/a"},
|
|
|
+ {"/foo/bar/", "..", "/foo/bar"},
|
|
|
+
|
|
|
+ {"/foo//bar///", "", "/foo/bar"},
|
|
|
+ {"/foo//bar///", "/", "/foo/bar"},
|
|
|
+ {"/foo//bar///", ".", "/foo/bar"},
|
|
|
+ {"/foo//bar///", "./a", "/foo/bar/a"},
|
|
|
+ {"/foo//bar///", "..", "/foo/bar"},
|
|
|
+
|
|
|
+ {"/x/y/z", "ab/c\x00d/ef", ""},
|
|
|
+
|
|
|
+ {".", "", "."},
|
|
|
+ {".", "/", "."},
|
|
|
+ {".", ".", "."},
|
|
|
+ {".", "./a", "a"},
|
|
|
+ {".", "..", "."},
|
|
|
+ {".", "..", "."},
|
|
|
+ {".", "../", "."},
|
|
|
+ {".", "../.", "."},
|
|
|
+ {".", "../a", "a"},
|
|
|
+ {".", "../..", "."},
|
|
|
+ {".", "../bar/a", "bar/a"},
|
|
|
+ {".", "../baz/a", "baz/a"},
|
|
|
+ {".", "...", "..."},
|
|
|
+ {".", ".../a", ".../a"},
|
|
|
+ {".", ".../..", "."},
|
|
|
+ {".", "a", "a"},
|
|
|
+ {".", "a/./b", "a/b"},
|
|
|
+ {".", "a/../../b", "b"},
|
|
|
+ {".", "a/../b", "b"},
|
|
|
+ {".", "a/b", "a/b"},
|
|
|
+ {".", "a/b/c/../../d", "a/d"},
|
|
|
+ {".", "a/b/c/../../../d", "d"},
|
|
|
+ {".", "a/b/c/../../../../d", "d"},
|
|
|
+ {".", "a/b/c/d", "a/b/c/d"},
|
|
|
+
|
|
|
+ {"", "", "."},
|
|
|
+ {"", "/", "."},
|
|
|
+ {"", ".", "."},
|
|
|
+ {"", "./a", "a"},
|
|
|
+ {"", "..", "."},
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, tc := range testCases {
|
|
|
+ d := Dir(filepath.FromSlash(tc.dir))
|
|
|
+ if got := filepath.ToSlash(d.resolve(tc.name)); got != tc.want {
|
|
|
+ t.Errorf("dir=%q, name=%q: got %q, want %q", tc.dir, tc.name, got, tc.want)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|