github.com/twelsh-aw/go/src@v0.0.0-20230516233729-a56fe86a7c81/path/path_test.go (about)

     1  // Copyright 2009 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package path_test
     6  
     7  import (
     8  	. "path"
     9  	"runtime"
    10  	"testing"
    11  )
    12  
    13  type PathTest struct {
    14  	path, result string
    15  }
    16  
    17  var cleantests = []PathTest{
    18  	// Already clean
    19  	{"", "."},
    20  	{"abc", "abc"},
    21  	{"abc/def", "abc/def"},
    22  	{"a/b/c", "a/b/c"},
    23  	{".", "."},
    24  	{"..", ".."},
    25  	{"../..", "../.."},
    26  	{"../../abc", "../../abc"},
    27  	{"/abc", "/abc"},
    28  	{"/", "/"},
    29  
    30  	// Remove trailing slash
    31  	{"abc/", "abc"},
    32  	{"abc/def/", "abc/def"},
    33  	{"a/b/c/", "a/b/c"},
    34  	{"./", "."},
    35  	{"../", ".."},
    36  	{"../../", "../.."},
    37  	{"/abc/", "/abc"},
    38  
    39  	// Remove doubled slash
    40  	{"abc//def//ghi", "abc/def/ghi"},
    41  	{"//abc", "/abc"},
    42  	{"///abc", "/abc"},
    43  	{"//abc//", "/abc"},
    44  	{"abc//", "abc"},
    45  
    46  	// Remove . elements
    47  	{"abc/./def", "abc/def"},
    48  	{"/./abc/def", "/abc/def"},
    49  	{"abc/.", "abc"},
    50  
    51  	// Remove .. elements
    52  	{"abc/def/ghi/../jkl", "abc/def/jkl"},
    53  	{"abc/def/../ghi/../jkl", "abc/jkl"},
    54  	{"abc/def/..", "abc"},
    55  	{"abc/def/../..", "."},
    56  	{"/abc/def/../..", "/"},
    57  	{"abc/def/../../..", ".."},
    58  	{"/abc/def/../../..", "/"},
    59  	{"abc/def/../../../ghi/jkl/../../../mno", "../../mno"},
    60  
    61  	// Combinations
    62  	{"abc/./../def", "def"},
    63  	{"abc//./../def", "def"},
    64  	{"abc/../../././../def", "../../def"},
    65  }
    66  
    67  func TestClean(t *testing.T) {
    68  	for _, test := range cleantests {
    69  		if s := Clean(test.path); s != test.result {
    70  			t.Errorf("Clean(%q) = %q, want %q", test.path, s, test.result)
    71  		}
    72  		if s := Clean(test.result); s != test.result {
    73  			t.Errorf("Clean(%q) = %q, want %q", test.result, s, test.result)
    74  		}
    75  	}
    76  }
    77  
    78  func TestCleanMallocs(t *testing.T) {
    79  	if testing.Short() {
    80  		t.Skip("skipping malloc count in short mode")
    81  	}
    82  	if runtime.GOMAXPROCS(0) > 1 {
    83  		t.Log("skipping AllocsPerRun checks; GOMAXPROCS>1")
    84  		return
    85  	}
    86  
    87  	for _, test := range cleantests {
    88  		allocs := testing.AllocsPerRun(100, func() { Clean(test.result) })
    89  		if allocs > 0 {
    90  			t.Errorf("Clean(%q): %v allocs, want zero", test.result, allocs)
    91  		}
    92  	}
    93  }
    94  
    95  type SplitTest struct {
    96  	path, dir, file string
    97  }
    98  
    99  var splittests = []SplitTest{
   100  	{"a/b", "a/", "b"},
   101  	{"a/b/", "a/b/", ""},
   102  	{"a/", "a/", ""},
   103  	{"a", "", "a"},
   104  	{"/", "/", ""},
   105  }
   106  
   107  func TestSplit(t *testing.T) {
   108  	for _, test := range splittests {
   109  		if d, f := Split(test.path); d != test.dir || f != test.file {
   110  			t.Errorf("Split(%q) = %q, %q, want %q, %q", test.path, d, f, test.dir, test.file)
   111  		}
   112  	}
   113  }
   114  
   115  type JoinTest struct {
   116  	elem []string
   117  	path string
   118  }
   119  
   120  var jointests = []JoinTest{
   121  	// zero parameters
   122  	{[]string{}, ""},
   123  
   124  	// one parameter
   125  	{[]string{""}, ""},
   126  	{[]string{"a"}, "a"},
   127  
   128  	// two parameters
   129  	{[]string{"a", "b"}, "a/b"},
   130  	{[]string{"a", ""}, "a"},
   131  	{[]string{"", "b"}, "b"},
   132  	{[]string{"/", "a"}, "/a"},
   133  	{[]string{"/", ""}, "/"},
   134  	{[]string{"a/", "b"}, "a/b"},
   135  	{[]string{"a/", ""}, "a"},
   136  	{[]string{"", ""}, ""},
   137  }
   138  
   139  func TestJoin(t *testing.T) {
   140  	for _, test := range jointests {
   141  		if p := Join(test.elem...); p != test.path {
   142  			t.Errorf("Join(%q) = %q, want %q", test.elem, p, test.path)
   143  		}
   144  	}
   145  }
   146  
   147  type ExtTest struct {
   148  	path, ext string
   149  }
   150  
   151  var exttests = []ExtTest{
   152  	{"path.go", ".go"},
   153  	{"path.pb.go", ".go"},
   154  	{"a.dir/b", ""},
   155  	{"a.dir/b.go", ".go"},
   156  	{"a.dir/", ""},
   157  }
   158  
   159  func TestExt(t *testing.T) {
   160  	for _, test := range exttests {
   161  		if x := Ext(test.path); x != test.ext {
   162  			t.Errorf("Ext(%q) = %q, want %q", test.path, x, test.ext)
   163  		}
   164  	}
   165  }
   166  
   167  var basetests = []PathTest{
   168  	// Already clean
   169  	{"", "."},
   170  	{".", "."},
   171  	{"/.", "."},
   172  	{"/", "/"},
   173  	{"////", "/"},
   174  	{"x/", "x"},
   175  	{"abc", "abc"},
   176  	{"abc/def", "def"},
   177  	{"a/b/.x", ".x"},
   178  	{"a/b/c.", "c."},
   179  	{"a/b/c.x", "c.x"},
   180  }
   181  
   182  func TestBase(t *testing.T) {
   183  	for _, test := range basetests {
   184  		if s := Base(test.path); s != test.result {
   185  			t.Errorf("Base(%q) = %q, want %q", test.path, s, test.result)
   186  		}
   187  	}
   188  }
   189  
   190  var dirtests = []PathTest{
   191  	{"", "."},
   192  	{".", "."},
   193  	{"/.", "/"},
   194  	{"/", "/"},
   195  	{"////", "/"},
   196  	{"/foo", "/"},
   197  	{"x/", "x"},
   198  	{"abc", "."},
   199  	{"abc/def", "abc"},
   200  	{"abc////def", "abc"},
   201  	{"a/b/.x", "a/b"},
   202  	{"a/b/c.", "a/b"},
   203  	{"a/b/c.x", "a/b"},
   204  }
   205  
   206  func TestDir(t *testing.T) {
   207  	for _, test := range dirtests {
   208  		if s := Dir(test.path); s != test.result {
   209  			t.Errorf("Dir(%q) = %q, want %q", test.path, s, test.result)
   210  		}
   211  	}
   212  }
   213  
   214  type IsAbsTest struct {
   215  	path  string
   216  	isAbs bool
   217  }
   218  
   219  var isAbsTests = []IsAbsTest{
   220  	{"", false},
   221  	{"/", true},
   222  	{"/usr/bin/gcc", true},
   223  	{"..", false},
   224  	{"/a/../bb", true},
   225  	{".", false},
   226  	{"./", false},
   227  	{"lala", false},
   228  }
   229  
   230  func TestIsAbs(t *testing.T) {
   231  	for _, test := range isAbsTests {
   232  		if r := IsAbs(test.path); r != test.isAbs {
   233  			t.Errorf("IsAbs(%q) = %v, want %v", test.path, r, test.isAbs)
   234  		}
   235  	}
   236  }