package parser_test import ( "testing" "git.sharkk.net/Sharkk/Mako/parser" ) func TestInfixExpressions(t *testing.T) { tests := []struct { input string leftValue any operator string rightValue any }{ {"5 + 5", 5.0, "+", 5.0}, {"5 - 5", 5.0, "-", 5.0}, {"5 * 5", 5.0, "*", 5.0}, {"5 / 5", 5.0, "/", 5.0}, {"true + false", true, "+", false}, } for _, tt := range tests { t.Run(tt.input, func(t *testing.T) { l := parser.NewLexer(tt.input) p := parser.NewParser(l) expr := p.ParseExpression(parser.LOWEST) checkParserErrors(t, p) testInfixExpression(t, expr, tt.leftValue, tt.operator, tt.rightValue) }) } } func TestOperatorPrecedence(t *testing.T) { tests := []struct { input string expected string }{ {"1 + 2 * 3", "(1.00 + (2.00 * 3.00))"}, {"2 * 3 + 4", "((2.00 * 3.00) + 4.00)"}, {"(1 + 2) * 3", "((1.00 + 2.00) * 3.00)"}, {"1 + 2 - 3", "((1.00 + 2.00) - 3.00)"}, {"2 * 3 / 4", "((2.00 * 3.00) / 4.00)"}, } for _, tt := range tests { t.Run(tt.input, func(t *testing.T) { l := parser.NewLexer(tt.input) p := parser.NewParser(l) expr := p.ParseExpression(parser.LOWEST) checkParserErrors(t, p) if expr.String() != tt.expected { t.Errorf("expected %s, got %s", tt.expected, expr.String()) } }) } }