aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-11-05 20:03:22 +0000
committerMichael Williamson <mike@zwobble.org>2023-11-05 20:03:22 +0000
commitfbe9654480d0d7b50afad2ce249b5874701da1d9 (patch)
tree904ce61f47260f685f7e5829a128b5d5884a2cd1 /src/test/java
parentaa88533bb9809fd9cc597d0b6fc7676b35f1ede2 (diff)
Throw error if effect field is not handled
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTryTests.java48
1 files changed, 40 insertions, 8 deletions
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTryTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTryTests.java
index 802f4d44..0935755f 100644
--- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTryTests.java
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTryTests.java
@@ -6,10 +6,7 @@ import org.shedlang.compiler.ast.untyped.UntypedCallNode;
import org.shedlang.compiler.ast.untyped.UntypedTryNode;
import org.shedlang.compiler.typechecker.errors.NotUserDefinedEffectError;
import org.shedlang.compiler.typechecker.errors.UnexpectedEffectError;
-import org.shedlang.compiler.types.Effects;
-import org.shedlang.compiler.types.FunctionType;
-import org.shedlang.compiler.types.NamespaceName;
-import org.shedlang.compiler.types.Types;
+import org.shedlang.compiler.types.*;
import org.shedlang.compiler.util.P;
import java.util.Map;
@@ -35,7 +32,8 @@ public class TypeCheckerTryTests {
var context = TypeCheckerContext.EMPTY
.enterGlobal(P.map(
Map.entry("Empty", Types.effectType(effect))
- ));
+ ))
+ .addUserDefinedEffectInfo(effect, UserDefinedEffectInfo.builder().build());
var result = typeCheckExpression(untyped, context);
@@ -69,7 +67,9 @@ public class TypeCheckerTryTests {
),
Effects.NONE,
Optional.empty()
- );
+ )
+ .addUserDefinedEffectInfo(handledEffect, UserDefinedEffectInfo.builder().build())
+ .addUserDefinedEffectInfo(unexpectedEffect, UserDefinedEffectInfo.builder().build());
var error = assertThrows(
UnexpectedEffectError.class,
@@ -101,7 +101,9 @@ public class TypeCheckerTryTests {
),
allowedEffect,
Optional.empty()
- );
+ )
+ .addUserDefinedEffectInfo(handledEffect, UserDefinedEffectInfo.builder().build())
+ .addUserDefinedEffectInfo(allowedEffect, UserDefinedEffectInfo.builder().build());
var result = typeCheckExpression(untyped, context);
@@ -128,7 +130,8 @@ public class TypeCheckerTryTests {
),
Effects.NONE,
Optional.empty()
- );
+ )
+ .addUserDefinedEffectInfo(handledEffect, UserDefinedEffectInfo.builder().build());
var result = typeCheckExpression(untyped, context);
@@ -156,4 +159,33 @@ public class TypeCheckerTryTests {
assertThat(error.effect(), equalTo(Effects.IO));
}
+
+ @Test
+ public void whenHandlerIsMissingThenErrorIsThrown() {
+ var handledEffect = Effects.userDefined(NAMESPACE_NAME, "HandledEffect");
+ var untyped = UntypedTryNode.builder()
+ .withHandledEffect(Untyped.typeLevelReference(handledEffect.name()))
+ .build();
+ var context = TypeCheckerContext.EMPTY
+ .addUserDefinedEffectInfo(
+ handledEffect,
+ UserDefinedEffectInfo.builder()
+ .addField("mark", FunctionType.builder().withReturnType(Types.UNIT).build())
+ .build()
+ )
+ .enterFunction(
+ P.map(
+ Map.entry(handledEffect.name(), Variable.defined(Types.effectType(handledEffect), VariableType.CONSTANT))
+ ),
+ Effects.NONE,
+ Optional.empty()
+ );
+
+ var error = assertThrows(
+ MissingEffectHandlerFieldError.class,
+ () -> typeCheckExpression(untyped, context)
+ );
+
+ assertThat(error.fieldName(), equalTo("mark"));
+ }
}