package org.shedlang.compiler.parser; 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 ParserIfTests { @Test public void canParseIfWithSingleConditionalBranchAndNoElse() { var source = "if (a) { 1; }"; var node = parseString(source, Parser::parseTopLevelExpression); assertThat(node, isUntypedIfNode( isSequence( isUntypedConditionalBranchNode( isUntypedReferenceNode("a"), isUntypedBlockNode(isSequence( isUntypedExpressionStatementNode(isUntypedIntLiteralNode(1)) )) ) ), isUntypedBlockNode(isSequence()) )); } @Test public void canParseIfWithSingleConditionalBranchAndElse() { var source = "if (a) { 1; } else { 2; }"; var node = parseString(source, Parser::parseTopLevelExpression); assertThat(node, isUntypedIfNode( isSequence( isUntypedConditionalBranchNode( isUntypedReferenceNode("a"), isUntypedBlockNode(isSequence( isUntypedExpressionStatementNode(isUntypedIntLiteralNode(1)) )) ) ), isUntypedBlockNode(isSequence( isUntypedExpressionStatementNode(isUntypedIntLiteralNode(2)) )) )); } @Test public void canParseIfWithManyConditionalBranchesAndNoElse() { var source = "if (a) { 1; } else if (b) { 2; }"; var node = parseString(source, Parser::parseTopLevelExpression); assertThat(node, isUntypedIfNode( isSequence( isUntypedConditionalBranchNode( isUntypedReferenceNode("a"), isUntypedBlockNode(isSequence( isUntypedExpressionStatementNode(isUntypedIntLiteralNode(1)) )) ), isUntypedConditionalBranchNode( isUntypedReferenceNode("b"), isUntypedBlockNode(isSequence( isUntypedExpressionStatementNode(isUntypedIntLiteralNode(2)) )) ) ), isUntypedBlockNode(isSequence()) )); } @Test public void canParseIfWithManyConditionalBranchesAndElse() { var source = "if (a) { 1; } else if (b) { 2; } else { 3; }"; var node = parseString(source, Parser::parseTopLevelExpression); assertThat(node, isUntypedIfNode( isSequence( isUntypedConditionalBranchNode( isUntypedReferenceNode("a"), isUntypedBlockNode(isSequence( isUntypedExpressionStatementNode(isUntypedIntLiteralNode(1)) )) ), isUntypedConditionalBranchNode( isUntypedReferenceNode("b"), isUntypedBlockNode(isSequence( isUntypedExpressionStatementNode(isUntypedIntLiteralNode(2)) )) ) ), isUntypedBlockNode(isSequence( isUntypedExpressionStatementNode(isUntypedIntLiteralNode(3)) )) )); } }