From c9370b6a47604e9d0af6adf482651611a4f01dbb Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 5 Jan 2024 23:32:07 +0000 Subject: Check constraints are retained from sum subtype --- .../typechecker/TypeCheckerIsSubTypeTests.java | 38 ++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'src/test/java') 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 -- cgit v1.2.3