aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2024-01-05 21:14:19 +0000
committerMichael Williamson <mike@zwobble.org>2024-01-05 21:14:19 +0000
commit9007805f8569da524718a69ed0619c3e3d466875 (patch)
tree90a2874e9cb6d53cc49bab25bed5e32c4324ba7d /src/test/java
parent8564cba1883aa4100d0ce614f44af26adde12f41 (diff)
Test bound type param as subtype
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIsSubTypeTests.java30
1 files changed, 29 insertions, 1 deletions
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIsSubTypeTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIsSubTypeTests.java
index af4d46e4..5f7fede9 100644
--- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIsSubTypeTests.java
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIsSubTypeTests.java
@@ -13,7 +13,7 @@ import java.util.Map;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.shedlang.compiler.typechecker.TypeCheckerSubTyping.isSubType;
import static org.zwobble.precisely.AssertThat.assertThat;
-import static org.zwobble.precisely.Matchers.equalTo;
+import static org.zwobble.precisely.Matchers.*;
public class TypeCheckerIsSubTypeTests {
// == General ==
@@ -135,12 +135,40 @@ public class TypeCheckerIsSubTypeTests {
);
var result = constraints.solve(Sources.NULL);
+ assertThat(constraints.typeBounds().get(typeParam), allOf(
+ has("lower", x -> x.lower(), isSequence(equalTo(Types.INT))),
+ has("upper", x -> x.upper(), isSequence())
+ ));
assertThat(result, equalTo(TypeSubstitutionMap.of(
Map.entry(typeParam, Types.INT)
)));
}
@Test
+ public void whenSubtypeIsBoundTypeParamThenUpperBoundIsAddedToType() {
+ var typeParam = TypeParam.forStructType(
+ Types.struct(NamespaceName.of("Example"), "Struct"),
+ "T"
+ );
+
+ var constraints = TypeCheckerSubTyping.addSubtypeConstraint(
+ typeParam,
+ Types.INT,
+ Sources.NULL,
+ TypeCheckerSubTyping.constraints(List.of(typeParam), TypeInfos.EMPTY)
+ );
+ var result = constraints.solve(Sources.NULL);
+
+ assertThat(constraints.typeBounds().get(typeParam), allOf(
+ has("lower", x -> x.lower(), isSequence()),
+ has("upper", x -> x.upper(), isSequence(equalTo(Types.INT)))
+ ));
+ assertThat(result, equalTo(TypeSubstitutionMap.of(
+ Map.entry(typeParam, Types.BOTTOM)
+ )));
+ }
+
+ @Test
public void whenSupertypeIsFreeTypeParamThenOtherTypesAreNotSubtype() {
var typeParam = TypeParam.forStructType(
Types.struct(NamespaceName.of("Example"), "Struct"),