aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-01 19:42:26 +0100
committerMichael Williamson <mike@zwobble.org>2023-10-01 19:42:26 +0100
commit9645a0ee4ea525b97084d1ef26c326201baaf7b4 (patch)
tree2504105d1cd4b7b73108caa2b862e618b699b913 /src/test/java
parent0f40994a60b060bddba5f08f5f43e4c49099c015 (diff)
Check type of when expression
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIfTests.java2
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerWhenTests.java65
2 files changed, 66 insertions, 1 deletions
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIfTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIfTests.java
index c619409b..375b8923 100644
--- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIfTests.java
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIfTests.java
@@ -72,7 +72,7 @@ public class TypeCheckerIfTests {
}
@Test
- public void whenBranchesHaveDifferentTypesThenTypeOfIfIsUnionOfBranchTypes() {
+ public void whenBranchesHaveDifferentTypesThenTypeOfIfIsCommonSuperTypeOfBranchTypes() {
var untyped = Untyped.if_(
List.of(
Untyped.conditionalBranch(
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerWhenTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerWhenTests.java
index 4fdaf950..aec35c33 100644
--- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerWhenTests.java
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerWhenTests.java
@@ -10,6 +10,7 @@ import java.util.Map;
import static org.shedlang.compiler.ast.typed.TypedNodeMatchers.*;
import static org.zwobble.precisely.AssertThat.assertThat;
+import static org.zwobble.precisely.Matchers.equalTo;
import static org.zwobble.precisely.Matchers.isSequence;
public class TypeCheckerWhenTests {
@@ -65,4 +66,68 @@ public class TypeCheckerWhenTests {
)
));
}
+
+ @Test
+ public void whenCaseBodiesHaveSameTypeThenExpressionTypeIsThatType() {
+ var untyped = Untyped.when(
+ Untyped.reference("x"),
+ List.of(
+ Untyped.whenCase(
+ Untyped.typeLevelReference(VARIANT_TYPE_1.name()),
+ 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(VARIANT_TYPE_1, VARIANT_TYPE_2)))
+ .enterGlobal(P.map(
+ Map.entry("x", SUM_TYPE),
+ Map.entry(VARIANT_TYPE_1.name(), Types.metaType(VARIANT_TYPE_1)),
+ Map.entry(VARIANT_TYPE_2.name(), Types.metaType(VARIANT_TYPE_2))
+ ));
+
+ var result = TypeChecker.typeCheckExpression(untyped, context);
+
+ assertThat(result.value().type(), equalTo(Types.STRING));
+ }
+
+ @Test
+ public void whenCaseBodiesHaveDifferentTypesThenExpressionTypeIsCommonSuperType() {
+ var untyped = Untyped.when(
+ Untyped.reference("x"),
+ List.of(
+ Untyped.whenCase(
+ Untyped.typeLevelReference(VARIANT_TYPE_1.name()),
+ Untyped.block(List.of(
+ Untyped.blockReturn(Untyped.stringLiteral("a"))
+ ))
+ ),
+ Untyped.whenCase(
+ Untyped.typeLevelReference(VARIANT_TYPE_2.name()),
+ Untyped.block(List.of(
+ Untyped.blockReturn(Untyped.intLiteral(42))
+ ))
+ )
+ )
+ );
+ var context = TypeCheckerContext.EMPTY
+ .addSumTypeInfo(SUM_TYPE, new SumTypeInfo(P.orderedSet(VARIANT_TYPE_1, VARIANT_TYPE_2)))
+ .enterGlobal(P.map(
+ Map.entry("x", SUM_TYPE),
+ Map.entry(VARIANT_TYPE_1.name(), Types.metaType(VARIANT_TYPE_1)),
+ Map.entry(VARIANT_TYPE_2.name(), Types.metaType(VARIANT_TYPE_2))
+ ));
+
+ var result = TypeChecker.typeCheckExpression(untyped, context);
+
+ assertThat(result.value().type(), equalTo(Types.TOP));
+ }
}