From 152e63c1865d8bc1df36f54218cc9286b7fd1ff2 Mon Sep 17 00:00:00 2001 From: Bobby Date: Wed, 8 Nov 2023 17:56:53 +0000 Subject: parse infix operators --- parser/parser_test.go | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) (limited to 'parser/parser_test.go') 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 + } + } +} -- cgit v1.2.3