aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-24 22:14:05 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-24 22:14:05 +0100
commit1380324206387b485579647bcbb0e184842579a3 (patch)
tree2558524b489a7b7ad4cdb1ee238d64fd347ae8d0 /src/test/java
parentcfc5182da57c3fd073e5d4b880871f9d52cd9ada (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.java39
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"))
+ ))
+ ));
+ }
}