aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-10 15:11:49 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-10 15:11:49 +0100
commitd4e6e270b038e721f7eba92d8dbcfe95ab1b31dd (patch)
tree20776839ac50d54c44c94f009a21236838050866 /src/test/java
parent3352299423098fa32275345f46beec19892f6e99 (diff)
Check type of type-level value
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTypeLevelReferenceTests.java25
1 files changed, 20 insertions, 5 deletions
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTypeLevelReferenceTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTypeLevelReferenceTests.java
index 13e7dc2c..c9f1272c 100644
--- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTypeLevelReferenceTests.java
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTypeLevelReferenceTests.java
@@ -5,7 +5,7 @@ import org.shedlang.compiler.ast.untyped.Untyped;
import org.shedlang.compiler.typechecker.errors.UnexpectedTypeError;
import org.shedlang.compiler.typechecker.errors.UnknownVariableError;
import org.shedlang.compiler.typechecker.typesets.TypeSets;
-import org.shedlang.compiler.types.Type;
+import org.shedlang.compiler.types.Effects;
import org.shedlang.compiler.types.Types;
import org.shedlang.compiler.util.P;
@@ -23,7 +23,7 @@ public class TypeCheckerTypeLevelReferenceTests {
var context = TypeCheckerContext.EMPTY
.enter(P.map(Map.entry("String", Types.metaType(Types.STRING))));
- var typed = TypeChecker.typeCheckTypeLevelExpression(Type.class, untyped, context);
+ var typed = TypeChecker.typeCheckTypeLevelExpression(TypeSets.META_TYPE, untyped, context);
assertThat(typed, isTypedTypeLevelReferenceNode("String", Types.STRING));
}
@@ -36,14 +36,29 @@ public class TypeCheckerTypeLevelReferenceTests {
var error = assertThrows(
UnexpectedTypeError.class,
- () -> TypeChecker.typeCheckTypeLevelExpression(Type.class, untyped, context)
+ () -> TypeChecker.typeCheckTypeLevelExpression(TypeSets.META_TYPE, untyped, context)
);
- assertThat(error.expected(), equalTo(TypeSets.TYPE_LEVEL_VALUE));
+ assertThat(error.expected(), equalTo(TypeSets.META_TYPE));
assertThat(error.actual(), equalTo(Types.STRING));
}
@Test
+ public void whenNameRefersToValueOfWrongTypeThenErrorIsThrown() {
+ var untyped = Untyped.typeLevelReference("Io");
+ var context = TypeCheckerContext.EMPTY
+ .enter(P.map(Map.entry("Io", Types.effectType(Effects.IO))));
+
+ var error = assertThrows(
+ UnexpectedTypeError.class,
+ () -> TypeChecker.typeCheckTypeLevelExpression(TypeSets.META_TYPE, untyped, context)
+ );
+
+ assertThat(error.expected(), equalTo(TypeSets.META_TYPE));
+ assertThat(error.actual(), equalTo(Types.effectType(Effects.IO)));
+ }
+
+ @Test
public void whenNameIsNotBoundInEnvironmentThenErrorIsThrown() {
var untyped = Untyped.typeLevelReference("String");
var context = TypeCheckerContext.EMPTY
@@ -51,7 +66,7 @@ public class TypeCheckerTypeLevelReferenceTests {
var error = assertThrows(
UnknownVariableError.class,
- () -> TypeChecker.typeCheckTypeLevelExpression(Type.class, untyped, context)
+ () -> TypeChecker.typeCheckTypeLevelExpression(TypeSets.META_TYPE, untyped, context)
);
assertThat(error.variableName(), equalTo("String"));