aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-12-29 11:46:49 +0000
committerMichael Williamson <mike@zwobble.org>2023-12-29 11:46:49 +0000
commit23d625dbaf27186dcf74014b6a25011612523178 (patch)
tree72f084745c58a44e8ac7719936067e5ab77243d7 /src/test/java
parentc98a8de3d9cd79b37e8c69a668ebbf2a633423f3 (diff)
Support constructed struct type as case in when expression
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerWhenTests.java64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerWhenTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerWhenTests.java
index d0ea43cb..dcf0979d 100644
--- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerWhenTests.java
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerWhenTests.java
@@ -201,6 +201,70 @@ public class TypeCheckerWhenTests {
}
@Test
+ public void variantCanBeConstructedSumType() {
+ var variantTypeConstructor1 = Types.typeConstructor(
+ 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)
+ );
+ var untyped = Untyped.when(
+ Untyped.reference("x"),
+ List.of(
+ Untyped.whenCase(
+ Untyped.constructedType(
+ Untyped.typeLevelReference(VARIANT_TYPE_1.name()),
+ List.of(Untyped.typeLevelReference("String"))
+ ),
+ 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("String", Types.metaType(Types.STRING)),
+ 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 result = typeCheckExpression(untyped, context);
+
+ assertThat(result.value(), isTypedWhenNode(
+ isTypedReferenceNode("x", SUM_TYPE),
+ isSequence(
+ isTypedWhenCaseNode(
+ equalTo(SumVariant.constructedStruct(constructedVariantType1)),
+ isTypedBlockNode(isSequence(
+ isTypedBlockReturnNode(isTypedStringLiteralNode("a"))
+ ))
+ ),
+ isTypedWhenCaseNode(
+ equalTo(SumVariant.struct(VARIANT_TYPE_2)),
+ isTypedBlockNode(isSequence(
+ isTypedBlockReturnNode(isTypedStringLiteralNode("b"))
+ ))
+ )
+ )
+ ));
+ }
+
+ @Test
public void whenCaseBodiesHaveSameTypeThenExpressionTypeIsThatType() {
var untyped = Untyped.when(
Untyped.reference("x"),