diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-11-05 20:03:22 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-11-05 20:03:22 +0000 |
| commit | fbe9654480d0d7b50afad2ce249b5874701da1d9 (patch) | |
| tree | 904ce61f47260f685f7e5829a128b5d5884a2cd1 /src/test/java | |
| parent | aa88533bb9809fd9cc597d0b6fc7676b35f1ede2 (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.java | 48 |
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")); + } } |
