aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-06 20:03:43 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-06 20:03:43 +0100
commit9d51478ffc90b4b7d059c38cae25beafe63eb40b (patch)
tree29814b4e7976a43db26f970b378045c5676ecb0a /src/test/java
parentab8b25ab08620df482d88c0e729fb9f53bca9f61 (diff)
Parse named arguments
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/ast/UntypedNodeMatchers.java10
-rw-r--r--src/test/java/org/shedlang/compiler/parser/ParserCallTests.java40
2 files changed, 50 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/ast/UntypedNodeMatchers.java b/src/test/java/org/shedlang/compiler/ast/UntypedNodeMatchers.java
index 21e8cf1b..3925ec80 100644
--- a/src/test/java/org/shedlang/compiler/ast/UntypedNodeMatchers.java
+++ b/src/test/java/org/shedlang/compiler/ast/UntypedNodeMatchers.java
@@ -16,6 +16,16 @@ public class UntypedNodeMatchers {
return new UntypedCallNodeMatcher();
}
+ public static Matcher<UntypedNamedArgNode> isUntypedNamedArgNode(
+ String name,
+ Matcher<UntypedExpressionNode> expression
+ ) {
+ return allOf(
+ has("name", x -> x.name(), equalTo(name)),
+ has("expression", x -> x.expression(), expression)
+ );
+ }
+
public static Matcher<UntypedExpressionNode> isUntypedReferenceNode(String name) {
return instanceOf(
UntypedReferenceNode.class,
diff --git a/src/test/java/org/shedlang/compiler/parser/ParserCallTests.java b/src/test/java/org/shedlang/compiler/parser/ParserCallTests.java
index 5345414f..1020b430 100644
--- a/src/test/java/org/shedlang/compiler/parser/ParserCallTests.java
+++ b/src/test/java/org/shedlang/compiler/parser/ParserCallTests.java
@@ -81,6 +81,46 @@ public class ParserCallTests {
}
@Test
+ public void canParseCallWithSingleNamedArg() {
+ var source = "f(.first = a)";
+
+ var node = parseString(source, Parser::parseTopLevelExpression);
+
+ assertThat(
+ node,
+ isUntypedCallNode()
+ .withArgs(
+ isUntypedArgsNode()
+ .withPositional(isSequence())
+ .withNamed(isSequence(
+ isUntypedNamedArgNode("first", isUntypedReferenceNode("a"))
+ ))
+ )
+ );
+ }
+
+ @Test
+ public void canParseCallWithManyNamedArgs() {
+ var source = "f(.first = a, .second = b, .third = c)";
+
+ var node = parseString(source, Parser::parseTopLevelExpression);
+
+ assertThat(
+ node,
+ isUntypedCallNode()
+ .withArgs(
+ isUntypedArgsNode()
+ .withPositional(isSequence())
+ .withNamed(isSequence(
+ isUntypedNamedArgNode("first", isUntypedReferenceNode("a")),
+ isUntypedNamedArgNode("second", isUntypedReferenceNode("b")),
+ isUntypedNamedArgNode("third", isUntypedReferenceNode("c"))
+ ))
+ )
+ );
+ }
+
+ @Test
public void argumentListCanHaveTrailingComma() {
var source = "f(a,)";