diff options
Diffstat (limited to 'parser/parser_test.go')
| -rw-r--r-- | parser/parser_test.go | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/parser/parser_test.go b/parser/parser_test.go index f1b8b8c..7b347f5 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -519,6 +519,14 @@ func TestOperatorPrecedenceParsing(t *testing.T) { "add(a + b + c * d / f + g)", "add((((a + b) + ((c * d) / f)) + g))", }, + { + "a * [1, 2, 3, 4][b * c] * d", + "((a * ([1, 2, 3, 4][(b * c)])) * d)", + }, + { + "add(a * b[2], b[1], 2 * [1, 2][1])", + "add((a * (b[2])), (b[1]), (2 * ([1, 2][1])))", + }, } for _, tt := range tests { @@ -802,6 +810,11 @@ func TestParsingArrayLiterals(t *testing.T) { checkParserErrors(t, p) stmt, ok := program.Statements[0].(*ast.ExpressionStatement) + + if !ok { + t.Fatalf("program.Statements[0] is not ast.ExpressionStatement. got=%T", program.Statements[0]) + } + array, ok := stmt.Expression.(*ast.ArrayLiteral) if !ok { @@ -816,3 +829,33 @@ func TestParsingArrayLiterals(t *testing.T) { testInfixExpression(t, array.Elements[1], 2, "*", 2) testInfixExpression(t, array.Elements[2], 3, "+", 3) } + +func TestParsingIndexExpressions(t *testing.T) { + input := "myArray[1 + 1]" + + var l *lexer.Lexer = lexer.New(input) + var p *Parser = New(l) + + var program *ast.Program = p.ParseProgram() + checkParserErrors(t, p) + + stmt, ok := program.Statements[0].(*ast.ExpressionStatement) + + if !ok { + t.Fatalf("program.Statements[0] is not ast.ExpressionStatement. got=%T", program.Statements[0]) + } + + indexExp, ok := stmt.Expression.(*ast.IndexExpression) + + if !ok { + t.Fatalf("exp is not ast.IndexExpression. got=%T", stmt.Expression) + } + + if !testIdentifier(t, indexExp.Left, "myArray") { + return + } + + if !testInfixExpression(t, indexExp.Index, 1, "+", 1) { + return + } +} |
