aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
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