golang.org/x/tools/gopls@v0.15.3/internal/cache/view_test.go (about) 1 // Copyright 2020 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 package cache 5 6 import ( 7 "os" 8 "path/filepath" 9 "testing" 10 11 "golang.org/x/tools/gopls/internal/protocol" 12 ) 13 14 func TestCaseInsensitiveFilesystem(t *testing.T) { 15 base := t.TempDir() 16 17 inner := filepath.Join(base, "a/B/c/DEFgh") 18 if err := os.MkdirAll(inner, 0777); err != nil { 19 t.Fatal(err) 20 } 21 file := filepath.Join(inner, "f.go") 22 if err := os.WriteFile(file, []byte("hi"), 0777); err != nil { 23 t.Fatal(err) 24 } 25 if _, err := os.Stat(filepath.Join(inner, "F.go")); err != nil { 26 t.Skip("filesystem is case-sensitive") 27 } 28 29 tests := []struct { 30 path string 31 err bool 32 }{ 33 {file, false}, 34 {filepath.Join(inner, "F.go"), true}, 35 {filepath.Join(base, "a/b/c/defgh/f.go"), true}, 36 } 37 for _, tt := range tests { 38 err := checkPathValid(tt.path) 39 if err != nil != tt.err { 40 t.Errorf("checkPathValid(%q) = %v, wanted error: %v", tt.path, err, tt.err) 41 } 42 } 43 } 44 45 func TestInVendor(t *testing.T) { 46 for _, tt := range []struct { 47 path string 48 inVendor bool 49 }{ 50 {"foo/vendor/x.go", false}, 51 {"foo/vendor/x/x.go", true}, 52 {"foo/x.go", false}, 53 {"foo/vendor/foo.txt", false}, 54 {"foo/vendor/modules.txt", false}, 55 } { 56 if got := inVendor(protocol.URIFromPath(tt.path)); got != tt.inVendor { 57 t.Errorf("expected %s inVendor %v, got %v", tt.path, tt.inVendor, got) 58 } 59 } 60 } 61 62 func TestFilters(t *testing.T) { 63 tests := []struct { 64 filters []string 65 included []string 66 excluded []string 67 }{ 68 { 69 included: []string{"x"}, 70 }, 71 { 72 filters: []string{"-"}, 73 excluded: []string{"x", "x/a"}, 74 }, 75 { 76 filters: []string{"-x", "+y"}, 77 included: []string{"y", "y/a", "z"}, 78 excluded: []string{"x", "x/a"}, 79 }, 80 { 81 filters: []string{"-x", "+x/y", "-x/y/z"}, 82 included: []string{"x/y", "x/y/a", "a"}, 83 excluded: []string{"x", "x/a", "x/y/z/a"}, 84 }, 85 { 86 filters: []string{"+foobar", "-foo"}, 87 included: []string{"foobar", "foobar/a"}, 88 excluded: []string{"foo", "foo/a"}, 89 }, 90 } 91 92 for _, tt := range tests { 93 filterer := NewFilterer(tt.filters) 94 for _, inc := range tt.included { 95 if relPathExcludedByFilter(inc, filterer) { 96 t.Errorf("filters %q excluded %v, wanted included", tt.filters, inc) 97 } 98 } 99 for _, exc := range tt.excluded { 100 if !relPathExcludedByFilter(exc, filterer) { 101 t.Errorf("filters %q included %v, wanted excluded", tt.filters, exc) 102 } 103 } 104 } 105 } 106 107 func TestSuffixes(t *testing.T) { 108 type file struct { 109 path string 110 want bool 111 } 112 type cases struct { 113 option []string 114 files []file 115 } 116 tests := []cases{ 117 {[]string{"tmpl", "gotmpl"}, []file{ // default 118 {"foo", false}, 119 {"foo.tmpl", true}, 120 {"foo.gotmpl", true}, 121 {"tmpl", false}, 122 {"tmpl.go", false}}, 123 }, 124 {[]string{"tmpl", "gotmpl", "html", "gohtml"}, []file{ 125 {"foo.gotmpl", true}, 126 {"foo.html", true}, 127 {"foo.gohtml", true}, 128 {"html", false}}, 129 }, 130 {[]string{"tmpl", "gotmpl", ""}, []file{ // possible user mistake 131 {"foo.gotmpl", true}, 132 {"foo.go", false}, 133 {"foo", false}}, 134 }, 135 } 136 for _, a := range tests { 137 suffixes := a.option 138 for _, b := range a.files { 139 got := fileHasExtension(b.path, suffixes) 140 if got != b.want { 141 t.Errorf("got %v, want %v, option %q, file %q (%+v)", 142 got, b.want, a.option, b.path, b) 143 } 144 } 145 } 146 } 147 148 func TestIgnoreFilter(t *testing.T) { 149 tests := []struct { 150 dirs []string 151 path string 152 want bool 153 }{ 154 {[]string{"a"}, "a/testdata/foo", true}, 155 {[]string{"a"}, "a/_ignore/foo", true}, 156 {[]string{"a"}, "a/.ignore/foo", true}, 157 {[]string{"a"}, "b/testdata/foo", false}, 158 {[]string{"a"}, "testdata/foo", false}, 159 {[]string{"a", "b"}, "b/testdata/foo", true}, 160 {[]string{"a"}, "atestdata/foo", false}, 161 } 162 163 for _, test := range tests { 164 // convert to filepaths, for convenience 165 for i, dir := range test.dirs { 166 test.dirs[i] = filepath.FromSlash(dir) 167 } 168 test.path = filepath.FromSlash(test.path) 169 170 f := newIgnoreFilter(test.dirs) 171 if got := f.ignored(test.path); got != test.want { 172 t.Errorf("newIgnoreFilter(%q).ignore(%q) = %t, want %t", test.dirs, test.path, got, test.want) 173 } 174 } 175 }