aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-11-05 20:08:08 +0000
committerMichael Williamson <mike@zwobble.org>2023-11-05 20:08:08 +0000
commitf3d28bc5d05eea6d8ed9db603682631290f8da2c (patch)
tree66dbc1373cf3523dbf6941d17a637b2f130fa977 /src/test/java
parent65affbc796449ab434a80212d6bf20ccf0ddbd97 (diff)
Throw error if handling field not on effect
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTryTests.java35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTryTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTryTests.java
index 9d2c06b0..c7a98211 100644
--- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTryTests.java
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTryTests.java
@@ -3,8 +3,10 @@ package org.shedlang.compiler.typechecker;
import org.junit.jupiter.api.Test;
import org.shedlang.compiler.ast.untyped.Untyped;
import org.shedlang.compiler.ast.untyped.UntypedCallNode;
+import org.shedlang.compiler.ast.untyped.UntypedFunctionDefinitionNode;
import org.shedlang.compiler.ast.untyped.UntypedTryNode;
import org.shedlang.compiler.typechecker.errors.MissingEffectHandlerFieldError;
+import org.shedlang.compiler.typechecker.errors.NoSuchFieldError;
import org.shedlang.compiler.typechecker.errors.NotUserDefinedEffectError;
import org.shedlang.compiler.typechecker.errors.UnexpectedEffectError;
import org.shedlang.compiler.types.*;
@@ -189,4 +191,37 @@ public class TypeCheckerTryTests {
assertThat(error.fieldName(), equalTo("mark"));
}
+
+ @Test
+ public void whenHandlerHasFieldNotInEffectThenErrorIsThrown() {
+ var handledEffect = Effects.userDefined(NAMESPACE_NAME, "HandledEffect");
+ var untyped = UntypedTryNode.builder()
+ .withHandledEffect(Untyped.typeLevelReference(handledEffect.name()))
+ .addHandlerField(
+ UntypedFunctionDefinitionNode.builder()
+ .withName("mark")
+ .build()
+ )
+ .build();
+ var context = TypeCheckerContext.EMPTY
+ .addUserDefinedEffectInfo(
+ handledEffect,
+ UserDefinedEffectInfo.builder()
+ .build()
+ )
+ .enterFunction(
+ P.map(
+ Map.entry(handledEffect.name(), Variable.defined(Types.effectType(handledEffect), VariableType.CONSTANT))
+ ),
+ Effects.NONE,
+ Optional.empty()
+ );
+
+ var error = assertThrows(
+ NoSuchFieldError.class,
+ () -> typeCheckExpression(untyped, context)
+ );
+
+ assertThat(error.fieldName(), equalTo("mark"));
+ }
}