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  }