diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-24 22:14:05 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-24 22:14:05 +0100 |
| commit | 1380324206387b485579647bcbb0e184842579a3 (patch) | |
| tree | 2558524b489a7b7ad4cdb1ee238d64fd347ae8d0 /src/test/java | |
| parent | cfc5182da57c3fd073e5d4b880871f9d52cd9ada (diff) | |
Set up environment properly in nested blocks
Diffstat (limited to 'src/test/java')
| -rw-r--r-- | src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIfTests.java | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIfTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIfTests.java index 8ec1848e..0aaf3d5e 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIfTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIfTests.java @@ -5,8 +5,10 @@ import org.shedlang.compiler.ast.untyped.Untyped; import org.shedlang.compiler.typechecker.errors.UnexpectedTypeError; import org.shedlang.compiler.typechecker.typesets.TypeSets; import org.shedlang.compiler.types.Types; +import org.shedlang.compiler.util.P; import java.util.List; +import java.util.Map; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.shedlang.compiler.ast.typed.TypedNodeMatchers.*; @@ -110,4 +112,41 @@ public class TypeCheckerIfTests { assertThat(error.expected(), equalTo(TypeSets.type(Types.BOOL))); assertThat(error.actual(), equalTo(Types.INT)); } + + @Test + public void branchesHaveSeparateEnvironments() { + var untyped = Untyped.if_( + List.of( + Untyped.conditionalBranch( + Untyped.boolLiteral(true), + Untyped.block(List.of( + Untyped.val(Untyped.targetVariable("x"), Untyped.stringLiteral("a")) + )) + ) + ), + Untyped.block(List.of( + Untyped.val(Untyped.targetVariable("x"), Untyped.stringLiteral("b")) + )) + ); + var context = TypeCheckerContext.EMPTY + .enterNamespace(P.map( + Map.entry("x", TypeCheckerContext.defined(Types.STRING)) + )); + + var result = TypeChecker.typeCheckExpression(untyped, context); + + assertThat(result.value(), isTypedIfNode( + isSequence( + isTypedConditionalBranchNode( + isTypedBoolLiteralNode(true), + isTypedBlockNode(isSequence( + isTypedValNode(isTypedTargetVariable("x"), isTypedStringLiteralNode("a")) + )) + ) + ), + isTypedBlockNode(isSequence( + isTypedValNode(isTypedTargetVariable("x"), isTypedStringLiteralNode("b")) + )) + )); + } } |
