From 120b830cab1462d76761ee0d26cba7df783dc741 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 5 Nov 2023 19:38:22 +0000 Subject: Check that handled effect is user-defined effect --- .../compiler/typechecker/TypeCheckerTryTests.java | 23 ++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTryTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTryTests.java index 9224c8ff..802f4d44 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTryTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTryTests.java @@ -4,6 +4,7 @@ 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.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; @@ -133,4 +134,26 @@ public class TypeCheckerTryTests { assertThat(result.value(), isTypedTryNode()); } + + @Test + public void whenHandledEffectIsNotUserDefinedEffectThenErrorIsThrown() { + var untyped = UntypedTryNode.builder() + .withHandledEffect(Untyped.typeLevelReference("Io")) + .build(); + var context = TypeCheckerContext.EMPTY + .enterFunction( + P.map( + Map.entry("Io", Variable.defined(Types.effectType(Effects.IO), VariableType.CONSTANT)) + ), + Effects.NONE, + Optional.empty() + ); + + var error = assertThrows( + NotUserDefinedEffectError.class, + () -> typeCheckExpression(untyped, context) + ); + + assertThat(error.effect(), equalTo(Effects.IO)); + } } -- cgit v1.2.3