aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2024-01-03 21:48:58 +0000
committerMichael Williamson <mike@zwobble.org>2024-01-03 21:48:58 +0000
commit41ca4d2ab2310cb53921a5ae11b2b2aea2756ccb (patch)
tree3a8451f8b7bddc2163a351263c2ce9d134d6a01c /src/test/java
parent2b07a0dd23552612aa05f826763e061604fc61fd (diff)
Check subtyping when supertype is free 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 1ff85fea..d86e0ed2 100644
--- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIsSubTypeTests.java
+++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerIsSubTypeTests.java
@@ -2,12 +2,15 @@ package org.shedlang.compiler.typechecker;
import org.junit.jupiter.api.Test;
import org.shedlang.compiler.sources.Sources;
+import org.shedlang.compiler.typechecker.errors.UnexpectedTypeError;
+import org.shedlang.compiler.typechecker.typesets.TypeSets;
import org.shedlang.compiler.types.*;
import org.shedlang.compiler.util.P;
import java.util.List;
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;
@@ -137,6 +140,27 @@ public class TypeCheckerIsSubTypeTests {
)));
}
+ @Test
+ public void whenSupertypeIsFreeTypeParamThenOtherTypesAreNotSubtype() {
+ var typeParam = TypeParam.forStructType(
+ Types.struct(NamespaceName.of("Example"), "Struct"),
+ "T"
+ );
+
+ var error = assertThrows(
+ UnexpectedTypeError.class,
+ () -> TypeCheckerSubTyping.addSubtypeConstraint(
+ Types.INT,
+ typeParam,
+ Sources.NULL,
+ TypeCheckerSubTyping.constraints(List.of(), TypeInfos.EMPTY)
+ )
+ );
+
+ assertThat(error.expected(), equalTo(TypeSets.type(typeParam)));
+ assertThat(error.actual(), equalTo(Types.INT));
+ }
+
// == Sum types ==
@Test