diff options
Diffstat (limited to 'parser/parser_test.go')
| -rw-r--r-- | parser/parser_test.go | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/parser/parser_test.go b/parser/parser_test.go index 828db24..d3e2d1d 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -259,3 +259,60 @@ func testIntegerLiteral(t *testing.T, il ast.Expression, value int64) bool { return true } + +// Infix expression tests. + +func TestParsingInfixExpressions(t *testing.T) { + var infixTests = []struct { + input string + leftValue int64 + operator string + rightValue int64 + }{ + {"5 + 5;", 5, "+", 5}, + {"5 - 5;", 5, "-", 5}, + {"5 * 5;", 5, "*", 5}, + {"5 / 5;", 5, "/", 5}, + {"5 > 5;", 5, ">", 5}, + {"5 < 5;", 5, "<", 5}, + {"5 == 5;", 5, "==", 5}, + {"5 != 5;", 5, "!=", 5}, + } + + for _, tt := range infixTests { + var l *lexer.Lexer = lexer.New(tt.input) + var p *Parser = New(l) + + var program *ast.Program = p.ParseProgram() + checkParserErrors(t, p) + + + if len(program.Statements) != 1 { + t.Fatalf("program.Statements does not contain %d statements, got=%d\n", 1, len(program.Statements)) + } + + stmt, ok := program.Statements[0].(*ast.ExpressionStatement) + + if !ok { + t.Fatalf("program.Statements[0] is not ast.ExpressionStatement, got=%T", program.Statements[0]) + } + + exp, ok := stmt.Expression.(*ast.InfixExpression) + + if !ok { + t.Fatalf("exp is not ast.InfixExpression. got=%T", stmt.Expression) + } + + if !testIntegerLiteral(t, exp.Left, tt.leftValue) { + return + } + + if exp.Operator != tt.operator { + t.Fatalf("exp.Operator is not '%s', got=%s", tt.operator, exp.Operator) + } + + if !testIntegerLiteral(t, exp.Right, tt.rightValue) { + return + } + } +} |
