github.com/sercand/please@v13.4.0+incompatible/src/parse/asp/parser_test.go (about) 1 package asp 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/assert" 7 ) 8 9 func TestParseBasic(t *testing.T) { 10 statements, err := newParser().parse("src/parse/asp/test_data/basic.build") 11 assert.NoError(t, err) 12 assert.Equal(t, 1, len(statements)) 13 assert.NotNil(t, statements[0].FuncDef) 14 assert.Equal(t, "test", statements[0].FuncDef.Name) 15 assert.Equal(t, 1, len(statements[0].FuncDef.Arguments)) 16 assert.Equal(t, "x", statements[0].FuncDef.Arguments[0].Name) 17 assert.Equal(t, 1, len(statements[0].FuncDef.Statements)) 18 assert.True(t, statements[0].FuncDef.Statements[0].Pass) 19 20 // Test for Endpos 21 assert.Equal(t, 9, statements[0].EndPos.Column) 22 assert.Equal(t, 3, statements[0].EndPos.Line) 23 } 24 25 func TestParseDefaultArguments(t *testing.T) { 26 statements, err := newParser().parse("src/parse/asp/test_data/default_arguments.build") 27 assert.NoError(t, err) 28 assert.Equal(t, 1, len(statements)) 29 assert.NotNil(t, statements[0].FuncDef) 30 assert.Equal(t, "test", statements[0].FuncDef.Name) 31 assert.Equal(t, 3, len(statements[0].FuncDef.Arguments)) 32 assert.Equal(t, 1, len(statements[0].FuncDef.Statements)) 33 assert.True(t, statements[0].FuncDef.Statements[0].Pass) 34 35 args := statements[0].FuncDef.Arguments 36 assert.Equal(t, "name", args[0].Name) 37 assert.Equal(t, "\"name\"", args[0].Value.Val.String) 38 assert.Equal(t, "timeout", args[1].Name) 39 assert.Equal(t, 10, args[1].Value.Val.Int.Int) 40 assert.Equal(t, "args", args[2].Name) 41 assert.Equal(t, "None", args[2].Value.Val.Bool) 42 43 // Test for Endpos 44 assert.Equal(t, 9, statements[0].EndPos.Column) 45 assert.Equal(t, 3, statements[0].EndPos.Line) 46 } 47 48 func TestParseFunctionCalls(t *testing.T) { 49 statements, err := newParser().parse("src/parse/asp/test_data/function_call.build") 50 assert.NoError(t, err) 51 assert.Equal(t, 5, len(statements)) 52 53 assert.NotNil(t, statements[0].Ident.Action.Call) 54 assert.Equal(t, "package", statements[0].Ident.Name) 55 assert.Equal(t, 0, len(statements[0].Ident.Action.Call.Arguments)) 56 57 assert.NotNil(t, statements[2].Ident.Action.Call) 58 assert.Equal(t, "package", statements[2].Ident.Name) 59 assert.Equal(t, 1, len(statements[2].Ident.Action.Call.Arguments)) 60 arg := statements[2].Ident.Action.Call.Arguments[0] 61 assert.Equal(t, "default_visibility", arg.Name) 62 assert.NotNil(t, arg.Value) 63 assert.Equal(t, 1, len(arg.Value.Val.List.Values)) 64 assert.Equal(t, "\"PUBLIC\"", arg.Value.Val.List.Values[0].Val.String) 65 66 assert.NotNil(t, statements[3].Ident.Action.Call) 67 assert.Equal(t, "python_library", statements[3].Ident.Name) 68 assert.Equal(t, 2, len(statements[3].Ident.Action.Call.Arguments)) 69 args := statements[3].Ident.Action.Call.Arguments 70 assert.Equal(t, "name", args[0].Name) 71 assert.Equal(t, "\"lib\"", args[0].Value.Val.String) 72 assert.Equal(t, "srcs", args[1].Name) 73 assert.NotNil(t, args[1].Value.Val.List) 74 assert.Equal(t, 2, len(args[1].Value.Val.List.Values)) 75 assert.Equal(t, "\"lib1.py\"", args[1].Value.Val.List.Values[0].Val.String) 76 assert.Equal(t, "\"lib2.py\"", args[1].Value.Val.List.Values[1].Val.String) 77 78 assert.NotNil(t, statements[4].Ident.Action.Call) 79 assert.Equal(t, "subinclude", statements[4].Ident.Name) 80 assert.NotNil(t, statements[4].Ident.Action.Call) 81 assert.Equal(t, 1, len(statements[4].Ident.Action.Call.Arguments)) 82 assert.Equal(t, "\"//build_defs:version\"", statements[4].Ident.Action.Call.Arguments[0].Value.Val.String) 83 84 // Test for Endpos 85 assert.Equal(t, 10, statements[0].EndPos.Column) 86 assert.Equal(t, 1, statements[0].EndPos.Line) 87 assert.Equal(t, 10, statements[1].EndPos.Column) 88 assert.Equal(t, 2, statements[1].EndPos.Line) 89 assert.Equal(t, 41, statements[2].EndPos.Column) 90 assert.Equal(t, 3, statements[2].EndPos.Line) 91 assert.Equal(t, 2, statements[3].EndPos.Column) 92 assert.Equal(t, 11, statements[3].EndPos.Line) 93 assert.Equal(t, 35, statements[4].EndPos.Column) 94 assert.Equal(t, 13, statements[4].EndPos.Line) 95 } 96 97 func TestParseAssignments(t *testing.T) { 98 statements, err := newParser().parse("src/parse/asp/test_data/assignments.build") 99 assert.NoError(t, err) 100 assert.Equal(t, 1, len(statements)) 101 102 assert.NotNil(t, statements[0].Ident.Action.Assign) 103 assert.Equal(t, "x", statements[0].Ident.Name) 104 ass := statements[0].Ident.Action.Assign.Val.Dict 105 assert.NotNil(t, ass) 106 assert.Equal(t, 3, len(ass.Items)) 107 assert.Equal(t, "\"mickey\"", ass.Items[0].Key.Val.String) 108 assert.Equal(t, 3, ass.Items[0].Value.Val.Int.Int) 109 assert.Equal(t, "\"donald\"", ass.Items[1].Key.Val.String) 110 assert.Equal(t, "\"sora\"", ass.Items[1].Value.Val.String) 111 assert.Equal(t, "\"goofy\"", ass.Items[2].Key.Val.String) 112 assert.Equal(t, "riku", ass.Items[2].Value.Val.Ident.Name) 113 114 // Test for Endpos 115 assert.Equal(t, 2, statements[0].EndPos.Column) 116 assert.Equal(t, 5, statements[0].EndPos.Line) 117 } 118 119 func TestForStatement(t *testing.T) { 120 statements, err := newParser().parse("src/parse/asp/test_data/for_statement.build") 121 assert.NoError(t, err) 122 assert.Equal(t, 2, len(statements)) 123 124 assert.NotNil(t, statements[0].Ident.Action.Assign) 125 assert.Equal(t, "LANGUAGES", statements[0].Ident.Name) 126 assert.Equal(t, 2, len(statements[0].Ident.Action.Assign.Val.List.Values)) 127 128 assert.NotNil(t, statements[1].For) 129 assert.Equal(t, []string{"language"}, statements[1].For.Names) 130 assert.Equal(t, "LANGUAGES", statements[1].For.Expr.Val.Ident.Name) 131 assert.Equal(t, 2, len(statements[1].For.Statements)) 132 133 //Test for Endpos 134 assert.Equal(t, 2, statements[0].EndPos.Column) 135 assert.Equal(t, 4, statements[0].EndPos.Line) 136 assert.Equal(t, 6, statements[1].EndPos.Column) 137 assert.Equal(t, 12, statements[1].EndPos.Line) 138 } 139 140 func TestOperators(t *testing.T) { 141 statements, err := newParser().parse("src/parse/asp/test_data/operators.build") 142 assert.NoError(t, err) 143 assert.Equal(t, 1, len(statements)) 144 145 assert.NotNil(t, statements[0].Ident.Action.Call) 146 assert.Equal(t, "genrule", statements[0].Ident.Name) 147 assert.Equal(t, 2, len(statements[0].Ident.Action.Call.Arguments)) 148 149 arg := statements[0].Ident.Action.Call.Arguments[1] 150 assert.Equal(t, "srcs", arg.Name) 151 assert.NotNil(t, arg.Value.Val.List) 152 assert.Equal(t, 1, len(arg.Value.Val.List.Values)) 153 assert.Equal(t, "\"//something:test_go\"", arg.Value.Val.List.Values[0].Val.String) 154 assert.Equal(t, 1, len(arg.Value.Op)) 155 assert.Equal(t, Add, arg.Value.Op[0].Op) 156 call := arg.Value.Op[0].Expr.Val.Ident.Action[0].Call 157 assert.Equal(t, "glob", arg.Value.Op[0].Expr.Val.Ident.Name) 158 assert.NotNil(t, call) 159 assert.Equal(t, 1, len(call.Arguments)) 160 assert.NotNil(t, call.Arguments[0].Value.Val.List) 161 assert.Equal(t, 1, len(call.Arguments[0].Value.Val.List.Values)) 162 assert.Equal(t, "\"*.go\"", call.Arguments[0].Value.Val.List.Values[0].Val.String) 163 164 //Test for Endpos 165 assert.Equal(t, 2, statements[0].EndPos.Column) 166 assert.Equal(t, 4, statements[0].EndPos.Line) 167 } 168 169 func TestIndexing(t *testing.T) { 170 statements, err := newParser().parse("src/parse/asp/test_data/indexing.build") 171 assert.NoError(t, err) 172 assert.Equal(t, 7, len(statements)) 173 174 assert.Equal(t, "x", statements[0].Ident.Name) 175 assert.NotNil(t, statements[0].Ident.Action.Assign) 176 assert.Equal(t, "\"test\"", statements[0].Ident.Action.Assign.Val.String) 177 178 assert.Equal(t, "y", statements[1].Ident.Name) 179 assert.NotNil(t, statements[1].Ident.Action.Assign) 180 assert.Equal(t, "x", statements[1].Ident.Action.Assign.Val.Ident.Name) 181 assert.NotNil(t, statements[1].Ident.Action.Assign.Val.Slice) 182 assert.Equal(t, 2, statements[1].Ident.Action.Assign.Val.Slice.Start.Val.Int.Int) 183 assert.Equal(t, "", statements[1].Ident.Action.Assign.Val.Slice.Colon) 184 assert.Nil(t, statements[1].Ident.Action.Assign.Val.Slice.End) 185 186 assert.Equal(t, "z", statements[2].Ident.Name) 187 assert.NotNil(t, statements[2].Ident.Action.Assign) 188 assert.Equal(t, "x", statements[2].Ident.Action.Assign.Val.Ident.Name) 189 assert.NotNil(t, statements[2].Ident.Action.Assign.Val.Slice) 190 assert.Equal(t, 1, statements[2].Ident.Action.Assign.Val.Slice.Start.Val.Int.Int) 191 assert.Equal(t, ":", statements[2].Ident.Action.Assign.Val.Slice.Colon) 192 assert.Equal(t, -1, statements[2].Ident.Action.Assign.Val.Slice.End.Val.Int.Int) 193 194 assert.Equal(t, "a", statements[3].Ident.Name) 195 assert.NotNil(t, statements[3].Ident.Action.Assign) 196 assert.Equal(t, "x", statements[3].Ident.Action.Assign.Val.Ident.Name) 197 assert.NotNil(t, statements[3].Ident.Action.Assign.Val.Slice) 198 assert.Equal(t, 2, statements[3].Ident.Action.Assign.Val.Slice.Start.Val.Int.Int) 199 assert.Equal(t, ":", statements[3].Ident.Action.Assign.Val.Slice.Colon) 200 assert.Nil(t, statements[3].Ident.Action.Assign.Val.Slice.End) 201 202 assert.Equal(t, "b", statements[4].Ident.Name) 203 assert.NotNil(t, statements[4].Ident.Action.Assign) 204 assert.Equal(t, "x", statements[4].Ident.Action.Assign.Val.Ident.Name) 205 assert.NotNil(t, statements[4].Ident.Action.Assign.Val.Slice) 206 assert.Nil(t, statements[4].Ident.Action.Assign.Val.Slice.Start) 207 assert.Equal(t, ":", statements[4].Ident.Action.Assign.Val.Slice.Colon) 208 assert.Equal(t, 2, statements[4].Ident.Action.Assign.Val.Slice.End.Val.Int.Int) 209 210 assert.Equal(t, "c", statements[5].Ident.Name) 211 assert.NotNil(t, statements[5].Ident.Action.Assign) 212 assert.Equal(t, "x", statements[5].Ident.Action.Assign.Val.Ident.Name) 213 assert.NotNil(t, statements[5].Ident.Action.Assign.Val.Slice) 214 assert.Equal(t, "y", statements[5].Ident.Action.Assign.Val.Slice.Start.Val.Ident.Name) 215 assert.Equal(t, "", statements[5].Ident.Action.Assign.Val.Slice.Colon) 216 assert.Nil(t, statements[5].Ident.Action.Assign.Val.Slice.End) 217 218 //Test for Endpos 219 assert.Equal(t, 11, statements[0].EndPos.Column) 220 assert.Equal(t, 1, statements[0].EndPos.Line) 221 assert.Equal(t, 9, statements[1].EndPos.Column) 222 assert.Equal(t, 3, statements[1].EndPos.Line) 223 assert.Equal(t, 12, statements[2].EndPos.Column) 224 assert.Equal(t, 5, statements[2].EndPos.Line) 225 assert.Equal(t, 10, statements[3].EndPos.Column) 226 assert.Equal(t, 7, statements[3].EndPos.Line) 227 assert.Equal(t, 10, statements[4].EndPos.Column) 228 assert.Equal(t, 9, statements[4].EndPos.Line) 229 assert.Equal(t, 9, statements[5].EndPos.Column) 230 assert.Equal(t, 11, statements[5].EndPos.Line) 231 } 232 233 func TestIfStatement(t *testing.T) { 234 statements, err := newParser().parse("src/parse/asp/test_data/if_statement.build") 235 assert.NoError(t, err) 236 assert.Equal(t, 1, len(statements)) 237 238 ifs := statements[0].If 239 assert.NotNil(t, ifs) 240 assert.Equal(t, "condition_a", ifs.Condition.Val.Ident.Name) 241 assert.Equal(t, And, ifs.Condition.Op[0].Op) 242 assert.Equal(t, "condition_b", ifs.Condition.Op[0].Expr.Val.Ident.Name) 243 assert.Equal(t, 1, len(ifs.Statements)) 244 assert.Equal(t, "genrule", ifs.Statements[0].Ident.Name) 245 246 //Test for Endpos 247 assert.Equal(t, 6, statements[0].EndPos.Column) 248 assert.Equal(t, 4, statements[0].EndPos.Line) 249 } 250 251 func TestDoubleUnindent(t *testing.T) { 252 statements, err := newParser().parse("src/parse/asp/test_data/double_unindent.build") 253 assert.NoError(t, err) 254 assert.Equal(t, 1, len(statements)) 255 256 assert.NotNil(t, statements[0].For) 257 assert.Equal(t, "y", statements[0].For.Names[0]) 258 assert.Equal(t, "x", statements[0].For.Expr.Val.Ident.Name) 259 assert.Equal(t, 1, len(statements[0].For.Statements)) 260 261 for2 := statements[0].For.Statements[0].For 262 assert.NotNil(t, for2) 263 assert.Equal(t, "z", for2.Names[0]) 264 assert.Equal(t, "y", for2.Expr.Val.Ident.Name) 265 assert.Equal(t, 1, len(for2.Statements)) 266 assert.Equal(t, "genrule", for2.Statements[0].Ident.Name) 267 268 //Test for Endpos 269 assert.Equal(t, 10, statements[0].EndPos.Column) 270 assert.Equal(t, 5, statements[0].EndPos.Line) 271 } 272 273 func TestInlineIf(t *testing.T) { 274 statements, err := newParser().parse("src/parse/asp/test_data/inline_if.build") 275 assert.NoError(t, err) 276 assert.Equal(t, 1, len(statements)) 277 278 assert.Equal(t, "x", statements[0].Ident.Name) 279 ass := statements[0].Ident.Action.Assign 280 assert.NotNil(t, ass) 281 assert.NotNil(t, ass.Val.List) 282 assert.Equal(t, 1, len(ass.Val.List.Values)) 283 assert.NotNil(t, ass.If) 284 assert.Equal(t, "y", ass.If.Condition.Val.Ident.Name) 285 assert.EqualValues(t, Is, ass.If.Condition.Op[0].Op) 286 assert.Equal(t, "None", ass.If.Condition.Op[0].Expr.Val.Bool) 287 assert.NotNil(t, ass.If.Else.Val.List) 288 assert.Equal(t, 1, len(ass.If.Else.Val.List.Values)) 289 290 // Test for Endpos 291 assert.Equal(t, 1, statements[0].EndPos.Line) 292 assert.Equal(t, 38, statements[0].EndPos.Column) 293 } 294 295 func TestFunctionDef(t *testing.T) { 296 statements, err := newParser().parse("src/parse/asp/test_data/function_def.build") 297 assert.NoError(t, err) 298 assert.Equal(t, 1, len(statements)) 299 assert.Equal(t, 3, len(statements[0].FuncDef.Statements)) 300 assert.Equal(t, "Generate a C or C++ library target.", stringLiteral(statements[0].FuncDef.Docstring)) 301 302 // Test for Endpos 303 assert.Equal(t, 9, statements[0].EndPos.Line) 304 assert.Equal(t, 22, statements[0].EndPos.Column) 305 } 306 307 func TestComprehension(t *testing.T) { 308 statements, err := newParser().parse("src/parse/asp/test_data/comprehension.build") 309 assert.NoError(t, err) 310 assert.Equal(t, 2, len(statements)) 311 312 assert.NotNil(t, statements[0].Ident.Action.Assign) 313 assert.NotNil(t, statements[1].Ident.Action.Assign) 314 assert.Equal(t, 1, len(statements[0].Ident.Action.Assign.Val.List.Values)) 315 assert.NotNil(t, statements[0].Ident.Action.Assign.Val.List.Comprehension) 316 assert.NotNil(t, statements[1].Ident.Action.Assign.Val.Dict.Comprehension) 317 318 // Test for Endpos 319 assert.Equal(t, 1, statements[0].EndPos.Line) 320 assert.Equal(t, 29, statements[0].EndPos.Column) 321 assert.Equal(t, 3, statements[1].EndPos.Line) 322 assert.Equal(t, 47, statements[1].EndPos.Column) 323 } 324 325 func TestMethodsOnLiterals(t *testing.T) { 326 statements, err := newParser().parse("src/parse/asp/test_data/literal_methods.build") 327 assert.NoError(t, err) 328 assert.Equal(t, 1, len(statements)) 329 330 // Test for Endpos 331 assert.Equal(t, 5, statements[0].EndPos.Line) 332 assert.Equal(t, 3, statements[0].EndPos.Column) 333 } 334 335 func TestUnaryOp(t *testing.T) { 336 statements, err := newParser().parse("src/parse/asp/test_data/unary_op.build") 337 assert.NoError(t, err) 338 assert.Equal(t, 3, len(statements)) 339 340 assert.NotNil(t, statements[0].Ident.Action.Assign.UnaryOp) 341 assert.Equal(t, "-", statements[0].Ident.Action.Assign.UnaryOp.Op) 342 assert.Equal(t, "len", statements[0].Ident.Action.Assign.UnaryOp.Expr.Ident.Name) 343 assert.NotNil(t, statements[1].Ident.Action.Assign.UnaryOp) 344 assert.Equal(t, "not", statements[1].Ident.Action.Assign.UnaryOp.Op) 345 assert.Equal(t, "x", statements[1].Ident.Action.Assign.UnaryOp.Expr.Ident.Name) 346 347 // Test for Endpos 348 assert.Equal(t, 1, statements[0].EndPos.Line) 349 assert.Equal(t, 19, statements[0].EndPos.Column) 350 assert.Equal(t, 3, statements[1].EndPos.Line) 351 assert.Equal(t, 10, statements[1].EndPos.Column) 352 assert.Equal(t, 5, statements[2].EndPos.Line) 353 assert.Equal(t, 24, statements[2].EndPos.Column) 354 } 355 356 func TestAugmentedAssignment(t *testing.T) { 357 statements, err := newParser().parse("src/parse/asp/test_data/aug_assign.build") 358 assert.NoError(t, err) 359 assert.Equal(t, 1, len(statements)) 360 assert.NotNil(t, statements[0].Ident.Action.AugAssign) 361 362 // Test for Endpos 363 assert.Equal(t, 1, statements[0].EndPos.Line) 364 assert.Equal(t, 17, statements[0].EndPos.Column) 365 } 366 367 func TestRaise(t *testing.T) { 368 statements, err := newParser().parse("src/parse/asp/test_data/raise.build") 369 assert.NoError(t, err) 370 assert.Equal(t, 2, len(statements)) 371 372 // Test for Endpos 373 assert.Equal(t, 1, statements[0].EndPos.Line) 374 assert.Equal(t, 27, statements[0].EndPos.Column) 375 assert.Equal(t, 4, statements[1].EndPos.Line) 376 assert.Equal(t, 31, statements[1].EndPos.Column) 377 } 378 379 func TestElseStatement(t *testing.T) { 380 statements, err := newParser().parse("src/parse/asp/test_data/else.build") 381 assert.NoError(t, err) 382 assert.Equal(t, 1, len(statements)) 383 assert.NotNil(t, statements[0].If) 384 assert.Equal(t, 1, len(statements[0].If.Statements)) 385 assert.Equal(t, 2, len(statements[0].If.Elif)) 386 assert.Equal(t, 1, len(statements[0].If.Elif[0].Statements)) 387 assert.NotNil(t, statements[0].If.Elif[0].Condition) 388 assert.Equal(t, 1, len(statements[0].If.Elif[1].Statements)) 389 assert.NotNil(t, statements[0].If.Elif[1].Condition) 390 assert.Equal(t, 1, len(statements[0].If.ElseStatements)) 391 392 // Test for Endpos 393 assert.Equal(t, 8, statements[0].EndPos.Line) 394 assert.Equal(t, 9, statements[0].EndPos.Column) 395 } 396 397 func TestDestructuringAssignment(t *testing.T) { 398 statements, err := newParser().parse("src/parse/asp/test_data/destructuring_assign.build") 399 assert.NoError(t, err) 400 assert.Equal(t, 1, len(statements)) 401 assert.NotNil(t, statements[0].Ident) 402 assert.Equal(t, "x", statements[0].Ident.Name) 403 assert.NotNil(t, statements[0].Ident.Unpack) 404 assert.Equal(t, 1, len(statements[0].Ident.Unpack.Names)) 405 assert.Equal(t, "y", statements[0].Ident.Unpack.Names[0]) 406 assert.NotNil(t, statements[0].Ident.Unpack.Expr) 407 assert.Equal(t, "something", statements[0].Ident.Unpack.Expr.Val.Ident.Name) 408 409 // Test for Endpos 410 assert.Equal(t, 1, statements[0].EndPos.Line) 411 assert.Equal(t, 19, statements[0].EndPos.Column) 412 } 413 414 func TestMultipleActions(t *testing.T) { 415 statements, err := newParser().parse("src/parse/asp/test_data/multiple_action.build") 416 assert.NoError(t, err) 417 assert.Equal(t, 3, len(statements)) 418 assert.NotNil(t, statements[0].Ident.Action.Assign) 419 assert.Equal(t, "y", statements[0].Ident.Action.Assign.Val.Ident.Name) 420 421 // Test for Endpos 422 assert.Equal(t, 1, statements[0].EndPos.Line) 423 assert.Equal(t, 64, statements[0].EndPos.Column) 424 assert.Equal(t, 3, statements[1].EndPos.Line) 425 assert.Equal(t, 14, statements[1].EndPos.Column) 426 assert.Equal(t, 5, statements[2].EndPos.Line) 427 assert.Equal(t, 12, statements[2].EndPos.Column) 428 } 429 430 func TestAssert(t *testing.T) { 431 statements, err := newParser().parse("src/parse/asp/test_data/assert.build") 432 assert.NoError(t, err) 433 assert.Equal(t, 2, len(statements)) 434 435 // Test for Endpos 436 assert.Equal(t, 1, statements[0].EndPos.Line) 437 assert.Equal(t, 74, statements[0].EndPos.Column) 438 439 assert.Equal(t, 4, statements[1].EndPos.Line) 440 assert.Equal(t, 18, statements[1].EndPos.Column) 441 } 442 443 func TestOptimise(t *testing.T) { 444 p := newParser() 445 statements, err := p.parse("src/parse/asp/test_data/optimise.build") 446 assert.NoError(t, err) 447 assert.Equal(t, 5, len(statements)) 448 statements = p.optimise(statements) 449 assert.Equal(t, 4, len(statements)) 450 451 assert.NotNil(t, statements[0].FuncDef) 452 assert.Equal(t, 0, len(statements[0].FuncDef.Statements)) 453 // Test for Endpos 454 assert.Equal(t, 41, statements[0].EndPos.Column) 455 assert.Equal(t, 4, statements[0].EndPos.Line) 456 457 assert.NotNil(t, statements[1].FuncDef) 458 assert.Equal(t, 0, len(statements[1].FuncDef.Statements)) 459 // Test for Endpos 460 assert.Equal(t, 9, statements[1].EndPos.Column) 461 assert.Equal(t, 7, statements[1].EndPos.Line) 462 463 assert.NotNil(t, statements[2].FuncDef) 464 assert.Equal(t, 1, len(statements[2].FuncDef.Statements)) 465 // Test for Endpos 466 assert.Equal(t, 18, statements[2].EndPos.Column) 467 assert.Equal(t, 10, statements[2].EndPos.Line) 468 469 ident := statements[2].FuncDef.Statements[0].Ident 470 assert.NotNil(t, ident) 471 assert.Equal(t, "l", ident.Name) 472 assert.NotNil(t, ident.Action.AugAssign) 473 assert.NotNil(t, ident.Action.AugAssign.Val.List) 474 475 // Test for Endpos 476 assert.Equal(t, 11, statements[3].EndPos.Column) 477 assert.Equal(t, 13, statements[3].EndPos.Line) 478 } 479 480 func TestMultilineStringQuotes(t *testing.T) { 481 statements, err := newParser().parse("src/parse/asp/test_data/multiline_string_quotes.build") 482 assert.NoError(t, err) 483 assert.Equal(t, 1, len(statements)) 484 assert.NotNil(t, statements[0].Ident) 485 assert.NotNil(t, statements[0].Ident.Action) 486 assert.NotNil(t, statements[0].Ident.Action.Assign) 487 expected := `" 488 #include "UnitTest++/UnitTest++.h" 489 "` 490 assert.Equal(t, expected, statements[0].Ident.Action.Assign.Val.String) 491 492 //TODO(BNM): It would be nice if we can get the actual EndPos for the multiline 493 //assert.Equal(t, 4, statements[0].EndPos.Column) 494 //assert.Equal(t, 3, statements[0].EndPos.Line) 495 } 496 497 func TestExample0(t *testing.T) { 498 // These tests are specific examples that turned out to fail. 499 statements, err := newParser().parse("src/parse/asp/test_data/example.build") 500 assert.NoError(t, err) 501 502 // Test for Endpos 503 assert.Equal(t, 2, statements[0].EndPos.Column) 504 assert.Equal(t, 14, statements[0].EndPos.Line) 505 assert.Equal(t, 2, statements[1].EndPos.Column) 506 assert.Equal(t, 24, statements[1].EndPos.Line) 507 assert.Equal(t, 2, statements[2].EndPos.Column) 508 assert.Equal(t, 34, statements[2].EndPos.Line) 509 assert.Equal(t, 2, statements[3].EndPos.Column) 510 assert.Equal(t, 43, statements[3].EndPos.Line) 511 } 512 513 func TestExample1(t *testing.T) { 514 // These tests are specific examples that turned out to fail. 515 stmts, err := newParser().parse("src/parse/asp/test_data/example_1.build") 516 assert.NoError(t, err) 517 518 // Test for Endpos 519 assert.Equal(t, 13, stmts[0].EndPos.Column) 520 assert.Equal(t, 6, stmts[0].EndPos.Line) 521 } 522 523 func TestExample2(t *testing.T) { 524 stmts, err := newParser().parse("src/parse/asp/test_data/example_2.build") 525 assert.NoError(t, err) 526 527 // Test for Endpos 528 assert.Equal(t, 35, stmts[0].EndPos.Column) 529 assert.Equal(t, 1, stmts[0].EndPos.Line) 530 assert.Equal(t, 2, stmts[1].EndPos.Column) 531 assert.Equal(t, 7, stmts[1].EndPos.Line) 532 } 533 534 func TestExample3(t *testing.T) { 535 stmts, err := newParser().parse("src/parse/asp/test_data/example_3.build") 536 assert.NoError(t, err) 537 538 // Test for Endpos 539 assert.Equal(t, 2, stmts[0].EndPos.Column) 540 assert.Equal(t, 4, stmts[0].EndPos.Line) 541 542 // Test for IdentExpr.Endpos 543 property := stmts[0].Ident.Action.Assign.Val.Ident.Action[0].Property 544 assert.Equal(t, 1, property.Pos.Line) 545 assert.Equal(t, 16, property.Pos.Column) 546 assert.Equal(t, 4, property.EndPos.Line) 547 assert.Equal(t, 2, property.EndPos.Column) 548 } 549 550 func TestExample4(t *testing.T) { 551 stmts, err := newParser().parse("src/parse/asp/test_data/example_4.build") 552 assert.NoError(t, err) 553 assert.Equal(t, len(stmts), 1) 554 555 // Test for Endpos 556 assert.Equal(t, 1, stmts[0].EndPos.Line) 557 assert.Equal(t, 38, stmts[0].EndPos.Column) 558 } 559 560 func TestExample5(t *testing.T) { 561 stmts, err := newParser().parse("src/parse/asp/test_data/example_5.build") 562 assert.NoError(t, err) 563 564 // Test for Endpos 565 assert.Equal(t, 1, stmts[0].EndPos.Line) 566 assert.Equal(t, 68, stmts[0].EndPos.Column) 567 } 568 569 func TestExample6(t *testing.T) { 570 stmts, err := newParser().parse("src/parse/asp/test_data/example_6.build") 571 assert.NoError(t, err) 572 573 // Test for Endpos 574 assert.Equal(t, 1, stmts[0].EndPos.Line) 575 assert.Equal(t, 80, stmts[0].EndPos.Column) 576 577 // Test for IdentExpr.Endpos 578 property := stmts[0].Ident.Action.Assign.Val.Property 579 assert.Equal(t, 1, property.Pos.Line) 580 assert.Equal(t, 15, property.Pos.Column) 581 assert.Equal(t, 1, property.EndPos.Line) 582 assert.Equal(t, 60, property.EndPos.Column) 583 584 property = stmts[1].Ident.Action.Call.Arguments[0].Value.Val.Property 585 assert.Equal(t, 4, property.Pos.Line) 586 assert.Equal(t, 31, property.Pos.Column) 587 assert.Equal(t, 4, property.EndPos.Line) 588 assert.Equal(t, 66, property.EndPos.Column) 589 } 590 591 func TestPrecedence(t *testing.T) { 592 stmts, err := newParser().parse("src/parse/asp/test_data/precedence.build") 593 assert.NoError(t, err) 594 assert.Equal(t, 1, len(stmts)) 595 assert.NotNil(t, stmts[0].Ident.Action.Assign.If) 596 597 // Test for Endpos 598 assert.Equal(t, 1, stmts[0].EndPos.Line) 599 assert.Equal(t, 35, stmts[0].EndPos.Column) 600 } 601 602 func TestMissingNewlines(t *testing.T) { 603 stmts, err := newParser().parse("src/parse/asp/test_data/no_newline.build") 604 assert.NoError(t, err) 605 assert.Equal(t, 1, len(stmts)) 606 607 // Test for Endpos 608 assert.Equal(t, 1, stmts[0].EndPos.Line) 609 assert.Equal(t, 10, stmts[0].EndPos.Column) 610 } 611 612 func TestRepeatedArguments(t *testing.T) { 613 _, err := newParser().parse("src/parse/asp/test_data/repeated_arguments.build") 614 assert.Error(t, err) 615 } 616 617 func TestConstantAssignments(t *testing.T) { 618 _, err := newParser().parse("src/parse/asp/test_data/constant_assign.build") 619 assert.Error(t, err) 620 } 621 622 func TestFStrings(t *testing.T) { 623 stmts, err := newParser().parse("src/parse/asp/test_data/fstring.build") 624 assert.NoError(t, err) 625 assert.Equal(t, 4, len(stmts)) 626 627 f := stmts[1].Ident.Action.Assign.Val.FString 628 assert.NotNil(t, f) 629 assert.Equal(t, "", f.Suffix) 630 assert.Equal(t, 1, len(f.Vars)) 631 assert.Equal(t, "", f.Vars[0].Prefix) 632 assert.Equal(t, "x", f.Vars[0].Var) 633 634 f = stmts[2].Ident.Action.Assign.Val.FString 635 assert.NotNil(t, f) 636 assert.Equal(t, " fin", f.Suffix) 637 assert.Equal(t, 2, len(f.Vars)) 638 assert.Equal(t, "x: ", f.Vars[0].Prefix) 639 assert.Equal(t, "x", f.Vars[0].Var) 640 assert.Equal(t, " y: ", f.Vars[1].Prefix) 641 assert.Equal(t, "y", f.Vars[1].Var) 642 643 // Test for Endpos 644 assert.Equal(t, 1, stmts[0].EndPos.Line) 645 assert.Equal(t, 8, stmts[0].EndPos.Column) 646 assert.Equal(t, 2, stmts[1].EndPos.Line) 647 assert.Equal(t, 11, stmts[1].EndPos.Column) 648 assert.Equal(t, 3, stmts[2].EndPos.Line) 649 assert.Equal(t, 25, stmts[2].EndPos.Column) 650 assert.Equal(t, 6, stmts[3].EndPos.Line) 651 assert.Equal(t, 15, stmts[3].EndPos.Column) 652 } 653 654 func TestFuncReturnTypes(t *testing.T) { 655 stmts, err := newParser().parse("src/parse/asp/test_data/return_type.build") 656 assert.NoError(t, err) 657 658 assert.Equal(t, "str", stmts[0].FuncDef.Return) 659 assert.Equal(t, "config", stmts[2].FuncDef.Return) 660 assert.Equal(t, "dict", stmts[3].FuncDef.Return) 661 }