From 41ca4d2ab2310cb53921a5ae11b2b2aea2756ccb Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Wed, 3 Jan 2024 21:48:58 +0000 Subject: Check subtyping when supertype is free type param --- .../typechecker/TypeCheckerIsSubTypeTests.java | 24 ++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'src/test/java') 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 -- cgit v1.2.3