From a4910c8f7183cebef3132914fb02dfa90245e3a0 Mon Sep 17 00:00:00 2001 From: Martin Bluemel Date: Sun, 27 Nov 2022 01:54:22 +0100 Subject: [PATCH 1/7] Cleanup of AbsFunction and its tests Tests for AbsFunction are simple JUnit tests now based on JUnit5 Started introducing JUnit5. Vintage Engine enables downward compatibility. Tweaked TesterUI to be a little bit closer to the JSONata Exerciser Signed-off-by: Martin Bluemel --- pom.xml | 40 +- .../expressions/functions/AbsFunction.java | 99 ++--- .../api/jsonata4java/testerui/TesterUI.java | 43 +- .../functions/AbsFunctionTest.java | 406 ++++++++++++++++++ .../suites/ComponentTestSuite.java | 2 - .../test/expressions/AbsFunctionTests.java | 288 ------------- .../agnostic/AgnosticTestSuite.java | 8 +- 7 files changed, 512 insertions(+), 374 deletions(-) create mode 100644 src/test/java/com/api/jsonata4java/expressions/functions/AbsFunctionTest.java delete mode 100644 src/test/java/com/api/jsonata4java/test/expressions/AbsFunctionTests.java diff --git a/pom.xml b/pom.xml index a3fcda81..bcdd6c7c 100644 --- a/pom.xml +++ b/pom.xml @@ -61,6 +61,8 @@ Martin Blümel + martin.bluemel1@vodafone.com + Vodafone Kabel Deutschland @@ -69,6 +71,8 @@ https://github.com/IBM/JSONata4Java + 5.9.1 + 1.9.1 **/*Test.class com/api/jsonata4java/test/expressions/agnostic/AgnosticTestSuite.class UTF-8 @@ -86,12 +90,36 @@ - - junit - junit - 4.13.2 - test - + + org.junit.jupiter + junit-jupiter-engine + ${junit.jupiter.version} + test + + + org.junit.jupiter + junit-jupiter-api + ${junit.jupiter.version} + test + + + org.junit.jupiter + junit-jupiter-params + ${junit.jupiter.version} + test + + + org.junit.vintage + junit-vintage-engine + ${junit.jupiter.version} + test + + + org.junit.platform + junit-platform-suite + ${junit.platform.version} + test + org.springframework spring-context diff --git a/src/main/java/com/api/jsonata4java/expressions/functions/AbsFunction.java b/src/main/java/com/api/jsonata4java/expressions/functions/AbsFunction.java index 209b95f4..9b8af8a9 100644 --- a/src/main/java/com/api/jsonata4java/expressions/functions/AbsFunction.java +++ b/src/main/java/com/api/jsonata4java/expressions/functions/AbsFunction.java @@ -27,28 +27,27 @@ import com.api.jsonata4java.expressions.generated.MappingExpressionParser.Fct_chainContext; import com.api.jsonata4java.expressions.generated.MappingExpressionParser.Function_callContext; import com.api.jsonata4java.expressions.utils.Constants; -import com.api.jsonata4java.expressions.utils.FunctionUtils; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.DoubleNode; -import com.fasterxml.jackson.databind.node.FloatNode; -import com.fasterxml.jackson.databind.node.IntNode; import com.fasterxml.jackson.databind.node.LongNode; /** - * http://docs.jsonata.org/numeric-functions.html - * - * $abs(number) - * * Returns the absolute value of the number parameter, i.e. if the number is - * negative, it returns the positive value. - * + * negative, it returns the positive value.
+ *
+ * http://docs.jsonata.org/numeric-functions.html
+ * $abs(number)
* If number is not specified (i.e. this function is invoked with no arguments), - * then the context value is used as the value of number. - * - * Examples - * - * $abs(5)==5 $abs(-5)==5 - * + * then the context value is used as the value of number.
+ *
+ * Examples
+ * $abs(5)==5 $abs(-5)==5
+ *

