aboutsummaryrefslogtreecommitdiff
path: root/parser/parser_test.go
diff options
context:
space:
mode:
authorBobby <[email protected]>2024-01-24 21:03:26 +0000
committerBobby <[email protected]>2024-01-24 21:03:26 +0000
commitc07b5f8fd0cf8bd1654825dcf7401d670fda4c0a (patch)
tree21630a57b47598ddf58f9428e265157ce9206fc8 /parser/parser_test.go
parentb7d832da734647049f28c6994292d77b6e2c60eb (diff)
downloadmana-c07b5f8fd0cf8bd1654825dcf7401d670fda4c0a.tar.xz
mana-c07b5f8fd0cf8bd1654825dcf7401d670fda4c0a.zip
If-Else Parsing
Diffstat (limited to 'parser/parser_test.go')
-rw-r--r--parser/parser_test.go106
1 files changed, 106 insertions, 0 deletions
diff --git a/parser/parser_test.go b/parser/parser_test.go
index d2a8c8f..f26fa1e 100644
--- a/parser/parser_test.go
+++ b/parser/parser_test.go
@@ -546,3 +546,109 @@ func testBooleanLiteral(t *testing.T, exp ast.Expression, value bool) bool {
return true
}
+
+// If expression tests.
+
+func TestIfExpression(t *testing.T) {
+ input := "if (x < y) { x }"
+
+ var l *lexer.Lexer = lexer.New(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", 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.IfExpression)
+
+ if !ok {
+ t.Fatalf("stmt.Expression is not ast.IfExpression. got=%T", stmt.Expression)
+ }
+
+ if !testInfixExpression(t, exp.Condition, "x", "<", "y") {
+ return
+ }
+
+ if len(exp.Consequence.Statements) != 1 {
+ t.Errorf("consequence is not 1 statements. got=%d", len(exp.Consequence.Statements))
+ }
+
+ consequence, ok := exp.Consequence.Statements[0].(*ast.ExpressionStatement)
+
+ if !ok {
+ t.Fatalf("Statements[0] is not ast.ExpressionStatement. got=%T", exp.Consequence.Statements[0])
+ }
+
+ if !testIdentifier(t, consequence.Expression, "x") {
+ return
+ }
+
+ if exp.Alternative != nil {
+ t.Errorf("exp.Alternative.Statements was not nil. got=%+v", exp.Alternative)
+ }
+}
+
+func TestIfElseExpression(t *testing.T) {
+ input := "if (x < y) { x } else { y }"
+
+ var l *lexer.Lexer = lexer.New(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", 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.IfExpression)
+
+ if !ok {
+ t.Fatalf("stmt.Expression is not ast.IfExpression. got=%T", stmt.Expression)
+ }
+
+ if !testInfixExpression(t, exp.Condition, "x", "<", "y") {
+ return
+ }
+
+ if len(exp.Consequence.Statements) != 1 {
+ t.Errorf("consequence is not 1 statements. got=%d", len(exp.Consequence.Statements))
+ }
+
+ consequence, ok := exp.Consequence.Statements[0].(*ast.ExpressionStatement)
+
+ if !ok {
+ t.Fatalf("Statements[0] is not ast.ExpressionStatement. got=%T", exp.Consequence.Statements[0])
+ }
+
+ if !testIdentifier(t, consequence.Expression, "x") {
+ return
+ }
+
+ if len(exp.Alternative.Statements) != 1 {
+ t.Errorf("consequence is not 1 statements. got=%d", len(exp.Alternative.Statements))
+ }
+
+ alternative, ok := exp.Alternative.Statements[0].(*ast.ExpressionStatement)
+
+ if !ok {
+ t.Fatalf("Statements[0] is not ast.ExpressionStatement. got=%T", exp.Alternative.Statements[0])
+ }
+
+ if !testIdentifier(t, alternative.Expression, "y") {
+ return
+ }
+}