From a7c33eef7d2598d5636ff5bcde07da4f9c057184 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 23 Dec 2023 11:50:33 +0000 Subject: Parse type level params for sum types --- .../parser/ParserSumTypeDefinitionTests.java | 64 +++++++++++++++++++++- 1 file changed, 62 insertions(+), 2 deletions(-) (limited to 'src/test/java/org/shedlang/compiler/parser') diff --git a/src/test/java/org/shedlang/compiler/parser/ParserSumTypeDefinitionTests.java b/src/test/java/org/shedlang/compiler/parser/ParserSumTypeDefinitionTests.java index 32392389..eb8285aa 100644 --- a/src/test/java/org/shedlang/compiler/parser/ParserSumTypeDefinitionTests.java +++ b/src/test/java/org/shedlang/compiler/parser/ParserSumTypeDefinitionTests.java @@ -3,8 +3,8 @@ package org.shedlang.compiler.parser; import org.junit.jupiter.api.Test; import org.shedlang.compiler.types.Visibility; -import static org.shedlang.compiler.ast.untyped.UntypedNodeMatchers.isUntypedSumTypeDefinitionNode; -import static org.shedlang.compiler.ast.untyped.UntypedNodeMatchers.isUntypedTypeLevelReferenceNode; +import static org.shedlang.compiler.ast.untyped.UntypedNodeMatchers.*; +import static org.shedlang.compiler.ast.untyped.UntypedNodeMatchers.isUntypedTypeLevelParamNode; import static org.shedlang.compiler.parser.ParserTesting.parseString; import static org.zwobble.precisely.AssertThat.assertThat; import static org.zwobble.precisely.Matchers.*; @@ -68,4 +68,64 @@ public class ParserSumTypeDefinitionTests { .withVisibility(Visibility.PUBLIC) ); } + + @Test + public void canParseSumTypeWithNoTypeLevelParams() { + var source = "sumtype Option = None;"; + + var node = parseString(source, Parser::parseNamespaceStatement); + + assertThat( + node, + isUntypedSumTypeDefinitionNode() + .withTypeLevelParams(isOptionalEmpty()) + ); + } + + @Test + public void canParseSumTypeWithSingleTypeLevelParam() { + var source = "sumtype Option[T1] = None;"; + + var node = parseString(source, Parser::parseNamespaceStatement); + + assertThat( + node, + isUntypedSumTypeDefinitionNode() + .withTypeLevelParams(isOptionalOf(isSequence( + isUntypedTypeLevelParamNode("T1") + ))) + ); + } + + @Test + public void canParseSumTypeWithMultipleTypeLevelParams() { + var source = "sumtype Option[T1, T2, T3] = None;"; + + var node = parseString(source, Parser::parseNamespaceStatement); + + assertThat( + node, + isUntypedSumTypeDefinitionNode() + .withTypeLevelParams(isOptionalOf(isSequence( + isUntypedTypeLevelParamNode("T1"), + isUntypedTypeLevelParamNode("T2"), + isUntypedTypeLevelParamNode("T3") + ))) + ); + } + + @Test + public void typeLevelParamsCanHaveTrailingComma() { + var source = "sumtype Option[T1,] = None;"; + + var node = parseString(source, Parser::parseNamespaceStatement); + + assertThat( + node, + isUntypedSumTypeDefinitionNode() + .withTypeLevelParams(isOptionalOf(isSequence( + isUntypedTypeLevelParamNode("T1") + ))) + ); + } } -- cgit v1.2.3