aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-24 22:24:42 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-24 22:24:42 +0100
commitdb5d22b9761149e5f16c1df4805072547ecf9f1f (patch)
treefabb80bc91d66c6c1ed928be47d2c8b1b1d97d25 /src/test/java
parentb3640946e1e30ec4538b88399966b7b8b8680dd6 (diff)
Fix update of top lexical context
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerContextTests.java24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerContextTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerContextTests.java
index 7a2d7d71..a9198b86 100644
--- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerContextTests.java
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerContextTests.java
@@ -76,6 +76,30 @@ public class TypeCheckerContextTests {
}
@Test
+ public void definingVariableOnlyAffectsTopMostLexicalContext() {
+ var context = TypeCheckerContext.EMPTY
+ .enterNamespace(P.map(
+ Map.entry("x", TypeCheckerContext.undefined()),
+ Map.entry("y", TypeCheckerContext.undefined())
+ ));
+
+ context = context.enterBlock(P.map(
+ Map.entry("x", TypeCheckerContext.undefined())
+ ));
+ context = context.define("x", Types.STRING, Sources.NULL);
+ assertThat(
+ context.runtimeLookup("x", Sources.NULL).value(),
+ isOptionalOf(equalTo(TypeCheckerContext.defined(Types.STRING)))
+ );
+
+ context = context.exit();
+ assertThat(
+ context.runtimeLookup("x", Sources.NULL).value(),
+ isOptionalOf(equalTo(TypeCheckerContext.undefined()))
+ );
+ }
+
+ @Test
public void runtimeLookupUpdatesFreeVariablesUntilLexicalContextInWhichVariableIsDefined() {
var context = TypeCheckerContext.EMPTY
.enterBlock(P.map())