github.phpd.cn/thought-machine/please@v12.2.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 21 func TestParseDefaultArguments(t *testing.T) { 22 statements, err := newParser().parse("src/parse/asp/test_data/default_arguments.build") 23 assert.NoError(t, err) 24 assert.Equal(t, 1, len(statements)) 25 assert.NotNil(t, statements[0].FuncDef) 26 assert.Equal(t, "test", statements[0].FuncDef.Name) 27 assert.Equal(t, 3, len(statements[0].FuncDef.Arguments)) 28 assert.Equal(t, 1, len(statements[0].FuncDef.Statements)) 29 assert.True(t, statements[0].FuncDef.Statements[0].Pass) 30 31 args := statements[0].FuncDef.Arguments 32 assert.Equal(t, "name", args[0].Name) 33 assert.Equal(t, "\"name\"", args[0].Value.Val.String) 34 assert.Equal(t, "timeout", args[1].Name) 35 assert.Equal(t, 10, args[1].Value.Val.Int.Int) 36 assert.Equal(t, "args", args[2].Name) 37 assert.Equal(t, "None", args[2].Value.Val.Bool) 38 } 39 40 func TestParseFunctionCalls(t *testing.T) { 41 statements, err := newParser().parse("src/parse/asp/test_data/function_call.build") 42 assert.NoError(t, err) 43 assert.Equal(t, 5, len(statements)) 44 45 assert.NotNil(t, statements[0].Ident.Action.Call) 46 assert.Equal(t, "package", statements[0].Ident.Name) 47 assert.Equal(t, 0, len(statements[0].Ident.Action.Call.Arguments)) 48 49 assert.NotNil(t, statements[2].Ident.Action.Call) 50 assert.Equal(t, "package", statements[2].Ident.Name) 51 assert.Equal(t, 1, len(statements[2].Ident.Action.Call.Arguments)) 52 arg := statements[2].Ident.Action.Call.Arguments[0] 53 assert.Equal(t, "default_visibility", arg.Name) 54 assert.NotNil(t, arg.Value) 55 assert.Equal(t, 1, len(arg.Value.Val.List.Values)) 56 assert.Equal(t, "\"PUBLIC\"", arg.Value.Val.List.Values[0].Val.String) 57 58 assert.NotNil(t, statements[3].Ident.Action.Call) 59 assert.Equal(t, "python_library", statements[3].Ident.Name) 60 assert.Equal(t, 2, len(statements[3].Ident.Action.Call.Arguments)) 61 args := statements[3].Ident.Action.Call.Arguments 62 assert.Equal(t, "name", args[0].Name) 63 assert.Equal(t, "\"lib\"", args[0].Value.Val.String) 64 assert.Equal(t, "srcs", args[1].Name) 65 assert.NotNil(t, args[1].Value.Val.List) 66 assert.Equal(t, 2, len(args[1].Value.Val.List.Values)) 67 assert.Equal(t, "\"lib1.py\"", args[1].Value.Val.List.Values[0].Val.String) 68 assert.Equal(t, "\"lib2.py\"", args[1].Value.Val.List.Values[1].Val.String) 69 70 assert.NotNil(t, statements[4].Ident.Action.Call) 71 assert.Equal(t, "subinclude", statements[4].Ident.Name) 72 assert.NotNil(t, statements[4].Ident.Action.Call) 73 assert.Equal(t, 1, len(statements[4].Ident.Action.Call.Arguments)) 74 assert.Equal(t, "\"//build_defs:version\"", statements[4].Ident.Action.Call.Arguments[0].Value.Val.String) 75 } 76 77 func TestParseAssignments(t *testing.T) { 78 statements, err := newParser().parse("src/parse/asp/test_data/assignments.build") 79 assert.NoError(t, err) 80 assert.Equal(t, 1, len(statements)) 81 82 assert.NotNil(t, statements[0].Ident.Action.Assign) 83 assert.Equal(t, "x", statements[0].Ident.Name) 84 ass := statements[0].Ident.Action.Assign.Val.Dict 85 assert.NotNil(t, ass) 86 assert.Equal(t, 3, len(ass.Items)) 87 assert.Equal(t, "\"mickey\"", ass.Items[0].Key.Val.String) 88 assert.Equal(t, 3, ass.Items[0].Value.Val.Int.Int) 89 assert.Equal(t, "\"donald\"", ass.Items[1].Key.Val.String) 90 assert.Equal(t, "\"sora\"", ass.Items[1].Value.Val.String) 91 assert.Equal(t, "\"goofy\"", ass.Items[2].Key.Val.String) 92 assert.Equal(t, "riku", ass.Items[2].Value.Val.Ident.Name) 93 } 94 95 func TestForStatement(t *testing.T) { 96 statements, err := newParser().parse("src/parse/asp/test_data/for_statement.build") 97 assert.NoError(t, err) 98 assert.Equal(t, 2, len(statements)) 99 100 assert.NotNil(t, statements[0].Ident.Action.Assign) 101 assert.Equal(t, "LANGUAGES", statements[0].Ident.Name) 102 assert.Equal(t, 2, len(statements[0].Ident.Action.Assign.Val.List.Values)) 103 104 assert.NotNil(t, statements[1].For) 105 assert.Equal(t, []string{"language"}, statements[1].For.Names) 106 assert.Equal(t, "LANGUAGES", statements[1].For.Expr.Val.Ident.Name) 107 assert.Equal(t, 2, len(statements[1].For.Statements)) 108 } 109 110 func TestOperators(t *testing.T) { 111 statements, err := newParser().parse("src/parse/asp/test_data/operators.build") 112 assert.NoError(t, err) 113 assert.Equal(t, 1, len(statements)) 114 115 assert.NotNil(t, statements[0].Ident.Action.Call) 116 assert.Equal(t, "genrule", statements[0].Ident.Name) 117 assert.Equal(t, 2, len(statements[0].Ident.Action.Call.Arguments)) 118 119 arg := statements[0].Ident.Action.Call.Arguments[1] 120 assert.Equal(t, "srcs", arg.Name) 121 assert.NotNil(t, arg.Value.Val.List) 122 assert.Equal(t, 1, len(arg.Value.Val.List.Values)) 123 assert.Equal(t, "\"//something:test_go\"", arg.Value.Val.List.Values[0].Val.String) 124 assert.Equal(t, 1, len(arg.Value.Op)) 125 assert.Equal(t, Add, arg.Value.Op[0].Op) 126 call := arg.Value.Op[0].Expr.Val.Ident.Action[0].Call 127 assert.Equal(t, "glob", arg.Value.Op[0].Expr.Val.Ident.Name) 128 assert.NotNil(t, call) 129 assert.Equal(t, 1, len(call.Arguments)) 130 assert.NotNil(t, call.Arguments[0].Value.Val.List) 131 assert.Equal(t, 1, len(call.Arguments[0].Value.Val.List.Values)) 132 assert.Equal(t, "\"*.go\"", call.Arguments[0].Value.Val.List.Values[0].Val.String) 133 } 134 135 func TestIndexing(t *testing.T) { 136 statements, err := newParser().parse("src/parse/asp/test_data/indexing.build") 137 assert.NoError(t, err) 138 assert.Equal(t, 6, len(statements)) 139 140 assert.Equal(t, "x", statements[0].Ident.Name) 141 assert.NotNil(t, statements[0].Ident.Action.Assign) 142 assert.Equal(t, "\"test\"", statements[0].Ident.Action.Assign.Val.String) 143 144 assert.Equal(t, "y", statements[1].Ident.Name) 145 assert.NotNil(t, statements[1].Ident.Action.Assign) 146 assert.Equal(t, "x", statements[1].Ident.Action.Assign.Val.Ident.Name) 147 assert.NotNil(t, statements[1].Ident.Action.Assign.Val.Slice) 148 assert.Equal(t, 2, statements[1].Ident.Action.Assign.Val.Slice.Start.Val.Int.Int) 149 assert.Equal(t, "", statements[1].Ident.Action.Assign.Val.Slice.Colon) 150 assert.Nil(t, statements[1].Ident.Action.Assign.Val.Slice.End) 151 152 assert.Equal(t, "z", statements[2].Ident.Name) 153 assert.NotNil(t, statements[2].Ident.Action.Assign) 154 assert.Equal(t, "x", statements[2].Ident.Action.Assign.Val.Ident.Name) 155 assert.NotNil(t, statements[2].Ident.Action.Assign.Val.Slice) 156 assert.Equal(t, 1, statements[2].Ident.Action.Assign.Val.Slice.Start.Val.Int.Int) 157 assert.Equal(t, ":", statements[2].Ident.Action.Assign.Val.Slice.Colon) 158 assert.Equal(t, -1, statements[2].Ident.Action.Assign.Val.Slice.End.Val.Int.Int) 159 160 assert.Equal(t, "a", statements[3].Ident.Name) 161 assert.NotNil(t, statements[3].Ident.Action.Assign) 162 assert.Equal(t, "x", statements[3].Ident.Action.Assign.Val.Ident.Name) 163 assert.NotNil(t, statements[3].Ident.Action.Assign.Val.Slice) 164 assert.Equal(t, 2, statements[3].Ident.Action.Assign.Val.Slice.Start.Val.Int.Int) 165 assert.Equal(t, ":", statements[3].Ident.Action.Assign.Val.Slice.Colon) 166 assert.Nil(t, statements[3].Ident.Action.Assign.Val.Slice.End) 167 168 assert.Equal(t, "b", statements[4].Ident.Name) 169 assert.NotNil(t, statements[4].Ident.Action.Assign) 170 assert.Equal(t, "x", statements[4].Ident.Action.Assign.Val.Ident.Name) 171 assert.NotNil(t, statements[4].Ident.Action.Assign.Val.Slice) 172 assert.Nil(t, statements[4].Ident.Action.Assign.Val.Slice.Start) 173 assert.Equal(t, ":", statements[4].Ident.Action.Assign.Val.Slice.Colon) 174 assert.Equal(t, 2, statements[4].Ident.Action.Assign.Val.Slice.End.Val.Int.Int) 175 176 assert.Equal(t, "c", statements[5].Ident.Name) 177 assert.NotNil(t, statements[5].Ident.Action.Assign) 178 assert.Equal(t, "x", statements[5].Ident.Action.Assign.Val.Ident.Name) 179 assert.NotNil(t, statements[5].Ident.Action.Assign.Val.Slice) 180 assert.Equal(t, "y", statements[5].Ident.Action.Assign.Val.Slice.Start.Val.Ident.Name) 181 assert.Equal(t, "", statements[5].Ident.Action.Assign.Val.Slice.Colon) 182 assert.Nil(t, statements[5].Ident.Action.Assign.Val.Slice.End) 183 } 184 185 func TestIfStatement(t *testing.T) { 186 statements, err := newParser().parse("src/parse/asp/test_data/if_statement.build") 187 assert.NoError(t, err) 188 assert.Equal(t, 1, len(statements)) 189 190 ifs := statements[0].If 191 assert.NotNil(t, ifs) 192 assert.Equal(t, "condition_a", ifs.Condition.Val.Ident.Name) 193 assert.Equal(t, And, ifs.Condition.Op[0].Op) 194 assert.Equal(t, "condition_b", ifs.Condition.Op[0].Expr.Val.Ident.Name) 195 assert.Equal(t, 1, len(ifs.Statements)) 196 assert.Equal(t, "genrule", ifs.Statements[0].Ident.Name) 197 } 198 199 func TestDoubleUnindent(t *testing.T) { 200 statements, err := newParser().parse("src/parse/asp/test_data/double_unindent.build") 201 assert.NoError(t, err) 202 assert.Equal(t, 1, len(statements)) 203 204 assert.NotNil(t, statements[0].For) 205 assert.Equal(t, "y", statements[0].For.Names[0]) 206 assert.Equal(t, "x", statements[0].For.Expr.Val.Ident.Name) 207 assert.Equal(t, 1, len(statements[0].For.Statements)) 208 209 for2 := statements[0].For.Statements[0].For 210 assert.NotNil(t, for2) 211 assert.Equal(t, "z", for2.Names[0]) 212 assert.Equal(t, "y", for2.Expr.Val.Ident.Name) 213 assert.Equal(t, 1, len(for2.Statements)) 214 assert.Equal(t, "genrule", for2.Statements[0].Ident.Name) 215 } 216 217 func TestInlineIf(t *testing.T) { 218 statements, err := newParser().parse("src/parse/asp/test_data/inline_if.build") 219 assert.NoError(t, err) 220 assert.Equal(t, 1, len(statements)) 221 222 assert.Equal(t, "x", statements[0].Ident.Name) 223 ass := statements[0].Ident.Action.Assign 224 assert.NotNil(t, ass) 225 assert.NotNil(t, ass.Val.List) 226 assert.Equal(t, 1, len(ass.Val.List.Values)) 227 assert.NotNil(t, ass.If) 228 assert.Equal(t, "y", ass.If.Condition.Val.Ident.Name) 229 assert.EqualValues(t, Is, ass.If.Condition.Op[0].Op) 230 assert.Equal(t, "None", ass.If.Condition.Op[0].Expr.Val.Bool) 231 assert.NotNil(t, ass.If.Else.Val.List) 232 assert.Equal(t, 1, len(ass.If.Else.Val.List.Values)) 233 } 234 235 func TestFunctionDef(t *testing.T) { 236 statements, err := newParser().parse("src/parse/asp/test_data/function_def.build") 237 assert.NoError(t, err) 238 assert.Equal(t, 1, len(statements)) 239 assert.Equal(t, 3, len(statements[0].FuncDef.Statements)) 240 assert.Equal(t, "Generate a C or C++ library target.", stringLiteral(statements[0].FuncDef.Docstring)) 241 } 242 243 func TestComprehension(t *testing.T) { 244 statements, err := newParser().parse("src/parse/asp/test_data/comprehension.build") 245 assert.NoError(t, err) 246 assert.Equal(t, 2, len(statements)) 247 248 assert.NotNil(t, statements[0].Ident.Action.Assign) 249 assert.NotNil(t, statements[1].Ident.Action.Assign) 250 assert.Equal(t, 1, len(statements[0].Ident.Action.Assign.Val.List.Values)) 251 assert.NotNil(t, statements[0].Ident.Action.Assign.Val.List.Comprehension) 252 assert.NotNil(t, statements[1].Ident.Action.Assign.Val.Dict.Comprehension) 253 } 254 255 func TestMethodsOnLiterals(t *testing.T) { 256 statements, err := newParser().parse("src/parse/asp/test_data/literal_methods.build") 257 assert.NoError(t, err) 258 assert.Equal(t, 1, len(statements)) 259 } 260 261 func TestUnaryOp(t *testing.T) { 262 statements, err := newParser().parse("src/parse/asp/test_data/unary_op.build") 263 assert.NoError(t, err) 264 assert.Equal(t, 3, len(statements)) 265 266 assert.NotNil(t, statements[0].Ident.Action.Assign.UnaryOp) 267 assert.Equal(t, "-", statements[0].Ident.Action.Assign.UnaryOp.Op) 268 assert.Equal(t, "len", statements[0].Ident.Action.Assign.UnaryOp.Expr.Ident.Name) 269 assert.NotNil(t, statements[1].Ident.Action.Assign.UnaryOp) 270 assert.Equal(t, "not", statements[1].Ident.Action.Assign.UnaryOp.Op) 271 assert.Equal(t, "x", statements[1].Ident.Action.Assign.UnaryOp.Expr.Ident.Name) 272 } 273 274 func TestAugmentedAssignment(t *testing.T) { 275 statements, err := newParser().parse("src/parse/asp/test_data/aug_assign.build") 276 assert.NoError(t, err) 277 assert.Equal(t, 1, len(statements)) 278 assert.NotNil(t, statements[0].Ident.Action.AugAssign) 279 } 280 281 func TestElseStatement(t *testing.T) { 282 statements, err := newParser().parse("src/parse/asp/test_data/else.build") 283 assert.NoError(t, err) 284 assert.Equal(t, 1, len(statements)) 285 assert.NotNil(t, statements[0].If) 286 assert.Equal(t, 1, len(statements[0].If.Statements)) 287 assert.Equal(t, 2, len(statements[0].If.Elif)) 288 assert.Equal(t, 1, len(statements[0].If.Elif[0].Statements)) 289 assert.NotNil(t, statements[0].If.Elif[0].Condition) 290 assert.Equal(t, 1, len(statements[0].If.Elif[1].Statements)) 291 assert.NotNil(t, statements[0].If.Elif[1].Condition) 292 assert.Equal(t, 1, len(statements[0].If.ElseStatements)) 293 } 294 295 func TestDestructuringAssignment(t *testing.T) { 296 statements, err := newParser().parse("src/parse/asp/test_data/destructuring_assign.build") 297 assert.NoError(t, err) 298 assert.Equal(t, 1, len(statements)) 299 assert.NotNil(t, statements[0].Ident) 300 assert.Equal(t, "x", statements[0].Ident.Name) 301 assert.NotNil(t, statements[0].Ident.Unpack) 302 assert.Equal(t, 1, len(statements[0].Ident.Unpack.Names)) 303 assert.Equal(t, "y", statements[0].Ident.Unpack.Names[0]) 304 assert.NotNil(t, statements[0].Ident.Unpack.Expr) 305 assert.Equal(t, "something", statements[0].Ident.Unpack.Expr.Val.Ident.Name) 306 } 307 308 func TestMultipleActions(t *testing.T) { 309 statements, err := newParser().parse("src/parse/asp/test_data/multiple_action.build") 310 assert.NoError(t, err) 311 assert.Equal(t, 3, len(statements)) 312 assert.NotNil(t, statements[0].Ident.Action.Assign) 313 assert.Equal(t, "y", statements[0].Ident.Action.Assign.Val.Ident.Name) 314 } 315 316 func TestAssert(t *testing.T) { 317 statements, err := newParser().parse("src/parse/asp/test_data/assert.build") 318 assert.NoError(t, err) 319 assert.Equal(t, 1, len(statements)) 320 } 321 322 func TestOptimise(t *testing.T) { 323 p := newParser() 324 statements, err := p.parse("src/parse/asp/test_data/optimise.build") 325 assert.NoError(t, err) 326 assert.Equal(t, 4, len(statements)) 327 statements = p.optimise(statements) 328 assert.Equal(t, 3, len(statements)) 329 assert.NotNil(t, statements[0].FuncDef) 330 assert.Equal(t, 0, len(statements[0].FuncDef.Statements)) 331 assert.NotNil(t, statements[1].FuncDef) 332 assert.Equal(t, 0, len(statements[1].FuncDef.Statements)) 333 assert.NotNil(t, statements[2].FuncDef) 334 assert.Equal(t, 1, len(statements[2].FuncDef.Statements)) 335 ident := statements[2].FuncDef.Statements[0].Ident 336 assert.NotNil(t, ident) 337 assert.Equal(t, "l", ident.Name) 338 assert.NotNil(t, ident.Action.AugAssign) 339 assert.NotNil(t, ident.Action.AugAssign.Val.List) 340 } 341 342 func TestMultilineStringQuotes(t *testing.T) { 343 statements, err := newParser().parse("src/parse/asp/test_data/multiline_string_quotes.build") 344 assert.NoError(t, err) 345 assert.Equal(t, 1, len(statements)) 346 assert.NotNil(t, statements[0].Ident) 347 assert.NotNil(t, statements[0].Ident.Action) 348 assert.NotNil(t, statements[0].Ident.Action.Assign) 349 expected := `" 350 #include "UnitTest++/UnitTest++.h" 351 "` 352 assert.Equal(t, expected, statements[0].Ident.Action.Assign.Val.String) 353 } 354 355 func TestExample1(t *testing.T) { 356 // These tests are specific examples that turned out to fail. 357 _, err := newParser().parse("src/parse/asp/test_data/example_1.build") 358 assert.NoError(t, err) 359 } 360 361 func TestExample2(t *testing.T) { 362 _, err := newParser().parse("src/parse/asp/test_data/example_2.build") 363 assert.NoError(t, err) 364 } 365 366 func TestExample3(t *testing.T) { 367 _, err := newParser().parse("src/parse/asp/test_data/example_3.build") 368 assert.NoError(t, err) 369 } 370 371 func TestExample4(t *testing.T) { 372 _, err := newParser().parse("src/parse/asp/test_data/example_4.build") 373 assert.NoError(t, err) 374 } 375 376 func TestExample5(t *testing.T) { 377 _, err := newParser().parse("src/parse/asp/test_data/example_5.build") 378 assert.NoError(t, err) 379 } 380 381 func TestExample6(t *testing.T) { 382 _, err := newParser().parse("src/parse/asp/test_data/example_6.build") 383 assert.NoError(t, err) 384 } 385 386 func TestPrecedence(t *testing.T) { 387 stmts, err := newParser().parse("src/parse/asp/test_data/precedence.build") 388 assert.NoError(t, err) 389 assert.Equal(t, 1, len(stmts)) 390 assert.NotNil(t, stmts[0].Ident.Action.Assign.If) 391 } 392 393 func TestMissingNewlines(t *testing.T) { 394 stmts, err := newParser().parse("src/parse/asp/test_data/no_newline.build") 395 assert.NoError(t, err) 396 assert.Equal(t, 1, len(stmts)) 397 } 398 399 func TestRepeatedArguments(t *testing.T) { 400 _, err := newParser().parse("src/parse/asp/test_data/repeated_arguments.build") 401 assert.Error(t, err) 402 }