diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-04-28 23:33:55 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-04-28 23:33:55 +0100 |
| commit | ceef673a9681db167b4a47053f78cc9ee05d0ffb (patch) | |
| tree | e56aa0b7462cb75bede51289b2cd9251b523fb2a /src/test/java | |
| parent | 8f9f4903d52646ee3a87c4b435c008beac4f13b9 (diff) | |
Parse sum types
Diffstat (limited to 'src/test/java')
| -rw-r--r-- | src/test/java/org/zwobble/hobgoblin/compiler/parser/ParserSumDefinitionTests.java | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/parser/ParserSumDefinitionTests.java b/src/test/java/org/zwobble/hobgoblin/compiler/parser/ParserSumDefinitionTests.java new file mode 100644 index 0000000..825511e --- /dev/null +++ b/src/test/java/org/zwobble/hobgoblin/compiler/parser/ParserSumDefinitionTests.java @@ -0,0 +1,82 @@ +package org.zwobble.hobgoblin.compiler.parser; + +import org.junit.jupiter.api.Test; +import org.zwobble.hobgoblin.compiler.ast.untyped.UntypedSumDefinitionNode; +import org.zwobble.hobgoblin.compiler.ast.untyped.UntypedSumVariantDefinitionNode; +import org.zwobble.hobgoblin.compiler.ast.untyped.UntypedTypeLevelReferenceNode; + +import static org.zwobble.hobgoblin.compiler.parser.ParserTesting.parseString; +import static org.zwobble.precisely.AssertThat.assertThat; +import static org.zwobble.precisely.Matchers.*; + +public class ParserSumDefinitionTests { + @Test + public void nameIsParsed() { + var source = """ + sum Shape { + }"""; + + var node = parseString( + source, + Parser::parseNamespaceStatement + ); + + assertThat(node, instanceOf( + UntypedSumDefinitionNode.class, + has("name", UntypedSumDefinitionNode::name, equalTo("Shape")) + )); + } + + @Test + public void emptySumHasNoVariants() { + var source = """ + sum Shape { + }"""; + + var node = parseString( + source, + Parser::parseNamespaceStatement + ); + + assertThat(node, instanceOf( + UntypedSumDefinitionNode.class, + has("variants", UntypedSumDefinitionNode::variants, isSequence()) + )); + } + + @Test + public void sumWithVariants() { + var source = """ + sum Shape { + variant Rectangle; + variant Triangle; + }"""; + + var node = parseString( + source, + Parser::parseNamespaceStatement + ); + + assertThat(node, instanceOf( + UntypedSumDefinitionNode.class, + has("variants", UntypedSumDefinitionNode::variants, isSequence( + has( + "type", + UntypedSumVariantDefinitionNode::type, + instanceOf( + UntypedTypeLevelReferenceNode.class, + has("name", UntypedTypeLevelReferenceNode::name, equalTo("Rectangle")) + ) + ), + has( + "type", + UntypedSumVariantDefinitionNode::type, + instanceOf( + UntypedTypeLevelReferenceNode.class, + has("name", UntypedTypeLevelReferenceNode::name, equalTo("Triangle")) + ) + ) + )) + )); + } +} |
