60 lines
1.3 KiB
Go
60 lines
1.3 KiB
Go
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())
|
|
}
|
|
})
|
|
}
|
|
}
|