package org.zwobble.hobgoblin.compiler.parser; import org.junit.jupiter.api.Test; import static org.zwobble.hobgoblin.compiler.ast.untyped.UntypedEnumDefinitionNodeMatcher.isUntypedEnumDefinitionNode; import static org.zwobble.hobgoblin.compiler.ast.untyped.UntypedEnumVariantDefinitionNodeMatcher.isUntypedEnumVariantDefinitionNode; import static org.zwobble.hobgoblin.compiler.parser.ParserTesting.parseString; import static org.zwobble.precisely.AssertThat.assertThat; import static org.zwobble.precisely.Matchers.equalTo; import static org.zwobble.precisely.Matchers.isSequence; public class ParserEnumDefinitionTests { @Test public void nameIsParsed() { var source = """ enum SmallNumber { }"""; var node = parseString( source, Parser::parseNamespaceStatement ); assertThat(node, isUntypedEnumDefinitionNode() .withName(equalTo("SmallNumber")) ); } @Test public void emptyEnumHasNoVariants() { var source = """ enum SmallNumber { }"""; var node = parseString( source, Parser::parseNamespaceStatement ); assertThat(node, isUntypedEnumDefinitionNode() .withVariants(isSequence()) ); } @Test public void enumWithVariants() { var source = """ enum SmallNumber { variant zero; variant one; }"""; var node = parseString( source, Parser::parseNamespaceStatement ); assertThat(node, isUntypedEnumDefinitionNode() .withVariants(isSequence( isUntypedEnumVariantDefinitionNode().withName(equalTo("zero")), isUntypedEnumVariantDefinitionNode().withName(equalTo("one")) )) ); } }