From 383321e4cbd303255607adcd0f8a2338050c795d Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 9 Jul 2023 19:17:56 +0100 Subject: Handle if expression statement --- .../parser/ParserExpressionStatementTests.java | 56 ++++++++++++++++++++++ 1 file changed, 56 insertions(+) (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/parser/ParserExpressionStatementTests.java b/src/test/java/org/shedlang/compiler/parser/ParserExpressionStatementTests.java index d962e68e..5b8bf167 100644 --- a/src/test/java/org/shedlang/compiler/parser/ParserExpressionStatementTests.java +++ b/src/test/java/org/shedlang/compiler/parser/ParserExpressionStatementTests.java @@ -5,6 +5,7 @@ import org.junit.jupiter.api.Test; import static org.shedlang.compiler.ast.untyped.UntypedNodeMatchers.*; import static org.shedlang.compiler.parser.ParserTesting.parseString; import static org.zwobble.precisely.AssertThat.assertThat; +import static org.zwobble.precisely.Matchers.isSequence; public class ParserExpressionStatementTests { @Test @@ -15,4 +16,59 @@ public class ParserExpressionStatementTests { assertThat(node, isUntypedExpressionStatementNode(isUntypedReferenceNode("f"))); } + + @Test + public void canParseBlockReturn() { + var source = "f"; + + var node = parseString(source, Parser::parseFunctionStatement); + + assertThat(node, isUntypedBlockReturnNode(isUntypedReferenceNode("f"))); + } + + @Test + public void ifWithAllBranchesAsExpressionStatementsIsExpressionStatement() { + var source = "if (a) { b; } else { c; }"; + + var node = parseString(source, Parser::parseFunctionStatement); + + assertThat(node, isUntypedExpressionStatementNode( + isUntypedIfNode( + isSequence( + isUntypedConditionalBranchNode( + isUntypedReferenceNode("a"), + isUntypedBlockNode(isSequence( + isUntypedExpressionStatementNode(isUntypedReferenceNode("b")) + )) + ) + ), + isUntypedBlockNode(isSequence( + isUntypedExpressionStatementNode(isUntypedReferenceNode("c")) + )) + ) + )); + } + + @Test + public void ifWithAllBranchesAsBlockReturnsIsBlockReturn() { + var source = "if (a) { b } else { c }"; + + var node = parseString(source, Parser::parseFunctionStatement); + + assertThat(node, isUntypedBlockReturnNode( + isUntypedIfNode( + isSequence( + isUntypedConditionalBranchNode( + isUntypedReferenceNode("a"), + isUntypedBlockNode(isSequence( + isUntypedBlockReturnNode(isUntypedReferenceNode("b")) + )) + ) + ), + isUntypedBlockNode(isSequence( + isUntypedBlockReturnNode(isUntypedReferenceNode("c")) + )) + ) + )); + } } -- cgit v1.2.3