aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2024-01-03 21:46:20 +0000
committerMichael Williamson <mike@zwobble.org>2024-01-03 21:46:20 +0000
commit2b07a0dd23552612aa05f826763e061604fc61fd (patch)
tree748bdba9ed53d7840ffd5fdc07a1501f6bd60fb2 /src/test/java
parentd81c270ad90334f47e39e2dd3b00d47796cdc348 (diff)
Test subtyping when supertype is bound type param
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIsSubTypeTests.java24
1 files changed, 24 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 88f93472..1ff85fea 100644
--- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIsSubTypeTests.java
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIsSubTypeTests.java
@@ -1,10 +1,12 @@
package org.shedlang.compiler.typechecker;
import org.junit.jupiter.api.Test;
+import org.shedlang.compiler.sources.Sources;
import org.shedlang.compiler.types.*;
import org.shedlang.compiler.util.P;
import java.util.List;
+import java.util.Map;
import static org.shedlang.compiler.typechecker.TypeCheckerSubTyping.isSubType;
import static org.zwobble.precisely.AssertThat.assertThat;
@@ -113,6 +115,28 @@ public class TypeCheckerIsSubTypeTests {
);
}
+ // == Type params ==
+
+ @Test
+ public void whenSupertypeIsBoundTypeParamThenLowerBoundIsAddedToType() {
+ var typeParam = TypeParam.forStructType(
+ Types.struct(NamespaceName.of("Example"), "Struct"),
+ "T"
+ );
+
+ var constraints = TypeCheckerSubTyping.addSubtypeConstraint(
+ Types.INT,
+ typeParam,
+ Sources.NULL,
+ TypeCheckerSubTyping.constraints(List.of(typeParam), TypeInfos.EMPTY)
+ );
+ var result = constraints.solve();
+
+ assertThat(result, equalTo(TypeSubstitutionMap.of(
+ Map.entry(typeParam, Types.INT)
+ )));
+ }
+
// == Sum types ==
@Test