aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-10 15:28:35 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-10 15:28:35 +0100
commit07860b8ad33a87c6a95c53b63f2b15ae86574ed3 (patch)
tree35d0472aa8ff4d932ff1cfc27775ab15d5265f5a /src/test/java
parent0d531b61a74872da604aa35e367392b4f8c59219 (diff)
Type check effect in function definition
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java24
1 files changed, 22 insertions, 2 deletions
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java
index 1215389b..1671bed4 100644
--- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionDefinitionTests.java
@@ -3,6 +3,7 @@ package org.shedlang.compiler.typechecker;
import org.junit.jupiter.api.Test;
import org.shedlang.compiler.ast.untyped.Untyped;
import org.shedlang.compiler.ast.untyped.UntypedFunctionDefinitionNode;
+import org.shedlang.compiler.types.Effects;
import org.shedlang.compiler.types.Types;
import org.shedlang.compiler.util.P;
@@ -10,8 +11,7 @@ import java.util.Map;
import static org.shedlang.compiler.ast.typed.TypedNodeMatchers.*;
import static org.zwobble.precisely.AssertThat.assertThat;
-import static org.zwobble.precisely.Matchers.isOptionalEmpty;
-import static org.zwobble.precisely.Matchers.isSequence;
+import static org.zwobble.precisely.Matchers.*;
public class TypeCheckerFunctionDefinitionTests {
@Test
@@ -63,6 +63,26 @@ public class TypeCheckerFunctionDefinitionTests {
)
);
}
+ @Test
+ public void effectIsTypeChecked() {
+ var untyped = UntypedFunctionDefinitionNode.builder()
+ .withEffect(Untyped.typeLevelReference("Io"))
+ .withReturnType(Untyped.typeLevelReference("Unit"))
+ .build();
+ var context = TypeCheckerContext.EMPTY
+ .enter(P.map(
+ Map.entry("Io", Types.effectType(Effects.IO)),
+ Map.entry("Unit", Types.metaType(Types.UNIT))
+ ));
+
+ var typed = TypeChecker.typeCheckNamespaceStatement(untyped, context);
+
+ assertThat(
+ typed,
+ isTypedFunctionDefinitionNode()
+ .withEffect(isOptionalOf(isTypedTypeLevelReferenceNode("Io", Effects.IO)))
+ );
+ }
@Test
public void bodyIsTypeChecked() {