+ * NOTE: FROM THE java.math::abs() FUNCTION JAVADOC:
+ * Note that if the argument is equal to the value of {@link Long#MIN_VALUE}, + * the most negative representable {@code long} value, the result is that same + * value, which is negative. + *

*/ public class AbsFunction extends FunctionBase { @@ -57,63 +56,42 @@ public class AbsFunction extends FunctionBase { public static String ERR_ARG2BADTYPE = String.format(Constants.ERR_MSG_ARG2_BAD_TYPE, Constants.FUNCTION_ABS); public JsonNode invoke(ExpressionsVisitor expressionVisitor, Function_callContext ctx) { - // Create the variable to return JsonNode result = null; + final CtxEvalResult ctxEvalResult = evalContext(expressionVisitor, ctx); + final JsonNode arg = ctxEvalResult.arg; + final int argCount = ctxEvalResult.argumentCount; - // Retrieve the number of arguments - JsonNode argNumber = null; - boolean useContext = FunctionUtils.useContextVariable(this, ctx, getSignature()); - int argCount = getArgumentCount(ctx); - if (useContext) { - argNumber = FunctionUtils.getContextVariable(expressionVisitor); - if (argNumber != null && argNumber.isNull() == false) { - argCount++; - if (!argNumber.isNumber()) { + switch (argCount) { + case 0: + if (arg != null) { + throw new EvaluateRuntimeException(ERR_BAD_CONTEXT); + } + // else signal no match (result = null) + break; + case 1: + if (arg == null) { + return null; + } + if (!arg.isNumber()) { throw new EvaluateRuntimeException(ERR_ARG1BADTYPE); } - } else { - useContext = false; - } - } - - // Make sure that we have the right number of arguments - if (argCount == 1) { - if (!useContext) { - argNumber = FunctionUtils.getValuesListExpression(expressionVisitor, ctx, 0); - } - if (argNumber == null) { - return null; - } - // Check the type of the argument - if (argNumber.isNumber()) { - if (argNumber.isInt()) { - int number = argNumber.intValue(); - result = new IntNode(Math.abs(number)); - } else if (argNumber.isLong()) { - long number = argNumber.longValue(); + if (arg.isLong()) { + final long number = arg.longValue(); if (number == Long.MIN_VALUE) { result = new LongNode(Long.MAX_VALUE); } else { result = new LongNode(Math.abs(number)); } - } else if (argNumber.isFloat()) { - float number = argNumber.floatValue(); - result = new FloatNode(Math.abs(number)); - } else if (argNumber.isDouble()) { - double number = argNumber.doubleValue(); + } else { // arg is Double + final double number = arg.doubleValue(); result = new DoubleNode(Math.abs(number)); } - } else { - throw new EvaluateRuntimeException(ERR_ARG1BADTYPE); - } - } else { - if (ctx.getParent() instanceof Fct_chainContext) { - if (argNumber == null) { - return null; + break; + default: // argCount > 1 + if (ctx.getParent() instanceof Fct_chainContext) { + throw new EvaluateRuntimeException(ERR_ARG1BADTYPE); } - throw new EvaluateRuntimeException(ERR_ARG1BADTYPE); - } - throw new EvaluateRuntimeException(argCount == 0 ? ERR_BAD_CONTEXT : ERR_ARG2BADTYPE); + throw new EvaluateRuntimeException(ERR_ARG2BADTYPE); } return result; @@ -134,5 +112,4 @@ public String getSignature() { // accepts a number (or context variable), returns a number return ""; } - } diff --git a/src/main/java/com/api/jsonata4java/testerui/TesterUI.java b/src/main/java/com/api/jsonata4java/testerui/TesterUI.java index aa8d8be7..23410c0c 100644 --- a/src/main/java/com/api/jsonata4java/testerui/TesterUI.java +++ b/src/main/java/com/api/jsonata4java/testerui/TesterUI.java @@ -52,6 +52,7 @@ import javax.swing.undo.CannotUndoException; import javax.swing.undo.UndoManager; import com.api.jsonata4java.expressions.EvaluateException; +import com.api.jsonata4java.expressions.EvaluateRuntimeException; import com.api.jsonata4java.expressions.Expressions; import com.api.jsonata4java.expressions.ParseException; import com.fasterxml.jackson.core.JsonProcessingException; @@ -401,22 +402,31 @@ private boolean parseMappingDescription() { private void map() { JsonNode inNode = null; - try { - switch (getFormat(inputArea.getText())) { - case XML: - inNode = xmlMapper.readTree(inputArea.getText()); - break; - default: - inNode = jsonMapper.readTree(inputArea.getText()); - break; - } - } catch (JsonProcessingException | RuntimeException e) { - System.err.println("Input error: " + e.getMessage()); - this.outputArea.setText("Input error: " + e.getMessage()); + if (inputArea.getText().length() == 0) { + } else if (inputArea.getText().matches("^[ \n\t]+$")) { + this.outputArea.setText("Input error: Unexpected end of JSON input"); this.inputArea.setBackground(settings.getBackgroundError()); this.outputArea.setBackground(settings.getBackgroundError()); return; + } else { + try { + switch (getFormat(inputArea.getText())) { + case XML: + inNode = xmlMapper.readTree(inputArea.getText()); + break; + default: + inNode = jsonMapper.readTree(inputArea.getText()); + break; + } + } catch (JsonProcessingException | RuntimeException e) { + System.err.println("Input error: " + e.getMessage()); + this.outputArea.setText("Input error: " + e.getMessage()); + this.inputArea.setBackground(settings.getBackgroundError()); + this.outputArea.setBackground(settings.getBackgroundError()); + return; + } } + try { final JsonNode outNode = this.expressions.evaluate(inNode); String newOutput = jsonMapper.writerWithDefaultPrettyPrinter().writeValueAsString(outNode); @@ -436,7 +446,12 @@ public void run() { this.inputArea.setBackground(settings.getBackgroundInput()); this.jsonataArea.setBackground(settings.getBackgroundJsonata()); this.outputArea.setBackground(settings.getBackgroundOutput()); - } catch (JsonProcessingException | EvaluateException | RuntimeException e) { + } catch (EvaluateException | EvaluateRuntimeException e) { + System.err.println("JSONata mapping error: " + e.getMessage()); + this.outputArea.setText(e.getMessage()); + this.jsonataArea.setBackground(settings.getBackgroundError()); + this.outputArea.setBackground(settings.getBackgroundError()); + } catch (JsonProcessingException | RuntimeException e) { System.err.println("JSONata mapping error: " + e.getMessage()); this.outputArea.setText("JSONata mapping error: " + e.getMessage()); this.jsonataArea.setBackground(settings.getBackgroundError()); @@ -445,7 +460,9 @@ public void run() { } enum Format { + XML, JSON + }; private Format getFormat(String text) { diff --git a/src/test/java/com/api/jsonata4java/expressions/functions/AbsFunctionTest.java b/src/test/java/com/api/jsonata4java/expressions/functions/AbsFunctionTest.java new file mode 100644 index 00000000..9b389fbc --- /dev/null +++ b/src/test/java/com/api/jsonata4java/expressions/functions/AbsFunctionTest.java @@ -0,0 +1,406 @@ +/** + * (c) Copyright 2018, 2019 IBM Corporation + * 1 New Orchard Road, + * Armonk, New York, 10504-1722 + * United States + * +1 914 499 1900 + * support: Nathaniel Mills wnm3@us.ibm.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.api.jsonata4java.expressions.functions; + +import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import org.junit.jupiter.api.Test; +import com.api.jsonata4java.expressions.utils.Constants; + +public class AbsFunctionTest { + + @Test + void nullInput() throws Exception { + test("$abs()", null, null, (String) null); + } + + @Test + void test02() throws Exception { + test("$abs()", null, AbsFunction.ERR_ARG1BADTYPE, "{}"); + } + + @Test + void test03() throws Exception { + test("$abs()", null, AbsFunction.ERR_ARG1BADTYPE, "[]"); + } + + @Test + void test04() throws Exception { + test("$abs()", null, AbsFunction.ERR_BAD_CONTEXT, "null"); + } + + @Test + void test05() throws Exception { + test("$abs(null)", null, AbsFunction.ERR_ARG1BADTYPE, (String) null); + } + + @Test + void test06() throws Exception { + test("$abs({})", null, AbsFunction.ERR_ARG1BADTYPE, (String) null); + } + + @Test + void test07() throws Exception { + test("$abs([])", null, AbsFunction.ERR_ARG1BADTYPE, (String) null); + } + + @Test + void test08() throws Exception { + test("$abs('1')", null, AbsFunction.ERR_ARG1BADTYPE, (String) null); + } + + @Test + void test09() throws Exception { + test("$abs(\"234\")", null, AbsFunction.ERR_ARG1BADTYPE, (String) null); + } + + @Test + void test10() throws Exception { + test("$abs(true)", null, AbsFunction.ERR_ARG1BADTYPE, (String) null); + } + + @Test + void test11() throws Exception { + test("$abs(a.b.c)", null, null, (String) null); + } + + @Test + void test12() throws Exception { + test("$abs(1)", "1", null, null); + } + + @Test + void test13() throws Exception { + test("$abs(-1)", "1", null, null); + } + + @Test + void test14() throws Exception { + test("$abs(2147483647)", "2147483647", null, null); + } + + @Test + void test15() throws Exception { + test("$abs(-2147483640)", "2147483640", null, null); + } + + @Test + void test16() throws Exception { + test("$abs(21474836471234)", "21474836471234", null, null); + } + + @Test + void test17() throws Exception { + test("$abs(-21474836471234)", "21474836471234", null, null); + } + + @Test + void test18() throws Exception { + test("$abs(1.0)", "1", null, null); + } + + @Test + void test19() throws Exception { + test("$abs(-1.0)", "1", null, null); + } + + @Test + void test20() throws Exception { + test("$abs(1.23456)", "1.23456", null, null); + } + + @Test + void test21() throws Exception { + test("$abs(-1.23456)", "1.23456", null, null); + } + + @Test + void test22() throws Exception { + test("$abs(1.234567890123)", "1.234567890123", null, null); + } + + @Test + void test23() throws Exception { + test("$abs(-1.234567890123)", "1.234567890123", null, null); + } + + @Test + void test24() throws Exception { + test("$abs(-9.123E99)", "9.123e+99", null, null); + } + + @Test + void test25() throws Exception { + test("$abs(-1.79769E308)", "1.79769e+308", null, null); + } + + @Test + void test26() throws Exception { + test("$abs(10/3.0)", "3.3333333333333333", null, null); + } + + @Test + void test27() throws Exception { + test("$abs(-10/3.0)", "3.3333333333333333", null, null); + } + + @Test + void test29() throws Exception { + test("$abs(9223372036854775807)", "9223372036854775807", null, null); + } + + @Test + void test30() throws Exception { + test("$abs(-9223372036854775807)", "9223372036854775807", null, null); + } + + @Test + void test31() throws Exception { + test("$abs(9223372036854775808)", "9223372036854775807", null, null); + } + + @Test + void test32() throws Exception { + test("$abs(-9223372036854775808)", "9223372036854775807", null, null); + } + + @Test + void test33() throws Exception { + test("$abs(9223372036854775809)", "9223372036854775807", null, null); + } + + @Test + void test34() throws Exception { + test("$abs(-9223372036854775809)", "9223372036854775807", null, null); + } + + @Test + void test35() throws Exception { + test("$abs(9223372036854775899.5)", "9223372036854775807", null, null); + } + + @Test + void test36() throws Exception { + test("$abs(-9223372036854775899.5)", Long.toString(Math.abs(Long.MAX_VALUE)), null, null); + } + + @Test + void test37() throws Exception { + test("$abs(9223372036854775809123456789)", "9.223372036854776E27", null, null); + } + + @Test + void test38() throws Exception { + test("$abs(-9223372036854775809123456789)", Double.toString(Math.abs(-9223372036854775809123456789D)), null, null); + } + + @Test + void test39() throws Exception { + test("$abs(9223372036854775809123456789.5)", Double.toString(Math.abs(9223372036854775809123456789.5)), null, null); + } + + @Test + void test40() throws Exception { + test("$abs(-9223372036854775809123456789.5)", Double.toString(Math.abs(-9223372036854775809123456789.5)), null, null); + } + + @Test + void test41() throws Exception { + test("$abs(1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + + "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + + "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789)", + "1.2345678901234567e+308", null, null); // original JSONata 1.8.6 is less precise 1.234567890123e+308 + } + + @Test + void test42() throws Exception { + test("$abs(1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + + "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + + "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890)", + "1.2345678901234567e+308", + String.format(Constants.ERR_MSG_NUMBER_OUT_OF_RANGE, + "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + + "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + + "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"), + null); + } + + @Test + void test43() throws Exception { + test("{}~>$abs()", null, AbsFunction.ERR_ARG1BADTYPE, (String) null); + } + + @Test + void test44() throws Exception { + test("[]~>$abs()", null, AbsFunction.ERR_ARG1BADTYPE, (String) null); + } + + @Test + void test45() throws Exception { + test("'1'~>$abs()", null, AbsFunction.ERR_ARG1BADTYPE, (String) null); + } + + @Test + void test46() throws Exception { + test("true~>$abs()", null, AbsFunction.ERR_ARG1BADTYPE, (String) null); + } + + @Test + void test47() throws Exception { + test("null~>$abs()", null, AbsFunction.ERR_BAD_CONTEXT, (String) null); + } + + @Test + void test48() throws Exception { + test("a.b.c~>$abs()", null, null, (String) null); + } + + @Test + void test49() throws Exception { + test("1~>$abs()", "1", null, null); + } + + @Test + void test50() throws Exception { + test("-1~>$abs()", "1", null, null); + } + + @Test + void test51() throws Exception { + test("2147483647~>$abs()", "2147483647", null, null); + } + + @Test + void test53() throws Exception { + test("-2147483640~>$abs()", "2147483640", null, null); + } + + @Test + void test54() throws Exception { + test("21474836471234~>$abs()", "21474836471234", null, null); + } + + @Test + void test55() throws Exception { + test("-21474836471234~>$abs()", "21474836471234", null, null); + } + + @Test + void test56() throws Exception { + test("1.0~>$abs()", "1", null, null); + } + + @Test + void test57() throws Exception { + test("-1.0~>$abs()", "1", null, null); + } + + @Test + void test58() throws Exception { + test("1.23456~>$abs()", "1.23456", null, null); + } + + @Test + void test59() throws Exception { + test("-1.23456~>$abs()", "1.23456", null, null); + } + + @Test + void test60() throws Exception { + test("1.234567890123~>$abs()", "1.234567890123", null, null); + } + + @Test + void test61() throws Exception { + test("-1.234567890123~>$abs()", "1.234567890123", null, null); + } + + @Test + void test62() throws Exception { + test("10/3.0~>$abs()", "3.3333333333333333", null, null); + } + + @Test + void test63() throws Exception { + test("-10/3.0~>$abs()", "3.3333333333333333", null, null); + } + + @Test + void test64() throws Exception { + test("9223372036854775807~>$abs()", "9223372036854775807", null, null); + } + + @Test + void test65() throws Exception { + test("-9223372036854775808~>$abs()", "9223372036854775807", null, null); + } + + @Test + void test66() throws Exception { + test("9223372036854775809~>$abs()", "9223372036854775807", null, null); + } + + @Test + void test67() throws Exception { + test("-9223372036854775809~>$abs()", "9223372036854775807", null, null); + } + + @Test + void test68() throws Exception { + test("9223372036854775899.5~>$abs()", "9223372036854775807", null, null); + } + + @Test + void test69() throws Exception { + test("-9223372036854775899.5~>$abs()", "9223372036854775807", null, null); + } + + @Test + void test70() throws Exception { + test("9223372036854775809123456789~>$abs()", "9.223372036854776E27", null, null); + } + + @Test + void test71() throws Exception { + test("-9223372036854775809123456789~>$abs()", "9.223372036854776E27", null, null); + } + + @Test + void test72() throws Exception { + test("9223372036854775809123456789.5~>$abs()", "9.223372036854776E27", null, null); + } + + @Test + void test73() throws Exception { + test("-9223372036854775809123456789.5~>$abs()", "9.223372036854776E27", null, null); + } + + @Test + void testWith2Args() throws Exception { + test("$abs(1, 2)", null, AbsFunction.ERR_ARG2BADTYPE, (String) null); + } + + @Test + void testWithChainPlus1Arg() throws Exception { + test("-1 ~> $abs(-2)", null, AbsFunction.ERR_ARG1BADTYPE, (String) null); + } +} diff --git a/src/test/java/com/api/jsonata4java/expressions/suites/ComponentTestSuite.java b/src/test/java/com/api/jsonata4java/expressions/suites/ComponentTestSuite.java index e9e85064..ba027ce2 100644 --- a/src/test/java/com/api/jsonata4java/expressions/suites/ComponentTestSuite.java +++ b/src/test/java/com/api/jsonata4java/expressions/suites/ComponentTestSuite.java @@ -26,7 +26,6 @@ import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; -import com.api.jsonata4java.test.expressions.AbsFunctionTests; import com.api.jsonata4java.test.expressions.Base64DecodeFunctionTests; import com.api.jsonata4java.test.expressions.Base64EncodeFunctionTests; import com.api.jsonata4java.test.expressions.BasicExpressionsTests; @@ -78,7 +77,6 @@ @RunWith(Suite.class) @SuiteClasses({ - AbsFunctionTests.class, // Base64DecodeFunctionTests.class, // Base64EncodeFunctionTests.class, // BasicExpressionsTests.class, // diff --git a/src/test/java/com/api/jsonata4java/test/expressions/AbsFunctionTests.java b/src/test/java/com/api/jsonata4java/test/expressions/AbsFunctionTests.java deleted file mode 100644 index 94bced29..00000000 --- a/src/test/java/com/api/jsonata4java/test/expressions/AbsFunctionTests.java +++ /dev/null @@ -1,288 +0,0 @@ -/** - * (c) Copyright 2018, 2019 IBM Corporation - * 1 New Orchard Road, - * Armonk, New York, 10504-1722 - * United States - * +1 914 499 1900 - * support: Nathaniel Mills wnm3@us.ibm.com - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package com.api.jsonata4java.test.expressions; - -import static com.api.jsonata4java.text.expressions.utils.Utils.test; -import java.io.Serializable; -import java.util.Arrays; -import java.util.Collection; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameter; -import org.junit.runners.Parameterized.Parameters; -import com.api.jsonata4java.expressions.utils.Constants; - -/** - * http://docs.jsonata.org/numeric-functions.html - * - * $abs(number) - * - * Returns the absolute value of the number parameter, i.e. if the number is - * negative, it returns the positive value. - * - * If number is not specified (i.e. this function is invoked with no arguments), - * then the context value is used as the value of number. - * - * Examples - * - * $abs(5)==5 $abs(-5)==5 - * - * - * NOTE: - * - * FROM THE java.math::abs() FUNCTION JAVADOC: - * - *

- * Note that if the argument is equal to the value of {@link Long#MIN_VALUE}, - * the most negative representable {@code long} value, the result is that same - * value, which is negative. - * - */ -@RunWith(Parameterized.class) -public class AbsFunctionTests implements Serializable { - - private static final long serialVersionUID = -1287491069575091760L; - - private static final String ERR_BAD_CONTEXT = String.format(Constants.ERR_MSG_BAD_CONTEXT, Constants.FUNCTION_ABS); - private static final String ERR_MSG_ARG1_BAD_TYPE = String.format(Constants.ERR_MSG_ARG1_BAD_TYPE, - Constants.FUNCTION_ABS); - private static final String ERR_MSG_NUMBER_OUT_OF_RANGE = String.format(Constants.ERR_MSG_NUMBER_OUT_OF_RANGE, - "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"); - - @Parameter(0) - public String expression; - - @Parameter(1) - public String expectedResultJsonString; - - @Parameter(2) - public String expectedRuntimeExceptionMessage; - - @Parameters(name = "{index}: {0} -> {1} ({2})") - public static Collection data() { - return Arrays.asList(new Object[][] { - { - "$abs()", null, ERR_BAD_CONTEXT - }, // - { - "$abs({})", null, ERR_MSG_ARG1_BAD_TYPE - }, // - { - "$abs([])", null, ERR_MSG_ARG1_BAD_TYPE - }, // - { - "$abs('1')", null, ERR_MSG_ARG1_BAD_TYPE - }, // - { - "$abs(true)", null, ERR_MSG_ARG1_BAD_TYPE - }, // - { - "$abs(null)", null, ERR_MSG_ARG1_BAD_TYPE - }, // - { - "$abs(a.b.c)", null, null - }, // - { - "$abs(1)", Long.toString(Math.abs(1)), null - }, // - { - "$abs(-1)", Long.toString(Math.abs(-1)), null - }, // - { - "$abs(2147483647)", Long.toString(Math.abs(2147483647)), null - }, // - { - "$abs(-2147483640)", Long.toString(Math.abs(-2147483640)), null - }, // - { - "$abs(21474836471234)", Long.toString((long) Math.abs(21474836471234D)), null - }, // - { - "$abs(-21474836471234)", Long.toString((long) Math.abs(-21474836471234D)), null - }, // - { - "$abs(1.0)", "1", null - }, // jsonata 1.8.2 Double.toString(Math.abs(1.0)), null }, // - { - "$abs(-1.0)", "1", null - }, // jsonata 1.8.2 Double.toString(Math.abs(-1.0)), null }, // - { - "$abs(1.23456)", Double.toString(Math.abs(1.23456)), null - }, // - { - "$abs(-1.23456)", Double.toString(Math.abs(-1.23456)), null - }, // - { - "$abs(1.234567890123)", Double.toString(Math.abs(1.234567890123)), null - }, // - { - "$abs(-1.234567890123)", Double.toString(Math.abs(-1.234567890123)), null - }, // - { - "$abs(10/3.0)", Double.toString(Math.abs(10 / 3.0)), null - }, // - { - "$abs(-10/3.0)", Double.toString(Math.abs(-10 / 3.0)), null - }, // - { - "$abs(9223372036854775807)", Long.toString(Math.abs(Long.MAX_VALUE)), null - }, // - { - "$abs(-9223372036854775808)", Long.toString(Math.abs(Long.MAX_VALUE)), null - }, // jsonata 1.8.2 Double.toString(Math.abs(-9223372036854775808D)), null }, // - { - "$abs(9223372036854775809)", Long.toString(Math.abs(Long.MAX_VALUE)), null - }, // jsonata 1.8.2 Double.toString(Math.abs(9223372036854775809D)), null }, // - { - "$abs(-9223372036854775809)", Long.toString(Math.abs(Long.MAX_VALUE)), null - }, // jsonata 1.8.2 Double.toString(Math.abs(-9223372036854775809D)), null }, // - { - "$abs(9223372036854775899.5)", Long.toString(Math.abs(Long.MAX_VALUE)), null - }, // jsonata 1.8.2 Double.toString(Math.abs(9223372036854775899.5)), null }, // - { - "$abs(-9223372036854775899.5)", Long.toString(Math.abs(Long.MAX_VALUE)), null - }, // jsonata 1.8.2 Double.toString(Math.abs(-9223372036854775899.5)), null }, // - { - "$abs(9223372036854775809123456789)", Double.toString(Math.abs(9223372036854775809123456789D)), // - null - }, // - { - "$abs(-9223372036854775809123456789)", Double.toString(Math.abs(-9223372036854775809123456789D)), // - null - }, // - { - "$abs(9223372036854775809123456789.5)", Double.toString(Math.abs(9223372036854775809123456789.5)), // - null - }, // - { - "$abs(-9223372036854775809123456789.5)", Double.toString(Math.abs(-9223372036854775809123456789.5)), // - null - }, // - { - "$abs(1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890)", // - null, ERR_MSG_NUMBER_OUT_OF_RANGE - }, // - { - "{}~>$abs()", null, ERR_MSG_ARG1_BAD_TYPE - }, // - { - "[]~>$abs()", null, ERR_MSG_ARG1_BAD_TYPE - }, // - { - "'1'~>$abs()", null, ERR_MSG_ARG1_BAD_TYPE - }, // - { - "true~>$abs()", null, ERR_MSG_ARG1_BAD_TYPE - }, // - { - "null~>$abs()", null, ERR_MSG_ARG1_BAD_TYPE - }, // - { - "a.b.c~>$abs()", null, null - }, // - { - "1~>$abs()", Long.toString(Math.abs(1)), null - }, // - { - "-1~>$abs()", Long.toString(Math.abs(-1)), null - }, // - { - "2147483647~>$abs()", Long.toString(Math.abs(2147483647)), null - }, // - { - "-2147483640~>$abs()", Long.toString(Math.abs(-2147483640)), null - }, // - { - "21474836471234~>$abs()", Long.toString((long) Math.abs(21474836471234D)), null - }, // - { - "-21474836471234~>$abs()", Long.toString((long) Math.abs(-21474836471234D)), null - }, // - { - "1.0~>$abs()", "1", null - }, // jsonata 1.8.2 Double.toString(Math.abs(1.0)), null }, // - { - "-1.0~>$abs()", "1", null - }, // jsonata 1.8.2 Double.toString(Math.abs(-1.0)), null }, // - { - "1.23456~>$abs()", Double.toString(Math.abs(1.23456)), null - }, // - { - "-1.23456~>$abs()", Double.toString(Math.abs(-1.23456)), null - }, // - { - "1.234567890123~>$abs()", Double.toString(Math.abs(1.234567890123)), null - }, // - { - "-1.234567890123~>$abs()", Double.toString(Math.abs(-1.234567890123)), null - }, // - { - "10/3.0~>$abs()", Double.toString(Math.abs(10 / 3.0)), null - }, // - { - "-10/3.0~>$abs()", Double.toString(Math.abs(-10 / 3.0)), null - }, // - { - "9223372036854775807~>$abs()", Long.toString(Math.abs(Long.MAX_VALUE)), null - }, // - { - "-9223372036854775808~>$abs()", Long.toString(Long.MAX_VALUE), null - }, // jsonata 1.8.2 Double.toString(Math.abs(-9223372036854775808D)), null }, // - { - "9223372036854775809~>$abs()", Long.toString(Long.MAX_VALUE), null - }, // jsonata 1.8.2 Double.toString(Math.abs(9223372036854775809D)), null }, // - { - "-9223372036854775809~>$abs()", Long.toString(Long.MAX_VALUE), null - }, // jsonata 1.8.2 Double.toString(Math.abs(-9223372036854775809D)), null }, // - { - "9223372036854775899.5~>$abs()", Long.toString(Long.MAX_VALUE), null - }, // jsonata 1.8.2 Double.toString(Math.abs(9223372036854775899.5)), null }, // - { - "-9223372036854775899.5~>$abs()", Long.toString(Long.MAX_VALUE), null - }, // jsonata 1.8.2 Double.toString(Math.abs(-9223372036854775899.5)), null }, // - { - "9223372036854775809123456789~>$abs()", Double.toString(Math.abs(9223372036854775809123456789D)), // - null - }, // - { - "-9223372036854775809123456789~>$abs()", Double.toString(Math.abs(-9223372036854775809123456789D)), // - null - }, // - { - "9223372036854775809123456789.5~>$abs()", Double.toString(Math.abs(9223372036854775809123456789.5)), // - null - }, // - { - "-9223372036854775809123456789.5~>$abs()", Double.toString(Math.abs(-9223372036854775809123456789.5)), // - null - } // - - }); - } - - @Test - public void runTest() throws Exception { - test(this.expression, expectedResultJsonString, expectedRuntimeExceptionMessage, null); - } -} diff --git a/src/test/java/com/api/jsonata4java/test/expressions/agnostic/AgnosticTestSuite.java b/src/test/java/com/api/jsonata4java/test/expressions/agnostic/AgnosticTestSuite.java index a38e7f69..abae6eb4 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/agnostic/AgnosticTestSuite.java +++ b/src/test/java/com/api/jsonata4java/test/expressions/agnostic/AgnosticTestSuite.java @@ -35,7 +35,6 @@ import com.api.jsonata4java.expressions.ParseException; import com.api.jsonata4java.expressions.path.PathExpression; import com.api.jsonata4java.expressions.utils.JsonMergeUtils; -import com.api.jsonata4java.test.expressions.AbsFunctionTests; import com.api.jsonata4java.test.expressions.Base64DecodeFunctionTests; import com.api.jsonata4java.test.expressions.Base64EncodeFunctionTests; import com.api.jsonata4java.test.expressions.BasicExpressionsTests; @@ -361,10 +360,8 @@ private void init() throws Exception { System.out.println("Read " + groupsRead + " groups from " + GROUPS_DIR); printFooter(); - runComponentTest(AbsFunctionTests.data()); runComponentTest(Base64DecodeFunctionTests.data()); runComponentTest(Base64EncodeFunctionTests.data()); - // runComponentTest(BasicExpressionsTest.data()); runComponentTest(BooleanFunctionTests.data()); runComponentTest(CeilFunctionTests.data()); runComponentTest(ContainsFunctionTests.data()); @@ -558,9 +555,12 @@ protected void runExecutionTest(Collection data) throws Exception { protected void runComponentTest(Collection data) throws Exception { for (Object[] test : data) { - if (test.length > 0) { + if (test.length == 3) { Utils.test(test[0] == null ? null : test[0].toString(), test[1] == null ? null : test[1].toString(), test[2] == null ? null : test[2].toString(), null); + } else if (test.length == 4) { + Utils.test(test[0] == null ? null : test[0].toString(), test[1] == null ? null : test[1].toString(), + test[2] == null ? null : test[2].toString(), test[3] == null ? null : test[3].toString()); } else { System.out.println("Received an empty test: " + test); System.out.println("for data: " + data); From cdf8bc7b6c05b002cda06c74378b02065d14229c Mon Sep 17 00:00:00 2001 From: Martin Bluemel Date: Mon, 28 Nov 2022 01:36:16 +0100 Subject: [PATCH 2/7] Reorganized tests Introduction of JUnit5 failed because Vintage Engine ignores failures in AgnosticTestSuite Signed-off-by: Martin Bluemel --- .classpath | 5 - .settings/org.eclipse.core.resources.prefs | 1 - pom.xml | 112 +++++------- src/main/resources/placeholder.file | 0 .../agnostic => }/AgnosticTestSuite.java | 164 ++++++++---------- .../Base64DecodeFunctionTests.java | 4 +- .../Base64EncodeFunctionTests.java | 4 +- .../expressions/BasicExpressionsTests.java | 10 +- .../expressions/BooleanFunctionTests.java | 4 +- .../expressions/CeilFunctionTests.java | 4 +- .../expressions/ContainsFunctionTests.java | 4 +- .../expressions/CountFunctionTests.java | 4 +- .../DiacriticsTokenizationTests.java | 4 +- .../expressions/DistinctFunctionTests.java | 4 +- .../expressions/EvalFunctionTests.java | 4 +- .../expressions/ExpressionsTests.java | 4 +- .../expressions/FloorFunctionTests.java | 4 +- .../expressions/FormatBaseFunctionTests.java | 4 +- .../FormatNumberFunctionTests.java | 4 +- .../expressions/FromMillisFunctionTests.java | 4 +- .../expressions/FunctionChainingTests.java | 4 +- .../expressions/FunctionErrorTest.java | 4 +- .../expressions/InvalidSyntaxTest.java | 2 +- .../expressions/JoinFunctionTests.java | 4 +- .../expressions/Jsonata4JavaTestMapper.java | 2 +- .../expressions/JsonataDotOrgTests.java | 4 +- .../expressions/LengthFunctionTests.java | 4 +- .../expressions/LowercaseFunctionTests.java | 4 +- .../expressions/MapFunctionTests.java | 4 +- .../expressions/MatchFunctionTests.java | 4 +- .../expressions/MaxFunctionTests.java | 4 +- .../expressions/MillisFunctionTests.java | 4 +- .../expressions/MinFunctionTests.java | 4 +- .../expressions/NotFunctionTests.java | 4 +- .../expressions/NowFunctionTests.java | 4 +- .../expressions/NumberFunctionTests.java | 4 +- .../expressions/NumericCoercionTests.java | 4 +- .../expressions/PadFunctionTests.java | 4 +- .../PathExpressionParentTests.java | 4 +- .../expressions/PowerFunctionTests.java | 4 +- .../expressions/RandomFunctionTests.java | 4 +- .../expressions/RegularExpressionTest.java | 2 +- .../expressions/ReplaceFunctionTests.java | 4 +- .../expressions/RoundFunctionTests.java | 4 +- .../SingletonArrayHandlingTests.java | 4 +- .../expressions/SortFunctionTests.java | 4 +- .../expressions/SplitFunctionTests.java | 4 +- .../expressions/SqrtFunctionTests.java | 4 +- .../expressions/StringFunctionTests.java | 4 +- .../SubstringAfterFunctionTests.java | 4 +- .../SubstringBeforeFunctionTests.java | 4 +- .../expressions/SubstringFunctionTests.java | 4 +- .../expressions/SumFunctionTests.java | 4 +- .../expressions/ToMillisFunctionTests.java | 4 +- .../expressions/TrimFunctionTests.java | 4 +- .../expressions/UnpackFunctionTests.java | 4 +- .../expressions/UppercaseFunctionTests.java | 4 +- .../functions/AbsFunctionTest.java | 150 ++++++++-------- .../path/PathExpressionSyntaxTests.java | 2 +- .../expressions/path/PathExpressionTests.java | 2 +- .../suites/ComponentTestSuite.java | 131 -------------- .../expressions/utils/JsonMergeUtilsTest.java | 2 +- .../expressions/utils/TestLogFormatter.java | 2 +- .../{text => }/expressions/utils/Utils.java | 2 +- .../java/testmanually/ComponentTestSuite.java | 130 ++++++++++++++ .../ExpressionTestPerfomance.java | 3 +- .../JsonataUnitTests.java | 4 +- .../MapFunctionNonParTests.java | 4 +- .../TestBindingReference.java | 4 +- .../java/{ => testmanually}/ThreadTester.java | 1 + 70 files changed, 438 insertions(+), 489 deletions(-) delete mode 100644 src/main/resources/placeholder.file rename src/test/java/com/api/jsonata4java/{test/expressions/agnostic => }/AgnosticTestSuite.java (87%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/Base64DecodeFunctionTests.java (97%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/Base64EncodeFunctionTests.java (97%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/BasicExpressionsTests.java (99%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/BooleanFunctionTests.java (98%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/CeilFunctionTests.java (98%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/ContainsFunctionTests.java (98%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/CountFunctionTests.java (95%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/DiacriticsTokenizationTests.java (96%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/DistinctFunctionTests.java (95%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/EvalFunctionTests.java (94%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/ExpressionsTests.java (99%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/FloorFunctionTests.java (98%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/FormatBaseFunctionTests.java (98%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/FormatNumberFunctionTests.java (99%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/FromMillisFunctionTests.java (99%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/FunctionChainingTests.java (99%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/FunctionErrorTest.java (99%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/InvalidSyntaxTest.java (99%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/JoinFunctionTests.java (98%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/Jsonata4JavaTestMapper.java (97%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/JsonataDotOrgTests.java (99%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/LengthFunctionTests.java (97%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/LowercaseFunctionTests.java (97%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/MapFunctionTests.java (97%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/MatchFunctionTests.java (98%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/MaxFunctionTests.java (98%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/MillisFunctionTests.java (96%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/MinFunctionTests.java (98%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/NotFunctionTests.java (97%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/NowFunctionTests.java (95%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/NumberFunctionTests.java (98%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/NumericCoercionTests.java (99%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/PadFunctionTests.java (98%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/PathExpressionParentTests.java (99%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/PowerFunctionTests.java (98%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/RandomFunctionTests.java (96%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/RegularExpressionTest.java (97%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/ReplaceFunctionTests.java (99%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/RoundFunctionTests.java (98%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/SingletonArrayHandlingTests.java (98%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/SortFunctionTests.java (94%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/SplitFunctionTests.java (98%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/SqrtFunctionTests.java (98%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/StringFunctionTests.java (96%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/SubstringAfterFunctionTests.java (98%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/SubstringBeforeFunctionTests.java (98%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/SubstringFunctionTests.java (98%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/SumFunctionTests.java (95%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/ToMillisFunctionTests.java (98%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/TrimFunctionTests.java (97%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/UnpackFunctionTests.java (95%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/UppercaseFunctionTests.java (97%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/path/PathExpressionSyntaxTests.java (98%) rename src/test/java/com/api/jsonata4java/{test => }/expressions/path/PathExpressionTests.java (99%) delete mode 100644 src/test/java/com/api/jsonata4java/expressions/suites/ComponentTestSuite.java rename src/test/java/com/api/jsonata4java/{text => }/expressions/utils/JsonMergeUtilsTest.java (98%) rename src/test/java/com/api/jsonata4java/{text => }/expressions/utils/TestLogFormatter.java (98%) rename src/test/java/com/api/jsonata4java/{text => }/expressions/utils/Utils.java (99%) create mode 100644 src/test/java/testmanually/ComponentTestSuite.java rename src/test/java/{com/api/jsonata4java/test/expressions => testmanually}/ExpressionTestPerfomance.java (98%) rename src/test/java/{com/api/jsonata4java/test/expressions => testmanually}/JsonataUnitTests.java (99%) rename src/test/java/{com/api/jsonata4java/test/expressions => testmanually}/MapFunctionNonParTests.java (98%) rename src/test/java/{com/api/jsonata4java/test/expressions => testmanually}/TestBindingReference.java (97%) rename src/test/java/{ => testmanually}/ThreadTester.java (98%) diff --git a/.classpath b/.classpath index 0cdd2919..38c39bd5 100644 --- a/.classpath +++ b/.classpath @@ -20,11 +20,6 @@ - - - - - diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs index 12da1b00..b66320f1 100644 --- a/.settings/org.eclipse.core.resources.prefs +++ b/.settings/org.eclipse.core.resources.prefs @@ -1,6 +1,5 @@ eclipse.preferences.version=1 encoding//src/main/java=UTF-8 -encoding//src/main/resources=UTF-8 encoding//src/test/java=UTF-8 encoding//src/test/resources=UTF-8 encoding//target/generated-sources/antlr4=UTF-8 diff --git a/pom.xml b/pom.xml index bcdd6c7c..2894ebb5 100644 --- a/pom.xml +++ b/pom.xml @@ -21,9 +21,7 @@ * */ --> - + 4.0.0 com.ibm.jsonata4java JSONata4Java @@ -71,14 +69,12 @@ https://github.com/IBM/JSONata4Java - 5.9.1 - 1.9.1 - **/*Test.class - com/api/jsonata4java/test/expressions/agnostic/AgnosticTestSuite.class + com/api/jsonata4java/**/*Test.class + com/api/jsonata4java/AgnosticTestSuite.class UTF-8 - true + true 4.11.1 - + ossrh @@ -90,42 +86,18 @@ - - org.junit.jupiter - junit-jupiter-engine - ${junit.jupiter.version} - test - - - org.junit.jupiter - junit-jupiter-api - ${junit.jupiter.version} - test - - - org.junit.jupiter - junit-jupiter-params - ${junit.jupiter.version} - test - - - org.junit.vintage - junit-vintage-engine - ${junit.jupiter.version} - test - - - org.junit.platform - junit-platform-suite - ${junit.platform.version} - test - + + junit + junit + 4.13.2 + test + - org.springframework - spring-context - 5.3.23 - test - + org.springframework + spring-context + 5.3.23 + test + org.antlr antlr4-runtime @@ -138,15 +110,15 @@ - com.fasterxml.woodstox - woodstox-core - 6.4.0 + com.fasterxml.woodstox + woodstox-core + 6.4.0 + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + 2.14.0 - - com.fasterxml.jackson.dataformat - jackson-dataformat-xml - 2.14.0 - org.apache.commons @@ -239,7 +211,7 @@ - 1.8 + 1.8 -Xdoclint:none @@ -251,8 +223,7 @@ 1.8 1.8 - - + @@ -269,7 +240,7 @@ https://github.com/jsonata-js/jsonata/archive/v1.8.4.zip true ${project.build.directory}/jsonata - c8f057d10e659c27a5aa79f11d961947 + c8f057d10e659c27a5aa79f11d961947 + mvn antlr4:antlr4 In any case, Maven will invoke this plugin before the Java source is compiled + --> org.antlr antlr4-maven-plugin @@ -324,7 +296,7 @@ src/test/resources/* - + @@ -402,11 +374,11 @@ - - release - - false - - - - + + release + + false + + + + \ No newline at end of file diff --git a/src/main/resources/placeholder.file b/src/main/resources/placeholder.file deleted file mode 100644 index e69de29b..00000000 diff --git a/src/test/java/com/api/jsonata4java/test/expressions/agnostic/AgnosticTestSuite.java b/src/test/java/com/api/jsonata4java/AgnosticTestSuite.java similarity index 87% rename from src/test/java/com/api/jsonata4java/test/expressions/agnostic/AgnosticTestSuite.java rename to src/test/java/com/api/jsonata4java/AgnosticTestSuite.java index abae6eb4..b821ea07 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/agnostic/AgnosticTestSuite.java +++ b/src/test/java/com/api/jsonata4java/AgnosticTestSuite.java @@ -1,4 +1,4 @@ -package com.api.jsonata4java.test.expressions.agnostic; +package com.api.jsonata4java; import java.io.BufferedReader; import java.io.File; @@ -7,7 +7,6 @@ import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStreamReader; -import java.io.Serializable; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; @@ -29,63 +28,63 @@ import org.junit.runner.notification.RunNotifier; import org.junit.runners.ParentRunner; import org.junit.runners.model.InitializationError; +import com.api.jsonata4java.AgnosticTestSuite.TestGroup; +import com.api.jsonata4java.expressions.Base64DecodeFunctionTests; +import com.api.jsonata4java.expressions.Base64EncodeFunctionTests; +import com.api.jsonata4java.expressions.BasicExpressionsTests; +import com.api.jsonata4java.expressions.BooleanFunctionTests; +import com.api.jsonata4java.expressions.CeilFunctionTests; +import com.api.jsonata4java.expressions.ContainsFunctionTests; +import com.api.jsonata4java.expressions.CountFunctionTests; +import com.api.jsonata4java.expressions.DistinctFunctionTests; import com.api.jsonata4java.expressions.EvaluateException; import com.api.jsonata4java.expressions.EvaluateRuntimeException; import com.api.jsonata4java.expressions.Expressions; +import com.api.jsonata4java.expressions.ExpressionsTests; +import com.api.jsonata4java.expressions.FloorFunctionTests; +import com.api.jsonata4java.expressions.FormatBaseFunctionTests; +import com.api.jsonata4java.expressions.FormatNumberFunctionTests; +import com.api.jsonata4java.expressions.FromMillisFunctionTests; +import com.api.jsonata4java.expressions.FunctionChainingTests; +import com.api.jsonata4java.expressions.InvalidSyntaxTest; +import com.api.jsonata4java.expressions.JoinFunctionTests; +import com.api.jsonata4java.expressions.JsonataDotOrgTests; +import com.api.jsonata4java.expressions.LengthFunctionTests; +import com.api.jsonata4java.expressions.LowercaseFunctionTests; +import com.api.jsonata4java.expressions.MatchFunctionTests; +import com.api.jsonata4java.expressions.MaxFunctionTests; +import com.api.jsonata4java.expressions.MillisFunctionTests; +import com.api.jsonata4java.expressions.MinFunctionTests; +import com.api.jsonata4java.expressions.NotFunctionTests; +import com.api.jsonata4java.expressions.NowFunctionTests; +import com.api.jsonata4java.expressions.NumberFunctionTests; +import com.api.jsonata4java.expressions.NumericCoercionTests; +import com.api.jsonata4java.expressions.PadFunctionTests; import com.api.jsonata4java.expressions.ParseException; +import com.api.jsonata4java.expressions.PathExpressionParentTests; +import com.api.jsonata4java.expressions.PowerFunctionTests; +import com.api.jsonata4java.expressions.RandomFunctionTests; +import com.api.jsonata4java.expressions.ReplaceFunctionTests; +import com.api.jsonata4java.expressions.RoundFunctionTests; +import com.api.jsonata4java.expressions.SingletonArrayHandlingTests; +import com.api.jsonata4java.expressions.SortFunctionTests; +import com.api.jsonata4java.expressions.SplitFunctionTests; +import com.api.jsonata4java.expressions.SqrtFunctionTests; +import com.api.jsonata4java.expressions.StringFunctionTests; +import com.api.jsonata4java.expressions.SubstringAfterFunctionTests; +import com.api.jsonata4java.expressions.SubstringBeforeFunctionTests; +import com.api.jsonata4java.expressions.SubstringFunctionTests; +import com.api.jsonata4java.expressions.SumFunctionTests; +import com.api.jsonata4java.expressions.ToMillisFunctionTests; +import com.api.jsonata4java.expressions.TrimFunctionTests; +import com.api.jsonata4java.expressions.UnpackFunctionTests; +import com.api.jsonata4java.expressions.UppercaseFunctionTests; import com.api.jsonata4java.expressions.path.PathExpression; +import com.api.jsonata4java.expressions.path.PathExpressionSyntaxTests; +import com.api.jsonata4java.expressions.path.PathExpressionTests; import com.api.jsonata4java.expressions.utils.JsonMergeUtils; -import com.api.jsonata4java.test.expressions.Base64DecodeFunctionTests; -import com.api.jsonata4java.test.expressions.Base64EncodeFunctionTests; -import com.api.jsonata4java.test.expressions.BasicExpressionsTests; -import com.api.jsonata4java.test.expressions.BooleanFunctionTests; -import com.api.jsonata4java.test.expressions.CeilFunctionTests; -import com.api.jsonata4java.test.expressions.ContainsFunctionTests; -import com.api.jsonata4java.test.expressions.CountFunctionTests; -import com.api.jsonata4java.test.expressions.DistinctFunctionTests; -import com.api.jsonata4java.test.expressions.ExpressionsTests; -import com.api.jsonata4java.test.expressions.FloorFunctionTests; -import com.api.jsonata4java.test.expressions.FormatBaseFunctionTests; -import com.api.jsonata4java.test.expressions.FormatNumberFunctionTests; -import com.api.jsonata4java.test.expressions.FromMillisFunctionTests; -import com.api.jsonata4java.test.expressions.FunctionChainingTests; -import com.api.jsonata4java.test.expressions.InvalidSyntaxTest; -import com.api.jsonata4java.test.expressions.JoinFunctionTests; -import com.api.jsonata4java.test.expressions.JsonataDotOrgTests; -import com.api.jsonata4java.test.expressions.LengthFunctionTests; -import com.api.jsonata4java.test.expressions.LowercaseFunctionTests; -import com.api.jsonata4java.test.expressions.MatchFunctionTests; -import com.api.jsonata4java.test.expressions.MaxFunctionTests; -import com.api.jsonata4java.test.expressions.MillisFunctionTests; -import com.api.jsonata4java.test.expressions.MinFunctionTests; -import com.api.jsonata4java.test.expressions.NotFunctionTests; -import com.api.jsonata4java.test.expressions.NowFunctionTests; -import com.api.jsonata4java.test.expressions.NumberFunctionTests; -import com.api.jsonata4java.test.expressions.NumericCoercionTests; -import com.api.jsonata4java.test.expressions.PadFunctionTests; -import com.api.jsonata4java.test.expressions.PathExpressionParentTests; -import com.api.jsonata4java.test.expressions.PowerFunctionTests; -import com.api.jsonata4java.test.expressions.RandomFunctionTests; -import com.api.jsonata4java.test.expressions.ReplaceFunctionTests; -import com.api.jsonata4java.test.expressions.RoundFunctionTests; -import com.api.jsonata4java.test.expressions.SingletonArrayHandlingTests; -import com.api.jsonata4java.test.expressions.SortFunctionTests; -import com.api.jsonata4java.test.expressions.SplitFunctionTests; -import com.api.jsonata4java.test.expressions.SqrtFunctionTests; -import com.api.jsonata4java.test.expressions.StringFunctionTests; -import com.api.jsonata4java.test.expressions.SubstringAfterFunctionTests; -import com.api.jsonata4java.test.expressions.SubstringBeforeFunctionTests; -import com.api.jsonata4java.test.expressions.SubstringFunctionTests; -import com.api.jsonata4java.test.expressions.SumFunctionTests; -import com.api.jsonata4java.test.expressions.ToMillisFunctionTests; -import com.api.jsonata4java.test.expressions.TrimFunctionTests; -import com.api.jsonata4java.test.expressions.UnpackFunctionTests; -import com.api.jsonata4java.test.expressions.UppercaseFunctionTests; -import com.api.jsonata4java.test.expressions.agnostic.AgnosticTestSuite.TestGroup; -import com.api.jsonata4java.test.expressions.path.PathExpressionSyntaxTests; -import com.api.jsonata4java.test.expressions.path.PathExpressionTests; -import com.api.jsonata4java.text.expressions.utils.JsonMergeUtilsTest; -import com.api.jsonata4java.text.expressions.utils.Utils; +import com.api.jsonata4java.expressions.utils.JsonMergeUtilsTest; +import com.api.jsonata4java.expressions.utils.Utils; import com.fasterxml.jackson.core.json.JsonWriteFeature; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JsonNode; @@ -97,9 +96,8 @@ import com.fasterxml.jackson.databind.node.ObjectNode; @RunWith(AgnosticTestSuite.class) -public class AgnosticTestSuite extends ParentRunner implements Serializable { - - private static final long serialVersionUID = -971059278554482900L; +// @ExtendWith(AgnosticTestSuiteExtension.class) +public class AgnosticTestSuite extends ParentRunner { private static final List SKIP_GROUPS = Arrays.asList(new String[] { "transform", // issue #47 @@ -110,18 +108,13 @@ public class AgnosticTestSuite extends ParentRunner implements Serial "closures", // issue #56 "matchers", // issue #57 "hof-zip-map", // issue #58 - // "parent-operator", // issue #60 - // "function-distinct", // issue #63 - // "lambdas", // issue #70 "higher-order-functions", // issue #70 - // "regex", // issue #71 "function-assert", // issue #72 "function-eval", // issue #73 "sorting", // issue #74 "hof-single", // issue #76 "tail-recursion", // tail-recursion requires lambda issue #70 "function-signatures", // #77 - // "flattening" // #78 }); private static final ObjectMapper _objectMapper = new ObjectMapper(); @@ -135,14 +128,8 @@ public class AgnosticTestSuite extends ParentRunner implements Serial // due to unparsable use of 'in' in the tests SKIP_CASES("inclusion-operator", "case004", "case005"); // issue #43 object construction - SKIP_CASES("object-constructor", /* "case008", "case009", "case010", */ - "case011", - /* "case012", */ - "case013", - /* "case014", "case015", "case016", */ - "case017", - /* "case018", "case019", "case020", */ - "case022", "case025"); + SKIP_CASES("object-constructor", "case013", "case017", "case022", + /* issue #56 closures*/ "case023"); SKIP_CASES("flattening", "case040", "case041"); // issue #48 @ references SKIP_CASES("joins", "employee-map-reduce-11"); @@ -216,8 +203,6 @@ public class AgnosticTestSuite extends ParentRunner implements Serial ); // issue #55 and / or stand alone to get by parser SKIP_CASES("boolean-expresssions", "case012", "case013", "case014", "case015"); - // issue #56 closures - SKIP_CASES("object-constructor", "case023"); // issue $59 SKIP_CASES("errors", "case012", "case013", "case014", "case015", "case018", "case020", "case022", "case023"); // have right answer, but AgnosticTestSuite not comparing correctly @@ -274,13 +259,11 @@ private static void SKIP_CASES(String group, String... casesArray) { public AgnosticTestSuite(Class testClass) throws InitializationError { super(testClass); - try { init(); } catch (Exception e) { throw new InitializationError(e); } - } // added for issue 203 @@ -509,7 +492,6 @@ protected void runJsonCompareTest(Collection data) throws Exception { final JsonNode actual = JsonMergeUtils.merge(test[0] == null ? null : (JsonNode) test[0], test[1] == null ? null : (JsonNode) test[1]); Assert.assertEquals(test[2] == null ? null : (JsonNode) test[2], actual); - } } @@ -588,17 +570,18 @@ protected Description describeChild(TestGroup group) { @Override protected void runChild(TestGroup group, RunNotifier notifier) { - if (!group.shouldSkip()) { - notifier.fireTestStarted(group.getDescription()); - } else { + if (group.shouldSkip()) { notifier.fireTestIgnored(group.getDescription()); + return; } + notifier.fireTestStarted(group.getDescription()); + for (final TestCase testCase : group.getTestCases()) { if (testCase.shouldSkip()) { notifier.fireTestIgnored(testCase.getDescription()); } else { - + System.out.print("- executing test case: " + group.getGroupName() + "." + testCase.getCaseName() + "..."); Description testDesc = testCase.getDescription(); try { if (testDesc.isEmpty() == false) { @@ -607,13 +590,11 @@ protected void runChild(TestGroup group, RunNotifier notifier) { System.out.println(testDesc + " is empty"); } } catch (Exception sbfe) { - System.out.println("Error in " + testDesc + " Error: " + sbfe.getLocalizedMessage()); + System.err.println("Error in " + testDesc + " Error: " + sbfe.getLocalizedMessage()); } try { - Expressions e = Expressions.parse(testCase.getExpr()); - // introduce bindings if available String key = ""; ObjectNode bindings = testCase.getBindings(); @@ -625,34 +606,35 @@ protected void runChild(TestGroup group, RunNotifier notifier) { JsonNode actualResult = e.evaluate(testCase.getDataset()); try { - String expected = _objectMapper.writerWithDefaultPrettyPrinter() - .writeValueAsString(testCase.expectedResult); - String actual = _objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(actualResult); - Assert.assertEquals(expected, actual); + Assert.assertEquals(testCase.expectedResult, actualResult); + System.out.println(" OK"); notifier.fireTestFinished(testCase.getDescription()); } catch (AssertionError ex) { try { - Assert.assertEquals(testCase.expectedResult, actualResult); + Assert.assertEquals( + _objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(testCase.expectedResult), + _objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(actualResult)); + System.out.println(" OK"); notifier.fireTestFinished(testCase.getDescription()); } catch (AssertionError ex1) { + System.err.println("\n FAILURE"); notifier.fireTestFailure(new Failure(testCase.getDescription(), ex1)); } } } catch (Throwable ex) { - if (testCase.expectParseOrEvaluateException && (ex instanceof ParseException || ex instanceof EvaluateException)) { + System.out.println(" OK"); notifier.fireTestFinished(testCase.getDescription()); } else { + System.err.println("\n FAILURE"); notifier.fireTestFailure(new Failure(testCase.getDescription(), ex)); } } } - - } - if (!group.shouldSkip()) { - notifier.fireTestFinished(group.getDescription()); } + + notifier.fireTestFinished(group.getDescription()); } private static String HEADER_DELIM = "-"; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/Base64DecodeFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/Base64DecodeFunctionTests.java similarity index 97% rename from src/test/java/com/api/jsonata4java/test/expressions/Base64DecodeFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/Base64DecodeFunctionTests.java index 04b71469..55a562bc 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/Base64DecodeFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/Base64DecodeFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/Base64EncodeFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/Base64EncodeFunctionTests.java similarity index 97% rename from src/test/java/com/api/jsonata4java/test/expressions/Base64EncodeFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/Base64EncodeFunctionTests.java index 19a5b74b..a79f4be1 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/Base64EncodeFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/Base64EncodeFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/BasicExpressionsTests.java b/src/test/java/com/api/jsonata4java/expressions/BasicExpressionsTests.java similarity index 99% rename from src/test/java/com/api/jsonata4java/test/expressions/BasicExpressionsTests.java rename to src/test/java/com/api/jsonata4java/expressions/BasicExpressionsTests.java index 0552cf41..9c471eeb 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/BasicExpressionsTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/BasicExpressionsTests.java @@ -20,12 +20,12 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.ensureAllIntegralsAreLongs; -import static com.api.jsonata4java.text.expressions.utils.Utils.simpleTest; -import static com.api.jsonata4java.text.expressions.utils.Utils.simpleTestExpectException; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.ensureAllIntegralsAreLongs; +import static com.api.jsonata4java.expressions.utils.Utils.simpleTest; +import static com.api.jsonata4java.expressions.utils.Utils.simpleTestExpectException; +import static com.api.jsonata4java.expressions.utils.Utils.test; import static org.junit.Assert.assertTrue; import java.io.IOException; import java.io.Serializable; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/BooleanFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/BooleanFunctionTests.java similarity index 98% rename from src/test/java/com/api/jsonata4java/test/expressions/BooleanFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/BooleanFunctionTests.java index fb566f4a..a35a054a 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/BooleanFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/BooleanFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/CeilFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/CeilFunctionTests.java similarity index 98% rename from src/test/java/com/api/jsonata4java/test/expressions/CeilFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/CeilFunctionTests.java index df68bcf7..b82e33a7 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/CeilFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/CeilFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/ContainsFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/ContainsFunctionTests.java similarity index 98% rename from src/test/java/com/api/jsonata4java/test/expressions/ContainsFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/ContainsFunctionTests.java index 3b4cec59..c289b0b8 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/ContainsFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/ContainsFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/CountFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/CountFunctionTests.java similarity index 95% rename from src/test/java/com/api/jsonata4java/test/expressions/CountFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/CountFunctionTests.java index 955e3df1..91080830 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/CountFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/CountFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/DiacriticsTokenizationTests.java b/src/test/java/com/api/jsonata4java/expressions/DiacriticsTokenizationTests.java similarity index 96% rename from src/test/java/com/api/jsonata4java/test/expressions/DiacriticsTokenizationTests.java rename to src/test/java/com/api/jsonata4java/expressions/DiacriticsTokenizationTests.java index 0f6bcbf2..ea46c4f9 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/DiacriticsTokenizationTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/DiacriticsTokenizationTests.java @@ -20,7 +20,7 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; import java.io.Serializable; import java.util.Arrays; @@ -30,7 +30,7 @@ import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameter; import org.junit.runners.Parameterized.Parameters; -import com.api.jsonata4java.text.expressions.utils.Utils; +import com.api.jsonata4java.expressions.utils.Utils; import com.fasterxml.jackson.databind.ObjectMapper; /** diff --git a/src/test/java/com/api/jsonata4java/test/expressions/DistinctFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/DistinctFunctionTests.java similarity index 95% rename from src/test/java/com/api/jsonata4java/test/expressions/DistinctFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/DistinctFunctionTests.java index 4b79b951..431130e0 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/DistinctFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/DistinctFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/EvalFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/EvalFunctionTests.java similarity index 94% rename from src/test/java/com/api/jsonata4java/test/expressions/EvalFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/EvalFunctionTests.java index f87a300c..d763b4ff 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/EvalFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/EvalFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/ExpressionsTests.java b/src/test/java/com/api/jsonata4java/expressions/ExpressionsTests.java similarity index 99% rename from src/test/java/com/api/jsonata4java/test/expressions/ExpressionsTests.java rename to src/test/java/com/api/jsonata4java/expressions/ExpressionsTests.java index 8b1f449c..92f68d64 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/ExpressionsTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/ExpressionsTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/FloorFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/FloorFunctionTests.java similarity index 98% rename from src/test/java/com/api/jsonata4java/test/expressions/FloorFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/FloorFunctionTests.java index bdbcf3bc..16ed21ef 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/FloorFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/FloorFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/FormatBaseFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/FormatBaseFunctionTests.java similarity index 98% rename from src/test/java/com/api/jsonata4java/test/expressions/FormatBaseFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/FormatBaseFunctionTests.java index 8af66d35..1a8606df 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/FormatBaseFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/FormatBaseFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/FormatNumberFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/FormatNumberFunctionTests.java similarity index 99% rename from src/test/java/com/api/jsonata4java/test/expressions/FormatNumberFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/FormatNumberFunctionTests.java index 72cbeee5..bef89d1e 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/FormatNumberFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/FormatNumberFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/FromMillisFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/FromMillisFunctionTests.java similarity index 99% rename from src/test/java/com/api/jsonata4java/test/expressions/FromMillisFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/FromMillisFunctionTests.java index 8e3d4646..03e04139 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/FromMillisFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/FromMillisFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/FunctionChainingTests.java b/src/test/java/com/api/jsonata4java/expressions/FunctionChainingTests.java similarity index 99% rename from src/test/java/com/api/jsonata4java/test/expressions/FunctionChainingTests.java rename to src/test/java/com/api/jsonata4java/expressions/FunctionChainingTests.java index 1db17b6f..3cc00666 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/FunctionChainingTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/FunctionChainingTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import org.junit.Test; /** diff --git a/src/test/java/com/api/jsonata4java/test/expressions/FunctionErrorTest.java b/src/test/java/com/api/jsonata4java/expressions/FunctionErrorTest.java similarity index 99% rename from src/test/java/com/api/jsonata4java/test/expressions/FunctionErrorTest.java rename to src/test/java/com/api/jsonata4java/expressions/FunctionErrorTest.java index d64c5f21..9f3beb3f 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/FunctionErrorTest.java +++ b/src/test/java/com/api/jsonata4java/expressions/FunctionErrorTest.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import static org.junit.Assert.assertEquals; import org.junit.Test; import com.api.jsonata4java.expressions.EvaluateException; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/InvalidSyntaxTest.java b/src/test/java/com/api/jsonata4java/expressions/InvalidSyntaxTest.java similarity index 99% rename from src/test/java/com/api/jsonata4java/test/expressions/InvalidSyntaxTest.java rename to src/test/java/com/api/jsonata4java/expressions/InvalidSyntaxTest.java index 57c735f0..5c5d3a3f 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/InvalidSyntaxTest.java +++ b/src/test/java/com/api/jsonata4java/expressions/InvalidSyntaxTest.java @@ -20,7 +20,7 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; import java.io.Serializable; import java.util.Arrays; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/JoinFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/JoinFunctionTests.java similarity index 98% rename from src/test/java/com/api/jsonata4java/test/expressions/JoinFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/JoinFunctionTests.java index 0d6313d6..da3e5c93 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/JoinFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/JoinFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/Jsonata4JavaTestMapper.java b/src/test/java/com/api/jsonata4java/expressions/Jsonata4JavaTestMapper.java similarity index 97% rename from src/test/java/com/api/jsonata4java/test/expressions/Jsonata4JavaTestMapper.java rename to src/test/java/com/api/jsonata4java/expressions/Jsonata4JavaTestMapper.java index 0248b18f..30bd7d34 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/Jsonata4JavaTestMapper.java +++ b/src/test/java/com/api/jsonata4java/expressions/Jsonata4JavaTestMapper.java @@ -1,4 +1,4 @@ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; import java.io.File; import java.io.IOException; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/JsonataDotOrgTests.java b/src/test/java/com/api/jsonata4java/expressions/JsonataDotOrgTests.java similarity index 99% rename from src/test/java/com/api/jsonata4java/test/expressions/JsonataDotOrgTests.java rename to src/test/java/com/api/jsonata4java/expressions/JsonataDotOrgTests.java index 8e8829fc..c2215a67 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/JsonataDotOrgTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/JsonataDotOrgTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/LengthFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/LengthFunctionTests.java similarity index 97% rename from src/test/java/com/api/jsonata4java/test/expressions/LengthFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/LengthFunctionTests.java index ec2f1e38..8ca4c9d7 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/LengthFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/LengthFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/LowercaseFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/LowercaseFunctionTests.java similarity index 97% rename from src/test/java/com/api/jsonata4java/test/expressions/LowercaseFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/LowercaseFunctionTests.java index 35e3fac3..6e0793f4 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/LowercaseFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/LowercaseFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/MapFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/MapFunctionTests.java similarity index 97% rename from src/test/java/com/api/jsonata4java/test/expressions/MapFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/MapFunctionTests.java index 403c1749..c9797f6b 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/MapFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/MapFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/MatchFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/MatchFunctionTests.java similarity index 98% rename from src/test/java/com/api/jsonata4java/test/expressions/MatchFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/MatchFunctionTests.java index 8c01ed55..ce830061 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/MatchFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/MatchFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/MaxFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/MaxFunctionTests.java similarity index 98% rename from src/test/java/com/api/jsonata4java/test/expressions/MaxFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/MaxFunctionTests.java index b6af63c4..13a836ac 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/MaxFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/MaxFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/MillisFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/MillisFunctionTests.java similarity index 96% rename from src/test/java/com/api/jsonata4java/test/expressions/MillisFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/MillisFunctionTests.java index 93685897..340a984c 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/MillisFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/MillisFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/MinFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/MinFunctionTests.java similarity index 98% rename from src/test/java/com/api/jsonata4java/test/expressions/MinFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/MinFunctionTests.java index 5624b808..51f9253d 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/MinFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/MinFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/NotFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/NotFunctionTests.java similarity index 97% rename from src/test/java/com/api/jsonata4java/test/expressions/NotFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/NotFunctionTests.java index 791c4d3b..c530bb1c 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/NotFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/NotFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/NowFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/NowFunctionTests.java similarity index 95% rename from src/test/java/com/api/jsonata4java/test/expressions/NowFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/NowFunctionTests.java index 11e484ca..4addb463 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/NowFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/NowFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.Arrays; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/NumberFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/NumberFunctionTests.java similarity index 98% rename from src/test/java/com/api/jsonata4java/test/expressions/NumberFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/NumberFunctionTests.java index cbf2307d..1a0ffc73 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/NumberFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/NumberFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/NumericCoercionTests.java b/src/test/java/com/api/jsonata4java/expressions/NumericCoercionTests.java similarity index 99% rename from src/test/java/com/api/jsonata4java/test/expressions/NumericCoercionTests.java rename to src/test/java/com/api/jsonata4java/expressions/NumericCoercionTests.java index 59350185..fc266e26 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/NumericCoercionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/NumericCoercionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/PadFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/PadFunctionTests.java similarity index 98% rename from src/test/java/com/api/jsonata4java/test/expressions/PadFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/PadFunctionTests.java index 6c8b2a23..eee48ea4 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/PadFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/PadFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/PathExpressionParentTests.java b/src/test/java/com/api/jsonata4java/expressions/PathExpressionParentTests.java similarity index 99% rename from src/test/java/com/api/jsonata4java/test/expressions/PathExpressionParentTests.java rename to src/test/java/com/api/jsonata4java/expressions/PathExpressionParentTests.java index 34c58186..1562643a 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/PathExpressionParentTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/PathExpressionParentTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import org.junit.Test; /** diff --git a/src/test/java/com/api/jsonata4java/test/expressions/PowerFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/PowerFunctionTests.java similarity index 98% rename from src/test/java/com/api/jsonata4java/test/expressions/PowerFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/PowerFunctionTests.java index 2be01a25..3ca1c853 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/PowerFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/PowerFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/RandomFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/RandomFunctionTests.java similarity index 96% rename from src/test/java/com/api/jsonata4java/test/expressions/RandomFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/RandomFunctionTests.java index 6c84e644..e51d0a23 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/RandomFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/RandomFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/RegularExpressionTest.java b/src/test/java/com/api/jsonata4java/expressions/RegularExpressionTest.java similarity index 97% rename from src/test/java/com/api/jsonata4java/test/expressions/RegularExpressionTest.java rename to src/test/java/com/api/jsonata4java/expressions/RegularExpressionTest.java index 9624a10d..74ae215b 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/RegularExpressionTest.java +++ b/src/test/java/com/api/jsonata4java/expressions/RegularExpressionTest.java @@ -20,7 +20,7 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/ReplaceFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/ReplaceFunctionTests.java similarity index 99% rename from src/test/java/com/api/jsonata4java/test/expressions/ReplaceFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/ReplaceFunctionTests.java index 747fc91c..81bca310 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/ReplaceFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/ReplaceFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/RoundFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/RoundFunctionTests.java similarity index 98% rename from src/test/java/com/api/jsonata4java/test/expressions/RoundFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/RoundFunctionTests.java index a5b854e3..1f533b5d 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/RoundFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/RoundFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/SingletonArrayHandlingTests.java b/src/test/java/com/api/jsonata4java/expressions/SingletonArrayHandlingTests.java similarity index 98% rename from src/test/java/com/api/jsonata4java/test/expressions/SingletonArrayHandlingTests.java rename to src/test/java/com/api/jsonata4java/expressions/SingletonArrayHandlingTests.java index 61bb219f..0adade52 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/SingletonArrayHandlingTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/SingletonArrayHandlingTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/SortFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/SortFunctionTests.java similarity index 94% rename from src/test/java/com/api/jsonata4java/test/expressions/SortFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/SortFunctionTests.java index cda0fac4..8f1fbe02 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/SortFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/SortFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.util.Arrays; import java.util.Collection; import org.junit.Test; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/SplitFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/SplitFunctionTests.java similarity index 98% rename from src/test/java/com/api/jsonata4java/test/expressions/SplitFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/SplitFunctionTests.java index 7dac8e7f..d522b56a 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/SplitFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/SplitFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/SqrtFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/SqrtFunctionTests.java similarity index 98% rename from src/test/java/com/api/jsonata4java/test/expressions/SqrtFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/SqrtFunctionTests.java index 996a273c..b07cbdbe 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/SqrtFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/SqrtFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/StringFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/StringFunctionTests.java similarity index 96% rename from src/test/java/com/api/jsonata4java/test/expressions/StringFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/StringFunctionTests.java index 24ba4443..91e15df9 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/StringFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/StringFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/SubstringAfterFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/SubstringAfterFunctionTests.java similarity index 98% rename from src/test/java/com/api/jsonata4java/test/expressions/SubstringAfterFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/SubstringAfterFunctionTests.java index 7eb0be95..0ed7d70a 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/SubstringAfterFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/SubstringAfterFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/SubstringBeforeFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/SubstringBeforeFunctionTests.java similarity index 98% rename from src/test/java/com/api/jsonata4java/test/expressions/SubstringBeforeFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/SubstringBeforeFunctionTests.java index f6ea4ef0..a24a307d 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/SubstringBeforeFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/SubstringBeforeFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/SubstringFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/SubstringFunctionTests.java similarity index 98% rename from src/test/java/com/api/jsonata4java/test/expressions/SubstringFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/SubstringFunctionTests.java index dad5b9f5..3cea7d20 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/SubstringFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/SubstringFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/SumFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/SumFunctionTests.java similarity index 95% rename from src/test/java/com/api/jsonata4java/test/expressions/SumFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/SumFunctionTests.java index 9d3fca16..f3fdac50 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/SumFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/SumFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/ToMillisFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/ToMillisFunctionTests.java similarity index 98% rename from src/test/java/com/api/jsonata4java/test/expressions/ToMillisFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/ToMillisFunctionTests.java index e6922995..405ac7d6 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/ToMillisFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/ToMillisFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/TrimFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/TrimFunctionTests.java similarity index 97% rename from src/test/java/com/api/jsonata4java/test/expressions/TrimFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/TrimFunctionTests.java index 0f469530..8da3d915 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/TrimFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/TrimFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/UnpackFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/UnpackFunctionTests.java similarity index 95% rename from src/test/java/com/api/jsonata4java/test/expressions/UnpackFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/UnpackFunctionTests.java index 227add69..9fe7fc30 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/UnpackFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/UnpackFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/UppercaseFunctionTests.java b/src/test/java/com/api/jsonata4java/expressions/UppercaseFunctionTests.java similarity index 97% rename from src/test/java/com/api/jsonata4java/test/expressions/UppercaseFunctionTests.java rename to src/test/java/com/api/jsonata4java/expressions/UppercaseFunctionTests.java index 13bbe6fd..55f79d3b 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/UppercaseFunctionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/UppercaseFunctionTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package com.api.jsonata4java.expressions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/expressions/functions/AbsFunctionTest.java b/src/test/java/com/api/jsonata4java/expressions/functions/AbsFunctionTest.java index 9b389fbc..d5a6e620 100644 --- a/src/test/java/com/api/jsonata4java/expressions/functions/AbsFunctionTest.java +++ b/src/test/java/com/api/jsonata4java/expressions/functions/AbsFunctionTest.java @@ -22,209 +22,209 @@ package com.api.jsonata4java.expressions.functions; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; -import org.junit.jupiter.api.Test; +import static com.api.jsonata4java.expressions.utils.Utils.test; +import org.junit.Test; import com.api.jsonata4java.expressions.utils.Constants; public class AbsFunctionTest { @Test - void nullInput() throws Exception { + public void nullInput() throws Exception { test("$abs()", null, null, (String) null); } @Test - void test02() throws Exception { + public void test02() throws Exception { test("$abs()", null, AbsFunction.ERR_ARG1BADTYPE, "{}"); } @Test - void test03() throws Exception { + public void test03() throws Exception { test("$abs()", null, AbsFunction.ERR_ARG1BADTYPE, "[]"); } @Test - void test04() throws Exception { + public void test04() throws Exception { test("$abs()", null, AbsFunction.ERR_BAD_CONTEXT, "null"); } @Test - void test05() throws Exception { + public void test05() throws Exception { test("$abs(null)", null, AbsFunction.ERR_ARG1BADTYPE, (String) null); } @Test - void test06() throws Exception { + public void test06() throws Exception { test("$abs({})", null, AbsFunction.ERR_ARG1BADTYPE, (String) null); } @Test - void test07() throws Exception { + public void test07() throws Exception { test("$abs([])", null, AbsFunction.ERR_ARG1BADTYPE, (String) null); } @Test - void test08() throws Exception { + public void test08() throws Exception { test("$abs('1')", null, AbsFunction.ERR_ARG1BADTYPE, (String) null); } @Test - void test09() throws Exception { + public void test09() throws Exception { test("$abs(\"234\")", null, AbsFunction.ERR_ARG1BADTYPE, (String) null); } @Test - void test10() throws Exception { + public void test10() throws Exception { test("$abs(true)", null, AbsFunction.ERR_ARG1BADTYPE, (String) null); } @Test - void test11() throws Exception { + public void test11() throws Exception { test("$abs(a.b.c)", null, null, (String) null); } @Test - void test12() throws Exception { + public void test12() throws Exception { test("$abs(1)", "1", null, null); } @Test - void test13() throws Exception { + public void test13() throws Exception { test("$abs(-1)", "1", null, null); } @Test - void test14() throws Exception { + public void test14() throws Exception { test("$abs(2147483647)", "2147483647", null, null); } @Test - void test15() throws Exception { + public void test15() throws Exception { test("$abs(-2147483640)", "2147483640", null, null); } @Test - void test16() throws Exception { + public void test16() throws Exception { test("$abs(21474836471234)", "21474836471234", null, null); } @Test - void test17() throws Exception { + public void test17() throws Exception { test("$abs(-21474836471234)", "21474836471234", null, null); } @Test - void test18() throws Exception { + public void test18() throws Exception { test("$abs(1.0)", "1", null, null); } @Test - void test19() throws Exception { + public void test19() throws Exception { test("$abs(-1.0)", "1", null, null); } @Test - void test20() throws Exception { + public void test20() throws Exception { test("$abs(1.23456)", "1.23456", null, null); } @Test - void test21() throws Exception { + public void test21() throws Exception { test("$abs(-1.23456)", "1.23456", null, null); } @Test - void test22() throws Exception { + public void test22() throws Exception { test("$abs(1.234567890123)", "1.234567890123", null, null); } @Test - void test23() throws Exception { + public void test23() throws Exception { test("$abs(-1.234567890123)", "1.234567890123", null, null); } @Test - void test24() throws Exception { + public void test24() throws Exception { test("$abs(-9.123E99)", "9.123e+99", null, null); } @Test - void test25() throws Exception { + public void test25() throws Exception { test("$abs(-1.79769E308)", "1.79769e+308", null, null); } @Test - void test26() throws Exception { + public void test26() throws Exception { test("$abs(10/3.0)", "3.3333333333333333", null, null); } @Test - void test27() throws Exception { + public void test27() throws Exception { test("$abs(-10/3.0)", "3.3333333333333333", null, null); } @Test - void test29() throws Exception { + public void test29() throws Exception { test("$abs(9223372036854775807)", "9223372036854775807", null, null); } @Test - void test30() throws Exception { + public void test30() throws Exception { test("$abs(-9223372036854775807)", "9223372036854775807", null, null); } @Test - void test31() throws Exception { + public void test31() throws Exception { test("$abs(9223372036854775808)", "9223372036854775807", null, null); } @Test - void test32() throws Exception { + public void test32() throws Exception { test("$abs(-9223372036854775808)", "9223372036854775807", null, null); } @Test - void test33() throws Exception { + public void test33() throws Exception { test("$abs(9223372036854775809)", "9223372036854775807", null, null); } @Test - void test34() throws Exception { + public void test34() throws Exception { test("$abs(-9223372036854775809)", "9223372036854775807", null, null); } @Test - void test35() throws Exception { + public void test35() throws Exception { test("$abs(9223372036854775899.5)", "9223372036854775807", null, null); } @Test - void test36() throws Exception { + public void test36() throws Exception { test("$abs(-9223372036854775899.5)", Long.toString(Math.abs(Long.MAX_VALUE)), null, null); } @Test - void test37() throws Exception { + public void test37() throws Exception { test("$abs(9223372036854775809123456789)", "9.223372036854776E27", null, null); } @Test - void test38() throws Exception { + public void test38() throws Exception { test("$abs(-9223372036854775809123456789)", Double.toString(Math.abs(-9223372036854775809123456789D)), null, null); } @Test - void test39() throws Exception { + public void test39() throws Exception { test("$abs(9223372036854775809123456789.5)", Double.toString(Math.abs(9223372036854775809123456789.5)), null, null); } @Test - void test40() throws Exception { + public void test40() throws Exception { test("$abs(-9223372036854775809123456789.5)", Double.toString(Math.abs(-9223372036854775809123456789.5)), null, null); } @Test - void test41() throws Exception { + public void test41() throws Exception { test("$abs(1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789)", @@ -232,7 +232,7 @@ void test41() throws Exception { } @Test - void test42() throws Exception { + public void test42() throws Exception { test("$abs(1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890)", @@ -245,162 +245,162 @@ void test42() throws Exception { } @Test - void test43() throws Exception { + public void test43() throws Exception { test("{}~>$abs()", null, AbsFunction.ERR_ARG1BADTYPE, (String) null); } @Test - void test44() throws Exception { + public void test44() throws Exception { test("[]~>$abs()", null, AbsFunction.ERR_ARG1BADTYPE, (String) null); } @Test - void test45() throws Exception { + public void test45() throws Exception { test("'1'~>$abs()", null, AbsFunction.ERR_ARG1BADTYPE, (String) null); } @Test - void test46() throws Exception { + public void test46() throws Exception { test("true~>$abs()", null, AbsFunction.ERR_ARG1BADTYPE, (String) null); } @Test - void test47() throws Exception { + public void test47() throws Exception { test("null~>$abs()", null, AbsFunction.ERR_BAD_CONTEXT, (String) null); } @Test - void test48() throws Exception { + public void test48() throws Exception { test("a.b.c~>$abs()", null, null, (String) null); } @Test - void test49() throws Exception { + public void test49() throws Exception { test("1~>$abs()", "1", null, null); } @Test - void test50() throws Exception { + public void test50() throws Exception { test("-1~>$abs()", "1", null, null); } @Test - void test51() throws Exception { + public void test51() throws Exception { test("2147483647~>$abs()", "2147483647", null, null); } @Test - void test53() throws Exception { + public void test53() throws Exception { test("-2147483640~>$abs()", "2147483640", null, null); } @Test - void test54() throws Exception { + public void test54() throws Exception { test("21474836471234~>$abs()", "21474836471234", null, null); } @Test - void test55() throws Exception { + public void test55() throws Exception { test("-21474836471234~>$abs()", "21474836471234", null, null); } @Test - void test56() throws Exception { + public void test56() throws Exception { test("1.0~>$abs()", "1", null, null); } @Test - void test57() throws Exception { + public void test57() throws Exception { test("-1.0~>$abs()", "1", null, null); } @Test - void test58() throws Exception { + public void test58() throws Exception { test("1.23456~>$abs()", "1.23456", null, null); } @Test - void test59() throws Exception { + public void test59() throws Exception { test("-1.23456~>$abs()", "1.23456", null, null); } @Test - void test60() throws Exception { + public void test60() throws Exception { test("1.234567890123~>$abs()", "1.234567890123", null, null); } @Test - void test61() throws Exception { + public void test61() throws Exception { test("-1.234567890123~>$abs()", "1.234567890123", null, null); } @Test - void test62() throws Exception { + public void test62() throws Exception { test("10/3.0~>$abs()", "3.3333333333333333", null, null); } @Test - void test63() throws Exception { + public void test63() throws Exception { test("-10/3.0~>$abs()", "3.3333333333333333", null, null); } @Test - void test64() throws Exception { + public void test64() throws Exception { test("9223372036854775807~>$abs()", "9223372036854775807", null, null); } @Test - void test65() throws Exception { + public void test65() throws Exception { test("-9223372036854775808~>$abs()", "9223372036854775807", null, null); } @Test - void test66() throws Exception { + public void test66() throws Exception { test("9223372036854775809~>$abs()", "9223372036854775807", null, null); } @Test - void test67() throws Exception { + public void test67() throws Exception { test("-9223372036854775809~>$abs()", "9223372036854775807", null, null); } @Test - void test68() throws Exception { + public void test68() throws Exception { test("9223372036854775899.5~>$abs()", "9223372036854775807", null, null); } @Test - void test69() throws Exception { + public void test69() throws Exception { test("-9223372036854775899.5~>$abs()", "9223372036854775807", null, null); } @Test - void test70() throws Exception { + public void test70() throws Exception { test("9223372036854775809123456789~>$abs()", "9.223372036854776E27", null, null); } @Test - void test71() throws Exception { + public void test71() throws Exception { test("-9223372036854775809123456789~>$abs()", "9.223372036854776E27", null, null); } @Test - void test72() throws Exception { + public void test72() throws Exception { test("9223372036854775809123456789.5~>$abs()", "9.223372036854776E27", null, null); } @Test - void test73() throws Exception { + public void test73() throws Exception { test("-9223372036854775809123456789.5~>$abs()", "9.223372036854776E27", null, null); } @Test - void testWith2Args() throws Exception { + public void testWith2Args() throws Exception { test("$abs(1, 2)", null, AbsFunction.ERR_ARG2BADTYPE, (String) null); } @Test - void testWithChainPlus1Arg() throws Exception { + public void testWithChainPlus1Arg() throws Exception { test("-1 ~> $abs(-2)", null, AbsFunction.ERR_ARG1BADTYPE, (String) null); } } diff --git a/src/test/java/com/api/jsonata4java/test/expressions/path/PathExpressionSyntaxTests.java b/src/test/java/com/api/jsonata4java/expressions/path/PathExpressionSyntaxTests.java similarity index 98% rename from src/test/java/com/api/jsonata4java/test/expressions/path/PathExpressionSyntaxTests.java rename to src/test/java/com/api/jsonata4java/expressions/path/PathExpressionSyntaxTests.java index 13a4b605..e9290ecf 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/path/PathExpressionSyntaxTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/path/PathExpressionSyntaxTests.java @@ -20,7 +20,7 @@ * */ -package com.api.jsonata4java.test.expressions.path; +package com.api.jsonata4java.expressions.path; import java.io.Serializable; import java.util.Arrays; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/path/PathExpressionTests.java b/src/test/java/com/api/jsonata4java/expressions/path/PathExpressionTests.java similarity index 99% rename from src/test/java/com/api/jsonata4java/test/expressions/path/PathExpressionTests.java rename to src/test/java/com/api/jsonata4java/expressions/path/PathExpressionTests.java index 802dafdb..e6dbf8d2 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/path/PathExpressionTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/path/PathExpressionTests.java @@ -20,7 +20,7 @@ * */ -package com.api.jsonata4java.test.expressions.path; +package com.api.jsonata4java.expressions.path; import java.io.Serializable; import java.util.Arrays; diff --git a/src/test/java/com/api/jsonata4java/expressions/suites/ComponentTestSuite.java b/src/test/java/com/api/jsonata4java/expressions/suites/ComponentTestSuite.java deleted file mode 100644 index ba027ce2..00000000 --- a/src/test/java/com/api/jsonata4java/expressions/suites/ComponentTestSuite.java +++ /dev/null @@ -1,131 +0,0 @@ -/** - * (c) Copyright 2018, 2019 IBM Corporation - * 1 New Orchard Road, - * Armonk, New York, 10504-1722 - * United States - * +1 914 499 1900 - * support: Nathaniel Mills wnm3@us.ibm.com - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package com.api.jsonata4java.expressions.suites; - -import java.io.Serializable; -import org.junit.runner.RunWith; -import org.junit.runners.Suite; -import org.junit.runners.Suite.SuiteClasses; -import com.api.jsonata4java.test.expressions.Base64DecodeFunctionTests; -import com.api.jsonata4java.test.expressions.Base64EncodeFunctionTests; -import com.api.jsonata4java.test.expressions.BasicExpressionsTests; -import com.api.jsonata4java.test.expressions.BooleanFunctionTests; -import com.api.jsonata4java.test.expressions.CeilFunctionTests; -import com.api.jsonata4java.test.expressions.ContainsFunctionTests; -import com.api.jsonata4java.test.expressions.CountFunctionTests; -import com.api.jsonata4java.test.expressions.ExpressionsTests; -import com.api.jsonata4java.test.expressions.FloorFunctionTests; -import com.api.jsonata4java.test.expressions.FormatBaseFunctionTests; -import com.api.jsonata4java.test.expressions.FormatNumberFunctionTests; -import com.api.jsonata4java.test.expressions.FromMillisFunctionTests; -import com.api.jsonata4java.test.expressions.InvalidSyntaxTest; -import com.api.jsonata4java.test.expressions.JoinFunctionTests; -import com.api.jsonata4java.test.expressions.JsonataDotOrgTests; -import com.api.jsonata4java.test.expressions.LengthFunctionTests; -import com.api.jsonata4java.test.expressions.LowercaseFunctionTests; -import com.api.jsonata4java.test.expressions.MatchFunctionTests; -import com.api.jsonata4java.test.expressions.MaxFunctionTests; -import com.api.jsonata4java.test.expressions.MillisFunctionTests; -import com.api.jsonata4java.test.expressions.MinFunctionTests; -import com.api.jsonata4java.test.expressions.NotFunctionTests; -import com.api.jsonata4java.test.expressions.NowFunctionTests; -import com.api.jsonata4java.test.expressions.NumberFunctionTests; -import com.api.jsonata4java.test.expressions.NumericCoercionTests; -import com.api.jsonata4java.test.expressions.PadFunctionTests; -import com.api.jsonata4java.test.expressions.PowerFunctionTests; -import com.api.jsonata4java.test.expressions.RandomFunctionTests; -import com.api.jsonata4java.test.expressions.ReplaceFunctionTests; -import com.api.jsonata4java.test.expressions.RoundFunctionTests; -import com.api.jsonata4java.test.expressions.SingletonArrayHandlingTests; -import com.api.jsonata4java.test.expressions.SplitFunctionTests; -import com.api.jsonata4java.test.expressions.SqrtFunctionTests; -import com.api.jsonata4java.test.expressions.StringFunctionTests; -import com.api.jsonata4java.test.expressions.SubstringAfterFunctionTests; -import com.api.jsonata4java.test.expressions.SubstringBeforeFunctionTests; -import com.api.jsonata4java.test.expressions.SubstringFunctionTests; -import com.api.jsonata4java.test.expressions.SumFunctionTests; -import com.api.jsonata4java.test.expressions.TestBindingReference; -import com.api.jsonata4java.test.expressions.ToMillisFunctionTests; -import com.api.jsonata4java.test.expressions.TrimFunctionTests; -import com.api.jsonata4java.test.expressions.UnpackFunctionTests; -import com.api.jsonata4java.test.expressions.UppercaseFunctionTests; -import com.api.jsonata4java.test.expressions.path.PathExpressionSyntaxTests; -import com.api.jsonata4java.test.expressions.path.PathExpressionTests; -import com.api.jsonata4java.text.expressions.utils.JsonMergeUtilsTest; - -/* @deprecated these tests have been incorporated in the AgnosticTestSuit */ - -@RunWith(Suite.class) -@SuiteClasses({ - Base64DecodeFunctionTests.class, // - Base64EncodeFunctionTests.class, // - BasicExpressionsTests.class, // - BooleanFunctionTests.class, // - CeilFunctionTests.class, // - ContainsFunctionTests.class, // - CountFunctionTests.class, // - ExpressionsTests.class, // - FloorFunctionTests.class, // - FormatBaseFunctionTests.class, // - FormatNumberFunctionTests.class, // - FromMillisFunctionTests.class, // - InvalidSyntaxTest.class, // - JoinFunctionTests.class, // - JsonMergeUtilsTest.class, // - JsonataDotOrgTests.class, // - LengthFunctionTests.class, // - LowercaseFunctionTests.class, // - MatchFunctionTests.class, // - MaxFunctionTests.class, // - MillisFunctionTests.class, // - MinFunctionTests.class, // - NotFunctionTests.class, // - NowFunctionTests.class, // - NumberFunctionTests.class, // - NumericCoercionTests.class, // - PadFunctionTests.class, // - PathExpressionSyntaxTests.class, // - PathExpressionTests.class, // - PowerFunctionTests.class, // - RandomFunctionTests.class, // - ReplaceFunctionTests.class, // - RoundFunctionTests.class, // - SingletonArrayHandlingTests.class, // - SplitFunctionTests.class, // - SqrtFunctionTests.class, // - StringFunctionTests.class, // - SubstringAfterFunctionTests.class, // - SubstringBeforeFunctionTests.class, // - SubstringFunctionTests.class, // - SumFunctionTests.class, // - ToMillisFunctionTests.class, // - TrimFunctionTests.class, // - UnpackFunctionTests.class, // - UppercaseFunctionTests.class, // - TestBindingReference.class // -}) - -public class ComponentTestSuite implements Serializable { - - private static final long serialVersionUID = 2033074749160537540L; -} diff --git a/src/test/java/com/api/jsonata4java/text/expressions/utils/JsonMergeUtilsTest.java b/src/test/java/com/api/jsonata4java/expressions/utils/JsonMergeUtilsTest.java similarity index 98% rename from src/test/java/com/api/jsonata4java/text/expressions/utils/JsonMergeUtilsTest.java rename to src/test/java/com/api/jsonata4java/expressions/utils/JsonMergeUtilsTest.java index 86f98af4..392c8e8d 100644 --- a/src/test/java/com/api/jsonata4java/text/expressions/utils/JsonMergeUtilsTest.java +++ b/src/test/java/com/api/jsonata4java/expressions/utils/JsonMergeUtilsTest.java @@ -20,7 +20,7 @@ * */ -package com.api.jsonata4java.text.expressions.utils; +package com.api.jsonata4java.expressions.utils; import java.io.File; import java.io.Serializable; diff --git a/src/test/java/com/api/jsonata4java/text/expressions/utils/TestLogFormatter.java b/src/test/java/com/api/jsonata4java/expressions/utils/TestLogFormatter.java similarity index 98% rename from src/test/java/com/api/jsonata4java/text/expressions/utils/TestLogFormatter.java rename to src/test/java/com/api/jsonata4java/expressions/utils/TestLogFormatter.java index fcc52396..8ebb08f8 100644 --- a/src/test/java/com/api/jsonata4java/text/expressions/utils/TestLogFormatter.java +++ b/src/test/java/com/api/jsonata4java/expressions/utils/TestLogFormatter.java @@ -20,7 +20,7 @@ * */ -package com.api.jsonata4java.text.expressions.utils; +package com.api.jsonata4java.expressions.utils; import java.io.PrintWriter; import java.io.Serializable; diff --git a/src/test/java/com/api/jsonata4java/text/expressions/utils/Utils.java b/src/test/java/com/api/jsonata4java/expressions/utils/Utils.java similarity index 99% rename from src/test/java/com/api/jsonata4java/text/expressions/utils/Utils.java rename to src/test/java/com/api/jsonata4java/expressions/utils/Utils.java index fcfb8cb2..54f4e019 100644 --- a/src/test/java/com/api/jsonata4java/text/expressions/utils/Utils.java +++ b/src/test/java/com/api/jsonata4java/expressions/utils/Utils.java @@ -20,7 +20,7 @@ * */ -package com.api.jsonata4java.text.expressions.utils; +package com.api.jsonata4java.expressions.utils; import java.io.File; import java.io.IOException; diff --git a/src/test/java/testmanually/ComponentTestSuite.java b/src/test/java/testmanually/ComponentTestSuite.java new file mode 100644 index 00000000..d11db62f --- /dev/null +++ b/src/test/java/testmanually/ComponentTestSuite.java @@ -0,0 +1,130 @@ +/** + * (c) Copyright 2018, 2019 IBM Corporation + * 1 New Orchard Road, + * Armonk, New York, 10504-1722 + * United States + * +1 914 499 1900 + * support: Nathaniel Mills wnm3@us.ibm.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package testmanually; + +import java.io.Serializable; +import org.junit.runner.RunWith; +import org.junit.runners.Suite; +import org.junit.runners.Suite.SuiteClasses; +import com.api.jsonata4java.expressions.Base64DecodeFunctionTests; +import com.api.jsonata4java.expressions.Base64EncodeFunctionTests; +import com.api.jsonata4java.expressions.BasicExpressionsTests; +import com.api.jsonata4java.expressions.BooleanFunctionTests; +import com.api.jsonata4java.expressions.CeilFunctionTests; +import com.api.jsonata4java.expressions.ContainsFunctionTests; +import com.api.jsonata4java.expressions.CountFunctionTests; +import com.api.jsonata4java.expressions.ExpressionsTests; +import com.api.jsonata4java.expressions.FloorFunctionTests; +import com.api.jsonata4java.expressions.FormatBaseFunctionTests; +import com.api.jsonata4java.expressions.FormatNumberFunctionTests; +import com.api.jsonata4java.expressions.FromMillisFunctionTests; +import com.api.jsonata4java.expressions.InvalidSyntaxTest; +import com.api.jsonata4java.expressions.JoinFunctionTests; +import com.api.jsonata4java.expressions.JsonataDotOrgTests; +import com.api.jsonata4java.expressions.LengthFunctionTests; +import com.api.jsonata4java.expressions.LowercaseFunctionTests; +import com.api.jsonata4java.expressions.MatchFunctionTests; +import com.api.jsonata4java.expressions.MaxFunctionTests; +import com.api.jsonata4java.expressions.MillisFunctionTests; +import com.api.jsonata4java.expressions.MinFunctionTests; +import com.api.jsonata4java.expressions.NotFunctionTests; +import com.api.jsonata4java.expressions.NowFunctionTests; +import com.api.jsonata4java.expressions.NumberFunctionTests; +import com.api.jsonata4java.expressions.NumericCoercionTests; +import com.api.jsonata4java.expressions.PadFunctionTests; +import com.api.jsonata4java.expressions.PowerFunctionTests; +import com.api.jsonata4java.expressions.RandomFunctionTests; +import com.api.jsonata4java.expressions.ReplaceFunctionTests; +import com.api.jsonata4java.expressions.RoundFunctionTests; +import com.api.jsonata4java.expressions.SingletonArrayHandlingTests; +import com.api.jsonata4java.expressions.SplitFunctionTests; +import com.api.jsonata4java.expressions.SqrtFunctionTests; +import com.api.jsonata4java.expressions.StringFunctionTests; +import com.api.jsonata4java.expressions.SubstringAfterFunctionTests; +import com.api.jsonata4java.expressions.SubstringBeforeFunctionTests; +import com.api.jsonata4java.expressions.SubstringFunctionTests; +import com.api.jsonata4java.expressions.SumFunctionTests; +import com.api.jsonata4java.expressions.ToMillisFunctionTests; +import com.api.jsonata4java.expressions.TrimFunctionTests; +import com.api.jsonata4java.expressions.UnpackFunctionTests; +import com.api.jsonata4java.expressions.UppercaseFunctionTests; +import com.api.jsonata4java.expressions.path.PathExpressionSyntaxTests; +import com.api.jsonata4java.expressions.path.PathExpressionTests; +import com.api.jsonata4java.expressions.utils.JsonMergeUtilsTest; + +/* @deprecated these tests have been incorporated in the AgnosticTestSuit */ + +@RunWith(Suite.class) +@SuiteClasses({ + Base64DecodeFunctionTests.class, // + Base64EncodeFunctionTests.class, // + BasicExpressionsTests.class, // + BooleanFunctionTests.class, // + CeilFunctionTests.class, // + ContainsFunctionTests.class, // + CountFunctionTests.class, // + ExpressionsTests.class, // + FloorFunctionTests.class, // + FormatBaseFunctionTests.class, // + FormatNumberFunctionTests.class, // + FromMillisFunctionTests.class, // + InvalidSyntaxTest.class, // + JoinFunctionTests.class, // + JsonMergeUtilsTest.class, // + JsonataDotOrgTests.class, // + LengthFunctionTests.class, // + LowercaseFunctionTests.class, // + MatchFunctionTests.class, // + MaxFunctionTests.class, // + MillisFunctionTests.class, // + MinFunctionTests.class, // + NotFunctionTests.class, // + NowFunctionTests.class, // + NumberFunctionTests.class, // + NumericCoercionTests.class, // + PadFunctionTests.class, // + PathExpressionSyntaxTests.class, // + PathExpressionTests.class, // + PowerFunctionTests.class, // + RandomFunctionTests.class, // + ReplaceFunctionTests.class, // + RoundFunctionTests.class, // + SingletonArrayHandlingTests.class, // + SplitFunctionTests.class, // + SqrtFunctionTests.class, // + StringFunctionTests.class, // + SubstringAfterFunctionTests.class, // + SubstringBeforeFunctionTests.class, // + SubstringFunctionTests.class, // + SumFunctionTests.class, // + ToMillisFunctionTests.class, // + TrimFunctionTests.class, // + UnpackFunctionTests.class, // + UppercaseFunctionTests.class, // + TestBindingReference.class // +}) + +public class ComponentTestSuite implements Serializable { + + private static final long serialVersionUID = 2033074749160537540L; +} diff --git a/src/test/java/com/api/jsonata4java/test/expressions/ExpressionTestPerfomance.java b/src/test/java/testmanually/ExpressionTestPerfomance.java similarity index 98% rename from src/test/java/com/api/jsonata4java/test/expressions/ExpressionTestPerfomance.java rename to src/test/java/testmanually/ExpressionTestPerfomance.java index 638ad96f..9b07ef2d 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/ExpressionTestPerfomance.java +++ b/src/test/java/testmanually/ExpressionTestPerfomance.java @@ -20,9 +20,10 @@ * */ -package com.api.jsonata4java.test.expressions; +package testmanually; import org.junit.Test; +import com.api.jsonata4java.expressions.Jsonata4JavaTestMapper; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonNode; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/JsonataUnitTests.java b/src/test/java/testmanually/JsonataUnitTests.java similarity index 99% rename from src/test/java/com/api/jsonata4java/test/expressions/JsonataUnitTests.java rename to src/test/java/testmanually/JsonataUnitTests.java index 8b66f78b..3d11cef8 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/JsonataUnitTests.java +++ b/src/test/java/testmanually/JsonataUnitTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package testmanually; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; diff --git a/src/test/java/com/api/jsonata4java/test/expressions/MapFunctionNonParTests.java b/src/test/java/testmanually/MapFunctionNonParTests.java similarity index 98% rename from src/test/java/com/api/jsonata4java/test/expressions/MapFunctionNonParTests.java rename to src/test/java/testmanually/MapFunctionNonParTests.java index a20a8599..a4549752 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/MapFunctionNonParTests.java +++ b/src/test/java/testmanually/MapFunctionNonParTests.java @@ -20,9 +20,9 @@ * */ -package com.api.jsonata4java.test.expressions; +package testmanually; -import static com.api.jsonata4java.text.expressions.utils.Utils.test; +import static com.api.jsonata4java.expressions.utils.Utils.test; import org.junit.Test; /** diff --git a/src/test/java/com/api/jsonata4java/test/expressions/TestBindingReference.java b/src/test/java/testmanually/TestBindingReference.java similarity index 97% rename from src/test/java/com/api/jsonata4java/test/expressions/TestBindingReference.java rename to src/test/java/testmanually/TestBindingReference.java index 8d9d8ccb..07806c6b 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/TestBindingReference.java +++ b/src/test/java/testmanually/TestBindingReference.java @@ -1,10 +1,10 @@ -package com.api.jsonata4java.test.expressions; +package testmanually; import java.io.Serializable; import org.junit.Assert; import org.junit.Test; import com.api.jsonata4java.Expression; -import com.api.jsonata4java.text.expressions.utils.Utils; +import com.api.jsonata4java.expressions.utils.Utils; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/src/test/java/ThreadTester.java b/src/test/java/testmanually/ThreadTester.java similarity index 98% rename from src/test/java/ThreadTester.java rename to src/test/java/testmanually/ThreadTester.java index 26caa8d8..1b88eba8 100644 --- a/src/test/java/ThreadTester.java +++ b/src/test/java/testmanually/ThreadTester.java @@ -1,3 +1,4 @@ +package testmanually; import org.junit.Test; import org.springframework.core.task.SimpleAsyncTaskExecutor; import org.springframework.core.task.TaskExecutor; From 41cc1db34a7c69a4ed8a057535b5f1dcceb8c1be Mon Sep 17 00:00:00 2001 From: Martin Bluemel Date: Mon, 28 Nov 2022 11:38:33 +0100 Subject: [PATCH 3/7] Fixed issue 237. And by the way - cleaned up implementation of function $merge() - added JUnit test for function $merge() to reach 100% test coverage Signed-off-by: Martin Bluemel --- .../expressions/functions/AbsFunction.java | 5 +- .../expressions/functions/EachFunction.java | 50 ++++----- .../expressions/functions/MergeFunction.java | 105 ++++++++---------- .../expressions/utils/FunctionUtils.java | 99 ++--------------- .../expressions/BasicExpressionsTests.java | 28 ----- .../functions/EachFunctionTest.java | 61 ++++++++++ .../functions/MergeFunctionTest.java | 90 +++++++++++++++ 7 files changed, 234 insertions(+), 204 deletions(-) create mode 100644 src/test/java/com/api/jsonata4java/expressions/functions/EachFunctionTest.java create mode 100644 src/test/java/com/api/jsonata4java/expressions/functions/MergeFunctionTest.java diff --git a/src/main/java/com/api/jsonata4java/expressions/functions/AbsFunction.java b/src/main/java/com/api/jsonata4java/expressions/functions/AbsFunction.java index 9b8af8a9..5175ef71 100644 --- a/src/main/java/com/api/jsonata4java/expressions/functions/AbsFunction.java +++ b/src/main/java/com/api/jsonata4java/expressions/functions/AbsFunction.java @@ -40,8 +40,9 @@ * If number is not specified (i.e. this function is invoked with no arguments), * then the context value is used as the value of number.
*
- * Examples
- * $abs(5)==5 $abs(-5)==5
+ * Examples:
+ * $abs(5)==5
+ * $abs(-5)==5
*

* NOTE: FROM THE java.math::abs() FUNCTION JAVADOC:
* Note that if the argument is equal to the value of {@link Long#MIN_VALUE}, diff --git a/src/main/java/com/api/jsonata4java/expressions/functions/EachFunction.java b/src/main/java/com/api/jsonata4java/expressions/functions/EachFunction.java index 669c7cbc..51ce0dc2 100644 --- a/src/main/java/com/api/jsonata4java/expressions/functions/EachFunction.java +++ b/src/main/java/com/api/jsonata4java/expressions/functions/EachFunction.java @@ -41,28 +41,20 @@ import com.fasterxml.jackson.databind.node.ObjectNode; /** - * From https://docs.jsonata.org/object-functions#each - * - * $each(object,function($value, $key) - * * Returns an array containing the values return by the function when applied to - * each key/value pair in the object. - * - * The function parameter will get invoked with two arguments: - * - * function(value, name) - * + * each key/value pair in the object.
+ * The function parameter will get invoked with two arguments:
+ * function(value, name)
* where the value parameter is the value of each name/value pair in the object - * and name is its name. The name parameter is optional. - * - * Examples - * - * $each(Address, function($v, $k) {$k & ": " & $v}) - * + * and name is its name. The name parameter is optional.
+ *
+ * From https://docs.jsonata.org/object-functions#each
+ * $each(object,function($value, $key)
+ *
+ * Examples
+ * $each(Address, function($v, $k) {$k & ": " & $v})
* results in - * * [ "Street: Hursley Park", "City: Winchester", "Postcode: SO21 2JN" ] - * */ public class EachFunction extends FunctionBase { @@ -74,18 +66,18 @@ public class EachFunction extends FunctionBase { .format(Constants.ERR_MSG_ARG1_MUST_BE_ARRAY_OF_OBJECTS, Constants.FUNCTION_EACH); public JsonNode invoke(ExpressionsVisitor expressionVisitor, Function_callContext ctx) { - SelectorArrayNode resultArray = new SelectorArrayNode(JsonNodeFactory.instance); + SelectorArrayNode result = new SelectorArrayNode(JsonNodeFactory.instance); boolean useContext = FunctionUtils.useContextVariable(this, ctx, getSignature()); // ((ctx.getParent() instanceof MappingExpressionParser.Fct_chainContext) // || (ctx.getParent() instanceof MappingExpressionParser.PathContext)); - JsonNode objNode = null; + JsonNode arg = null; ExprValuesContext valuesCtx = ctx.exprValues(); ExprListContext exprList = valuesCtx.exprList(); int argCount = getArgumentCount(ctx); if (useContext) { // pop context var from stack - objNode = FunctionUtils.getContextVariable(expressionVisitor); - if (objNode != null && objNode.isNull() == false) { + arg = FunctionUtils.getContextVariable(expressionVisitor); + if (arg != null && arg.isNull() == false) { argCount++; } else { useContext = false; @@ -93,14 +85,14 @@ public JsonNode invoke(ExpressionsVisitor expressionVisitor, Function_callContex } if (argCount == 2) { if (!useContext) { - objNode = expressionVisitor.visit(exprList.expr(0)); + arg = expressionVisitor.visit(exprList.expr(0)); } // expect something that evaluates to an object and a function declaration - if (objNode == null || !objNode.isObject()) { + if (arg == null || !arg.isObject()) { throw new EvaluateRuntimeException(String.format(Constants.ERR_MSG_ARG1_BAD_TYPE, Constants.FUNCTION_EACH)); } - ObjectNode object = (ObjectNode) objNode; + ObjectNode object = (ObjectNode) arg; ExprContext varid = exprList.expr((useContext ? 0 : 1)); if (varid instanceof Var_recallContext) { @@ -141,7 +133,7 @@ public JsonNode invoke(ExpressionsVisitor expressionVisitor, Function_callContex } JsonNode fctResult = fct.invoke(expressionVisitor, evc); if (fctResult != null) { - resultArray.add(fctResult); + result.add(fctResult); } } } else { @@ -153,7 +145,7 @@ public JsonNode invoke(ExpressionsVisitor expressionVisitor, Function_callContex Function_callContext callCtx = new Function_callContext(ctx); // note: callCtx.children should be empty unless carrying an // exception - resultArray.add(FunctionUtils.processVariablesCallFunction(expressionVisitor, function, VAR_ID, callCtx, field)); + result.add(FunctionUtils.processVariablesCallFunction(expressionVisitor, function, VAR_ID, callCtx, field)); } } else { throw new EvaluateRuntimeException( @@ -199,14 +191,14 @@ public JsonNode invoke(ExpressionsVisitor expressionVisitor, Function_callContex } JsonNode fctResult = fct.invoke(expressionVisitor, evc); if (fctResult != null) { - resultArray.add(fctResult); + result.add(fctResult); } } } } else { throw new EvaluateRuntimeException(argCount <= 1 ? ERR_BAD_CONTEXT : ERR_ARG3BADTYPE); } - return resultArray; + return result; } @Override diff --git a/src/main/java/com/api/jsonata4java/expressions/functions/MergeFunction.java b/src/main/java/com/api/jsonata4java/expressions/functions/MergeFunction.java index 142ee004..b4b7d87d 100644 --- a/src/main/java/com/api/jsonata4java/expressions/functions/MergeFunction.java +++ b/src/main/java/com/api/jsonata4java/expressions/functions/MergeFunction.java @@ -25,26 +25,23 @@ import java.util.Iterator; import com.api.jsonata4java.expressions.EvaluateRuntimeException; import com.api.jsonata4java.expressions.ExpressionsVisitor; +import com.api.jsonata4java.expressions.generated.MappingExpressionParser.Fct_chainContext; import com.api.jsonata4java.expressions.generated.MappingExpressionParser.Function_callContext; import com.api.jsonata4java.expressions.utils.Constants; -import com.api.jsonata4java.expressions.utils.FunctionUtils; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; /** - * From http://docs.jsonata.org/object-functions.html - * - * $merge(array) - * * Returns the merger of the objects in an array of objects. It is an error if - * the input is not an array of objects. - * - * Example - * + * the input is not an array of objects.
+ *
+ * From http://docs.jsonata.org/object-functions.html + *
+ * $merge(array)
+ * Example:
* $merge([{"a":1},{"b":2}])=={"a":1, "b":2} - * */ public class MergeFunction extends FunctionBase { @@ -55,62 +52,58 @@ public class MergeFunction extends FunctionBase { Constants.FUNCTION_MERGE); public JsonNode invoke(ExpressionsVisitor expressionVisitor, Function_callContext ctx) { - // Create the variable to return - ObjectNode result = JsonNodeFactory.instance.objectNode(); - - // Retrieve the number of arguments - JsonNode argArray = JsonNodeFactory.instance.nullNode(); - boolean useContext = FunctionUtils.useContextVariable(this, ctx, getSignature()); - int argCount = getArgumentCount(ctx); - if (useContext) { - argArray = FunctionUtils.getContextVariable(expressionVisitor); - if (argArray != null && argArray.isNull() == false) { - argCount++; - } else { - useContext = false; - } - } + JsonNode result = null; + final CtxEvalResult ctxEvalResult = evalContext(expressionVisitor, ctx); + final JsonNode arg = ctxEvalResult.arg; + final int argCount = ctxEvalResult.argumentCount; - // Make sure that we have the right number of arguments - if (argCount == 1) { - if (!useContext) { - argArray = FunctionUtils.getValuesListExpression(expressionVisitor, ctx, 0); - } - String key = null; - if (argArray == null) { - return null; - } - if (argArray.isArray()) { - ArrayNode array = (ArrayNode) argArray; - for (int i = 0; i < array.size(); i++) { - JsonNode obj = array.get(i); - if (obj.isObject()) { - ObjectNode cell = (ObjectNode) obj; - for (Iterator it = cell.fieldNames(); it.hasNext();) { - key = it.next(); - result.set(key, cell.get(key)); - } - } else { - throw new EvaluateRuntimeException(ERR_ARG1_MUST_BE_OBJECT_ARRAY); - } + switch (argCount) { + case 0: + if (arg != null) { + throw new EvaluateRuntimeException(ERR_BAD_CONTEXT); } - } else { - if (argArray.isObject()) { - result = (ObjectNode) argArray; + // else signal no match (result = null) + break; + case 1: + if (arg == null) { + return null; + } + if (arg.isArray()) { + result = mergeArray(arg); + } else if (arg.isObject()) { + result = (ObjectNode) arg; } else { - /* - * The input argument is not an array. Throw a suitable exception - */ throw new EvaluateRuntimeException(ERR_ARG1BADTYPE); } - } - } else { - throw new EvaluateRuntimeException(argCount == 0 ? ERR_ARG1BADTYPE : ERR_ARG2BADTYPE); + break; + default: + if (ctx.getParent() instanceof Fct_chainContext) { + throw new EvaluateRuntimeException(ERR_ARG1BADTYPE); + } + throw new EvaluateRuntimeException(ERR_ARG2BADTYPE); } return result; } + private JsonNode mergeArray(final JsonNode arg) { + final ObjectNode arrayResult = JsonNodeFactory.instance.objectNode(); + final ArrayNode array = (ArrayNode) arg; + for (int i = 0; i < array.size(); i++) { + final JsonNode obj = array.get(i); + if (obj.isObject()) { + ObjectNode cell = (ObjectNode) obj; + for (Iterator it = cell.fieldNames(); it.hasNext();) { + final String key = it.next(); + arrayResult.set(key, cell.get(key)); + } + } else { + throw new EvaluateRuntimeException(ERR_ARG1_MUST_BE_OBJECT_ARRAY); + } + } + return arrayResult; + } + @Override public int getMaxArgs() { return 1; diff --git a/src/main/java/com/api/jsonata4java/expressions/utils/FunctionUtils.java b/src/main/java/com/api/jsonata4java/expressions/utils/FunctionUtils.java index fc45cfe6..4ab1fe20 100644 --- a/src/main/java/com/api/jsonata4java/expressions/utils/FunctionUtils.java +++ b/src/main/java/com/api/jsonata4java/expressions/utils/FunctionUtils.java @@ -247,12 +247,18 @@ public static ExprValuesContext fillExprVarContext(int fctVarCount, ExprContext break; } case STRING: + token = CommonTokenFactory.DEFAULT.create(MappingExpressionParser.STRING, element.toString()); + TerminalNodeImpl tn1 = new TerminalNodeImpl(token); + StringContext sc1 = new StringContext(ctx); + sc1.addAnyChild(tn1); + elc.addAnyChild(sc1); + break; default: { token = CommonTokenFactory.DEFAULT.create(MappingExpressionParser.STRING, element.asText()); - TerminalNodeImpl tn = new TerminalNodeImpl(token); - StringContext sc = new StringContext(ctx); - sc.addAnyChild(tn); - elc.addAnyChild(sc); + TerminalNodeImpl tn2 = new TerminalNodeImpl(token); + StringContext sc2 = new StringContext(ctx); + sc2.addAnyChild(tn2); + elc.addAnyChild(sc2); break; } } @@ -262,91 +268,6 @@ public static ExprValuesContext fillExprVarContext(int fctVarCount, ExprContext return evc; } - /** - * Sets up the {@link ExprValuesContext} variables for the function($v,$k) - * signature used in each call for pairs of values and keys - * - * @param ctx - * context to be used to create the new {@link ExprListContext} to - * contain the key, value pair - * @param key - * key used to relate the supplied value in the ExprValuesContext - * @param value - * content to be added to the ExprValuesContext - * @return {@link ExprValuesContext} containing the key and value in its - * parenthesized comma separated variable {@link ExprListContext} - */ - public static ExprValuesContext fillExprVarContext(ExprContext ctx, String key, JsonNode value) { - ExprValuesContext evc = new ExprValuesContext(ctx, ctx.invokingState); - ExprListContext elc = new ExprListContext(ctx.getParent(), ctx.invokingState); - evc.addAnyChild(new TerminalNodeImpl(CommonTokenFactory.DEFAULT.create(MappingExpressionParser.T__1, "("))); - CommonToken token = null; - TerminalNode tn = null; - - token = null; - switch (value.getNodeType()) { - case BINARY: - case POJO: { - break; - } - case BOOLEAN: { - token = (value.asBoolean() ? CommonTokenFactory.DEFAULT.create(MappingExpressionParser.TRUE, value.asText()) - : CommonTokenFactory.DEFAULT.create(MappingExpressionParser.FALSE, value.asText())); - tn = new TerminalNodeImpl(token); - BooleanContext bc = new MappingExpressionParser.BooleanContext(ctx); - bc.op = token; - bc.addAnyChild(tn); - elc.addAnyChild(bc); - break; - } - case MISSING: - case NULL: { - token = CommonTokenFactory.DEFAULT.create(MappingExpressionParser.NULL, null); - tn = new TerminalNodeImpl(token); - NullContext nc = new NullContext(ctx); - nc.addAnyChild(tn); - elc.addAnyChild(nc); - break; - } - case NUMBER: { - token = CommonTokenFactory.DEFAULT.create(MappingExpressionParser.NUMBER, value.asText()); - tn = new TerminalNodeImpl(token); - NumberContext nc = new NumberContext(ctx); - nc.addAnyChild(tn); - elc.addAnyChild(nc); - break; - } - case OBJECT: { - // create an Object_constructorContext - elc.addAnyChild(getObjectConstructorContext(ctx, (ObjectNode) value)); - break; - } - case ARRAY: { - elc.addAnyChild(getArrayConstructorContext(ctx, (ArrayNode) value)); - break; - } - case STRING: - default: { - token = CommonTokenFactory.DEFAULT.create(MappingExpressionParser.STRING, value.asText()); - tn = new TerminalNodeImpl(token); - StringContext sc = new StringContext(ctx); - sc.addAnyChild(tn); - elc.addAnyChild(sc); - break; - } - } - - token = CommonTokenFactory.DEFAULT.create(MappingExpressionParser.STRING, key); - tn = new TerminalNodeImpl(token); - StringContext sc = new StringContext(ctx); - sc.addAnyChild(tn); - elc.addAnyChild(sc); - - evc.addAnyChild(elc); - evc.addAnyChild(new TerminalNodeImpl(CommonTokenFactory.DEFAULT.create(MappingExpressionParser.T__3, ")"))); - return evc; - } - /** * Creates an {@link Array_constructorContext} from the supplied context and * array diff --git a/src/test/java/com/api/jsonata4java/expressions/BasicExpressionsTests.java b/src/test/java/com/api/jsonata4java/expressions/BasicExpressionsTests.java index 9c471eeb..a81bfba4 100644 --- a/src/test/java/com/api/jsonata4java/expressions/BasicExpressionsTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/BasicExpressionsTests.java @@ -35,16 +35,11 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import com.api.jsonata4java.expressions.EvaluateException; -import com.api.jsonata4java.expressions.Expressions; -import com.api.jsonata4java.expressions.NonNumericArrayIndexException; -import com.api.jsonata4java.expressions.ParseException; import com.api.jsonata4java.expressions.functions.AppendFunction; import com.api.jsonata4java.expressions.functions.AverageFunction; import com.api.jsonata4java.expressions.functions.CountFunction; import com.api.jsonata4java.expressions.functions.ExistsFunction; import com.api.jsonata4java.expressions.functions.LookupFunction; -import com.api.jsonata4java.expressions.functions.MergeFunction; import com.api.jsonata4java.expressions.functions.ShuffleFunction; import com.api.jsonata4java.expressions.functions.SubstringFunction; import com.api.jsonata4java.expressions.functions.SumFunction; @@ -1047,29 +1042,6 @@ public void testObjectFunctions() throws Exception { // ex.getMessage()); // } // } - - simpleTest("$merge([{\"a\":1,\"value\":2},{\"b\":{\"value\":{\"d\":5},\"c\":5}},{\"a\":2}])", - "{\"a\":2, \"value\":2, \"b\":{\"value\":{\"d\":5},\"c\":5}}"); - simpleTest("$merge(a.b)", null); - - { - Expressions expression = Expressions.parse("$merge()"); - try { - expression.evaluate(null); - Assert.fail("Did not throw an expected exception"); - } catch (EvaluateException ex) { - Assert.assertEquals(MergeFunction.ERR_ARG1BADTYPE, ex.getMessage()); - } - } - { - Expressions expression = Expressions.parse("$merge({\"hello\":1},2)"); - try { - expression.evaluate(null); - Assert.fail("Did not throw an expected exception"); - } catch (EvaluateException ex) { - Assert.assertEquals(MergeFunction.ERR_ARG2BADTYPE, ex.getMessage()); - } - } } @Test diff --git a/src/test/java/com/api/jsonata4java/expressions/functions/EachFunctionTest.java b/src/test/java/com/api/jsonata4java/expressions/functions/EachFunctionTest.java new file mode 100644 index 00000000..556f263b --- /dev/null +++ b/src/test/java/com/api/jsonata4java/expressions/functions/EachFunctionTest.java @@ -0,0 +1,61 @@ +/** + * (c) Copyright 2018, 2019 IBM Corporation + * 1 New Orchard Road, + * Armonk, New York, 10504-1722 + * United States + * +1 914 499 1900 + * support: Nathaniel Mills wnm3@us.ibm.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.api.jsonata4java.expressions.functions; + +import static com.api.jsonata4java.expressions.utils.Utils.test; +import org.junit.Ignore; +import org.junit.Test; + +public class EachFunctionTest { + + @Test + @Ignore + public void nullInput() throws Exception { + test("$each()", null, null, (String) null); + } + + @Test + public void eachKeyValuePairIntoArray() throws Exception { + test("$each(Address, function($v, $k) {$k & \": \" & $v})", + "[\n" + + " \"Street: Hursley Park\",\n" + + " \"City: Winchester\",\n" + + " \"Postcode: SO21 2JN\"\n" + + "]", + null, + "{\n" + + " \"FirstName\": \"Fred\",\n" + + " \"Address\": {\n" + + " \"Street\": \"Hursley Park\",\n" + + " \"City\": \"Winchester\",\n" + + " \"Postcode\": \"SO21 2JN\"\n" + + " }\n" + + "}"); + } + + @Test + public void combineWithMap() throws Exception { + test("$map([{\"a\":1,\"value\":2},{\"b\":3,\"value\":4}],function($obj1){$each($obj1,function($v,$k){$k&\"=\"&$v})})", + "[[\"a=1\", \"value=2\"], [\"b=3\", \"value=4\"]]", null, (String) null); + } +} diff --git a/src/test/java/com/api/jsonata4java/expressions/functions/MergeFunctionTest.java b/src/test/java/com/api/jsonata4java/expressions/functions/MergeFunctionTest.java new file mode 100644 index 00000000..0693ac99 --- /dev/null +++ b/src/test/java/com/api/jsonata4java/expressions/functions/MergeFunctionTest.java @@ -0,0 +1,90 @@ +/** + * (c) Copyright 2018, 2019 IBM Corporation + * 1 New Orchard Road, + * Armonk, New York, 10504-1722 + * United States + * +1 914 499 1900 + * support: Nathaniel Mills wnm3@us.ibm.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.api.jsonata4java.expressions.functions; + +import static com.api.jsonata4java.expressions.utils.Utils.test; +import org.junit.Test; + +public class MergeFunctionTest { + + @Test + public void nullInput() throws Exception { + test("$merge()", null, null, (String) null); + } + + @Test + public void emptyInput() throws Exception { + test("null ~> $merge()", null, MergeFunction.ERR_BAD_CONTEXT, (String) null); + } + + @Test + public void inputDoesNotExist() throws Exception { + test("$merge(a.b)", null, null, (String) null); + } + + @Test + public void mergeObject() throws Exception { + test("$merge({\"k1\": \"v1\", \"k2\": \"v2\"})", "{\"k1\": \"v1\", \"k2\": \"v2\"}", null, (String) null); + } + + @Test + public void mergeTwoDifferentKeyValuePairs() throws Exception { + test("$merge([{\"a\":1},{\"b\":2}])", "{\"a\":1, \"b\":2}", null, (String) null); + } + + @Test + public void mergeSameKeyValuePairs() throws Exception { + test("$merge([{\"a\":1},{\"a\":2}])", "{\"a\":2}", null, (String) null); + } + + @Test + public void mergeMixed() throws Exception { + test("$merge([{\"a\":1,\"value\":2},{\"b\":{\"value\":{\"d\":5},\"c\":5}},{\"a\":2}])", + "{\"a\":2, \"value\":2, \"b\":{\"value\":{\"d\":5},\"c\":5}}", null, (String) null); + } + + @Test + public void badArgType() throws Exception { + test("$merge(2)", null, MergeFunction.ERR_ARG1BADTYPE, (String) null); + } + + @Test + public void twoArguments() throws Exception { + test("$merge({\"k1\":\"v1\"},{\"k2\":\"v2\"})", null, MergeFunction.ERR_ARG2BADTYPE, (String) null); + } + + @Test + public void twoArgumentsOnePerChain() throws Exception { + test("{\"k2\":\"v2\"} ~> $merge({\"k1\":\"v1\"})", null, MergeFunction.ERR_ARG1BADTYPE, (String) null); + } + + @Test + public void arrayWithOtherThanObject() throws Exception { + test("$merge([1, 2])", null, MergeFunction.ERR_ARG1_MUST_BE_OBJECT_ARRAY, (String) null); + } + + @Test + public void issue237IncosistentQuotationMarkSanitization() throws Exception { + test("$each($, function($v, $k) {({ $k: $v})}) ~> $merge()", "{\"key1\":\"\\\"v1\\\"\"}", null, "{ \"key1\": \"\\\"v1\\\"\" }"); + } +} From a88ac53d38188b509e1aa7b3922bc4740ef59f29 Mon Sep 17 00:00:00 2001 From: Martin Bluemel Date: Tue, 29 Nov 2022 15:35:41 +0100 Subject: [PATCH 4/7] Redesign and fix of FilterFunction Removed console traces during JUnit test runs Signed-off-by: Martin Bluemel --- .../expressions/functions/FilterFunction.java | 230 ++++++++++-------- .../api/jsonata4java/AgnosticTestSuite.java | 44 +--- .../expressions/BasicExpressionsTests.java | 10 - .../expressions/FunctionErrorTest.java | 1 - .../expressions/InvalidSyntaxTest.java | 3 - .../functions/FilterFunctionTest.java | 104 ++++++++ .../jsonata4java/expressions/utils/Utils.java | 13 +- 7 files changed, 250 insertions(+), 155 deletions(-) create mode 100644 src/test/java/com/api/jsonata4java/expressions/functions/FilterFunctionTest.java diff --git a/src/main/java/com/api/jsonata4java/expressions/functions/FilterFunction.java b/src/main/java/com/api/jsonata4java/expressions/functions/FilterFunction.java index 75c0cc27..cdd98451 100644 --- a/src/main/java/com/api/jsonata4java/expressions/functions/FilterFunction.java +++ b/src/main/java/com/api/jsonata4java/expressions/functions/FilterFunction.java @@ -68,38 +68,127 @@ */ public class FilterFunction extends FunctionBase { - public static String ERR_BAD_CONTEXT = String.format(Constants.ERR_MSG_BAD_CONTEXT, Constants.FUNCTION_SPREAD); - public static String ERR_ARG1BADTYPE = String.format(Constants.ERR_MSG_ARG1_BAD_TYPE, Constants.FUNCTION_SPREAD); - public static String ERR_ARG2BADTYPE = String.format(Constants.ERR_MSG_ARG2_BAD_TYPE, Constants.FUNCTION_SPREAD); - public static String ERR_ARG3BADTYPE = String.format(Constants.ERR_MSG_ARG3_BAD_TYPE, Constants.FUNCTION_SPREAD); + public static String ERR_BAD_CONTEXT = String.format(Constants.ERR_MSG_BAD_CONTEXT, Constants.FUNCTION_FILTER); + public static String ERR_ARG1BADTYPE = String.format(Constants.ERR_MSG_ARG1_BAD_TYPE, Constants.FUNCTION_FILTER); + public static String ERR_ARG2BADTYPE = String.format(Constants.ERR_MSG_ARG2_BAD_TYPE, Constants.FUNCTION_FILTER); + public static String ERR_ARG3BADTYPE = String.format(Constants.ERR_MSG_ARG3_BAD_TYPE, Constants.FUNCTION_FILTER); public static String ERR_ARG1_MUST_BE_ARRAY_OF_OBJECTS = String .format(Constants.ERR_MSG_ARG1_MUST_BE_ARRAY_OF_OBJECTS, Constants.FUNCTION_SPREAD); public JsonNode invoke(ExpressionsVisitor expressionVisitor, Function_callContext ctx) { - SelectorArrayNode resultArray = new SelectorArrayNode(JsonNodeFactory.instance); + SelectorArrayNode result = new SelectorArrayNode(JsonNodeFactory.instance); final CtxEvalResult ctxEvalResult = evalContext(expressionVisitor, ctx); final JsonNode arg = ctxEvalResult.arg; final int argCount = ctxEvalResult.argumentCount; final boolean useContext = ctxEvalResult.useContext; - if (argCount == 2) { - // expect something that evaluates to an object and either a variable - // pointing to a function, or a function declaration - if (arg == null) { - throw new EvaluateRuntimeException(String.format(Constants.ERR_MSG_ARG1_BAD_TYPE, Constants.FUNCTION_FILTER)); - } + switch (argCount) { + case 0: + if (arg != null) { + throw new EvaluateRuntimeException(ERR_BAD_CONTEXT); + } + // else signal no match (result = null) + break; + case 1: + final DeclaredFunction fctArg = getFunctionArgFromCtx(expressionVisitor, ctx, true); + if (fctArg == null) { + // this error message might be not so precise but it is exactly what original JSONata (1.8.6) does + throw new EvaluateRuntimeException(ERR_ARG2BADTYPE); + } + // unfortunately we can not (or at least I do not see how) differ between + // - context evaluates to null + // - no array argument specified at all + // so in every case we signal no match (result = null) + break; + case 2: + // expect something that evaluates to an object and either a variable + // pointing to a function, or a function declaration + if (arg == null) { + throw new EvaluateRuntimeException(String.format(Constants.ERR_MSG_ARG1_BAD_TYPE, Constants.FUNCTION_FILTER)); + } + + ArrayNode mapArray = (ArrayNode) ExpressionsVisitor.ensureArray(arg); + + ExprValuesContext valuesCtx = ctx.exprValues(); + ExprListContext exprList = valuesCtx.exprList(); + ExprContext varid = exprList.expr((useContext ? 0 : 1)); + if (varid instanceof Var_recallContext) { + TerminalNode VAR_ID = ((Var_recallContext) varid).VAR_ID(); + String varID = varid.getText(); + // get the function to be executed from the functionMap and execute + DeclaredFunction fct = expressionVisitor.getDeclaredFunction(varID); + if (fct != null) { + int varCount = fct.getVariableCount(); + int fctVarCount = fct.getMaxArgs(); + if (varCount > fctVarCount) { + // only send variables function can consume + varCount = fctVarCount; + } + for (int i = 0; i < mapArray.size(); i++) { + JsonNode element = mapArray.get(i); + ExprValuesContext evc = new ExprValuesContext(ctx, ctx.invokingState); + switch (varCount) { + case 1: { + // just pass the mapArray variable + evc = FunctionUtils.fillExprVarContext(varCount, ctx, element); + break; + } + case 2: { + // pass the mapArray variable and index + evc = FunctionUtils.fillExprVarContext(varCount, ctx, element); + evc = FunctionUtils.addIndexExprVarContext(ctx, evc, i); + break; + } + case 3: { + // pass the mapArray variable, index, and array + evc = FunctionUtils.fillExprVarContext(varCount, ctx, element); + evc = FunctionUtils.addIndexExprVarContext(ctx, evc, i); + evc = FunctionUtils.addArrayExprVarContext(ctx, evc, mapArray); + break; + } + } + JsonNode fctResult = fct.invoke(expressionVisitor, evc); + if (fctResult != null && fctResult.asBoolean()) { + result.addAsSelectionGroup(element); + } + } + } else { + FunctionBase function = expressionVisitor.getJsonataFunction(varid.getText()); + if (function != null) { + int optionalArgs = FunctionUtils.getOptionalArgCount(function.getSignature()); + int maxArgs = function.getMaxArgs() - optionalArgs; + for (int i = 0; i < mapArray.size(); i++) { + Function_callContext callCtx = new Function_callContext(ctx); + // note: callCtx.children should be empty unless carrying an + // exception + JsonNode element = mapArray.get(i); - ArrayNode mapArray = (ArrayNode) ExpressionsVisitor.ensureArray(arg); + JsonNode fctResult = null; + if (maxArgs <= 1) { + fctResult = FunctionUtils.processVariablesCallFunction(expressionVisitor, function, VAR_ID, callCtx, element); + } else if (maxArgs == 2) { + fctResult = FunctionUtils.processVariablesCallFunction(expressionVisitor, function, VAR_ID, callCtx, element, + JsonNodeFactory.instance.numberNode(i)); + } else { // if (maxArgs >= 3) { + fctResult = FunctionUtils.processVariablesCallFunction(expressionVisitor, function, VAR_ID, callCtx, element, + JsonNodeFactory.instance.numberNode(i), mapArray); + } + if (fctResult != null && fctResult.asBoolean()) { + result.addAsSelectionGroup(element); + } + } + } else { + throw new EvaluateRuntimeException( + "Expected function variable reference " + varID + " to resolve to a declared nor Jsonata function."); + } + } + } else if (varid instanceof Function_declContext) { + Function_declContext fctDeclCtx = (Function_declContext) exprList.expr((useContext ? 0 : 1)); - ExprValuesContext valuesCtx = ctx.exprValues(); - ExprListContext exprList = valuesCtx.exprList(); - ExprContext varid = exprList.expr((useContext ? 0 : 1)); - if (varid instanceof Var_recallContext) { - TerminalNode VAR_ID = ((Var_recallContext) varid).VAR_ID(); - String varID = varid.getText(); - // get the function to be executed from the functionMap and execute - DeclaredFunction fct = expressionVisitor.getDeclaredFunction(varID); - if (fct != null) { + // we have a declared function for filter + VarListContext varList = fctDeclCtx.varList(); + ExprListContext fctBody = fctDeclCtx.exprList(); + DeclaredFunction fct = new DeclaredFunction(varList, fctBody); int varCount = fct.getVariableCount(); int fctVarCount = fct.getMaxArgs(); if (varCount > fctVarCount) { @@ -131,88 +220,35 @@ public JsonNode invoke(ExpressionsVisitor expressionVisitor, Function_callContex } JsonNode fctResult = fct.invoke(expressionVisitor, evc); if (fctResult != null && fctResult.asBoolean()) { - resultArray.addAsSelectionGroup(element); + result.addAsSelectionGroup(element); } } - } else { - FunctionBase function = expressionVisitor.getJsonataFunction(varid.getText()); - if (function != null) { - int optionalArgs = FunctionUtils.getOptionalArgCount(function.getSignature()); - int maxArgs = function.getMaxArgs() - optionalArgs; - for (int i = 0; i < mapArray.size(); i++) { - Function_callContext callCtx = new Function_callContext(ctx); - // note: callCtx.children should be empty unless carrying an - // exception - JsonNode element = mapArray.get(i); - - JsonNode fctResult = null; - if (maxArgs <= 1) { - fctResult = FunctionUtils.processVariablesCallFunction(expressionVisitor, function, VAR_ID, callCtx, element); - } else if (maxArgs == 2) { - fctResult = FunctionUtils.processVariablesCallFunction(expressionVisitor, function, VAR_ID, callCtx, element, - JsonNodeFactory.instance.numberNode(i)); - } else { // if (maxArgs >= 3) { - fctResult = FunctionUtils.processVariablesCallFunction(expressionVisitor, function, VAR_ID, callCtx, element, - JsonNodeFactory.instance.numberNode(i), mapArray); - } - if (fctResult != null && fctResult.asBoolean()) { - resultArray.addAsSelectionGroup(element); - } - } - } else { - throw new EvaluateRuntimeException( - "Expected function variable reference " + varID + " to resolve to a declared nor Jsonata function."); - } } - } else if (varid instanceof Function_declContext) { - Function_declContext fctDeclCtx = (Function_declContext) exprList.expr((useContext ? 0 : 1)); + break; + default: // argCount > 2 + throw new EvaluateRuntimeException(ERR_ARG3BADTYPE); + } + if (result.size() == 0) { + result = null; + } + return result; + } - // we have a declared function for filter - VarListContext varList = fctDeclCtx.varList(); - ExprListContext fctBody = fctDeclCtx.exprList(); - DeclaredFunction fct = new DeclaredFunction(varList, fctBody); - int varCount = fct.getVariableCount(); - int fctVarCount = fct.getMaxArgs(); - if (varCount > fctVarCount) { - // only send variables function can consume - varCount = fctVarCount; - } - for (int i = 0; i < mapArray.size(); i++) { - JsonNode element = mapArray.get(i); - ExprValuesContext evc = new ExprValuesContext(ctx, ctx.invokingState); - switch (varCount) { - case 1: { - // just pass the mapArray variable - evc = FunctionUtils.fillExprVarContext(varCount, ctx, element); - break; - } - case 2: { - // pass the mapArray variable and index - evc = FunctionUtils.fillExprVarContext(varCount, ctx, element); - evc = FunctionUtils.addIndexExprVarContext(ctx, evc, i); - break; - } - case 3: { - // pass the mapArray variable, index, and array - evc = FunctionUtils.fillExprVarContext(varCount, ctx, element); - evc = FunctionUtils.addIndexExprVarContext(ctx, evc, i); - evc = FunctionUtils.addArrayExprVarContext(ctx, evc, mapArray); - break; - } - } - JsonNode fctResult = fct.invoke(expressionVisitor, evc); - if (fctResult != null && fctResult.asBoolean()) { - resultArray.addAsSelectionGroup(element); - } - } - } - } else { - throw new EvaluateRuntimeException(argCount <= 1 ? ERR_BAD_CONTEXT : ERR_ARG3BADTYPE); + private DeclaredFunction getFunctionArgFromCtx(ExpressionsVisitor expressionVisitor, Function_callContext ctx, boolean useContext) { + if (ctx.exprValues() == null + || ctx.exprValues().exprList() == null + || ctx.exprValues().exprList().expr() == null + || ctx.exprValues().exprList().expr().size() == 0) { + return null; } - if (resultArray.size() == 0) { - resultArray = null; + final ExprContext varid = ctx.exprValues().exprList().expr(useContext ? 0 : 1); + if (varid instanceof Var_recallContext) { + return expressionVisitor.getDeclaredFunction(ctx.exprValues().exprList().expr(0).getText()); + } else if (varid instanceof Function_declContext) { + final Function_declContext fctDeclCtx = (Function_declContext) ctx.exprValues().exprList().expr(useContext ? 0 : 1); + return new DeclaredFunction(fctDeclCtx.varList(), fctDeclCtx.exprList()); } - return resultArray; + return null; } @Override diff --git a/src/test/java/com/api/jsonata4java/AgnosticTestSuite.java b/src/test/java/com/api/jsonata4java/AgnosticTestSuite.java index b821ea07..d2fd429e 100644 --- a/src/test/java/com/api/jsonata4java/AgnosticTestSuite.java +++ b/src/test/java/com/api/jsonata4java/AgnosticTestSuite.java @@ -20,7 +20,6 @@ import java.util.List; import java.util.Map; import java.util.stream.Stream; -import org.apache.commons.lang3.StringUtils; import org.junit.Assert; import org.junit.runner.Description; import org.junit.runner.RunWith; @@ -282,7 +281,7 @@ private void init() throws Exception { om.getFactory().configure(JsonWriteFeature.ESCAPE_NON_ASCII.mappedFeature(), true); // load and parse all the dataset json files into memory - printHeader("Loading datasets"); + System.out.println("Loading datasets"); final File datasetsDir = new File(DATASETS_DIR); final File[] datasetFiles = datasetsDir.listFiles(JsonFileFilter.INSTANCE); int filesRead = 0; @@ -298,9 +297,8 @@ private void init() throws Exception { filesRead++; } System.out.println("Read " + filesRead + " datasets from " + DATASETS_DIR); - printFooter(); - printHeader("Loading groups"); + System.out.println("Loading groups"); this.groups = new ArrayList<>(); final File groupsDir = new File(GROUPS_DIR); final File[] groupDirs = groupsDir.listFiles(DirectoryFilter.INSTANCE); @@ -341,7 +339,6 @@ private void init() throws Exception { } } System.out.println("Read " + groupsRead + " groups from " + GROUPS_DIR); - printFooter(); runComponentTest(Base64DecodeFunctionTests.data()); runComponentTest(Base64EncodeFunctionTests.data()); @@ -517,7 +514,6 @@ protected void runPathExpressionSyntaxTest(Collection data) throws Exc protected void runExecutionTest(Collection data) throws Exception { for (Object[] test : data) { try { - System.err.println("* " + test[0] == null ? null : test[0].toString()); Expressions.parse(test[0] == null ? null : test[0].toString()); if (!(test[1] == null ? null : (Boolean) test[1])) { Assert.fail( @@ -581,16 +577,16 @@ protected void runChild(TestGroup group, RunNotifier notifier) { if (testCase.shouldSkip()) { notifier.fireTestIgnored(testCase.getDescription()); } else { - System.out.print("- executing test case: " + group.getGroupName() + "." + testCase.getCaseName() + "..."); Description testDesc = testCase.getDescription(); try { if (testDesc.isEmpty() == false) { notifier.fireTestStarted(testDesc); } else { - System.out.println(testDesc + " is empty"); + System.err.println(testDesc + " is empty"); } } catch (Exception sbfe) { - System.err.println("Error in " + testDesc + " Error: " + sbfe.getLocalizedMessage()); + System.err.println("FAILURE in AgnosticTestSuite test case: " + group.getGroupName() + "." + testCase.getCaseName() + + ": " + testDesc + " Error: " + sbfe.getLocalizedMessage()); } try { @@ -606,28 +602,26 @@ protected void runChild(TestGroup group, RunNotifier notifier) { JsonNode actualResult = e.evaluate(testCase.getDataset()); try { - Assert.assertEquals(testCase.expectedResult, actualResult); - System.out.println(" OK"); + Assert.assertEquals("FAILURE in AgnosticTestSuite test case: " + group.getGroupName() + "." + testCase.getCaseName() + "\n", + testCase.expectedResult, actualResult); notifier.fireTestFinished(testCase.getDescription()); } catch (AssertionError ex) { try { - Assert.assertEquals( + Assert.assertEquals("FAILURE in AgnosticTestSuite test case: " + group.getGroupName() + "." + testCase.getCaseName() + "\n", _objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(testCase.expectedResult), _objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(actualResult)); - System.out.println(" OK"); notifier.fireTestFinished(testCase.getDescription()); } catch (AssertionError ex1) { - System.err.println("\n FAILURE"); + System.err.println("FAILURE in AgnosticTestSuite test case: " + group.getGroupName() + "." + testCase.getCaseName()); notifier.fireTestFailure(new Failure(testCase.getDescription(), ex1)); } } } catch (Throwable ex) { if (testCase.expectParseOrEvaluateException && (ex instanceof ParseException || ex instanceof EvaluateException)) { - System.out.println(" OK"); notifier.fireTestFinished(testCase.getDescription()); } else { - System.err.println("\n FAILURE"); + System.err.println("FAILURE in AgnosticTestSuite test case: " + group.getGroupName() + "." + testCase.getCaseName()); notifier.fireTestFailure(new Failure(testCase.getDescription(), ex)); } } @@ -637,22 +631,6 @@ protected void runChild(TestGroup group, RunNotifier notifier) { notifier.fireTestFinished(group.getDescription()); } - private static String HEADER_DELIM = "-"; - private static String HEADER_LINE = StringUtils.repeat(HEADER_DELIM, 10); - - private static void printHeader(String msg) { - System.out.println(HEADER_LINE); - System.out.print(HEADER_DELIM); - System.out.print(' '); - System.out.println(msg); - System.out.println(HEADER_LINE); - } - - private static void printFooter() { - System.out.println(HEADER_LINE); - System.out.println(); - } - static class JsonFileFilter implements FilenameFilter { public static final FilenameFilter INSTANCE = new JsonFileFilter(); @@ -846,7 +824,6 @@ public TestCase(TestGroup group, String caseName, JsonNode caseJson) { // TODO: token: // If the code field is present, an optional token field may also be present // indicating which token token the exception should be associated with. - } private boolean isWholeNumber(double n) { @@ -898,5 +875,4 @@ private boolean shouldSkip() { } } - } diff --git a/src/test/java/com/api/jsonata4java/expressions/BasicExpressionsTests.java b/src/test/java/com/api/jsonata4java/expressions/BasicExpressionsTests.java index a81bfba4..db51f2a9 100644 --- a/src/test/java/com/api/jsonata4java/expressions/BasicExpressionsTests.java +++ b/src/test/java/com/api/jsonata4java/expressions/BasicExpressionsTests.java @@ -292,13 +292,6 @@ public void testNewStuff() throws Exception { expectArray.removeAll(); expectArray.add(mapper.readTree("{\"entity\":{\"filter\":true}}")); - simpleTest( - "$filter([{\"entity\":{\"filter\":true}},{\"entity\":{\"filter\":false}},{\"entity\":{\"missingfilter\":true}}],\n" - + " function($v){$v.entity.filter=true})", - mapper.readTree("{\"entity\":{\"filter\":true}}")/* expectArray */, jsonObj); - expectArray.removeAll(); - test("$filter([{\"entity\":{\"filter\":true}},{\"entity\":{\"filter\":false}},{\"entity\":{\"missingfilter\":true}}],\n" - + " function($v){$v.filter=true})", null, null, jsonObj); simpleTest("$length(Surname)", 5, jsonObj2); test("$length(SurnameX)", null, null, jsonObj2); test("$length(Surname)=5", BooleanNode.TRUE, null, jsonObj2); @@ -942,7 +935,6 @@ public void testArrays() throws Exception { simpleTest("$reverse([1,2,3,4,5])", "[5, 4, 3, 2, 1]"); simpleTest("$reverse([1..5])", "[5, 4, 3, 2, 1]"); - System.err.println("* " + "$shuffle([1..5])=" + Expressions.parse("$shuffle([1..5])").evaluate(null)); simpleTest("$zip([1,2],4,{\"a\":1,\"b\":2})", "[[1, 4, {\"a\":1,\"b\":2}]]"); simpleTest("$zip([])", "[]"); simpleTest("$zip({})", "[[{}]]"); @@ -972,9 +964,7 @@ public void testFunctionDecl() throws Exception { "$map([{\"a\":1,\"value\":2},{\"b\":3,\"value\":4}],function($obj1){$each($obj1,function($v,$k){$k&\"=\"&$v})})", "[[\"a=1\", \"value=2\"], [\"b=3\", \"value=4\"]]"); simpleTest("($x:=function($l){$l*2};$map([1,5,3,4,2],$x))", "[2, 10, 6, 8, 4]"); - simpleTest("($x:=function($l){$l>2};$filter([1,5,3,4,2],$x))", "[5, 3, 4]"); simpleTest("($x:=function($l){$l%2=1};$map([1,5,3,4,2],$x))", "[true, true, true, false, false]"); - simpleTest("($x:=function($l){$l%2=1};$filter([1,5,3,4,2],$x))", "[1, 5, 3]"); simpleTest("$reduce([1..5],function($i,$j){$i*$j})", "120"); simpleTest("$reduce([1..5],function($i,$j){$i*$j},30)", "3600"); simpleTest("($x:=function($i,$j){$i*$j};$reduce([1..5],$x,30))", "3600"); diff --git a/src/test/java/com/api/jsonata4java/expressions/FunctionErrorTest.java b/src/test/java/com/api/jsonata4java/expressions/FunctionErrorTest.java index 9f3beb3f..54e0902a 100644 --- a/src/test/java/com/api/jsonata4java/expressions/FunctionErrorTest.java +++ b/src/test/java/com/api/jsonata4java/expressions/FunctionErrorTest.java @@ -25,7 +25,6 @@ import static com.api.jsonata4java.expressions.utils.Utils.test; import static org.junit.Assert.assertEquals; import org.junit.Test; -import com.api.jsonata4java.expressions.EvaluateException; import com.api.jsonata4java.expressions.functions.ReplaceFunction; /** diff --git a/src/test/java/com/api/jsonata4java/expressions/InvalidSyntaxTest.java b/src/test/java/com/api/jsonata4java/expressions/InvalidSyntaxTest.java index 5c5d3a3f..ec43fae7 100644 --- a/src/test/java/com/api/jsonata4java/expressions/InvalidSyntaxTest.java +++ b/src/test/java/com/api/jsonata4java/expressions/InvalidSyntaxTest.java @@ -31,8 +31,6 @@ import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameter; import org.junit.runners.Parameterized.Parameters; -import com.api.jsonata4java.expressions.Expressions; -import com.api.jsonata4java.expressions.ParseException; /** * Check that we correctly reject invalid uses of JSONata syntax @@ -128,7 +126,6 @@ public static Collection data() { @Test public void runTest() throws Exception { try { - System.err.println("* " + expression); Expressions.parse(expression); if (!syntaxIsValid) { Assert.fail("Expected a ParseException to be thrown when attempting to parse expression '" + expression diff --git a/src/test/java/com/api/jsonata4java/expressions/functions/FilterFunctionTest.java b/src/test/java/com/api/jsonata4java/expressions/functions/FilterFunctionTest.java new file mode 100644 index 00000000..bc291b6e --- /dev/null +++ b/src/test/java/com/api/jsonata4java/expressions/functions/FilterFunctionTest.java @@ -0,0 +1,104 @@ +/** + * (c) Copyright 2018, 2019 IBM Corporation + * 1 New Orchard Road, + * Armonk, New York, 10504-1722 + * United States + * +1 914 499 1900 + * support: Nathaniel Mills wnm3@us.ibm.com + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.api.jsonata4java.expressions.functions; + +import static com.api.jsonata4java.expressions.utils.Utils.test; +import org.junit.Test; + +public class FilterFunctionTest { + + @Test + public void nullInput() throws Exception { + test("$filter()", null, null, (String) null); + } + + @Test + public void filterObjects() throws Exception { + test(/* expression */ "{\n" + + " \"objs\": [\n" + + " objects.id ~> $filter(function($v){$v > 1})\n" + + " ]\n" + + "}", + /* expected output */ + "{ \"objs\" : [ 2, 3 ] }", + null, + /* input */ "{\n" + + "\"objects\": [\n" + + " {\"id\": 0},\n" + + " {\"id\": 1},\n" + + " {\"id\": 2},\n" + + " {\"id\": 3}\n" + + " ]\n" + + "}"); + } + + @Test + public void filterNumbers() throws Exception { + test("($x:=function($l){$l>2};$filter([1,5,3,4,2],$x))", "[5, 3, 4]", null, null); + } + + @Test + public void filterNumbersOdd() throws Exception { + test("($x:=function($l){$l%2=1};$filter([1,5,3,4,2],$x))", "[1, 5, 3]", null, null); + } + + @Test + public void filterSimple() throws Exception { + test(/* expression */ "$filter([{\"entity\":{\"filter\":true}},{\"entity\":{\"filter\":false}}," + + "{\"entity\":{\"missingfilter\":true}}],\n" + + "function($v){$v.entity.filter=true})", + /* expected output */" {\"entity\":{\"filter\":true}}", null, null); + } + + @Test + public void filterAll() throws Exception { + test("$filter([{\"entity\":{\"filter\":true}},{\"entity\":{\"filter\":false}},{\"entity\":{\"missingfilter\":true}}],\n" + + " function($v){$v.filter=true})", null, null, (String) null); + } + + @Test + public void filterMissingFunctionArg() throws Exception { + test("$filter([1,5,3,4,2])", null, FilterFunction.ERR_ARG2BADTYPE, (String) null); + } + + @Test + public void filterMissingArrayArg() throws Exception { + test("($x:=function($l){$l>2};$filter($x))", null, null, (String) null); + } + + @Test + public void filterNumbersEmpty() throws Exception { + test(/* expression */ "{\n" + + " \"objs\": [\n" + + " objects.id ~> $filter(function($v){$v > 1})\n" + + " ]\n" + + "}", + /* expected output */ + "{ \"objs\" : [ ] }", + null, + /* input */ "{\n" + + "\"objects\": [\n" + + " ]\n" + + "}"); + } +} diff --git a/src/test/java/com/api/jsonata4java/expressions/utils/Utils.java b/src/test/java/com/api/jsonata4java/expressions/utils/Utils.java index 54f4e019..f69555d7 100644 --- a/src/test/java/com/api/jsonata4java/expressions/utils/Utils.java +++ b/src/test/java/com/api/jsonata4java/expressions/utils/Utils.java @@ -97,8 +97,6 @@ public static void simpleTest(String expression, ObjectNode expected, JsonNode j throws ParseException, EvaluateException, IOException { Expressions expr = Expressions.parse(expression); JsonNode result = expr.evaluate(jsonObj); - System.err.print("* " + expression); - System.err.println(" returned " + result); Assert.assertEquals(mapper.writeValueAsString(expected), (mapper.writeValueAsString(result))); } @@ -106,8 +104,6 @@ public static void simpleTest(String expression, JsonNode expected, JsonNode jso throws ParseException, EvaluateException, IOException { Expressions expr = Expressions.parse(expression); JsonNode result = expr.evaluate(jsonObj); - System.err.print("* " + expression); - System.err.println(" returned " + result); Assert.assertEquals(mapper.writeValueAsString(expected), mapper.writeValueAsString(result)); } @@ -146,7 +142,6 @@ public static void test(String expression, JsonNode expected, String expectedEva if (rootContext != null) rootContext = ensureAllIntegralsAreLongs(rootContext); - System.err.print("* " + expression); Expressions e = null; try { e = Expressions.parse(expression); @@ -158,7 +153,7 @@ public static void test(String expression, JsonNode expected, String expectedEva pe.printStackTrace(); throw pe; } - System.err.println(" threw exception: " + pe.getClass().getName()); + System.err.println("* " + expression + " threw exception: " + pe.getClass().getName()); return; } } @@ -169,15 +164,13 @@ public static void test(String expression, JsonNode expected, String expectedEva Assert.fail("EvaluateException \"" + expectedEvaluateExceptionMsg + "\" was not thrown but we expected it to be. Got actual=\"" + actual + "\""); } - System.err.println(" returned " + actual); Assert.assertEquals(expected, actual); } catch (EvaluateException ex) { if (expectedEvaluateExceptionMsg == null) { - System.err.println(" expected:\"" + expected + "\" but got \"" + actual + "\""); throw ex; } else { - System.err.println(" got exception with message " + ex.getLocalizedMessage()); - Assert.assertEquals("EvaluateException was thrown as expected, but its message was not as expected", + Assert.assertEquals("EvaluateException was thrown but expected message: " + + expectedEvaluateExceptionMsg + "> got message <" + ex.getLocalizedMessage() + ">", expectedEvaluateExceptionMsg, ex.getMessage()); } } From edd9e29b28d3d53d85e9619df0c185e48643011d Mon Sep 17 00:00:00 2001 From: Martin Bluemel Date: Tue, 29 Nov 2022 16:34:34 +0100 Subject: [PATCH 5/7] Redesign of EachFunction Signed-off-by: Martin Bluemel --- .../expressions/functions/EachFunction.java | 259 +++++++++--------- .../expressions/functions/FilterFunction.java | 19 +- .../expressions/utils/FunctionUtils.java | 21 ++ .../functions/EachFunctionTest.java | 2 - 4 files changed, 152 insertions(+), 149 deletions(-) diff --git a/src/main/java/com/api/jsonata4java/expressions/functions/EachFunction.java b/src/main/java/com/api/jsonata4java/expressions/functions/EachFunction.java index 51ce0dc2..d33c43d7 100644 --- a/src/main/java/com/api/jsonata4java/expressions/functions/EachFunction.java +++ b/src/main/java/com/api/jsonata4java/expressions/functions/EachFunction.java @@ -66,137 +66,147 @@ public class EachFunction extends FunctionBase { .format(Constants.ERR_MSG_ARG1_MUST_BE_ARRAY_OF_OBJECTS, Constants.FUNCTION_EACH); public JsonNode invoke(ExpressionsVisitor expressionVisitor, Function_callContext ctx) { - SelectorArrayNode result = new SelectorArrayNode(JsonNodeFactory.instance); - boolean useContext = FunctionUtils.useContextVariable(this, ctx, getSignature()); - // ((ctx.getParent() instanceof MappingExpressionParser.Fct_chainContext) - // || (ctx.getParent() instanceof MappingExpressionParser.PathContext)); - JsonNode arg = null; - ExprValuesContext valuesCtx = ctx.exprValues(); - ExprListContext exprList = valuesCtx.exprList(); - int argCount = getArgumentCount(ctx); - if (useContext) { - // pop context var from stack - arg = FunctionUtils.getContextVariable(expressionVisitor); - if (arg != null && arg.isNull() == false) { - argCount++; - } else { - useContext = false; - } - } - if (argCount == 2) { - if (!useContext) { - arg = expressionVisitor.visit(exprList.expr(0)); - } - // expect something that evaluates to an object and a function declaration - - if (arg == null || !arg.isObject()) { - throw new EvaluateRuntimeException(String.format(Constants.ERR_MSG_ARG1_BAD_TYPE, Constants.FUNCTION_EACH)); - } - ObjectNode object = (ObjectNode) arg; - - ExprContext varid = exprList.expr((useContext ? 0 : 1)); - if (varid instanceof Var_recallContext) { - TerminalNode VAR_ID = ((Var_recallContext) varid).VAR_ID(); - String varID = varid.getText(); - // get the function to be executed from the functionMap and execute - DeclaredFunction fct = expressionVisitor.getDeclaredFunction(varID); - if (fct != null) { - int varCount = fct.getVariableCount(); - int fctVarCount = fct.getMaxArgs(); - if (varCount > fctVarCount) { - // only send variables function can consume - varCount = fctVarCount; - } - for (Iterator it = object.fieldNames(); it.hasNext();) { - String key = it.next(); - JsonNode field = object.get(key); - ExprValuesContext evc = new ExprValuesContext(ctx, ctx.invokingState); - switch (varCount) { - case 1: { - // just pass the field value - evc = FunctionUtils.fillExprVarContext(varCount, ctx, field); - break; - } - case 2: { - // pass the field value and key - evc = FunctionUtils.fillExprVarContext(varCount, ctx, field); - evc = FunctionUtils.addStringExprVarContext(ctx, evc, key); - break; - } - case 3: { - // pass the field value, key, and object - evc = FunctionUtils.fillExprVarContext(varCount, ctx, field); - evc = FunctionUtils.addStringExprVarContext(ctx, evc, key); - evc = FunctionUtils.addObjectExprVarContext(ctx, evc, object); - break; - } - } - JsonNode fctResult = fct.invoke(expressionVisitor, evc); - if (fctResult != null) { - result.add(fctResult); + SelectorArrayNode result = null; + final CtxEvalResult ctxEvalResult = evalContext(expressionVisitor, ctx); + final JsonNode arg = ctxEvalResult.arg; + final int argCount = ctxEvalResult.argumentCount; + final boolean useContext = ctxEvalResult.useContext; + switch (argCount) { + case 0: + if (arg != null) { + throw new EvaluateRuntimeException(ERR_BAD_CONTEXT); + } + // else signal no match (result = null) + break; + case 1: + final DeclaredFunction fctArg = FunctionUtils.getFunctionArgFromCtx(expressionVisitor, ctx, true); + if (fctArg == null) { + // this error message might be not so precise but it is exactly what original JSONata (1.8.6) does + throw new EvaluateRuntimeException(ERR_ARG2BADTYPE); + } + // unfortunately we can not (or at least I do not see how) differ between + // - context evaluates to null + // - no array argument specified at all + // so in every case we signal no match (result = null) + break; + case 2: + // expect something that evaluates to an object and a function declaration + if (arg == null || !arg.isObject()) { + throw new EvaluateRuntimeException(String.format(Constants.ERR_MSG_ARG1_BAD_TYPE, Constants.FUNCTION_EACH)); + } + final ObjectNode object = (ObjectNode) arg; + result = new SelectorArrayNode(JsonNodeFactory.instance); + final ExprContext varid = ctx.exprValues() != null + && ctx.exprValues().exprList() != null + ? ctx.exprValues().exprList().expr(useContext ? 0 : 1) + : null; + if (varid instanceof Var_recallContext) { + TerminalNode VAR_ID = ((Var_recallContext) varid).VAR_ID(); + String varID = varid.getText(); + // get the function to be executed from the functionMap and execute + DeclaredFunction fct = expressionVisitor.getDeclaredFunction(varID); + if (fct != null) { + int varCount = fct.getVariableCount(); + int fctVarCount = fct.getMaxArgs(); + if (varCount > fctVarCount) { + // only send variables function can consume + varCount = fctVarCount; } - } - } else { - FunctionBase function = expressionVisitor.getJsonataFunction(varid.getText()); - if (function != null) { for (Iterator it = object.fieldNames(); it.hasNext();) { String key = it.next(); JsonNode field = object.get(key); - Function_callContext callCtx = new Function_callContext(ctx); - // note: callCtx.children should be empty unless carrying an - // exception - result.add(FunctionUtils.processVariablesCallFunction(expressionVisitor, function, VAR_ID, callCtx, field)); + ExprValuesContext evc = new ExprValuesContext(ctx, ctx.invokingState); + switch (varCount) { + case 1: { + // just pass the field value + evc = FunctionUtils.fillExprVarContext(varCount, ctx, field); + break; + } + case 2: { + // pass the field value and key + evc = FunctionUtils.fillExprVarContext(varCount, ctx, field); + evc = FunctionUtils.addStringExprVarContext(ctx, evc, key); + break; + } + case 3: { + // pass the field value, key, and object + evc = FunctionUtils.fillExprVarContext(varCount, ctx, field); + evc = FunctionUtils.addStringExprVarContext(ctx, evc, key); + evc = FunctionUtils.addObjectExprVarContext(ctx, evc, object); + break; + } + } + JsonNode fctResult = fct.invoke(expressionVisitor, evc); + if (fctResult != null) { + result.add(fctResult); + } } } else { - throw new EvaluateRuntimeException( - "Expected function variable reference " + varID + " to resolve to a declared nor Jsonata function."); - } - } - } else if (varid instanceof Function_declContext) { - Function_declContext fctDeclCtx = (Function_declContext) exprList.expr((useContext ? 0 : 1)); - - // we have a declared function for each - VarListContext varList = fctDeclCtx.varList(); - ExprListContext fctBody = fctDeclCtx.exprList(); - DeclaredFunction fct = new DeclaredFunction(varList, fctBody); - int varCount = fct.getVariableCount(); - int fctVarCount = fct.getMaxArgs(); - if (varCount > fctVarCount) { - // only send variables function can consume - varCount = fctVarCount; - } - for (Iterator it = object.fieldNames(); it.hasNext();) { - String key = it.next(); - JsonNode field = object.get(key); - ExprValuesContext evc = new ExprValuesContext(ctx, ctx.invokingState); - switch (varCount) { - case 1: { - // just pass the field value - evc = FunctionUtils.fillExprVarContext(varCount, ctx, field); - break; + FunctionBase function = expressionVisitor.getJsonataFunction(varid.getText()); + if (function != null) { + for (Iterator it = object.fieldNames(); it.hasNext();) { + String key = it.next(); + JsonNode field = object.get(key); + Function_callContext callCtx = new Function_callContext(ctx); + // note: callCtx.children should be empty unless carrying an + // exception + result.add(FunctionUtils.processVariablesCallFunction(expressionVisitor, function, VAR_ID, callCtx, field)); + } + } else { + throw new EvaluateRuntimeException( + "Expected function variable reference " + varID + " to resolve to a declared nor Jsonata function."); } - case 2: { - // pass the field value and key - evc = FunctionUtils.fillExprVarContext(varCount, ctx, field); - evc = FunctionUtils.addStringExprVarContext(ctx, evc, key); - break; + } + } else if (varid instanceof Function_declContext) { + final Function_declContext fctDeclCtx = ctx.exprValues() != null + && ctx.exprValues().exprList() != null + ? (Function_declContext) ctx.exprValues().exprList().expr(useContext ? 0 : 1) + : null; + if (fctDeclCtx != null) { + // we have a declared function for each + VarListContext varList = fctDeclCtx.varList(); + ExprListContext fctBody = fctDeclCtx.exprList(); + DeclaredFunction fct = new DeclaredFunction(varList, fctBody); + int varCount = fct.getVariableCount(); + int fctVarCount = fct.getMaxArgs(); + if (varCount > fctVarCount) { + // only send variables function can consume + varCount = fctVarCount; } - case 3: { - // pass the field value, key, and object - evc = FunctionUtils.fillExprVarContext(varCount, ctx, field); - evc = FunctionUtils.addStringExprVarContext(ctx, evc, key); - evc = FunctionUtils.addObjectExprVarContext(ctx, evc, object); - break; + for (Iterator it = object.fieldNames(); it.hasNext();) { + String key = it.next(); + JsonNode field = object.get(key); + ExprValuesContext evc = new ExprValuesContext(ctx, ctx.invokingState); + switch (varCount) { + case 1: { + // just pass the field value + evc = FunctionUtils.fillExprVarContext(varCount, ctx, field); + break; + } + case 2: { + // pass the field value and key + evc = FunctionUtils.fillExprVarContext(varCount, ctx, field); + evc = FunctionUtils.addStringExprVarContext(ctx, evc, key); + break; + } + case 3: { + // pass the field value, key, and object + evc = FunctionUtils.fillExprVarContext(varCount, ctx, field); + evc = FunctionUtils.addStringExprVarContext(ctx, evc, key); + evc = FunctionUtils.addObjectExprVarContext(ctx, evc, object); + break; + } + } + JsonNode fctResult = fct.invoke(expressionVisitor, evc); + if (fctResult != null) { + result.add(fctResult); + } } } - JsonNode fctResult = fct.invoke(expressionVisitor, evc); - if (fctResult != null) { - result.add(fctResult); - } } - } - } else { - throw new EvaluateRuntimeException(argCount <= 1 ? ERR_BAD_CONTEXT : ERR_ARG3BADTYPE); + break; + default: + throw new EvaluateRuntimeException(ERR_ARG3BADTYPE); } return result; } @@ -216,13 +226,4 @@ public String getSignature() { // accepts anything (or context variable), and a function, returns an array of objects return ""; } - - public void addObject(SelectorArrayNode result, ObjectNode obj) { - for (Iterator it = obj.fieldNames(); it.hasNext();) { - String key = it.next(); - ObjectNode cell = JsonNodeFactory.instance.objectNode(); - cell.set(key, obj.get(key)); - result.add(cell); - } - } } diff --git a/src/main/java/com/api/jsonata4java/expressions/functions/FilterFunction.java b/src/main/java/com/api/jsonata4java/expressions/functions/FilterFunction.java index cdd98451..9ea3fc9c 100644 --- a/src/main/java/com/api/jsonata4java/expressions/functions/FilterFunction.java +++ b/src/main/java/com/api/jsonata4java/expressions/functions/FilterFunction.java @@ -90,7 +90,7 @@ public JsonNode invoke(ExpressionsVisitor expressionVisitor, Function_callContex // else signal no match (result = null) break; case 1: - final DeclaredFunction fctArg = getFunctionArgFromCtx(expressionVisitor, ctx, true); + final DeclaredFunction fctArg = FunctionUtils.getFunctionArgFromCtx(expressionVisitor, ctx, true); if (fctArg == null) { // this error message might be not so precise but it is exactly what original JSONata (1.8.6) does throw new EvaluateRuntimeException(ERR_ARG2BADTYPE); @@ -234,23 +234,6 @@ public JsonNode invoke(ExpressionsVisitor expressionVisitor, Function_callContex return result; } - private DeclaredFunction getFunctionArgFromCtx(ExpressionsVisitor expressionVisitor, Function_callContext ctx, boolean useContext) { - if (ctx.exprValues() == null - || ctx.exprValues().exprList() == null - || ctx.exprValues().exprList().expr() == null - || ctx.exprValues().exprList().expr().size() == 0) { - return null; - } - final ExprContext varid = ctx.exprValues().exprList().expr(useContext ? 0 : 1); - if (varid instanceof Var_recallContext) { - return expressionVisitor.getDeclaredFunction(ctx.exprValues().exprList().expr(0).getText()); - } else if (varid instanceof Function_declContext) { - final Function_declContext fctDeclCtx = (Function_declContext) ctx.exprValues().exprList().expr(useContext ? 0 : 1); - return new DeclaredFunction(fctDeclCtx.varList(), fctDeclCtx.exprList()); - } - return null; - } - @Override public int getMaxArgs() { return 2; diff --git a/src/main/java/com/api/jsonata4java/expressions/utils/FunctionUtils.java b/src/main/java/com/api/jsonata4java/expressions/utils/FunctionUtils.java index e59ec0a9..81411ae9 100644 --- a/src/main/java/com/api/jsonata4java/expressions/utils/FunctionUtils.java +++ b/src/main/java/com/api/jsonata4java/expressions/utils/FunctionUtils.java @@ -34,6 +34,7 @@ import org.antlr.v4.runtime.tree.TerminalNodeImpl; import com.api.jsonata4java.expressions.EvaluateRuntimeException; import com.api.jsonata4java.expressions.ExpressionsVisitor; +import com.api.jsonata4java.expressions.functions.DeclaredFunction; import com.api.jsonata4java.expressions.functions.FunctionBase; import com.api.jsonata4java.expressions.generated.MappingExpressionParser; import com.api.jsonata4java.expressions.generated.MappingExpressionParser.Array_constructorContext; @@ -47,6 +48,7 @@ import com.api.jsonata4java.expressions.generated.MappingExpressionParser.Fct_chainContext; import com.api.jsonata4java.expressions.generated.MappingExpressionParser.FieldListContext; import com.api.jsonata4java.expressions.generated.MappingExpressionParser.Function_callContext; +import com.api.jsonata4java.expressions.generated.MappingExpressionParser.Function_declContext; import com.api.jsonata4java.expressions.generated.MappingExpressionParser.IdContext; import com.api.jsonata4java.expressions.generated.MappingExpressionParser.NullContext; import com.api.jsonata4java.expressions.generated.MappingExpressionParser.NumberContext; @@ -55,6 +57,7 @@ import com.api.jsonata4java.expressions.generated.MappingExpressionParser.SeqContext; import com.api.jsonata4java.expressions.generated.MappingExpressionParser.StringContext; import com.api.jsonata4java.expressions.generated.MappingExpressionParser.Unary_opContext; +import com.api.jsonata4java.expressions.generated.MappingExpressionParser.Var_recallContext; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.DoubleNode; @@ -914,4 +917,22 @@ public static int getOptionalArgCount(String signature) { } return optional; } + + public static DeclaredFunction getFunctionArgFromCtx(ExpressionsVisitor expressionVisitor, Function_callContext ctx, boolean useContext) { + if (ctx.exprValues() == null + || ctx.exprValues().exprList() == null + || ctx.exprValues().exprList().expr() == null + || ctx.exprValues().exprList().expr().size() == 0) { + return null; + } + final ExprContext varid = ctx.exprValues().exprList().expr(useContext ? 0 : 1); + if (varid instanceof Var_recallContext) { + return expressionVisitor.getDeclaredFunction(ctx.exprValues().exprList().expr(0).getText()); + } else if (varid instanceof Function_declContext) { + final Function_declContext fctDeclCtx = (Function_declContext) ctx.exprValues().exprList().expr(useContext ? 0 : 1); + return new DeclaredFunction(fctDeclCtx.varList(), fctDeclCtx.exprList()); + } + return null; + } + } diff --git a/src/test/java/com/api/jsonata4java/expressions/functions/EachFunctionTest.java b/src/test/java/com/api/jsonata4java/expressions/functions/EachFunctionTest.java index 556f263b..2f9136f6 100644 --- a/src/test/java/com/api/jsonata4java/expressions/functions/EachFunctionTest.java +++ b/src/test/java/com/api/jsonata4java/expressions/functions/EachFunctionTest.java @@ -23,13 +23,11 @@ package com.api.jsonata4java.expressions.functions; import static com.api.jsonata4java.expressions.utils.Utils.test; -import org.junit.Ignore; import org.junit.Test; public class EachFunctionTest { @Test - @Ignore public void nullInput() throws Exception { test("$each()", null, null, (String) null); } From 2b3bccc3c24e6290d1c63c94d14ef48d89135331 Mon Sep 17 00:00:00 2001 From: Martin Bluemel Date: Fri, 2 Dec 2022 16:55:40 +0100 Subject: [PATCH 6/7] Redesign and thorough test of EachFunction (test coverage > 98%) Signed-off-by: Martin Bluemel --- .../expressions/functions/EachFunction.java | 230 +++++++------- .../functions/EachFunctionTest.java | 297 +++++++++++++++++- 2 files changed, 404 insertions(+), 123 deletions(-) diff --git a/src/main/java/com/api/jsonata4java/expressions/functions/EachFunction.java b/src/main/java/com/api/jsonata4java/expressions/functions/EachFunction.java index d33c43d7..65a9eea2 100644 --- a/src/main/java/com/api/jsonata4java/expressions/functions/EachFunction.java +++ b/src/main/java/com/api/jsonata4java/expressions/functions/EachFunction.java @@ -23,7 +23,6 @@ package com.api.jsonata4java.expressions.functions; import java.util.Iterator; -import org.antlr.v4.runtime.tree.TerminalNode; import com.api.jsonata4java.expressions.EvaluateRuntimeException; import com.api.jsonata4java.expressions.ExpressionsVisitor; import com.api.jsonata4java.expressions.ExpressionsVisitor.SelectorArrayNode; @@ -64,6 +63,7 @@ public class EachFunction extends FunctionBase { public static String ERR_ARG3BADTYPE = String.format(Constants.ERR_MSG_ARG3_BAD_TYPE, Constants.FUNCTION_EACH); public static String ERR_ARG1_MUST_BE_ARRAY_OF_OBJECTS = String .format(Constants.ERR_MSG_ARG1_MUST_BE_ARRAY_OF_OBJECTS, Constants.FUNCTION_EACH); + public static String ERR_ARG2_FUNCTION_RESOLVE = "Could not resolve function variable reference \"%s\"."; public JsonNode invoke(ExpressionsVisitor expressionVisitor, Function_callContext ctx) { SelectorArrayNode result = null; @@ -73,136 +73,26 @@ public JsonNode invoke(ExpressionsVisitor expressionVisitor, Function_callContex final boolean useContext = ctxEvalResult.useContext; switch (argCount) { case 0: - if (arg != null) { - throw new EvaluateRuntimeException(ERR_BAD_CONTEXT); - } - // else signal no match (result = null) - break; + throw new EvaluateRuntimeException(ERR_ARG1BADTYPE); case 1: final DeclaredFunction fctArg = FunctionUtils.getFunctionArgFromCtx(expressionVisitor, ctx, true); if (fctArg == null) { // this error message might be not so precise but it is exactly what original JSONata (1.8.6) does throw new EvaluateRuntimeException(ERR_ARG2BADTYPE); } - // unfortunately we can not (or at least I do not see how) differ between - // - context evaluates to null - // - no array argument specified at all - // so in every case we signal no match (result = null) break; case 2: // expect something that evaluates to an object and a function declaration - if (arg == null || !arg.isObject()) { - throw new EvaluateRuntimeException(String.format(Constants.ERR_MSG_ARG1_BAD_TYPE, Constants.FUNCTION_EACH)); - } - final ObjectNode object = (ObjectNode) arg; - result = new SelectorArrayNode(JsonNodeFactory.instance); - final ExprContext varid = ctx.exprValues() != null - && ctx.exprValues().exprList() != null - ? ctx.exprValues().exprList().expr(useContext ? 0 : 1) - : null; - if (varid instanceof Var_recallContext) { - TerminalNode VAR_ID = ((Var_recallContext) varid).VAR_ID(); - String varID = varid.getText(); - // get the function to be executed from the functionMap and execute - DeclaredFunction fct = expressionVisitor.getDeclaredFunction(varID); - if (fct != null) { - int varCount = fct.getVariableCount(); - int fctVarCount = fct.getMaxArgs(); - if (varCount > fctVarCount) { - // only send variables function can consume - varCount = fctVarCount; - } - for (Iterator it = object.fieldNames(); it.hasNext();) { - String key = it.next(); - JsonNode field = object.get(key); - ExprValuesContext evc = new ExprValuesContext(ctx, ctx.invokingState); - switch (varCount) { - case 1: { - // just pass the field value - evc = FunctionUtils.fillExprVarContext(varCount, ctx, field); - break; - } - case 2: { - // pass the field value and key - evc = FunctionUtils.fillExprVarContext(varCount, ctx, field); - evc = FunctionUtils.addStringExprVarContext(ctx, evc, key); - break; - } - case 3: { - // pass the field value, key, and object - evc = FunctionUtils.fillExprVarContext(varCount, ctx, field); - evc = FunctionUtils.addStringExprVarContext(ctx, evc, key); - evc = FunctionUtils.addObjectExprVarContext(ctx, evc, object); - break; - } - } - JsonNode fctResult = fct.invoke(expressionVisitor, evc); - if (fctResult != null) { - result.add(fctResult); - } - } - } else { - FunctionBase function = expressionVisitor.getJsonataFunction(varid.getText()); - if (function != null) { - for (Iterator it = object.fieldNames(); it.hasNext();) { - String key = it.next(); - JsonNode field = object.get(key); - Function_callContext callCtx = new Function_callContext(ctx); - // note: callCtx.children should be empty unless carrying an - // exception - result.add(FunctionUtils.processVariablesCallFunction(expressionVisitor, function, VAR_ID, callCtx, field)); - } - } else { - throw new EvaluateRuntimeException( - "Expected function variable reference " + varID + " to resolve to a declared nor Jsonata function."); - } - } - } else if (varid instanceof Function_declContext) { - final Function_declContext fctDeclCtx = ctx.exprValues() != null + if (arg == null) { + final ExprContext varid = ctx.exprValues() != null && ctx.exprValues().exprList() != null - ? (Function_declContext) ctx.exprValues().exprList().expr(useContext ? 0 : 1) + ? ctx.exprValues().exprList().expr(useContext ? 0 : 1) : null; - if (fctDeclCtx != null) { - // we have a declared function for each - VarListContext varList = fctDeclCtx.varList(); - ExprListContext fctBody = fctDeclCtx.exprList(); - DeclaredFunction fct = new DeclaredFunction(varList, fctBody); - int varCount = fct.getVariableCount(); - int fctVarCount = fct.getMaxArgs(); - if (varCount > fctVarCount) { - // only send variables function can consume - varCount = fctVarCount; - } - for (Iterator it = object.fieldNames(); it.hasNext();) { - String key = it.next(); - JsonNode field = object.get(key); - ExprValuesContext evc = new ExprValuesContext(ctx, ctx.invokingState); - switch (varCount) { - case 1: { - // just pass the field value - evc = FunctionUtils.fillExprVarContext(varCount, ctx, field); - break; - } - case 2: { - // pass the field value and key - evc = FunctionUtils.fillExprVarContext(varCount, ctx, field); - evc = FunctionUtils.addStringExprVarContext(ctx, evc, key); - break; - } - case 3: { - // pass the field value, key, and object - evc = FunctionUtils.fillExprVarContext(varCount, ctx, field); - evc = FunctionUtils.addStringExprVarContext(ctx, evc, key); - evc = FunctionUtils.addObjectExprVarContext(ctx, evc, object); - break; - } - } - JsonNode fctResult = fct.invoke(expressionVisitor, evc); - if (fctResult != null) { - result.add(fctResult); - } - } + if (!(varid instanceof Var_recallContext) && !(varid instanceof Function_declContext)) { + throw new EvaluateRuntimeException(ERR_ARG2BADTYPE); } + } else { + result = each(expressionVisitor, ctx, arg, useContext); } break; default: @@ -211,6 +101,108 @@ public JsonNode invoke(ExpressionsVisitor expressionVisitor, Function_callContex return result; } + private SelectorArrayNode each(ExpressionsVisitor expressionVisitor, Function_callContext ctx, final JsonNode arg, final boolean useContext) { + SelectorArrayNode result; + if (!arg.isObject()) { + throw new EvaluateRuntimeException(ERR_ARG1BADTYPE); + } + final ObjectNode object = (ObjectNode) arg; + result = new SelectorArrayNode(JsonNodeFactory.instance); + final ExprContext varid = ctx.exprValues() != null + && ctx.exprValues().exprList() != null + ? ctx.exprValues().exprList().expr(useContext ? 0 : 1) + : null; + if (varid instanceof Var_recallContext) { + invokeDeclaredFunction(expressionVisitor, ctx, result, object, varid); + } else if (varid instanceof Function_declContext) { + invokeFunctionInlined(expressionVisitor, ctx, result, useContext, object); + } else { + throw new EvaluateRuntimeException(ERR_ARG2BADTYPE); + } + return result; + } + + private void invokeDeclaredFunction(ExpressionsVisitor expressionVisitor, Function_callContext ctx, SelectorArrayNode result, final ObjectNode object, + final ExprContext varid) { + final DeclaredFunction fct = expressionVisitor.getDeclaredFunction(varid.getText()); + if (fct != null) { + // invoke user defined function + invokeFunction(expressionVisitor, ctx, result, object, fct); + } else { + final FunctionBase function = expressionVisitor.getJsonataFunction(varid.getText()); + if (function != null) { + invokeJsonataFunction(expressionVisitor, ctx, result, object, varid, function); + } else { + throw new EvaluateRuntimeException(String.format(ERR_ARG2_FUNCTION_RESOLVE, varid.getText())); + } + } + } + + private void invokeJsonataFunction(ExpressionsVisitor expressionVisitor, Function_callContext ctx, SelectorArrayNode result, final ObjectNode object, final ExprContext varid, + final FunctionBase function) { + for (Iterator it = object.fieldNames(); it.hasNext();) { + final String key = it.next(); + final JsonNode field = object.get(key); + final Function_callContext callCtx = new Function_callContext(ctx); + // note: callCtx.children should be empty unless carrying an exception + result.add(FunctionUtils.processVariablesCallFunction(expressionVisitor, function, + ((Var_recallContext) varid).VAR_ID(), callCtx, field)); + } + } + + private void invokeFunctionInlined(ExpressionsVisitor expressionVisitor, Function_callContext ctx, SelectorArrayNode result, final boolean useContext, + final ObjectNode object) { + final Function_declContext fctDeclCtx = ctx.exprValues() != null + && ctx.exprValues().exprList() != null + ? (Function_declContext) ctx.exprValues().exprList().expr(useContext ? 0 : 1) + : null; + if (fctDeclCtx != null) { + final VarListContext varList = fctDeclCtx.varList(); + final ExprListContext fctBody = fctDeclCtx.exprList(); + final DeclaredFunction fct = new DeclaredFunction(varList, fctBody); + invokeFunction(expressionVisitor, ctx, result, object, fct); + } + } + + private void invokeFunction(ExpressionsVisitor expressionVisitor, Function_callContext ctx, SelectorArrayNode result, final ObjectNode object, final DeclaredFunction fct) { + final int varCount = fct.getVariableCount() > fct.getMaxArgs() ? fct.getMaxArgs() : fct.getVariableCount(); + for (Iterator it = object.fieldNames(); it.hasNext();) { + final String key = it.next(); + final JsonNode field = object.get(key); + ExprValuesContext evc = new ExprValuesContext(ctx, ctx.invokingState); + switch (varCount) { + case 1: + // just pass the field value + evc = FunctionUtils.fillExprVarContext(varCount, ctx, field); + break; + case 2: + // pass the field value and key + evc = FunctionUtils.fillExprVarContext(varCount, ctx, field); + evc = FunctionUtils.addStringExprVarContext(ctx, evc, key); + break; + case 3: + // pass the field value, key, and object + evc = FunctionUtils.fillExprVarContext(varCount, ctx, field); + evc = FunctionUtils.addStringExprVarContext(ctx, evc, key); + evc = FunctionUtils.addObjectExprVarContext(ctx, evc, object); + break; + default: + // pass the field value, key, and object + evc = FunctionUtils.fillExprVarContext(varCount, ctx, field); + evc = FunctionUtils.addStringExprVarContext(ctx, evc, key); + evc = FunctionUtils.addObjectExprVarContext(ctx, evc, object); + for (int i = 3; i < varCount; i++) { + evc = FunctionUtils.addStringExprVarContext(ctx, evc, ""); + } + break; + } + final JsonNode fctResult = fct.invoke(expressionVisitor, evc); + if (fctResult != null) { + result.add(fctResult); + } + } + } + @Override public int getMaxArgs() { return 2; diff --git a/src/test/java/com/api/jsonata4java/expressions/functions/EachFunctionTest.java b/src/test/java/com/api/jsonata4java/expressions/functions/EachFunctionTest.java index 2f9136f6..54401566 100644 --- a/src/test/java/com/api/jsonata4java/expressions/functions/EachFunctionTest.java +++ b/src/test/java/com/api/jsonata4java/expressions/functions/EachFunctionTest.java @@ -28,13 +28,46 @@ public class EachFunctionTest { @Test - public void nullInput() throws Exception { - test("$each()", null, null, (String) null); + public void eachWithFunctionInlinedWith1Arg() throws Exception { + test("$each(Address, function($val) {$val})", + "[\n" + + " \"Hursley Park\",\n" + + " \"Winchester\",\n" + + " \"SO21 2JN\"\n" + + "]", + null, + "{\n" + + " \"FirstName\": \"Fred\",\n" + + " \"Address\": {\n" + + " \"Street\": \"Hursley Park\",\n" + + " \"City\": \"Winchester\",\n" + + " \"Postcode\": \"SO21 2JN\"\n" + + " }\n" + + "}"); + } + + @Test + public void eachWithFunctionInlinedWith1ArgReturnNull() throws Exception { + test("$each(Address, function($val) {null})", + "[\n" + + " null,\n" + + " null,\n" + + " null\n" + + "]", + null, + "{\n" + + " \"FirstName\": \"Fred\",\n" + + " \"Address\": {\n" + + " \"Street\": \"Hursley Park\",\n" + + " \"City\": \"Winchester\",\n" + + " \"Postcode\": \"SO21 2JN\"\n" + + " }\n" + + "}"); } @Test - public void eachKeyValuePairIntoArray() throws Exception { - test("$each(Address, function($v, $k) {$k & \": \" & $v})", + public void eachWithFunctionInlinedWith2Args() throws Exception { + test("$each(Address, function($val, $key) {$key & \": \" & $val})", "[\n" + " \"Street: Hursley Park\",\n" + " \"City: Winchester\",\n" @@ -51,9 +84,265 @@ public void eachKeyValuePairIntoArray() throws Exception { + "}"); } + @Test + public void eachWithFunctionInlinedWith3Args() throws Exception { + test("$each(Address, function($val, $key, $obj) {{ $key & \"|\" & $val : $obj }})", + "[\n" + + " {\n" + + " \"Street|Hursley Park\": {\n" + + " \"Street\": \"Hursley Park\",\n" + + " \"City\": \"Winchester\",\n" + + " \"Postcode\": \"SO21 2JN\"\n" + + " }\n" + + " },\n" + + " {\n" + + " \"City|Winchester\": {\n" + + " \"Street\": \"Hursley Park\",\n" + + " \"City\": \"Winchester\",\n" + + " \"Postcode\": \"SO21 2JN\"\n" + + " }\n" + + " },\n" + + " {\n" + + " \"Postcode|SO21 2JN\": {\n" + + " \"Street\": \"Hursley Park\",\n" + + " \"City\": \"Winchester\",\n" + + " \"Postcode\": \"SO21 2JN\"\n" + + " }\n" + + " }\n" + + "]", + null, + "{\n" + + " \"FirstName\": \"Fred\",\n" + + " \"Address\": {\n" + + " \"Street\": \"Hursley Park\",\n" + + " \"City\": \"Winchester\",\n" + + " \"Postcode\": \"SO21 2JN\"\n" + + " }\n" + + "}"); + } + + @Test + public void eachWithFunctionInlinedWith4Args() throws Exception { + test("$each(Address, function($val, $key, $obj, $x) {{ $key & \"|\" & $val : $obj & $x}})", + "[\n" + + " {\n" + + " \"Street|Hursley Park\": \"{\\\"Street\\\":\\\"Hursley Park\\\",\\\"City\\\":\\\"Winchester\\\",\\\"Postcode\\\":\\\"SO21 2JN\\\"}\"\n" + + " },\n" + + " {\n" + + " \"City|Winchester\": \"{\\\"Street\\\":\\\"Hursley Park\\\",\\\"City\\\":\\\"Winchester\\\",\\\"Postcode\\\":\\\"SO21 2JN\\\"}\"\n" + + " },\n" + + " {\n" + + " \"Postcode|SO21 2JN\": \"{\\\"Street\\\":\\\"Hursley Park\\\",\\\"City\\\":\\\"Winchester\\\",\\\"Postcode\\\":\\\"SO21 2JN\\\"}\"\n" + + " }\n" + + "]", + null, + "{\n" + + " \"FirstName\": \"Fred\",\n" + + " \"Address\": {\n" + + " \"Street\": \"Hursley Park\",\n" + + " \"City\": \"Winchester\",\n" + + " \"Postcode\": \"SO21 2JN\"\n" + + " }\n" + + "}"); + } + + @Test + public void eachWithFunctionWith1Arg() throws Exception { + test("($func := function($val) {$val};\n" + + "$each(Address, $func))", + "[\n" + + " \"Hursley Park\",\n" + + " \"Winchester\",\n" + + " \"SO21 2JN\"\n" + + "]", + null, + "{\n" + + " \"FirstName\": \"Fred\",\n" + + " \"Address\": {\n" + + " \"Street\": \"Hursley Park\",\n" + + " \"City\": \"Winchester\",\n" + + " \"Postcode\": \"SO21 2JN\"\n" + + " }\n" + + "}"); + } + + @Test + public void eachWithFunctionWith2Args() throws Exception { + test("($mapKeyValue := function($v, $k) {$k & \": \" & $v};\n" + + "$each(Address, $mapKeyValue))", + "[\n" + + " \"Street: Hursley Park\",\n" + + " \"City: Winchester\",\n" + + " \"Postcode: SO21 2JN\"\n" + + "]", + null, + "{\n" + + " \"FirstName\": \"Fred\",\n" + + " \"Address\": {\n" + + " \"Street\": \"Hursley Park\",\n" + + " \"City\": \"Winchester\",\n" + + " \"Postcode\": \"SO21 2JN\"\n" + + " }\n" + + "})"); + } + + @Test + public void eachWithFunctionWith3Args() throws Exception { + test("($myfunc := function($val, $key, $obj) {{ $key & \"|\" & $val : $obj }};\n" + + "$each(Address, $myfunc))", + "[\n" + + " {\n" + + " \"Street|Hursley Park\": {\n" + + " \"Street\": \"Hursley Park\",\n" + + " \"City\": \"Winchester\",\n" + + " \"Postcode\": \"SO21 2JN\"\n" + + " }\n" + + " },\n" + + " {\n" + + " \"City|Winchester\": {\n" + + " \"Street\": \"Hursley Park\",\n" + + " \"City\": \"Winchester\",\n" + + " \"Postcode\": \"SO21 2JN\"\n" + + " }\n" + + " },\n" + + " {\n" + + " \"Postcode|SO21 2JN\": {\n" + + " \"Street\": \"Hursley Park\",\n" + + " \"City\": \"Winchester\",\n" + + " \"Postcode\": \"SO21 2JN\"\n" + + " }\n" + + " }\n" + + "]", + null, + "{\n" + + " \"FirstName\": \"Fred\",\n" + + " \"Address\": {\n" + + " \"Street\": \"Hursley Park\",\n" + + " \"City\": \"Winchester\",\n" + + " \"Postcode\": \"SO21 2JN\"\n" + + " }\n" + + "}"); + } + + @Test + public void eachWithFunctionWith4Args() throws Exception { + test("($func := function($val, $key, $obj, $x) {{ $key & \"|\" & $val : $obj & $x}};" + + "$each(Address, $func))", + "[\n" + + " {\n" + + " \"Street|Hursley Park\": \"{\\\"Street\\\":\\\"Hursley Park\\\",\\\"City\\\":\\\"Winchester\\\",\\\"Postcode\\\":\\\"SO21 2JN\\\"}\"\n" + + " },\n" + + " {\n" + + " \"City|Winchester\": \"{\\\"Street\\\":\\\"Hursley Park\\\",\\\"City\\\":\\\"Winchester\\\",\\\"Postcode\\\":\\\"SO21 2JN\\\"}\"\n" + + " },\n" + + " {\n" + + " \"Postcode|SO21 2JN\": \"{\\\"Street\\\":\\\"Hursley Park\\\",\\\"City\\\":\\\"Winchester\\\",\\\"Postcode\\\":\\\"SO21 2JN\\\"}\"\n" + + " }\n" + + "]", + null, + "{\n" + + " \"FirstName\": \"Fred\",\n" + + " \"Address\": {\n" + + " \"Street\": \"Hursley Park\",\n" + + " \"City\": \"Winchester\",\n" + + " \"Postcode\": \"SO21 2JN\"\n" + + " }\n" + + "}"); + } + + @Test + public void eachKeyValuePairIntoArrayWithJsonataFunction() throws Exception { + test("$each(Address, $uppercase))", + "[\n" + + " \"HURSLEY PARK\",\n" + + " \"WINCHESTER\",\n" + + " \"SO21 2JN\"\n" + + "]", + null, + "{\n" + + " \"Address\": {\n" + + " \"Street\": \"Hursley Park\",\n" + + " \"City\": \"Winchester\",\n" + + " \"Postcode\": \"SO21 2JN\"\n" + + " }\n" + + "})"); + } + @Test public void combineWithMap() throws Exception { test("$map([{\"a\":1,\"value\":2},{\"b\":3,\"value\":4}],function($obj1){$each($obj1,function($v,$k){$k&\"=\"&$v})})", "[[\"a=1\", \"value=2\"], [\"b=3\", \"value=4\"]]", null, (String) null); } + + @Test + public void agnosticTestSuiteCase002() throws Exception { + test("$each(function($v, $k) {$k[$v>2]})", + "[\"c\", \"d\"]", + null, + "{ \"a\": 1, \"b\": 2, \"c\": 3, \"d\": 4 }"); + } + + @Test + public void undefindedFunction() throws Exception { + test("$each(Address, $xyz))", + null, + String.format(EachFunction.ERR_ARG2_FUNCTION_RESOLVE, "$xyz"), + "{\n" + + " \"Address\": {\n" + + " \"Street\": \"Hursley Park\",\n" + + " \"City\": \"Winchester\",\n" + + " \"Postcode\": \"SO21 2JN\"\n" + + " }\n" + + "})"); + } + + @Test + public void nullInput() throws Exception { + test("$each()", null, EachFunction.ERR_ARG1BADTYPE, (String) null); + } + + @Test + public void nullInputFromChain() throws Exception { + test("null ~> $each()", null, EachFunction.ERR_ARG1BADTYPE, (String) null); + } + + @Test + public void oneArgNoFunctionArg() throws Exception { + test("$each(object)", null, EachFunction.ERR_ARG2BADTYPE, (String) null); + } + + @Test + public void oneArgNoObjectArg() throws Exception { + test("$each(function($v, $k){{$k: $v}})", null, null, (String) null); + } + + @Test + public void twoArgsObjectNoMatch() throws Exception { + test("$each(obj, function($v, $k){{$k: $v}})", null, null, (String) null); + } + + @Test + public void twoArgs1stWrongType() throws Exception { + test("$each(2, function($v, $k){{$k: $v}})", null, EachFunction.ERR_ARG1BADTYPE, (String) null); + } + + @Test + public void twoArgs2ndWrongType() throws Exception { + test("$each({\"key\":\"value\"}, 2)", "[]", EachFunction.ERR_ARG2BADTYPE, (String) null); + } + + @Test + public void twoArgs1stNoMatch2ndWrongType() throws Exception { + test("$each(obj, 2)", null, EachFunction.ERR_ARG2BADTYPE, (String) null); + } + + @Test + public void threeArgs() throws Exception { + test("$each({\"key\":\"value\"}, function($v, $k){{$k: $v}}, 2)", null, EachFunction.ERR_ARG3BADTYPE, (String) null); + } + + @Test + public void threeArgs1stNoMatch() throws Exception { + test("$each(object, function($v, $k){{$k: $v}}, 2)", null, EachFunction.ERR_ARG3BADTYPE, (String) null); + } } From 49f7d9c04e632359426377d353e935f2c28eebd1 Mon Sep 17 00:00:00 2001 From: Martin Bluemel Date: Sat, 3 Dec 2022 13:49:22 +0100 Subject: [PATCH 7/7] Increased test coverage of FilterFunction @Ignore all manual tests in Order to measure overall JUnit test coverage Test coverage: - AbsFunction: 100,0% - EachFunction: 98,2% - FilterFunction: 94,5% - MergeFunction: 100,0% - Overall Coverage: 62,9% Signed-off-by: Martin Bluemel --- .../expressions/functions/EachFunction.java | 9 +- .../expressions/functions/FilterFunction.java | 240 ++++++++---------- .../functions/FilterFunctionTest.java | 128 +++++++++- ...nsTests.java => BasicExpressionsTest.java} | 39 +-- .../java/testmanually/ComponentTestSuite.java | 3 +- .../ExpressionTestPerfomance.java | 2 + .../java/testmanually/JsonataUnitTests.java | 2 + .../testmanually/MapFunctionNonParTests.java | 2 + .../testmanually/TestBindingReference.java | 2 + src/test/java/testmanually/ThreadTester.java | 3 + 10 files changed, 237 insertions(+), 193 deletions(-) rename src/test/java/com/api/jsonata4java/test/expressions/{BasicExpressionsTests.java => BasicExpressionsTest.java} (98%) diff --git a/src/main/java/com/api/jsonata4java/expressions/functions/EachFunction.java b/src/main/java/com/api/jsonata4java/expressions/functions/EachFunction.java index 65a9eea2..93d0b299 100644 --- a/src/main/java/com/api/jsonata4java/expressions/functions/EachFunction.java +++ b/src/main/java/com/api/jsonata4java/expressions/functions/EachFunction.java @@ -101,13 +101,12 @@ public JsonNode invoke(ExpressionsVisitor expressionVisitor, Function_callContex return result; } - private SelectorArrayNode each(ExpressionsVisitor expressionVisitor, Function_callContext ctx, final JsonNode arg, final boolean useContext) { - SelectorArrayNode result; + private SelectorArrayNode each(final ExpressionsVisitor expressionVisitor, final Function_callContext ctx, final JsonNode arg, final boolean useContext) { if (!arg.isObject()) { throw new EvaluateRuntimeException(ERR_ARG1BADTYPE); } final ObjectNode object = (ObjectNode) arg; - result = new SelectorArrayNode(JsonNodeFactory.instance); + final SelectorArrayNode result = new SelectorArrayNode(JsonNodeFactory.instance); final ExprContext varid = ctx.exprValues() != null && ctx.exprValues().exprList() != null ? ctx.exprValues().exprList().expr(useContext ? 0 : 1) @@ -138,8 +137,8 @@ private void invokeDeclaredFunction(ExpressionsVisitor expressionVisitor, Functi } } - private void invokeJsonataFunction(ExpressionsVisitor expressionVisitor, Function_callContext ctx, SelectorArrayNode result, final ObjectNode object, final ExprContext varid, - final FunctionBase function) { + private void invokeJsonataFunction(final ExpressionsVisitor expressionVisitor, final Function_callContext ctx, final SelectorArrayNode result, + final ObjectNode object, final ExprContext varid, final FunctionBase function) { for (Iterator it = object.fieldNames(); it.hasNext();) { final String key = it.next(); final JsonNode field = object.get(key); diff --git a/src/main/java/com/api/jsonata4java/expressions/functions/FilterFunction.java b/src/main/java/com/api/jsonata4java/expressions/functions/FilterFunction.java index 9ea3fc9c..b56615b3 100644 --- a/src/main/java/com/api/jsonata4java/expressions/functions/FilterFunction.java +++ b/src/main/java/com/api/jsonata4java/expressions/functions/FilterFunction.java @@ -22,7 +22,6 @@ package com.api.jsonata4java.expressions.functions; -import java.util.Iterator; import org.antlr.v4.runtime.tree.TerminalNode; import com.api.jsonata4java.expressions.EvaluateRuntimeException; import com.api.jsonata4java.expressions.ExpressionsVisitor; @@ -39,7 +38,6 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.ObjectNode; /** * From http://docs.jsonata.org/higher-order-functions#filter @@ -74,6 +72,7 @@ public class FilterFunction extends FunctionBase { public static String ERR_ARG3BADTYPE = String.format(Constants.ERR_MSG_ARG3_BAD_TYPE, Constants.FUNCTION_FILTER); public static String ERR_ARG1_MUST_BE_ARRAY_OF_OBJECTS = String .format(Constants.ERR_MSG_ARG1_MUST_BE_ARRAY_OF_OBJECTS, Constants.FUNCTION_SPREAD); + public static String ERR_ARG2_FUNCTION_RESOLVE = "Could not resolve function variable reference \"%s\"."; public JsonNode invoke(ExpressionsVisitor expressionVisitor, Function_callContext ctx) { SelectorArrayNode result = new SelectorArrayNode(JsonNodeFactory.instance); @@ -84,144 +83,31 @@ public JsonNode invoke(ExpressionsVisitor expressionVisitor, Function_callContex switch (argCount) { case 0: - if (arg != null) { - throw new EvaluateRuntimeException(ERR_BAD_CONTEXT); - } - // else signal no match (result = null) - break; + throw new EvaluateRuntimeException(ERR_ARG1BADTYPE); case 1: final DeclaredFunction fctArg = FunctionUtils.getFunctionArgFromCtx(expressionVisitor, ctx, true); if (fctArg == null) { // this error message might be not so precise but it is exactly what original JSONata (1.8.6) does throw new EvaluateRuntimeException(ERR_ARG2BADTYPE); } + // TODO // unfortunately we can not (or at least I do not see how) differ between - // - context evaluates to null - // - no array argument specified at all - // so in every case we signal no match (result = null) + // - context evaluates to null: chainedArrayArgNullFuncInlined() + // - no array argument specified at all: missingArrayArgFuncInlined() + // so currently in every case we signal no match (result = null) break; case 2: // expect something that evaluates to an object and either a variable // pointing to a function, or a function declaration - if (arg == null) { - throw new EvaluateRuntimeException(String.format(Constants.ERR_MSG_ARG1_BAD_TYPE, Constants.FUNCTION_FILTER)); - } - - ArrayNode mapArray = (ArrayNode) ExpressionsVisitor.ensureArray(arg); - - ExprValuesContext valuesCtx = ctx.exprValues(); - ExprListContext exprList = valuesCtx.exprList(); - ExprContext varid = exprList.expr((useContext ? 0 : 1)); - if (varid instanceof Var_recallContext) { - TerminalNode VAR_ID = ((Var_recallContext) varid).VAR_ID(); - String varID = varid.getText(); - // get the function to be executed from the functionMap and execute - DeclaredFunction fct = expressionVisitor.getDeclaredFunction(varID); - if (fct != null) { - int varCount = fct.getVariableCount(); - int fctVarCount = fct.getMaxArgs(); - if (varCount > fctVarCount) { - // only send variables function can consume - varCount = fctVarCount; - } - for (int i = 0; i < mapArray.size(); i++) { - JsonNode element = mapArray.get(i); - ExprValuesContext evc = new ExprValuesContext(ctx, ctx.invokingState); - switch (varCount) { - case 1: { - // just pass the mapArray variable - evc = FunctionUtils.fillExprVarContext(varCount, ctx, element); - break; - } - case 2: { - // pass the mapArray variable and index - evc = FunctionUtils.fillExprVarContext(varCount, ctx, element); - evc = FunctionUtils.addIndexExprVarContext(ctx, evc, i); - break; - } - case 3: { - // pass the mapArray variable, index, and array - evc = FunctionUtils.fillExprVarContext(varCount, ctx, element); - evc = FunctionUtils.addIndexExprVarContext(ctx, evc, i); - evc = FunctionUtils.addArrayExprVarContext(ctx, evc, mapArray); - break; - } - } - JsonNode fctResult = fct.invoke(expressionVisitor, evc); - if (fctResult != null && fctResult.asBoolean()) { - result.addAsSelectionGroup(element); - } - } - } else { - FunctionBase function = expressionVisitor.getJsonataFunction(varid.getText()); - if (function != null) { - int optionalArgs = FunctionUtils.getOptionalArgCount(function.getSignature()); - int maxArgs = function.getMaxArgs() - optionalArgs; - for (int i = 0; i < mapArray.size(); i++) { - Function_callContext callCtx = new Function_callContext(ctx); - // note: callCtx.children should be empty unless carrying an - // exception - JsonNode element = mapArray.get(i); - - JsonNode fctResult = null; - if (maxArgs <= 1) { - fctResult = FunctionUtils.processVariablesCallFunction(expressionVisitor, function, VAR_ID, callCtx, element); - } else if (maxArgs == 2) { - fctResult = FunctionUtils.processVariablesCallFunction(expressionVisitor, function, VAR_ID, callCtx, element, - JsonNodeFactory.instance.numberNode(i)); - } else { // if (maxArgs >= 3) { - fctResult = FunctionUtils.processVariablesCallFunction(expressionVisitor, function, VAR_ID, callCtx, element, - JsonNodeFactory.instance.numberNode(i), mapArray); - } - if (fctResult != null && fctResult.asBoolean()) { - result.addAsSelectionGroup(element); - } - } - } else { - throw new EvaluateRuntimeException( - "Expected function variable reference " + varID + " to resolve to a declared nor Jsonata function."); - } - } - } else if (varid instanceof Function_declContext) { - Function_declContext fctDeclCtx = (Function_declContext) exprList.expr((useContext ? 0 : 1)); - - // we have a declared function for filter - VarListContext varList = fctDeclCtx.varList(); - ExprListContext fctBody = fctDeclCtx.exprList(); - DeclaredFunction fct = new DeclaredFunction(varList, fctBody); - int varCount = fct.getVariableCount(); - int fctVarCount = fct.getMaxArgs(); - if (varCount > fctVarCount) { - // only send variables function can consume - varCount = fctVarCount; - } - for (int i = 0; i < mapArray.size(); i++) { - JsonNode element = mapArray.get(i); - ExprValuesContext evc = new ExprValuesContext(ctx, ctx.invokingState); - switch (varCount) { - case 1: { - // just pass the mapArray variable - evc = FunctionUtils.fillExprVarContext(varCount, ctx, element); - break; - } - case 2: { - // pass the mapArray variable and index - evc = FunctionUtils.fillExprVarContext(varCount, ctx, element); - evc = FunctionUtils.addIndexExprVarContext(ctx, evc, i); - break; - } - case 3: { - // pass the mapArray variable, index, and array - evc = FunctionUtils.fillExprVarContext(varCount, ctx, element); - evc = FunctionUtils.addIndexExprVarContext(ctx, evc, i); - evc = FunctionUtils.addArrayExprVarContext(ctx, evc, mapArray); - break; - } - } - JsonNode fctResult = fct.invoke(expressionVisitor, evc); - if (fctResult != null && fctResult.asBoolean()) { - result.addAsSelectionGroup(element); - } + if (arg != null) { + ArrayNode mapArray = (ArrayNode) ExpressionsVisitor.ensureArray(arg); + ExprValuesContext valuesCtx = ctx.exprValues(); + ExprListContext exprList = valuesCtx.exprList(); + ExprContext varid = exprList.expr((useContext ? 0 : 1)); + if (varid instanceof Var_recallContext) { + invokeDeclaredFunction(expressionVisitor, ctx, result, mapArray, varid); + } else if (varid instanceof Function_declContext) { + invokeInlinedFunction(expressionVisitor, ctx, result, useContext, mapArray, exprList); } } break; @@ -234,6 +120,93 @@ public JsonNode invoke(ExpressionsVisitor expressionVisitor, Function_callContex return result; } + private void invokeDeclaredFunction(ExpressionsVisitor expressionVisitor, Function_callContext ctx, SelectorArrayNode result, ArrayNode mapArray, ExprContext varid) { + // get the function to be executed from the functionMap and execute + final DeclaredFunction fct = expressionVisitor.getDeclaredFunction(varid.getText()); + if (fct != null) { + invokeFunction(expressionVisitor, ctx, result, mapArray, fct); + } else { + final FunctionBase function = expressionVisitor.getJsonataFunction(varid.getText()); + if (function != null) { + invokeJsonataFunction(expressionVisitor, ctx, result, mapArray, ((Var_recallContext) varid).VAR_ID(), function); + } else { + throw new EvaluateRuntimeException(String.format(ERR_ARG2_FUNCTION_RESOLVE, varid.getText())); + } + } + } + + private void invokeInlinedFunction(final ExpressionsVisitor expressionVisitor, final Function_callContext ctx, final SelectorArrayNode result, + final boolean useContext, ArrayNode mapArray, final ExprListContext exprList) { + final Function_declContext fctDeclCtx = (Function_declContext) exprList.expr((useContext ? 0 : 1)); + final VarListContext varList = fctDeclCtx.varList(); + final ExprListContext fctBody = fctDeclCtx.exprList(); + final DeclaredFunction fct = new DeclaredFunction(varList, fctBody); + invokeFunction(expressionVisitor, ctx, result, mapArray, fct); + } + + private void invokeJsonataFunction(final ExpressionsVisitor expressionVisitor, final Function_callContext ctx, final SelectorArrayNode result, + final ArrayNode mapArray, final TerminalNode VAR_ID, final FunctionBase function) { + final int optionalArgs = FunctionUtils.getOptionalArgCount(function.getSignature()); + final int maxArgs = function.getMaxArgs() - optionalArgs; + for (int i = 0; i < mapArray.size(); i++) { + final Function_callContext callCtx = new Function_callContext(ctx); + // note: callCtx.children should be empty unless carrying an exception + final JsonNode element = mapArray.get(i); + JsonNode fctResult = null; + if (maxArgs <= 1) { + fctResult = FunctionUtils.processVariablesCallFunction(expressionVisitor, function, VAR_ID, callCtx, element); + } else if (maxArgs == 2) { + fctResult = FunctionUtils.processVariablesCallFunction(expressionVisitor, function, VAR_ID, callCtx, element, + JsonNodeFactory.instance.numberNode(i)); + } else { // if (maxArgs >= 3) { + // Probably never used: TODO: find a JSONata function with fitting signature + fctResult = FunctionUtils.processVariablesCallFunction(expressionVisitor, function, VAR_ID, callCtx, element, + JsonNodeFactory.instance.numberNode(i), mapArray); + } + if (fctResult != null && fctResult.asBoolean()) { + result.addAsSelectionGroup(element); + } + } + } + + private void invokeFunction(ExpressionsVisitor expressionVisitor, Function_callContext ctx, SelectorArrayNode result, ArrayNode mapArray, DeclaredFunction fct) { + final int varCount = fct.getVariableCount() > fct.getMaxArgs() ? fct.getMaxArgs() : fct.getVariableCount(); + for (int i = 0; i < mapArray.size(); i++) { + final JsonNode element = mapArray.get(i); + ExprValuesContext evc = new ExprValuesContext(ctx, ctx.invokingState); + switch (varCount) { + case 1: + // just pass the array element + evc = FunctionUtils.fillExprVarContext(varCount, ctx, element); + break; + case 2: + // pass the array element and index + evc = FunctionUtils.fillExprVarContext(varCount, ctx, element); + evc = FunctionUtils.addIndexExprVarContext(ctx, evc, i); + break; + case 3: + // pass the array element, index, and the complete array + evc = FunctionUtils.fillExprVarContext(varCount, ctx, element); + evc = FunctionUtils.addIndexExprVarContext(ctx, evc, i); + evc = FunctionUtils.addArrayExprVarContext(ctx, evc, mapArray); + break; + default: + // pass the array element, index, and array and empty values + evc = FunctionUtils.fillExprVarContext(varCount, ctx, element); + evc = FunctionUtils.addIndexExprVarContext(ctx, evc, i); + evc = FunctionUtils.addArrayExprVarContext(ctx, evc, mapArray); + for (int j = 3; j < varCount; j++) { + evc = FunctionUtils.addStringExprVarContext(ctx, evc, ""); + } + break; + } + final JsonNode fctResult = fct.invoke(expressionVisitor, evc); + if (fctResult != null && fctResult.asBoolean()) { + result.addAsSelectionGroup(element); + } + } + } + @Override public int getMaxArgs() { return 2; @@ -249,13 +222,4 @@ public String getSignature() { // accepts anything, returns an array of objects return ""; } - - public void addObject(SelectorArrayNode result, ObjectNode obj) { - for (Iterator it = obj.fieldNames(); it.hasNext();) { - String key = it.next(); - ObjectNode cell = JsonNodeFactory.instance.objectNode(); - cell.set(key, obj.get(key)); - result.add(cell); - } - } } diff --git a/src/test/java/com/api/jsonata4java/expressions/functions/FilterFunctionTest.java b/src/test/java/com/api/jsonata4java/expressions/functions/FilterFunctionTest.java index bc291b6e..60e0835f 100644 --- a/src/test/java/com/api/jsonata4java/expressions/functions/FilterFunctionTest.java +++ b/src/test/java/com/api/jsonata4java/expressions/functions/FilterFunctionTest.java @@ -27,11 +27,6 @@ public class FilterFunctionTest { - @Test - public void nullInput() throws Exception { - test("$filter()", null, null, (String) null); - } - @Test public void filterObjects() throws Exception { test(/* expression */ "{\n" @@ -53,13 +48,58 @@ public void filterObjects() throws Exception { } @Test - public void filterNumbers() throws Exception { - test("($x:=function($l){$l>2};$filter([1,5,3,4,2],$x))", "[5, 3, 4]", null, null); + public void filterNumbersFuncInlined() throws Exception { + test("$filter([1,5,3,4,2], function($n){$n>2})", "[5,3,4]", null, null); + } + + @Test + public void filterNumbersFuncDeclared() throws Exception { + test("($x:=function($n){$n>2};$filter([1,5,3,4,2], $x))", "[5,3,4]", null, null); + } + + @Test + public void filterNumbersFuncJsonata1() throws Exception { + test("$filter([-2,-1,0,1,2], $abs)", "[-2,-1,1,2]", null, null); + } + + @Test + public void filterNumbersFuncJsonataIncompatible() throws Exception { + test("$filter([1,5,3,4,2], $substring)", null, "Context value is not a compatible type with argument 1 of function \"$substring\"", (String) null); + } + + @Test + public void filterNumbersFuncJsonataArgNotMatch1() throws Exception { + test("$filter([1,5,3,4,2], $pad)", null, "Argument 1 of function $pad does not match function signature", (String) null); + } + + @Test + public void filterNumbersFuncJsonataArgNotMatch2() throws Exception { + test("$filter([1,5,3,4,2], $split)", null, "Argument 2 of function $split does not match function signature", (String) null); + } + + @Test + public void filterNumbersFuncJsonata2() throws Exception { + test("$filter([1,5,3,4,2], $reduce)", "[1,5,3,4,2]", null, (String) null); } @Test public void filterNumbersOdd() throws Exception { - test("($x:=function($l){$l%2=1};$filter([1,5,3,4,2],$x))", "[1, 5, 3]", null, null); + test("($x:=function($n){$n%2=1};$filter([1,5,3,4,2],$x))", "[1,5,3]", null, null); + } + + @Test + public void filterNumbersByIndex() throws Exception { + test("$filter([10,4,45,2,13,7], function($n, $i){$i < 3})", "[10,4,45]", null, null); + } + + @Test + public void filterNumbersByIndexAndCompleteArray() throws Exception { + test("$filter([10,4,45,2,13,7], function($n, $i, $a){$i > 0 and $a[$i - 1] >= 10})", "[4,2,7]", null, null); + } + + @Test + public void filterNumbersByIndexAndCompleteArrayPlusArg() throws Exception { + test("$filter([10,4,45,2,13,7], function($n, $i, $a, $s){$i > 0 and $a[$i - 1] >= 10 and $s})", null, null, (String) null); } @Test @@ -77,13 +117,62 @@ public void filterAll() throws Exception { } @Test - public void filterMissingFunctionArg() throws Exception { + public void noInput() throws Exception { + test("$filter()", null, FilterFunction.ERR_ARG1BADTYPE, (String) null); + } + + @Test + public void nullInput() throws Exception { + test("$filter(null)", null, FilterFunction.ERR_ARG2BADTYPE, (String) null); + } + + @Test + public void nullInputChain() throws Exception { + test("null ~> $filter()", null, FilterFunction.ERR_ARG1BADTYPE, (String) null); + } + + @Test + public void missingFunctionArg() throws Exception { test("$filter([1,5,3,4,2])", null, FilterFunction.ERR_ARG2BADTYPE, (String) null); } + // Original JSONata FilterFunction.ERR_ARG2BADTYPE + // FIXME how to differ this case from chainedArrayArgNullFuncInlined() + @Test + public void missingArrayArgFuncInlined() throws Exception { + test("$filter(function($n){$n>2})", null, null, (String) null); + } + + // Original JSONata FilterFunction.ERR_ARG2BADTYPE + // FIXME how to differ this case from chainedArrayArgNullFuncInlined() + @Test + public void missingArrayArgFuncDeclared() throws Exception { + test("($func:=function($n){$n>2};$filter($func))", null, null, (String) null); + } + + @Test + public void filterNumbersFuncNotDeclared() throws Exception { + test("$filter([1,5,3,4,2], $func)", "[5,3,4]", String.format(FilterFunction.ERR_ARG2_FUNCTION_RESOLVE, "$func"), null); + } + + @Test + public void filterNumbersFuncReturnsNothing() throws Exception { + test("$filter([1,5,3,4,2], function($n){null})", null, null, (String) null); + } + + @Test + public void filterNumbersFuncReturnsNoBoolean() throws Exception { + test("$filter([1,5,3,4,2], function($n){\"foo\"})", null, null, (String) null); + } + @Test - public void filterMissingArrayArg() throws Exception { - test("($x:=function($l){$l>2};$filter($x))", null, null, (String) null); + public void chainedArrayArgNullFuncInlined() throws Exception { + test("null ~> $filter(function($n){$n>2})", null, null, (String) null); + } + + @Test + public void chainedArgEmptyFuncInlined() throws Exception { + test("[] ~> $filter(function($n){$n>2})", null, null, (String) null); } @Test @@ -101,4 +190,21 @@ public void filterNumbersEmpty() throws Exception { + " ]\n" + "}"); } + + @Test + public void nullArrayArg() throws Exception { + test("$filter(null, function($n){$n>2})", null, + "The expressions either side of operator \">\" must evaluate to numeric or string values", + (String) null); + } + + @Test + public void noMatchArrayArg() throws Exception { + test("$filter(n, function($n){$n>2})", null, null, (String) null); + } + + @Test + public void tooMuchArgs() throws Exception { + test("$filter([1,5,3], function($n){$n>2}, \"test\")", null, FilterFunction.ERR_ARG3BADTYPE, (String) null); + } } diff --git a/src/test/java/com/api/jsonata4java/test/expressions/BasicExpressionsTests.java b/src/test/java/com/api/jsonata4java/test/expressions/BasicExpressionsTest.java similarity index 98% rename from src/test/java/com/api/jsonata4java/test/expressions/BasicExpressionsTests.java rename to src/test/java/com/api/jsonata4java/test/expressions/BasicExpressionsTest.java index 56736c58..44b5db95 100644 --- a/src/test/java/com/api/jsonata4java/test/expressions/BasicExpressionsTests.java +++ b/src/test/java/com/api/jsonata4java/test/expressions/BasicExpressionsTest.java @@ -44,7 +44,6 @@ import com.api.jsonata4java.expressions.functions.CountFunction; import com.api.jsonata4java.expressions.functions.ExistsFunction; import com.api.jsonata4java.expressions.functions.LookupFunction; -import com.api.jsonata4java.expressions.functions.MergeFunction; import com.api.jsonata4java.expressions.functions.ShuffleFunction; import com.api.jsonata4java.expressions.functions.SubstringFunction; import com.api.jsonata4java.expressions.functions.SumFunction; @@ -67,7 +66,7 @@ * class. Retained because we might as well keep them (they execute in seconds). */ @SuppressWarnings("deprecation") -public class BasicExpressionsTests implements Serializable { +public class BasicExpressionsTest implements Serializable { private static final long serialVersionUID = -2403728781442037506L; @@ -1037,41 +1036,6 @@ public void testObjectFunctions() throws Exception { simpleTest("$spread([1])", "[1]"); - // jsonata.js 1.8 docs only talk about objects and arrays of objects - // but changed code to behave like jsonata.js - // { - // try { - // Expressions.parse("$spread([1])").evaluate(null); - // Assert.fail("Did not throw an expected exception"); - // } catch (EvaluateException ex) { - // Assert.assertEquals(SpreadFunction.ERR_ARG1_MUST_BE_ARRAY_OF_OBJECTS, - // ex.getMessage()); - // } - // } - - simpleTest("$merge([{\"a\":1,\"value\":2},{\"b\":{\"value\":{\"d\":5},\"c\":5}},{\"a\":2}])", - "{\"a\":2, \"value\":2, \"b\":{\"value\":{\"d\":5},\"c\":5}}"); - simpleTest("$merge(a.b)", null); - - { - Expressions expression = Expressions.parse("$merge()"); - try { - expression.evaluate(null); - Assert.fail("Did not throw an expected exception"); - } catch (EvaluateException ex) { - Assert.assertEquals(MergeFunction.ERR_ARG1BADTYPE, ex.getMessage()); - } - } - { - Expressions expression = Expressions.parse("$merge({\"hello\":1},2)"); - try { - expression.evaluate(null); - Assert.fail("Did not throw an expected exception"); - } catch (EvaluateException ex) { - Assert.assertEquals(MergeFunction.ERR_ARG2BADTYPE, ex.getMessage()); - } - } - // issue #237 JsonNode payload = mapper.readTree("{ \"key1\": \"\\\"v1\\\"\" }"); JsonNode result1 = Expressions.parse("$each($, function($v, $k) {({ $k: $v})}) ~> $merge()").evaluate(payload); @@ -2131,7 +2095,6 @@ public void testBasicSelection() throws Exception { // selecting empty member names simpleTest("[{\"\":1}, {\"\":2}].``", "[1,2]"); - } @Test diff --git a/src/test/java/testmanually/ComponentTestSuite.java b/src/test/java/testmanually/ComponentTestSuite.java index d11db62f..2ec2f434 100644 --- a/src/test/java/testmanually/ComponentTestSuite.java +++ b/src/test/java/testmanually/ComponentTestSuite.java @@ -23,6 +23,7 @@ package testmanually; import java.io.Serializable; +import org.junit.Ignore; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; @@ -123,7 +124,7 @@ UppercaseFunctionTests.class, // TestBindingReference.class // }) - +@Ignore public class ComponentTestSuite implements Serializable { private static final long serialVersionUID = 2033074749160537540L; diff --git a/src/test/java/testmanually/ExpressionTestPerfomance.java b/src/test/java/testmanually/ExpressionTestPerfomance.java index 9b07ef2d..54551ffd 100644 --- a/src/test/java/testmanually/ExpressionTestPerfomance.java +++ b/src/test/java/testmanually/ExpressionTestPerfomance.java @@ -22,6 +22,7 @@ package testmanually; +import org.junit.Ignore; import org.junit.Test; import com.api.jsonata4java.expressions.Jsonata4JavaTestMapper; import com.fasterxml.jackson.core.JsonProcessingException; @@ -34,6 +35,7 @@ * * @author Martin Bluemel */ +@Ignore public class ExpressionTestPerfomance { private final ObjectMapper jsonMapper = new ObjectMapper(); diff --git a/src/test/java/testmanually/JsonataUnitTests.java b/src/test/java/testmanually/JsonataUnitTests.java index 3d11cef8..7184b88a 100644 --- a/src/test/java/testmanually/JsonataUnitTests.java +++ b/src/test/java/testmanually/JsonataUnitTests.java @@ -26,6 +26,7 @@ import java.io.Serializable; import java.util.Arrays; import java.util.Collection; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -37,6 +38,7 @@ * Verify behavior when access special $state, $event and $instance variables. */ @RunWith(Parameterized.class) +@Ignore public class JsonataUnitTests implements Serializable { private static final long serialVersionUID = -862598258330086928L; diff --git a/src/test/java/testmanually/MapFunctionNonParTests.java b/src/test/java/testmanually/MapFunctionNonParTests.java index a4549752..42df1db4 100644 --- a/src/test/java/testmanually/MapFunctionNonParTests.java +++ b/src/test/java/testmanually/MapFunctionNonParTests.java @@ -23,6 +23,7 @@ package testmanually; import static com.api.jsonata4java.expressions.utils.Utils.test; +import org.junit.Ignore; import org.junit.Test; /** @@ -30,6 +31,7 @@ * * @author Martin Bluemel */ +@Ignore public class MapFunctionNonParTests { // @Test diff --git a/src/test/java/testmanually/TestBindingReference.java b/src/test/java/testmanually/TestBindingReference.java index 07806c6b..028670cb 100644 --- a/src/test/java/testmanually/TestBindingReference.java +++ b/src/test/java/testmanually/TestBindingReference.java @@ -2,6 +2,7 @@ import java.io.Serializable; import org.junit.Assert; +import org.junit.Ignore; import org.junit.Test; import com.api.jsonata4java.Expression; import com.api.jsonata4java.expressions.utils.Utils; @@ -9,6 +10,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; +@Ignore public class TestBindingReference implements Serializable { private static final long serialVersionUID = -7721819254928734600L; diff --git a/src/test/java/testmanually/ThreadTester.java b/src/test/java/testmanually/ThreadTester.java index 1b88eba8..4a21fbcb 100644 --- a/src/test/java/testmanually/ThreadTester.java +++ b/src/test/java/testmanually/ThreadTester.java @@ -1,4 +1,6 @@ package testmanually; + +import org.junit.Ignore; import org.junit.Test; import org.springframework.core.task.SimpleAsyncTaskExecutor; import org.springframework.core.task.TaskExecutor; @@ -6,6 +8,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +@Ignore public class ThreadTester { static boolean showError = false;