diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-06-19 18:08:56 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-06-19 18:08:56 +0100 |
| commit | 6230f7d84bcb3e6c9850ddba810c02bbbe07c32a (patch) | |
| tree | b3440ea1df279a2abf1a16131b31ed92ca35a526 /src/test/java/org | |
| parent | dbf8530b171bb2fdb21352d2500b1a2e7287d5ca (diff) | |
Type check enums
Diffstat (limited to 'src/test/java/org')
| -rw-r--r-- | src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerEnumDefinitionTests.java | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerEnumDefinitionTests.java b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerEnumDefinitionTests.java new file mode 100644 index 0000000..f8a8fb4 --- /dev/null +++ b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerEnumDefinitionTests.java @@ -0,0 +1,61 @@ +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.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 TypeCheckerEnumDefinitionTests { + @Test + public void enumHasNamespaceFromContext() { + var untyped = UntypedEnumDefinitionNode.arbitrary() + .withName("X") + .build(); + var context = TypeCheckerContextArb.namespaceContext(NamespaceName.of("a", "b")); + + var typed = typeCheckNamespaceStatement(untyped, context); + + assertThat(typed, instanceOf( + TypedEnumDefinitionNode.class, + has( + "type", + TypedEnumDefinitionNode::type, + equalTo(new EnumType(NamespaceName.of("a", "b"), "X")) + ) + )); + } + + @Test + public void variantsAreTypeChecked() { + var untyped = UntypedEnumDefinitionNode.arbitrary() + .withName("X") + .withVariants(List.of( + UntypedEnumVariantDefinitionNode.arbitrary().withName("a").build(), + UntypedEnumVariantDefinitionNode.arbitrary().withName("b").build() + )) + .build(); + var globalContext = TypeCheckerGlobalContext.initial(); + var namespaceContext = globalContext + .enterNamespace(NamespaceName.of("a", "b")); + + var typed = typeCheckNamespaceStatement(untyped, namespaceContext); + + assertThat(typed, instanceOf( + TypedEnumDefinitionNode.class, + has( + "variants", + TypedEnumDefinitionNode::variants, + isSequence( + has("name", TypedEnumVariantDefinitionNode::name, equalTo("a")), + has("name", TypedEnumVariantDefinitionNode::name, equalTo("b")) + ) + ) + )); + } +} |
