From d4e6e270b038e721f7eba92d8dbcfe95ab1b31dd Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 10 Jun 2023 15:11:49 +0100 Subject: Check type of type-level value --- .../TypeCheckerTypeLevelReferenceTests.java | 25 +++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) (limited to 'src/test/java') 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,13 +36,28 @@ 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"); @@ -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")); -- cgit v1.2.3