aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-12-29 11:48:40 +0000
committerMichael Williamson <mike@zwobble.org>2023-12-29 11:48:40 +0000
commit7c34126993f49596ba425f54e44496599a5d25a2 (patch)
tree66e8c4d725aabe6238b6aef509a2b8f6759c8038 /src/test/java
parent23d625dbaf27186dcf74014b6a25011612523178 (diff)
Check handling of case with wrong type arg in when expression
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerWhenTests.java57
1 files changed, 56 insertions, 1 deletions
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerWhenTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerWhenTests.java
index dcf0979d..9ed7b247 100644
--- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerWhenTests.java
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerWhenTests.java
@@ -206,7 +206,6 @@ public class TypeCheckerWhenTests {
List.of(TypeParam.forStructType(VARIANT_TYPE_1, "T")),
VARIANT_TYPE_1
);
- // TODO: check type checking fails when constructed type arg for case is incorrect
var constructedVariantType1 = Types.constructedType(
variantTypeConstructor1,
List.of(Types.STRING)
@@ -265,6 +264,62 @@ public class TypeCheckerWhenTests {
}
@Test
+ public void whenCaseHasConstructedTypeWithWrongTypeArgThenErrorIsThrown() {
+ var variantTypeConstructor1 = Types.typeConstructor(
+ List.of(TypeParam.forStructType(VARIANT_TYPE_1, "T")),
+ VARIANT_TYPE_1
+ );
+ var constructedVariantType1 = Types.constructedType(
+ variantTypeConstructor1,
+ List.of(Types.STRING)
+ );
+ var untyped = Untyped.when(
+ Untyped.reference("x"),
+ List.of(
+ Untyped.whenCase(
+ Untyped.constructedType(
+ Untyped.typeLevelReference(VARIANT_TYPE_1.name()),
+ List.of(Untyped.typeLevelReference("Int"))
+ ),
+ Untyped.block(List.of(
+ Untyped.blockReturn(Untyped.stringLiteral("a"))
+ ))
+ ),
+ Untyped.whenCase(
+ Untyped.typeLevelReference(VARIANT_TYPE_2.name()),
+ Untyped.block(List.of(
+ Untyped.blockReturn(Untyped.stringLiteral("b"))
+ ))
+ )
+ )
+ );
+ var context = TypeCheckerContext.EMPTY
+ .addSumTypeInfo(SUM_TYPE, new SumTypeInfo(P.orderedSet(
+ SumVariant.constructedStruct(constructedVariantType1),
+ SumVariant.struct(VARIANT_TYPE_2)
+ )))
+ .enterGlobal(P.map(
+ Map.entry("Int", Types.metaType(Types.INT)),
+ Map.entry("x", SUM_TYPE),
+ Map.entry(VARIANT_TYPE_1.name(), Types.typeConstructorType(variantTypeConstructor1)),
+ Map.entry(VARIANT_TYPE_2.name(), Types.metaType(VARIANT_TYPE_2))
+ ));
+
+ var error = assertThrows(
+ UnreachableWhenCaseError.class,
+ () -> typeCheckExpression(untyped, context)
+ );
+
+ assertThat(
+ error.caseType(),
+ equalTo(Types.constructedType(
+ variantTypeConstructor1,
+ List.of(Types.INT)
+ ))
+ );
+ }
+
+ @Test
public void whenCaseBodiesHaveSameTypeThenExpressionTypeIsThatType() {
var untyped = Untyped.when(
Untyped.reference("x"),