diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-06 20:03:43 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-06 20:03:43 +0100 |
| commit | 9d51478ffc90b4b7d059c38cae25beafe63eb40b (patch) | |
| tree | 29814b4e7976a43db26f970b378045c5676ecb0a /src/test/java | |
| parent | ab8b25ab08620df482d88c0e729fb9f53bca9f61 (diff) | |
Parse named arguments
Diffstat (limited to 'src/test/java')
| -rw-r--r-- | src/test/java/org/shedlang/compiler/ast/UntypedNodeMatchers.java | 10 | ||||
| -rw-r--r-- | src/test/java/org/shedlang/compiler/parser/ParserCallTests.java | 40 |
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,)"; |
