github.com/tiagovtristao/plz@v13.4.0+incompatible/tools/build_langserver/langserver/utils_test.go (about) 1 package langserver 2 3 import ( 4 "context" 5 "github.com/thought-machine/please/src/core" 6 "fmt" 7 "path" 8 "strings" 9 "testing" 10 11 "github.com/stretchr/testify/assert" 12 13 "github.com/thought-machine/please/tools/build_langserver/lsp" 14 ) 15 16 func TestIsURL(t *testing.T) { 17 currentFile, err := getFileinCwd("utils_test.go") 18 assert.Equal(t, err, nil) 19 20 assert.False(t, IsURL(currentFile)) 21 22 documentURI := "file://" + currentFile 23 assert.True(t, IsURL(documentURI)) 24 } 25 26 func TestGetPathFromURL(t *testing.T) { 27 currentFile, err := getFileinCwd("utils_test.go") 28 assert.Equal(t, err, nil) 29 documentURI := lsp.DocumentURI("file://" + currentFile) 30 31 // Test GetPathFromURL when documentURI passed in is a URI 32 p, err := GetPathFromURL(documentURI, "file") 33 assert.Equal(t, err, nil) 34 assert.Equal(t, p, string(currentFile)) 35 36 // Test GetPathFromURL when documentURI passed in is a file path 37 p2, err := GetPathFromURL(currentFile, "File") 38 assert.Equal(t, err, nil) 39 assert.Equal(t, p2, string(currentFile)) 40 41 } 42 43 func TestGetPathFromURLFail(t *testing.T) { 44 // Test invalid file fail with Bogus file 45 bogusFile, err := getFileinCwd("BLAH.blah") 46 assert.Equal(t, err, nil) 47 48 p, err := GetPathFromURL(bogusFile, "file") 49 assert.Equal(t, p, "") 50 assert.Error(t, err) 51 52 // Test invalid file not in repo root 53 p2, err := GetPathFromURL(lsp.DocumentURI("/tmp"), "path") 54 assert.Equal(t, p2, "") 55 assert.Error(t, err) 56 57 // Test invalid pathtype 58 currentFile, err := getFileinCwd("utils_test.go") 59 assert.Equal(t, err, nil) 60 p3, err := GetPathFromURL(currentFile, "dir") 61 assert.Equal(t, p3, "") 62 assert.Error(t, err) 63 } 64 65 func TestLocalFilesFromURI(t *testing.T) { 66 exampleBuildURI := lsp.DocumentURI("file://tools/build_langserver/langserver/test_data/example.build") 67 files, err := LocalFilesFromURI(exampleBuildURI) 68 assert.NoError(t, err) 69 assert.True(t, StringInSlice(files, "foo.go")) 70 assert.True(t, !StringInSlice(files, "example.go")) 71 } 72 73 func TestPackageLabelFromURI(t *testing.T) { 74 filePath := path.Join(core.RepoRoot, "tools/build_langserver/langserver/BUILD") 75 uri := lsp.DocumentURI("file://" + filePath) 76 label, err := PackageLabelFromURI(uri) 77 78 assert.Equal(t, err, nil) 79 assert.Equal(t, "//tools/build_langserver/langserver", label) 80 } 81 82 func TestEnsureURL(t *testing.T) { 83 currentFile, err := getFileinCwd("utils_test.go") 84 assert.Equal(t, err, nil) 85 86 uri, err := EnsureURL(currentFile, "file") 87 assert.Equal(t, err, nil) 88 assert.Equal(t, uri, lsp.DocumentURI("file://"+string(currentFile))) 89 } 90 91 func TestReadFile(t *testing.T) { 92 ctx := context.Background() 93 filepath := path.Join(core.RepoRoot, "tools/build_langserver/langserver/test_data/example.build") 94 uri := lsp.DocumentURI("file://" + filepath) 95 96 // Test ReadFile() with filepath as uri 97 content, err := ReadFile(ctx, lsp.DocumentURI(filepath)) 98 // Type checking 99 assert.Equal(t, fmt.Sprintf("%T", content), "[]string") 100 assert.Equal(t, err, nil) 101 // Content check 102 assert.Equal(t, content[0], "go_library(") 103 assert.Equal(t, strings.TrimSpace(content[1]), "name = \"langserver\",") 104 105 // Test ReadFile() with uri as uri 106 content1, err := ReadFile(ctx, uri) 107 // Type checking 108 assert.Equal(t, fmt.Sprintf("%T", content), "[]string") 109 assert.Equal(t, err, nil) 110 // Content check 111 assert.Equal(t, content1[0], "go_library(") 112 assert.Equal(t, strings.TrimSpace(content1[1]), "name = \"langserver\",") 113 114 } 115 116 func TestReadFileCanceledContext(t *testing.T) { 117 ctx, cancel := context.WithCancel(context.Background()) 118 filepath := path.Join(core.RepoRoot, "tools/build_langserver/langserver/test_data/example.build") 119 120 cancel() 121 content, err := ReadFile(ctx, lsp.DocumentURI(filepath)) 122 assert.Equal(t, content, []string(nil)) 123 assert.Equal(t, err, nil) 124 } 125 126 func TestGetLineContent(t *testing.T) { 127 ctx := context.Background() 128 filepath := path.Join(core.RepoRoot, "tools/build_langserver/langserver/test_data/example.build") 129 pos := lsp.Position{ 130 Line: 0, 131 Character: 0, 132 } 133 134 line, err := GetLineContent(ctx, lsp.DocumentURI(filepath), pos) 135 assert.Equal(t, err, nil) 136 assert.Equal(t, strings.TrimSpace(line[0]), "go_library(") 137 } 138 139 func TestTrimQoutes(t *testing.T) { 140 trimed := TrimQuotes("\"blah\"") 141 assert.Equal(t, trimed, "blah") 142 143 trimed = TrimQuotes(`"//src/core",`) 144 assert.Equal(t, "//src/core", trimed) 145 146 trimed = TrimQuotes(` "//src/core",`) 147 assert.Equal(t, "//src/core", trimed) 148 149 trimed = TrimQuotes("'blah") 150 assert.Equal(t, "blah", trimed) 151 152 // this is to make sure our regex works, 153 // so it doesn't just match anything with a build label 154 trimed = TrimQuotes(`visibility = ["//tools/build_langserver/...", "//src/core"]`) 155 assert.Equal(t, `visibility = ["//tools/build_langserver/...", "//src/core"]`, trimed) 156 157 trimed = TrimQuotes(`"//src/core`) 158 assert.Equal(t, "//src/core", trimed) 159 } 160 161 func TestExtractStringVal(t *testing.T) { 162 assert.Equal(t, "blah", ExtractStrTail(` srcs=["blah"`)) 163 assert.Equal(t, "foo", ExtractStrTail(` "foo"`)) 164 assert.Equal(t, "", ExtractStrTail(`"blah", srcs=`)) 165 } 166 167 func TestLooksLikeAttribute(t *testing.T) { 168 assert.True(t, LooksLikeAttribute("CONFIG.")) 169 assert.True(t, LooksLikeAttribute("CONFIG.J")) 170 assert.True(t, LooksLikeAttribute(" CONFIG.J")) 171 assert.True(t, LooksLikeAttribute(" \"blah\".for")) 172 assert.True(t, LooksLikeAttribute(" \"blah\".")) 173 assert.True(t, LooksLikeAttribute(" mystr = \"{time}-{message}\".fo")) 174 175 assert.False(t, LooksLikeAttribute(" func(ca")) 176 assert.False(t, LooksLikeAttribute("call_assign = subinclude(\"//build_defs:fpm\")")) 177 assert.False(t, LooksLikeAttribute(" \"//tools/build_langserver/lsp\",")) 178 assert.False(t, LooksLikeAttribute(" augassign += len(replace_str)")) 179 } 180 181 func TestLooksLikeCONFIGAttr(t *testing.T) { 182 assert.True(t, LooksLikeCONFIGAttr("CONFIG.")) 183 assert.True(t, LooksLikeCONFIGAttr("CONFIG.J")) 184 assert.True(t, LooksLikeCONFIGAttr(" CONFIG.J")) 185 assert.True(t, LooksLikeCONFIGAttr(" CONFIG.9")) 186 187 assert.False(t, LooksLikeCONFIGAttr("CONFIG = BLAH.")) 188 assert.False(t, LooksLikeCONFIGAttr("CONFIG.BLAH = \"hello\"")) 189 assert.False(t, LooksLikeCONFIGAttr("func(ca")) 190 } 191 192 func TestLooksLikeStringAttr(t *testing.T) { 193 assert.True(t, LooksLikeStringAttr("\"{time}-{message}\".")) 194 assert.True(t, LooksLikeStringAttr("'{time}-{message}'.")) 195 assert.True(t, LooksLikeStringAttr(" 'message'.")) 196 assert.True(t, LooksLikeStringAttr("blah = 'message'.")) 197 198 // Test fail when quotes style don't match 199 assert.False(t, LooksLikeStringAttr("\"foo'.")) 200 } 201 202 func TestLooksLikeDictAttr(t *testing.T) { 203 assert.True(t, LooksLikeDictAttr("{\"foo\":2, \"bar\":\"baz\"}.")) 204 assert.True(t, LooksLikeDictAttr("{\"foo\":2}.")) 205 assert.True(t, LooksLikeDictAttr("{\"foo\":2}.k")) 206 assert.True(t, LooksLikeDictAttr("{\"foo\":2}.keys")) 207 208 // Ensure completed call does not get triggered 209 assert.False(t, LooksLikeDictAttr("{\"foo\":2}.keys()")) 210 } 211 212 func TestExtractBuildLabel(t *testing.T) { 213 label := ExtractBuildLabel(`target = "//src/cache/blah:hello`) 214 assert.Equal(t, "//src/cache/blah:hello", label) 215 t.Log(label) 216 217 label = ExtractBuildLabel(`target = "//src/cache/blah:hello"`) 218 assert.Equal(t, "//src/cache/blah:hello", label) 219 220 label = ExtractBuildLabel(` "//src/cache:`) 221 assert.Equal(t, "//src/cache:", label) 222 223 label = ExtractBuildLabel(` "//src/cache/blah`) 224 assert.Equal(t, "//src/cache/blah", label) 225 226 label = ExtractBuildLabel(` "//src/cache/blah/`) 227 assert.Equal(t, "//src/cache/blah/", label) 228 229 // no match 230 label = ExtractBuildLabel("blah") 231 assert.Equal(t, "", label) 232 233 label = ExtractBuildLabel(`"//src/cache/blah//`) 234 assert.Equal(t, "", label) 235 236 label = ExtractBuildLabel(`"//src/cache/blah/:`) 237 assert.Equal(t, "", label) 238 239 label = ExtractBuildLabel(`"//src/ca`) 240 assert.Equal(t, "//src/ca", label) 241 } 242 243 func TestExtractLiteral(t *testing.T) { 244 lit := ExtractLiteral(`blah = "go_librar`) 245 assert.Equal(t, "", lit) 246 247 lit = ExtractLiteral(`blah = go_librar`) 248 assert.Equal(t, "go_librar", lit) 249 250 lit = ExtractLiteral(`go_librar`) 251 assert.Equal(t, "go_librar", lit) 252 253 lit = ExtractLiteral(`blah = " = go_librar`) 254 assert.Equal(t, "", lit) 255 256 lit = ExtractLiteral(`blah = "hello", hi = go_lib`) 257 assert.Equal(t, "go_lib", lit) 258 259 lit = ExtractLiteral(`blah = 'hello', hi = go_lib`) 260 assert.Equal(t, "go_lib", lit) 261 262 lit = ExtractLiteral(`"blah = 'hello, hi = go_lib`) 263 assert.Equal(t, "", lit) 264 265 // Tests for extracting attribute literals 266 lit = ExtractLiteral(`blah.form`) 267 assert.Equal(t, "blah.form", lit) 268 269 lit = ExtractLiteral(`hello = blah.form`) 270 assert.Equal(t, "blah.form", lit) 271 272 lit = ExtractLiteral(`hello = "blah.form`) 273 assert.Equal(t, "", lit) 274 275 lit = ExtractLiteral(`blah = 'hello', hi = blah.form`) 276 assert.Equal(t, "blah.form", lit) 277 278 assert.Equal(t, ".format", ExtractLiteral(`"blah".format`)) 279 } 280 281 /* 282 * Utilities function for tests in this file 283 */ 284 func getFileinCwd(name string) (lsp.DocumentURI, error) { 285 core.FindRepoRoot() 286 filePath := path.Join(core.RepoRoot, "tools/build_langserver/langserver/"+name) 287 288 return lsp.DocumentURI(filePath), nil 289 }