From e49744ff95e24ad4282c29634fa58a4241c66c82 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Tue, 28 Apr 2026 23:43:29 +0100 Subject: Type check sum definitions --- .../typechecker/TypeCheckerSumDefinitionTests.java | 77 ++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerSumDefinitionTests.java (limited to 'src/test/java/org') diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerSumDefinitionTests.java b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerSumDefinitionTests.java new file mode 100644 index 0000000..18d718e --- /dev/null +++ b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerSumDefinitionTests.java @@ -0,0 +1,77 @@ +package org.zwobble.hobgoblin.compiler.typechecker; + +import org.junit.jupiter.api.Test; +import org.zwobble.hobgoblin.compiler.ast.typed.*; +import org.zwobble.hobgoblin.compiler.ast.untyped.*; +import org.zwobble.hobgoblin.compiler.sources.NullSource; +import org.zwobble.hobgoblin.compiler.types.*; + +import java.util.List; + +import static org.zwobble.hobgoblin.compiler.typechecker.TypeCheckerTesting.typeCheckNamespaceStatement; +import static org.zwobble.precisely.AssertThat.assertThat; +import static org.zwobble.precisely.Matchers.*; + +public class TypeCheckerSumDefinitionTests { + @Test + public void sumHasNamespaceFromContext() { + var untyped = new UntypedSumDefinitionNode( + "X", + List.of(), + NullSource.INSTANCE + ); + var context = TypeCheckerContextArb.namespaceContext(NamespaceName.of("a", "b")); + + var typed = typeCheckNamespaceStatement(untyped, context); + + assertThat(typed, instanceOf( + TypedSumDefinitionNode.class, + has( + "type", + TypedSumDefinitionNode::type, + equalTo(new SumType(NamespaceName.of("a", "b"), "X")) + ) + )); + } + + @Test + public void variantsAreTypeChecked() { + var rectangleType = new StructType(NamespaceName.of("a", "b"), "Rectangle"); + var triangleType = new StructType(NamespaceName.of("a", "b"), "Triangle"); + var untyped = new UntypedSumDefinitionNode( + "X", + List.of( + new UntypedSumVariantDefinitionNode(UntypedArb.typeLevelReference("Rectangle"), NullSource.INSTANCE), + new UntypedSumVariantDefinitionNode(UntypedArb.typeLevelReference("Triangle"), NullSource.INSTANCE) + ), + NullSource.INSTANCE + ); + var context = TypeCheckerContextArb.namespaceContext(NamespaceName.of("a", "b")); + context.declare(rectangleType.name()); + context.define(rectangleType.name(), new TypeLevelValueType(rectangleType)); + context.declare(triangleType.name()); + context.define(triangleType.name(), new TypeLevelValueType(triangleType)); + + var typed = typeCheckNamespaceStatement(untyped, context); + + assertThat(typed, instanceOf( + TypedSumDefinitionNode.class, + has( + "fields", + TypedSumDefinitionNode::variants, + isSequence( + has("type", TypedSumVariantDefinitionNode::type, has( + "value", + TypedTypeLevelExpressionNode::value, + equalTo(rectangleType) + )), + has("type", TypedSumVariantDefinitionNode::type, has( + "value", + TypedTypeLevelExpressionNode::value, + equalTo(triangleType) + )) + ) + ) + )); + } +} -- cgit v1.2.3