// Copyright 2023 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. //go:build wasip1 package syscall_test import ( "syscall" "testing" ) var joinPathTests = [...]struct { dir, file, path string }{ 0: {".", ".", "."}, 1: {"./", "./", "./"}, 2: {"././././", ".", "."}, 3: {".", "./././", "./"}, 4: {".", "a", "a"}, 5: {".", "a/b", "a/b"}, 6: {".", "..", ".."}, 7: {".", "../", "../"}, 8: {".", "../../", "../../"}, 9: {".", "../..", "../.."}, 10: {".", "../..//..///", "../../../"}, 11: {"/", "/", "/"}, 12: {"/", "a", "/a"}, 13: {"/", "a/b", "/a/b"}, 14: {"/a", "b", "/a/b"}, 15: {"/", ".", "/"}, 16: {"/", "..", "/"}, 17: {"/", "../../", "/"}, 18: {"/", "/../a/b/c", "/a/b/c"}, 19: {"/", "/../a/b/c", "/a/b/c"}, 20: {"/", "./hello/world", "/hello/world"}, 21: {"/a", "../", "/"}, 22: {"/a/b/c", "..", "/a/b"}, 23: {"/a/b/c", "..///..///", "/a/"}, 24: {"/a/b/c", "..///..///..", "/"}, 25: {"/a/b/c", "..///..///..///..", "/"}, 26: {"/a/b/c", "..///..///..///..///..", "/"}, 27: {"/a/b/c/", "/d/e/f/", "/a/b/c/d/e/f/"}, 28: {"a/b/c/", ".", "a/b/c"}, 29: {"a/b/c/", "./d", "a/b/c/d"}, 30: {"a/b/c/", "./d/", "a/b/c/d/"}, 31: {"a/b/", "./c/d/", "a/b/c/d/"}, 32: {"../", "..", "../.."}, 33: {"a/b/c/d", "e/../..", "a/b/c"}, 34: {"a/b/c/d", "./e/../..", "a/b/c"}, 35: {"a/b/c/d", "./e/..//../../f/g//", "a/b/f/g/"}, 36: {"../../../", "a/../../b/c", "../../b/c"}, 37: {"/a/b/c", "/.././/hey!", "/a/b/hey!"}, } func TestJoinPath(t *testing.T) { for _, test := range joinPathTests { t.Run("", func(t *testing.T) { path := syscall.JoinPath(test.dir, test.file) if path != test.path { t.Errorf("join(%q,%q): want=%q got=%q", test.dir, test.file, test.path, path) } }) } } func BenchmarkJoinPath(b *testing.B) { for _, test := range joinPathTests { b.Run("", func(b *testing.B) { for i := 0; i < b.N; i++ { syscall.JoinPath(test.dir, test.file) } }) } }