summaryrefslogtreecommitdiff
path: root/src/test/java/org
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-06-19 18:08:56 +0100
committerMichael Williamson <mike@zwobble.org>2026-06-19 18:08:56 +0100
commit6230f7d84bcb3e6c9850ddba810c02bbbe07c32a (patch)
treeb3440ea1df279a2abf1a16131b31ed92ca35a526 /src/test/java/org
parentdbf8530b171bb2fdb21352d2500b1a2e7287d5ca (diff)
Type check enums
Diffstat (limited to 'src/test/java/org')
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerEnumDefinitionTests.java61
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"))
+ )
+ )
+ ));
+ }
+}