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  }