aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2024-01-05 23:32:07 +0000
committerMichael Williamson <mike@zwobble.org>2024-01-05 23:32:07 +0000
commitc9370b6a47604e9d0af6adf482651611a4f01dbb (patch)
treeb77e6559eb4762771c7110475d3ab3faa43a9f4c /src/test/java
parent6e2fdd6cee5b79eb59d6eff857e42f36242688e2 (diff)
Check constraints are retained from sum subtype
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIsSubTypeTests.java38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIsSubTypeTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIsSubTypeTests.java
index 79b80179..7edff026 100644
--- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIsSubTypeTests.java
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIsSubTypeTests.java
@@ -385,6 +385,44 @@ public class TypeCheckerIsSubTypeTests {
));
}
+ @Test
+ public void constraintsFromSumSubtypeAreRetained() {
+ var namespaceName = NamespaceName.of("Example", "Project");
+ var sumType = Types.sum(namespaceName, "Sum");
+ var variantType = Types.struct(namespaceName, "Variant2");
+ var variantTypeConstructor = Types.typeConstructor(
+ List.of(TypeParam.forStructType(variantType, "T")),
+ variantType
+ );
+ var typeInfos = TypeInfos.EMPTY
+ .addSumTypeInfo(sumType, new SumTypeInfo(P.orderedSet(
+ Types.constructedStructType(
+ variantTypeConstructor,
+ List.of(TypeParam.forSumType(sumType, "T"))
+ )
+ )));
+
+ var constraints = TypeCheckerSubTyping.constraints(
+ List.of(TypeParam.forSumType(sumType, "T")),
+ typeInfos
+ );
+ constraints = TypeCheckerSubTyping.addSubtypeConstraint(
+ sumType,
+ Types.constructedStructType(
+ variantTypeConstructor,
+ List.of(Types.STRING)
+ ),
+ Sources.NULL,
+ constraints
+ );
+
+ assertThat(constraints.typeBounds().get(TypeParam.forSumType(sumType, "T")), allOf(
+ has("lower", x -> x.lower(), isSequence(equalTo(Types.STRING))),
+ has("upper", x -> x.upper(), isSequence(equalTo(Types.STRING)))
+ ));
+ }
+
+
// == Constructed types ==
@Test