github.com/tiagovtristao/plz@v13.4.0+incompatible/tools/build_langserver/langserver/hover_test.go (about) 1 package langserver 2 3 import ( 4 "context" 5 "github.com/thought-machine/please/src/core" 6 "strings" 7 "testing" 8 9 "github.com/thought-machine/please/tools/build_langserver/lsp" 10 11 "github.com/stretchr/testify/assert" 12 ) 13 14 /*************************************** 15 *Tests for Build Definitions 16 ***************************************/ 17 func TestGetHoverContentOnBuildDefName(t *testing.T) { 18 var ctx = context.Background() 19 20 content, err := handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 0, Character: 3}) 21 expected := analyzer.BuiltIns["go_library"].Header + "\n\n" + analyzer.BuiltIns["go_library"].Docstring 22 23 assert.Equal(t, nil, err) 24 assert.Equal(t, expected, content) 25 } 26 27 func TestGetHoverContentOnArgument(t *testing.T) { 28 var ctx = context.Background() 29 30 // Test hovering over argument name 31 content, err := handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 7, Character: 7}) 32 assert.Equal(t, nil, err) 33 assert.Equal(t, "deps required:false, type:list", content) 34 35 // Test hovering over argument name with nested call 36 content, err = handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 2, Character: 7}) 37 assert.Equal(t, nil, err) 38 assert.Equal(t, "srcs required:true, type:list", 39 content) 40 41 // Test hovering over argument content 42 43 // when build label is a label for including all sub packages 44 content, err = handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 6, Character: 21}) 45 assert.Equal(t, nil, err) 46 expected := "BuildLabel includes all subpackages in path: " + 47 core.RepoRoot + "/tools/build_langserver" 48 assert.Equal(t, expected, content) 49 50 // When build label is definitive, e.g. "//src/core" or "//src/core:core" 51 content, err = handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 6, Character: 57}) 52 expectedContent := []string{"go_library(", " name = \"core\",", " srcs = glob("} 53 assert.Equal(t, nil, err) 54 // Checking only the first 3 line 55 splited := strings.Split(content, "\n") 56 assert.Equal(t, expectedContent, splited[:3]) 57 } 58 59 func TestGetHoverContentOnNestedCall(t *testing.T) { 60 var ctx = context.Background() 61 62 // Test hovering over nested call on definition, e.g. glob( 63 content, err := handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 2, Character: 14}) 64 assert.Equal(t, nil, err) 65 assert.Equal(t, "def glob(include:list, exclude:list&excludes=[], hidden:bool=False)", 66 content) 67 68 // Test hovering over nested call on ending parenthese 69 content, err = handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 5, Character: 6}) 70 assert.Equal(t, nil, err) 71 assert.Equal(t, "", content) 72 73 // Test hovering over argument assignment of nested call 74 content, err = handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 4, Character: 15}) 75 assert.Equal(t, nil, err) 76 assert.Equal(t, "exclude required:false, type:list", 77 content) 78 79 content, err = handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 3, Character: 15}) 80 assert.Equal(t, nil, err) 81 assert.Equal(t, "include required:true, type:list", 82 content) 83 } 84 85 func TestGetHoverContentOnEmptyContent(t *testing.T) { 86 var ctx = context.Background() 87 88 content, err := handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 1, Character: 3}) 89 assert.Equal(t, nil, err) 90 assert.Equal(t, "", content) 91 92 content, err = handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 2, Character: 30}) 93 assert.Equal(t, nil, err) 94 assert.Equal(t, "", content) 95 } 96 97 func TestGetHoverContentOnBuildLabels(t *testing.T) { 98 var ctx = context.Background() 99 100 // Test hovering over buildlabels 101 content, err := handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 13, Character: 15}) 102 expected := "go_get(\n" + 103 " name = \"jsonrpc2\",\n" + 104 " get = \"github.com/sourcegraph/jsonrpc2\",\n" + 105 " revision = \"549eb959f029d014d623104d40ab966d159a92de\",\n" + 106 ")" 107 assert.Equal(t, nil, err) 108 assert.Equal(t, expected, content) 109 } 110 111 func TestGetHoverContentOnNoneBuildLabelString(t *testing.T) { 112 var ctx = context.Background() 113 114 content, err := handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 20, Character: 18}) 115 assert.Equal(t, nil, err) 116 assert.Equal(t, "", content) 117 } 118 119 func TestGetHoverContentOnArgumentWithProperty(t *testing.T) { 120 var ctx = context.Background() 121 122 // Hover on argument name 123 content, err := handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 35, Character: 6}) 124 assert.Equal(t, nil, err) 125 assert.Equal(t, "name required:true, type:str", content) 126 127 // Hover on property name 128 content, err = handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 35, Character: 20}) 129 assert.Equal(t, nil, err) 130 assert.Equal(t, "", content) 131 132 // Hover on property call 133 content, err = handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 35, Character: 34}) 134 assert.Equal(t, nil, err) 135 assert.Equal(t, "str.format()", content) 136 } 137 138 func TestGetHoverContentArgOnTheSameLine(t *testing.T) { 139 var ctx = context.Background() 140 141 content, err := handler.getHoverContent(ctx, exampleBuildURI, lsp.Position{Line: 43, Character: 17}) 142 assert.Equal(t, nil, err) 143 assert.Equal(t, "name required:true, type:str", content) 144 } 145 146 /*************************************** 147 *Tests for Variable assignments 148 ***************************************/ 149 func TestGetHoverContentOnPropertyAssignment(t *testing.T) { 150 var ctx = context.Background() 151 152 //Hover on assignment with properties 153 content, err := handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 0, Character: 30}) 154 assert.Equal(t, nil, err) 155 assert.Equal(t, "str.format()", content) 156 157 content, err = handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 2, Character: 18}) 158 assert.Equal(t, nil, err) 159 assert.Equal(t, "str.replace(old:str, new:str)", content) 160 161 //Hover on argument of assignment property 162 content, err = handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 0, Character: 36}) 163 assert.Equal(t, nil, err) 164 assert.Equal(t, "", content) 165 166 content, err = handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 2, Character: 25}) 167 assert.Equal(t, nil, err) 168 assert.Equal(t, "old required:true, type:str", content) 169 170 content, err = handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 2, Character: 29}) 171 assert.Equal(t, nil, err) 172 assert.Equal(t, "new required:true, type:str", content) 173 174 // Hover on assignment with function call 175 content, err = handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 6, Character: 18}) 176 assert.Equal(t, nil, err) 177 assert.Equal(t, "def subinclude(target:str, hash:str=None)", content) 178 } 179 180 func TestGetHoverAssignmentBuildLabel(t *testing.T) { 181 var ctx = context.Background() 182 183 content, err := handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 25, Character: 13}) 184 expected := []string{"go_library(", " name = \"fs\",", " srcs = ["} 185 t.Log(content) 186 assert.Equal(t, nil, err) 187 assert.Equal(t, strings.Split(content, "\n")[:3], expected) 188 } 189 190 func TestGetHoverContentOnUnaryAssignment(t *testing.T) { 191 var ctx = context.Background() 192 193 // Hover on assignment with unary op 194 content, err := handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 4, Character: 13}) 195 assert.Equal(t, nil, err) 196 assert.Equal(t, "def len(obj)", content) 197 } 198 199 func TestGetHoverContentOnListAssignment(t *testing.T) { 200 var ctx = context.Background() 201 202 coreContent := []string{"go_library(", " name = \"core\",", " srcs = glob("} 203 fsContent := []string{"go_library(", " name = \"fs\",", " srcs = ["} 204 205 // Hover on assignment with Multiline list 206 content, err := handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 10, Character: 11}) 207 assert.Equal(t, nil, err) 208 splited := strings.Split(content, "\n") 209 assert.Equal(t, coreContent, splited[:3]) 210 211 // Hover on assignment with single line list 212 content, err = handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 19, Character: 26}) 213 assert.Equal(t, nil, err) 214 splited = strings.Split(content, "\n") 215 assert.Equal(t, fsContent, splited[:3]) 216 217 content, err = handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 19, Character: 39}) 218 assert.Equal(t, nil, err) 219 splited = strings.Split(content, "\n") 220 assert.Equal(t, coreContent, splited[:3]) 221 222 // Hover on empty space assignment 223 content, err = handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 12, Character: 52}) 224 assert.Equal(t, nil, err) 225 assert.Equal(t, "", content) 226 } 227 228 func TestGetHoverContentOnIfAssignment(t *testing.T) { 229 var ctx = context.Background() 230 231 // Hover on if statement assignment empty 232 content, err := handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 21, Character: 33}) 233 assert.Equal(t, nil, err) 234 assert.Equal(t, "", content) 235 236 // Hover on else statement assignment 237 content, err = handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 21, Character: 40}) 238 assert.Equal(t, nil, err) 239 assert.Equal(t, "def subinclude(target:str, hash:str=None)", 240 content) 241 } 242 243 /*************************************** 244 *Tests for Variable augAssign 245 ***************************************/ 246 func TestGetHoverContentAugAssign(t *testing.T) { 247 var ctx = context.Background() 248 249 // Hover on assignment with call 250 content, err := handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 23, Character: 14}) 251 assert.Equal(t, nil, err) 252 assert.Equal(t, "def len(obj)", content) 253 254 // Hover on empty space 255 content, err = handler.getHoverContent(ctx, assignBuildURI, lsp.Position{Line: 23, Character: 56}) 256 assert.Equal(t, nil, err) 257 assert.Equal(t, "", content) 258 } 259 260 /*************************************** 261 *Tests for property 262 ***************************************/ 263 func TestGetHoverContentProperty(t *testing.T) { 264 var ctx = context.Background() 265 266 // Hover on CONFIG property 267 content, err := handler.getHoverContent(ctx, propURI, lsp.Position{Line: 0, Character: 4}) 268 assert.Equal(t, nil, err) 269 assert.Equal(t, "", content) 270 271 content, err = handler.getHoverContent(ctx, propURI, lsp.Position{Line: 2, Character: 4}) 272 assert.Equal(t, nil, err) 273 assert.Equal(t, "str.replace(old:str, new:str)", content) 274 } 275 276 /*************************************** 277 *Tests for ast expression statements 278 ***************************************/ 279 func TestGetHoverContentAst(t *testing.T) { 280 var ctx = context.Background() 281 282 // Test for statement 283 content, err := handler.getHoverContent(ctx, miscURI, lsp.Position{Line: 0, Character: 11}) 284 assert.Equal(t, nil, err) 285 assert.Equal(t, "def len(obj)", content) 286 287 // Test inner For statement 288 content, err = handler.getHoverContent(ctx, miscURI, lsp.Position{Line: 1, Character: 11}) 289 assert.Equal(t, nil, err) 290 assert.Equal(t, "str.replace(old:str, new:str)", content) 291 292 // Test Assert For statement 293 content, err = handler.getHoverContent(ctx, miscURI, lsp.Position{Line: 2, Character: 17}) 294 assert.Equal(t, nil, err) 295 assert.Equal(t, "def subinclude(target:str, hash:str=None)", content) 296 } 297 298 func TestGetHoverContentAst2(t *testing.T) { 299 var ctx = context.Background() 300 301 // Test if statement 302 content, err := handler.getHoverContent(ctx, miscURI, lsp.Position{Line: 4, Character: 7}) 303 assert.Equal(t, nil, err) 304 assert.Equal(t, "str.find(needle:str)", content) 305 306 // Test elif statement 307 content, err = handler.getHoverContent(ctx, miscURI, lsp.Position{Line: 6, Character: 8}) 308 assert.Equal(t, nil, err) 309 assert.Equal(t, "str.count(needle:str)", content) 310 311 // Test return statement 312 content, err = handler.getHoverContent(ctx, miscURI, lsp.Position{Line: 5, Character: 17}) 313 assert.Equal(t, nil, err) 314 assert.Equal(t, "def subinclude(target:str, hash:str=None)", content) 315 316 content, err = handler.getHoverContent(ctx, miscURI, lsp.Position{Line: 9, Character: 17}) 317 assert.Equal(t, nil, err) 318 assert.Equal(t, "str.lower()", content) 319 } 320 321 func TestGetHoverContentSubinclude(t *testing.T) { 322 var ctx = context.Background() 323 324 // hover on subincluded rule name 325 content, err := handler.getHoverContent(ctx, subincludeURI, lsp.Position{Line: 2, Character: 8}) 326 assert.Equal(t, nil, err) 327 328 expected := "def plz_e2e_test(name, cmd, pre_cmd=None, expected_output=None, expected_failure=False,\n" + 329 " expect_output_contains=None, expect_output_doesnt_contain=None,\n" + 330 " deps=None, data=[], labels=None, sandbox=None,\n" + 331 " expect_file_exists=None, expect_file_doesnt_exist=None)" 332 assert.Equal(t, expected, content) 333 334 // hover on subincluded arg 335 content, err = handler.getHoverContent(ctx, subincludeURI, lsp.Position{Line: 3, Character: 7}) 336 assert.Equal(t, nil, err) 337 assert.Equal(t, "name required:true", content) 338 }