aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-01 19:57:15 +0100
committerMichael Williamson <mike@zwobble.org>2023-10-01 19:57:15 +0100
commit0138badca3abaeca2ea40405cad3788c5048c36e (patch)
tree6ba7a999b959c4a10f9d78cf817b71b569addd53 /src/test/java
parent804500f0aac6253cfd5262038b62667902e195ca (diff)
Check variant is valid
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerWhenTests.java37
1 files changed, 37 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 ef131b4d..906e2cec 100644
--- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerWhenTests.java
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerWhenTests.java
@@ -3,6 +3,7 @@ package org.shedlang.compiler.typechecker;
import org.junit.jupiter.api.Test;
import org.shedlang.compiler.ast.untyped.Untyped;
import org.shedlang.compiler.typechecker.errors.UnhandledVariantError;
+import org.shedlang.compiler.typechecker.errors.UnreachableWhenCaseError;
import org.shedlang.compiler.typechecker.errors.WhenExpressionIsNotInstanceOfSumTypeError;
import org.shedlang.compiler.types.*;
import org.shedlang.compiler.util.P;
@@ -71,6 +72,42 @@ public class TypeCheckerWhenTests {
}
@Test
+ public void whenCaseHasTypeThatIsNotVariantThenErrorIsThrown() {
+ var otherStructType = Types.struct(NAMESPACE_NAME, "OtherStruct");
+ 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(otherStructType.name()),
+ Untyped.block(List.of(
+ Untyped.blockReturn(Untyped.stringLiteral("a"))
+ ))
+ )
+ )
+ );
+ var context = TypeCheckerContext.EMPTY
+ .addSumTypeInfo(SUM_TYPE, new SumTypeInfo(P.orderedSet(VARIANT_TYPE_1)))
+ .enterGlobal(P.map(
+ Map.entry("x", SUM_TYPE),
+ Map.entry(VARIANT_TYPE_1.name(), Types.metaType(VARIANT_TYPE_1)),
+ Map.entry(otherStructType.name(), Types.metaType(otherStructType))
+ ));
+
+ var error = assertThrows(
+ UnreachableWhenCaseError.class,
+ () -> TypeChecker.typeCheckExpression(untyped, context)
+ );
+
+ assertThat(error.caseType(), equalTo(otherStructType));
+ }
+
+ @Test
public void whenAllCasesAreHandledThenExpressionTypeChecks() {
var untyped = Untyped.when(
Untyped.reference("x"),