diff options
| author | Michael Williamson <mike@zwobble.org> | 2024-01-05 23:32:07 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2024-01-05 23:32:07 +0000 |
| commit | c9370b6a47604e9d0af6adf482651611a4f01dbb (patch) | |
| tree | b77e6559eb4762771c7110475d3ab3faa43a9f4c /src/test/java | |
| parent | 6e2fdd6cee5b79eb59d6eff857e42f36242688e2 (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.java | 38 |
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 |
