From a17c1e5fcbb159d9c6ef84058d8d10ae9567ffc8 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 2 Aug 2026 14:03:46 +0100 Subject: Check number of type-level args --- .../TypeCheckerConstructedTypeTests.java | 45 ++++++++++++++++++++++ 1 file changed, 45 insertions(+) (limited to 'src/test/java/org/zwobble') diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerConstructedTypeTests.java b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerConstructedTypeTests.java index fa511ba..09c0f8c 100644 --- a/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerConstructedTypeTests.java +++ b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerConstructedTypeTests.java @@ -3,10 +3,12 @@ package org.zwobble.hobgoblin.compiler.typechecker; import org.junit.jupiter.api.Test; import org.zwobble.hobgoblin.compiler.ast.untyped.UntypedArb; import org.zwobble.hobgoblin.compiler.sources.NullSource; +import org.zwobble.hobgoblin.compiler.typechecker.errors.WrongNumberOfTypeLevelArgsError; import org.zwobble.hobgoblin.compiler.types.*; import java.util.List; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.zwobble.hobgoblin.compiler.ast.typed.TypedNodeMatchers.isTypedConstructedTypeNode; import static org.zwobble.precisely.AssertThat.assertThat; import static org.zwobble.precisely.Matchers.equalTo; @@ -31,4 +33,47 @@ public class TypeCheckerConstructedTypeTests { equalTo(new ConstructedNativeType(listTypeConstructor, List.of(int32Type))) )); } + + @Test + public void whenThereAreTooFewArgsThenErrorIsThrown() { + var untyped = UntypedArb.constructedType( + UntypedArb.typeLevelReference("List"), + List.of() + ); + var context = TypeCheckerContextArb.namespaceContext(); + var listType = SimpleNativeType.builtin("List"); + var listTypeConstructor = new TypeConstructor<>(List.of(new TypeParam("T")), listType); + context.declare("List", new TypeLevelValueType(listTypeConstructor), NullSource.INSTANCE); + + var error = assertThrows( + WrongNumberOfTypeLevelArgsError.class, + () -> TypeChecker.typeCheckTypeLevelExpression(untyped, context) + ); + + assertThat(error.expectedArgCount(), equalTo(1)); + assertThat(error.actualArgCount(), equalTo(0)); + } + + @Test + public void whenThereAreTooManyArgsThenErrorIsThrown() { + var untyped = UntypedArb.constructedType( + UntypedArb.typeLevelReference("List"), + List.of( + UntypedArb.typeLevelReference("Int32"), + UntypedArb.typeLevelReference("Int64") + ) + ); + var context = TypeCheckerContextArb.namespaceContext(); + var listType = SimpleNativeType.builtin("List"); + var listTypeConstructor = new TypeConstructor<>(List.of(new TypeParam("T")), listType); + context.declare("List", new TypeLevelValueType(listTypeConstructor), NullSource.INSTANCE); + + var error = assertThrows( + WrongNumberOfTypeLevelArgsError.class, + () -> TypeChecker.typeCheckTypeLevelExpression(untyped, context) + ); + + assertThat(error.expectedArgCount(), equalTo(1)); + assertThat(error.actualArgCount(), equalTo(2)); + } } -- cgit v1.2.3