aboutsummaryrefslogtreecommitdiff
path: root/src/test/java/org
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-12-23 12:05:34 +0000
committerMichael Williamson <mike@zwobble.org>2023-12-23 16:09:48 +0000
commit1886fc2b214bb2c5bfc4cb1ca3d49975c76da0d6 (patch)
tree23d4ee613b0b636b54be11ee147ea2ddf84aaf67 /src/test/java/org
parenta7c33eef7d2598d5636ff5bcde07da4f9c057184 (diff)
Parse constructed types
Diffstat (limited to 'src/test/java/org')
-rw-r--r--src/test/java/org/shedlang/compiler/ast/untyped/UntypedNodeMatchers.java11
-rw-r--r--src/test/java/org/shedlang/compiler/parser/ParserConstructedTypeTests.java55
2 files changed, 66 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/ast/untyped/UntypedNodeMatchers.java b/src/test/java/org/shedlang/compiler/ast/untyped/UntypedNodeMatchers.java
index 5b290949..7ad42734 100644
--- a/src/test/java/org/shedlang/compiler/ast/untyped/UntypedNodeMatchers.java
+++ b/src/test/java/org/shedlang/compiler/ast/untyped/UntypedNodeMatchers.java
@@ -93,6 +93,17 @@ public class UntypedNodeMatchers {
);
}
+ public static Matcher<UntypedTypeLevelExpressionNode> isUntypedConstructedTypeNode(
+ Matcher<UntypedTypeLevelExpressionNode> receiver,
+ Matcher<Iterable<? extends UntypedTypeLevelExpressionNode>> args
+ ) {
+ return instanceOf(
+ UntypedConstructedTypeNode.class,
+ has("receiver", x -> x.receiver(), receiver),
+ has("args", x -> x.args(), args)
+ );
+ }
+
public static UntypedEffectDefinitionNodeMatcher isUntypedEffectDefinitionNode() {
return UntypedEffectDefinitionNodeMatcher.empty();
}
diff --git a/src/test/java/org/shedlang/compiler/parser/ParserConstructedTypeTests.java b/src/test/java/org/shedlang/compiler/parser/ParserConstructedTypeTests.java
new file mode 100644
index 00000000..9221d000
--- /dev/null
+++ b/src/test/java/org/shedlang/compiler/parser/ParserConstructedTypeTests.java
@@ -0,0 +1,55 @@
+package org.shedlang.compiler.parser;
+
+import org.junit.jupiter.api.Test;
+
+import static org.shedlang.compiler.ast.untyped.UntypedNodeMatchers.isUntypedConstructedTypeNode;
+import static org.shedlang.compiler.ast.untyped.UntypedNodeMatchers.isUntypedTypeLevelReferenceNode;
+import static org.shedlang.compiler.parser.ParserTesting.parseString;
+import static org.zwobble.precisely.AssertThat.assertThat;
+import static org.zwobble.precisely.Matchers.isSequence;
+
+public class ParserConstructedTypeTests {
+ @Test
+ public void canParseConstructedTypeWithOneArg() {
+ var source = "List[String]";
+
+ var node = parseString(source, Parser::parseTopLevelTypeLevelExpression);
+
+ assertThat(node, isUntypedConstructedTypeNode(
+ isUntypedTypeLevelReferenceNode("List"),
+ isSequence(
+ isUntypedTypeLevelReferenceNode("String")
+ )
+ ));
+ }
+
+ @Test
+ public void canParseConstructedTypeWithMultipleArgs() {
+ var source = "X[T1, T2, T3]";
+
+ var node = parseString(source, Parser::parseTopLevelTypeLevelExpression);
+
+ assertThat(node, isUntypedConstructedTypeNode(
+ isUntypedTypeLevelReferenceNode("X"),
+ isSequence(
+ isUntypedTypeLevelReferenceNode("T1"),
+ isUntypedTypeLevelReferenceNode("T2"),
+ isUntypedTypeLevelReferenceNode("T3")
+ )
+ ));
+ }
+
+ @Test
+ public void argsCanHaveTrailingComma() {
+ var source = "List[String,]";
+
+ var node = parseString(source, Parser::parseTopLevelTypeLevelExpression);
+
+ assertThat(node, isUntypedConstructedTypeNode(
+ isUntypedTypeLevelReferenceNode("List"),
+ isSequence(
+ isUntypedTypeLevelReferenceNode("String")
+ )
+ ));
+ }
+}