aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-24 21:21:29 +0100
committerMichael Williamson <mike@zwobble.org>2023-10-24 21:21:29 +0100
commit405fc623d679c0d40a8e4fc031dd4e5e32d5f35f (patch)
tree0607ce5c6f321b7c6044094a7991663a19eccd4c /src/test/java
parentb18304ac527691bb778ca467cfef17805a4d85a7 (diff)
Type-check effect in function types
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionTypeTests.java49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionTypeTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionTypeTests.java
index 608e3caf..d1c7c2f2 100644
--- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionTypeTests.java
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerFunctionTypeTests.java
@@ -4,6 +4,7 @@ import org.junit.jupiter.api.Test;
import org.shedlang.compiler.ast.untyped.Untyped;
import org.shedlang.compiler.ast.untyped.UntypedFunctionTypeNode;
import org.shedlang.compiler.typechecker.typesets.TypeSets;
+import org.shedlang.compiler.types.Effects;
import org.shedlang.compiler.types.FunctionType;
import org.shedlang.compiler.types.Types;
import org.shedlang.compiler.util.P;
@@ -36,4 +37,52 @@ public class TypeCheckerFunctionTypeTests {
))
);
}
+
+ @Test
+ public void whenNodeHasNoEffectThenEffectIsNone() {
+ var untyped = UntypedFunctionTypeNode.builder()
+ .withReturnType(Untyped.typeLevelReference("String"))
+ .build();
+ var context = TypeCheckerContext.EMPTY
+ .enterGlobal(P.map(
+ Map.entry("String", Types.metaType(Types.STRING))
+ ));
+
+ var typed = TypeChecker.typeCheckTypeLevelExpression(TypeSets.META_TYPE, untyped, context);
+
+ assertThat(
+ typed,
+ isTypedFunctionTypeNode(equalTo(
+ FunctionType.builder()
+ .withEffect(Effects.NONE)
+ .withReturnType(Types.STRING)
+ .build()
+ ))
+ );
+ }
+
+ @Test
+ public void effectIsTypeChecked() {
+ var untyped = UntypedFunctionTypeNode.builder()
+ .withEffect(Untyped.typeLevelReference("Io"))
+ .withReturnType(Untyped.typeLevelReference("String"))
+ .build();
+ var context = TypeCheckerContext.EMPTY
+ .enterGlobal(P.map(
+ Map.entry("Io", Types.effectType(Effects.IO)),
+ Map.entry("String", Types.metaType(Types.STRING))
+ ));
+
+ var typed = TypeChecker.typeCheckTypeLevelExpression(TypeSets.META_TYPE, untyped, context);
+
+ assertThat(
+ typed,
+ isTypedFunctionTypeNode(equalTo(
+ FunctionType.builder()
+ .withEffect(Effects.IO)
+ .withReturnType(Types.STRING)
+ .build()
+ ))
+ );
+ }
}