diff --git a/src/main/java/com/dashjoin/jsonata/utils/Signature.java b/src/main/java/com/dashjoin/jsonata/utils/Signature.java index efd286c..fa1a1bd 100644 --- a/src/main/java/com/dashjoin/jsonata/utils/Signature.java +++ b/src/main/java/com/dashjoin/jsonata/utils/Signature.java @@ -313,7 +313,7 @@ public Object validate(Object _args, Object context) { for (Object _param : _params) { Param param = (Param)_param; var arg = argIndex compiler happy } diff --git a/src/test/java/com/dashjoin/jsonata/DateTimeTest.java b/src/test/java/com/dashjoin/jsonata/DateTimeTest.java index 2966087..4b14e18 100644 --- a/src/test/java/com/dashjoin/jsonata/DateTimeTest.java +++ b/src/test/java/com/dashjoin/jsonata/DateTimeTest.java @@ -16,6 +16,6 @@ public void testToMillis() { Jsonata expr = Jsonata.jsonata("$fromMillis($toMillis($))"); String timestamp = (String) expr.evaluate(noZoneTooPrecise); Assertions.assertTrue(timestamp.startsWith("2024-08-2")); - Assertions.assertTrue(timestamp.endsWith(":43:15.781Z")); + Assertions.assertTrue(timestamp.endsWith("3:15.781Z")); } } diff --git a/src/test/java/com/dashjoin/jsonata/SignatureTest.java b/src/test/java/com/dashjoin/jsonata/SignatureTest.java index 9d2eed0..536c848 100644 --- a/src/test/java/com/dashjoin/jsonata/SignatureTest.java +++ b/src/test/java/com/dashjoin/jsonata/SignatureTest.java @@ -56,6 +56,21 @@ public Object call(Object input, List args) throws Throwable { Assertions.assertEquals(6, expression.evaluate(null)); } + /** + * Verifies that parameter index tracking works correctly in signature validation. + * Without the index++ fix in Signature.validate(), the second parameter's capture group + * is read at the wrong position, causing valid calls to fail with T0410. + */ + @Test + public void testArrayFirstArgWithFunctionSecondArg() { + // $map has signature : first arg = array, second arg = function + // Without index++ fix, the function arg is validated against group(1) instead of group(2) + var expression = jsonata("$map([1,2,3], function($v) { $v * 2 })"); + var result = expression.evaluate(null); + Assertions.assertNotNull(result); + Assertions.assertEquals(java.util.List.of(2, 4, 6), result); + } + @Test public void testVarArgMany(){ Jsonata expr = jsonata("$customArgs('test',[1,2,3,4],3)");