From c109b45a80078e306d983b27c91e31a0cae50eac Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 13 Jan 2024 17:32:10 +0000 Subject: Update commonSubtype() to produce more specific types --- .../compiler/types/CommonSubtypeTests.java | 51 +++++++++++++++++++--- 1 file changed, 45 insertions(+), 6 deletions(-) (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/types/CommonSubtypeTests.java b/src/test/java/org/shedlang/compiler/types/CommonSubtypeTests.java index 9095ca07..a5e030e5 100644 --- a/src/test/java/org/shedlang/compiler/types/CommonSubtypeTests.java +++ b/src/test/java/org/shedlang/compiler/types/CommonSubtypeTests.java @@ -1,6 +1,8 @@ package org.shedlang.compiler.types; import org.junit.jupiter.api.Test; +import org.shedlang.compiler.typechecker.TypeInfos; +import org.shedlang.compiler.util.P; import java.util.List; @@ -10,43 +12,80 @@ import static org.zwobble.precisely.Matchers.equalTo; public class CommonSubtypeTests { @Test public void commonSubtypeOfNoTypesIsTop() { - var result = Types.commonSubtype(List.of()); + var result = Types.commonSubtype(List.of(), TypeInfos.EMPTY); assertThat(result, equalTo(Types.TOP)); } @Test public void commonSubtypeOfSingleTypeIsThatType() { - var result = Types.commonSubtype(List.of(Types.INT)); + var result = Types.commonSubtype(List.of(Types.INT), TypeInfos.EMPTY); assertThat(result, equalTo(Types.INT)); } @Test public void commonSubtypeOfRepeatedTypeIsThatType() { - var result = Types.commonSubtype(List.of(Types.INT, Types.INT, Types.INT)); + var result = Types.commonSubtype( + List.of(Types.INT, Types.INT, Types.INT), + TypeInfos.EMPTY + ); assertThat(result, equalTo(Types.INT)); } @Test public void commonSubtypeOfUnrelatedTypesIsBottom() { - var result = Types.commonSubtype(List.of(Types.INT, Types.STRING)); + var result = Types.commonSubtype( + List.of(Types.INT, Types.STRING), + TypeInfos.EMPTY + ); assertThat(result, equalTo(Types.BOTTOM)); } @Test public void commonSubtypeOfTopAndOtherTypeIsOtherType() { - var result = Types.commonSubtype(List.of(Types.TOP, Types.INT)); + var result = Types.commonSubtype( + List.of(Types.TOP, Types.INT), + TypeInfos.EMPTY + ); assertThat(result, equalTo(Types.INT)); } @Test public void commonSubtypeOfOtherTypeAndTopIsOtherType() { - var result = Types.commonSubtype(List.of(Types.INT, Types.TOP)); + var result = Types.commonSubtype( + List.of(Types.INT, Types.TOP), + TypeInfos.EMPTY + ); assertThat(result, equalTo(Types.INT)); } + + @Test + public void commonSubtypeOfSumTypeAndVariantOfThatSumTypeIsThatVariant() { + var namespaceName = NamespaceName.of("Example"); + var variantType1 = Types.struct(namespaceName, "Variant1"); + var variantType2 = Types.struct(namespaceName, "Variant2"); + var sumType = Types.sum(namespaceName, "Sum"); + var typeInfos = TypeInfos.EMPTY + .addSumTypeInfo(sumType, new SumTypeInfo(P.orderedSet( + variantType1, + variantType2 + ))); + + var result1 = Types.commonSubtype( + List.of(sumType, variantType2), + typeInfos + ); + var result2 = Types.commonSubtype( + List.of(variantType2, sumType), + typeInfos + ); + + assertThat(result1, equalTo(variantType2)); + assertThat(result2, equalTo(variantType2)); + } } -- cgit v1.2.3