From e487321334cfd7b704653cde61021b7c08ed7c36 Mon Sep 17 00:00:00 2001 From: mikhail-barg Date: Fri, 21 Jan 2022 01:28:01 +0300 Subject: [PATCH] v1.2.0 - renamed stuff and added proper bindings api --- README.md | 4 +- .../Jsonata.Net.Native.TestSuite.xml | 6298 ++++++++--------- src/Jsonata.Net.Native/Eval/Attributes.cs | 4 +- .../Eval/BuiltinFunctions.cs | 10 +- src/Jsonata.Net.Native/Eval/Environment.cs | 99 - src/Jsonata.Net.Native/Eval/EvalProcessor.cs | 90 +- .../Eval/EvaluationSupplement.cs | 18 + src/Jsonata.Net.Native/Eval/FunctionToken.cs | 2 +- .../Eval/FunctionTokenCsharp.cs | 27 +- .../Eval/FunctionTokenLambda.cs | 10 +- .../Eval/FunctionTokenPartial.cs | 2 +- .../Eval/FunctionTokenRegex.cs | 2 +- .../Eval/FunctionTokenTransformation.cs | 6 +- .../EvaluationEnvironment.cs | 112 + .../Jsonata.Net.Native.csproj | 2 +- src/Jsonata.Net.Native/JsonataQuery.cs | 16 +- src/Jsonata.Net.Native/Program.cs | 23 - src/TestApp/Program.cs | 49 +- 18 files changed, 3420 insertions(+), 3354 deletions(-) delete mode 100644 src/Jsonata.Net.Native/Eval/Environment.cs create mode 100644 src/Jsonata.Net.Native/Eval/EvaluationSupplement.cs create mode 100644 src/Jsonata.Net.Native/EvaluationEnvironment.cs delete mode 100644 src/Jsonata.Net.Native/Program.cs diff --git a/README.md b/README.md index b54b0df..78e2f1f 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,9 @@ Debug.Assert(result.ToString(Formatting.None) == "\"b\""); * `JsonataQuery` objects are immutable and therefore reusable and thread-safe. * It is possible to provide additional variable bindings via `bindings` arg of `Eval()` call. - * Additional functional bindings are work in progress (*TODO*: functionality is same as for built-in function implementations, but need to provide user API) +* It is possible to provide additional functional bindings via `Eval(JToken data, EvaluationEnvironment environment)` call. See [example](src/TestApp/Program.cs) + * Functionality is same as for [built-in function implementations](src/Jsonata.Net.Native/Eval/BuiltinFunctions.cs) + * You may use a number of [argument attributes](src/Jsonata.Net.Native/Eval/Attributes.cs) to get fancy behavior if needed. Also refer to [built-in function implementations](src/Jsonata.Net.Native/Eval/BuiltinFunctions.cs) * Error codes are mostly in sync with the [JS implementation](https://github.com/jsonata-js/jsonata/blob/65e854d6bfee1d1413ebff7f1a185834c6c42265/src/jsonata.js#L1919), but some checkup is to be done later (*TODO*). We also provide an [Exerciser app](https://github.com/mikhail-barg/jsonata.net.native/tree/master/src/JsonataExerciser) with same functionality as in original [JSONata Exerciser](https://try.jsonata.org/): diff --git a/src/Jsonata.Net.Native.TestSuite/TestReport/Jsonata.Net.Native.TestSuite.xml b/src/Jsonata.Net.Native.TestSuite/TestReport/Jsonata.Net.Native.TestSuite.xml index 7a1bc28..cc5d63d 100644 --- a/src/Jsonata.Net.Native.TestSuite/TestReport/Jsonata.Net.Native.TestSuite.xml +++ b/src/Jsonata.Net.Native.TestSuite/TestReport/Jsonata.Net.Native.TestSuite.xml @@ -1,6 +1,6 @@ - - + + Jsonata.Net.Native.TestSuite.Tests.array-constructor.array-sequences[1] @@ -1616,11 +1616,11 @@ Jsonata.Net.Native.TestSuite.Tests.wildcards.case009 - + - + @@ -1629,39 +1629,39 @@ - + - + - + - + - + - + - + - + @@ -1670,7 +1670,7 @@ Result: '[[3,1578381600],[5,1578381700]]' Expected: '[[3,1578381600],[5,1578381700]]' ]]> - + @@ -1679,7 +1679,7 @@ Result: '[[3,1578381600]]' Expected: '[[3,1578381600]]' ]]> - + @@ -1688,7 +1688,7 @@ Result: '[3,1578381600]' Expected: '[3,1578381600]' ]]> - + @@ -1697,7 +1697,7 @@ Result: '[{"foo":"bar"}]' Expected: '[{"foo":"bar"}]' ]]> - + @@ -1706,7 +1706,7 @@ Result: '[{"foo":"bar"}]' Expected: '[{"foo":"bar"}]' ]]> - + @@ -1715,7 +1715,7 @@ Result: '[]' Expected: '[]' ]]> - + @@ -1724,7 +1724,7 @@ Result: '[1]' Expected: '[1]' ]]> - + @@ -1733,7 +1733,7 @@ Result: '[1,2]' Expected: '[1,2]' ]]> - + @@ -1742,7 +1742,7 @@ Result: '[1,2,3]' Expected: '[1,2,3]' ]]> - + @@ -1751,7 +1751,7 @@ Result: '[1,2,[3,4]]' Expected: '[1,2,[3,4]]' ]]> - + @@ -1760,7 +1760,7 @@ Result: '[1,"two",["three",4]]' Expected: '[1,"two",["three",4]]' ]]> - + @@ -1769,7 +1769,7 @@ Result: '[1,2,["three","four"]]' Expected: '[1,2,["three","four"]]' ]]> - + @@ -1778,7 +1778,7 @@ Result: '["foo.bar",42,["foo.baz",{"fud":"hello"},{"fud":"world"}]]' Expected: '["foo.bar",42,["foo.baz",{"fud":"hello"},{"fud":"world"}]]' ]]> - + @@ -1787,7 +1787,7 @@ Result: '1' Expected: '1' ]]> - + @@ -1796,7 +1796,7 @@ Result: '[3,4]' Expected: '[3,4]' ]]> - + @@ -1805,7 +1805,7 @@ Result: '4' Expected: '4' ]]> - + @@ -1814,7 +1814,7 @@ Result: '[["hello","hello"],["world","world"]]' Expected: '[["hello","hello"],["world","world"]]' ]]> - + @@ -1823,7 +1823,7 @@ Result: '[[["hello","hello"]],[["world","world"]]]' Expected: '[[["hello","hello"]],[["world","world"]]]' ]]> - + @@ -1832,7 +1832,7 @@ Result: '"hello"' Expected: '"hello"' ]]> - + @@ -1841,7 +1841,7 @@ Result: '["hello","world"]' Expected: '["hello","world"]' ]]> - + @@ -1850,7 +1850,7 @@ Result: '["Winchester","London"]' Expected: '["Winchester","London"]' ]]> - + @@ -1859,7 +1859,7 @@ Result: '["Winchester","London"]' Expected: '["Winchester","London"]' ]]> - + @@ -1868,7 +1868,7 @@ Result: '[0,2,4,6,8]' Expected: '[0,2,4,6,8]' ]]> - + @@ -1877,7 +1877,7 @@ Result: '[1,2,3]' Expected: '[1,2,3]' ]]> - + @@ -1886,7 +1886,7 @@ Result: '[1,2,3]' Expected: '[1,2,3]' ]]> - + @@ -1895,7 +1895,7 @@ Result: '[1,2,3]' Expected: '[1,2,3]' ]]> - + @@ -1904,7 +1904,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -1913,7 +1913,7 @@ Result: '3' Expected: '3' ]]> - + @@ -1922,7 +1922,7 @@ Result: '3' Expected: '3' ]]> - + @@ -1931,7 +1931,7 @@ Result: '7' Expected: '7' ]]> - + @@ -1940,7 +1940,7 @@ Result: '[68.9,21.67,137.8,107.99]' Expected: '[68.9,21.67,137.8,107.99]' ]]> - + @@ -1949,7 +1949,7 @@ Result: '"order103"' Expected: '"order103"' ]]> - + @@ -1958,7 +1958,7 @@ Result: '"order103"' Expected: '"order103"' ]]> - + @@ -1967,7 +1967,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -1976,7 +1976,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -1985,7 +1985,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -1994,7 +1994,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2003,7 +2003,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2012,7 +2012,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2021,7 +2021,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2030,7 +2030,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2039,7 +2039,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2048,7 +2048,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2057,7 +2057,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2066,7 +2066,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2075,7 +2075,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2084,7 +2084,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2093,7 +2093,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2102,7 +2102,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2111,7 +2111,7 @@ Result: '["fakeintegrationname"]' Expected: '["fakeintegrationname"]' ]]> - + @@ -2120,7 +2120,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2129,7 +2129,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2138,7 +2138,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2147,7 +2147,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2156,7 +2156,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2165,7 +2165,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2174,7 +2174,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2183,7 +2183,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2192,7 +2192,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2201,7 +2201,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2210,7 +2210,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -2220,7 +2220,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2230,7 +2230,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2241,7 +2241,7 @@ Expected: 'false' Expr is '$type(age) = 'number' or $number(age) > 0' ]]> - + @@ -2250,7 +2250,7 @@ Result: '{"Account":"Firefly","SKU-858383":"Bowler Hat","SKU-345664":"Cloak"}' Expected: '{"Account":"Firefly","SKU-858383":"Bowler Hat","SKU-345664":"Cloak"}' ]]> - + @@ -2259,7 +2259,7 @@ Result: '{"Account":"Firefly","SKU-858383":"Bowler Hat","SKU-345664":"Cloak"}' Expected: '{"Account":"Firefly","SKU-858383":"Bowler Hat","SKU-345664":"Cloak"}' ]]> - + @@ -2270,7 +2270,7 @@ Result: '2' Expected: '2' ]]> - + @@ -2280,7 +2280,7 @@ Result: '"Hello"' Expected: '"Hello"' ]]> - + @@ -2292,7 +2292,7 @@ Expected: '"Hello"' ' ]]> - + @@ -2326,7 +2326,7 @@ Result: '16' Expected: '16' ]]> - + @@ -2335,7 +2335,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2344,7 +2344,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2353,7 +2353,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2362,7 +2362,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2371,7 +2371,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2380,7 +2380,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2389,7 +2389,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2398,7 +2398,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2408,7 +2408,7 @@ Expected: 'true' - + @@ -2418,7 +2418,7 @@ Expected: 'true' - + @@ -2428,7 +2428,7 @@ Expected: 'true' = true' ]]> - + @@ -2437,7 +2437,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2446,7 +2446,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2455,7 +2455,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2464,7 +2464,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2473,7 +2473,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2482,7 +2482,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2491,7 +2491,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2500,7 +2500,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2509,7 +2509,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2518,7 +2518,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2527,7 +2527,7 @@ Result: '{"fud":"hello"}' Expected: '{"fud":"hello"}' ]]> - + @@ -2536,7 +2536,7 @@ Result: '{"fud":"hello"}' Expected: '{"fud":"hello"}' ]]> - + @@ -2545,7 +2545,7 @@ Result: '[34.45,34.45,107.99]' Expected: '[34.45,34.45,107.99]' ]]> - + @@ -2554,7 +2554,7 @@ Result: '[34.45,21.67,34.45]' Expected: '[34.45,21.67,34.45]' ]]> - + @@ -2564,7 +2564,7 @@ Expected: '[34.45,21.67,34.45]' 1' ]]> - + @@ -2574,7 +2574,7 @@ Expected: '[34.45,21.67,34.45]' $x' ]]> - + @@ -2583,7 +2583,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -2592,7 +2592,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -2601,7 +2601,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2610,7 +2610,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2619,7 +2619,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2628,7 +2628,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2637,7 +2637,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2646,7 +2646,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2655,7 +2655,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2664,7 +2664,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2673,7 +2673,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2682,7 +2682,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2691,7 +2691,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2700,7 +2700,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2709,7 +2709,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2718,7 +2718,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2727,7 +2727,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2736,7 +2736,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2745,7 +2745,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2754,7 +2754,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -2763,7 +2763,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -2772,7 +2772,7 @@ Result: '"Red"' Expected: '"Red"' ]]> - + @@ -2781,7 +2781,7 @@ Result: '"White"' Expected: '"White"' ]]> - + @@ -2790,7 +2790,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -2799,7 +2799,7 @@ Result: '"Red"' Expected: '"Red"' ]]> - + @@ -2808,7 +2808,7 @@ Result: '"White"' Expected: '"White"' ]]> - + @@ -2817,7 +2817,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -2826,7 +2826,7 @@ Result: '"Cheap"' Expected: '"Cheap"' ]]> - + @@ -2835,7 +2835,7 @@ Result: '["Expensive","Cheap","Expensive","Expensive"]' Expected: '["Expensive","Cheap","Expensive","Expensive"]' ]]> - + @@ -2844,7 +2844,7 @@ Result: '["Expensive","Cheap","Expensive","Rip off"]' Expected: '["Expensive","Cheap","Expensive","Rip off"]' ]]> - + @@ -2853,7 +2853,7 @@ Result: '5' Expected: '5' ]]> - + @@ -2862,7 +2862,7 @@ Result: '["1","2","3","4","5"]' Expected: '["1","2","3","4","5"]' ]]> - + @@ -2871,7 +2871,7 @@ Result: '["Item 1","Item 2","Item 3","Item 4","Item 5"]' Expected: '["Item 1","Item 2","Item 3","Item 4","Item 5"]' ]]> - + @@ -2880,7 +2880,7 @@ Result: '["BOWLER","TRILBY","BOWLER","CLOAK"]' Expected: '["BOWLER","TRILBY","BOWLER","CLOAK"]' ]]> - + @@ -2889,7 +2889,7 @@ Result: '[{"baz":{"fud":"hello"}},{"baz":{"fud":"world"}},{"bazz":"gotcha"}]' Expected: '[{"baz":{"fud":"hello"}},{"baz":{"fud":"world"}},{"bazz":"gotcha"}]' ]]> - + @@ -2898,7 +2898,7 @@ Result: '[{"fud":"hello"},{"fud":"world"}]' Expected: '[{"fud":"hello"},{"fud":"world"}]' ]]> - + @@ -2907,7 +2907,7 @@ Result: '["hello","world"]' Expected: '["hello","world"]' ]]> - + @@ -2916,7 +2916,7 @@ Result: '["hello","world"]' Expected: '["hello","world"]' ]]> - + @@ -2925,7 +2925,7 @@ Result: '["hello","world"]' Expected: '["hello","world"]' ]]> - + @@ -2934,7 +2934,7 @@ Result: '["hello","world"]' Expected: '["hello","world"]' ]]> - + @@ -2943,7 +2943,7 @@ Result: '["hello","world"]' Expected: '["hello","world"]' ]]> - + @@ -2952,7 +2952,7 @@ Result: '["hello","world"]' Expected: '["hello","world"]' ]]> - + @@ -2961,7 +2961,7 @@ Result: '["Purple","Orange","Purple","Black"]' Expected: '["Purple","Orange","Purple","Black"]' ]]> - + @@ -2970,7 +2970,7 @@ Result: '["hello","world"]' Expected: '["hello","world"]' ]]> - + @@ -2979,7 +2979,7 @@ Result: '"hello"' Expected: '"hello"' ]]> - + @@ -2988,7 +2988,7 @@ Result: '"hello"' Expected: '"hello"' ]]> - + @@ -2997,7 +2997,7 @@ Result: '[34.45,21.67,34.45,107.99]' Expected: '[34.45,21.67,34.45,107.99]' ]]> - + @@ -3006,7 +3006,7 @@ Result: '[34.45,21.67,34.45,107.99]' Expected: '[34.45,21.67,34.45,107.99]' ]]> - + @@ -3015,7 +3015,7 @@ Result: '34.45' Expected: '34.45' ]]> - + @@ -3024,7 +3024,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -3033,7 +3033,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -3042,7 +3042,7 @@ Result: '"aGVsbG86d29ybGQ="' Expected: '"aGVsbG86d29ybGQ="' ]]> - + @@ -3051,7 +3051,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -3060,7 +3060,7 @@ Result: '"hello:world"' Expected: '"hello:world"' ]]> - + @@ -3069,7 +3069,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -3079,7 +3079,7 @@ Expected 'undefined' - + @@ -3089,7 +3089,7 @@ Expected 'undefined' - + @@ -3099,7 +3099,7 @@ Expected 'undefined' - + @@ -3109,7 +3109,7 @@ Expected 'undefined' - + @@ -3119,7 +3119,7 @@ Expected 'undefined' - + @@ -3129,7 +3129,7 @@ Expected 'undefined' - + @@ -3139,7 +3139,7 @@ Expected 'undefined' - + @@ -3149,7 +3149,7 @@ Expected 'undefined' - + @@ -3159,7 +3159,7 @@ Expected 'undefined' - + @@ -3169,7 +3169,7 @@ Expected 'undefined' - + @@ -3179,7 +3179,7 @@ Expected 'undefined' - + @@ -3197,7 +3197,7 @@ Expected 'undefined' - + @@ -3207,7 +3207,7 @@ Expected 'undefined' - + @@ -3217,7 +3217,7 @@ Expected 'undefined' - + @@ -3227,7 +3227,7 @@ Expected 'undefined' - + @@ -3237,7 +3237,7 @@ Expected 'undefined' - + @@ -3247,7 +3247,7 @@ Expected 'undefined' - + @@ -3257,7 +3257,7 @@ Expected 'undefined' - + @@ -3267,7 +3267,7 @@ Expected 'undefined' - + @@ -3277,7 +3277,7 @@ Expected 'undefined' - + @@ -3287,7 +3287,7 @@ Expected 'undefined' 5' ]]> - + @@ -3297,7 +3297,7 @@ Expected 'undefined' - + @@ -3307,7 +3307,7 @@ Expected 'undefined' - + @@ -3317,7 +3317,7 @@ Expected 'undefined' - + @@ -3327,21 +3327,21 @@ Expected 'undefined' - + - + - + @@ -3350,7 +3350,7 @@ Result: '42' Expected: '42' ]]> - + @@ -3359,7 +3359,7 @@ Result: '[{"baz":{"fud":"hello"}},{"baz":{"fud":"world"}},{"bazz":"gotcha"}]' Expected: '[{"baz":{"fud":"hello"}},{"baz":{"fud":"world"}},{"bazz":"gotcha"}]' ]]> - + @@ -3368,7 +3368,7 @@ Result: '"gotcha"' Expected: '"gotcha"' ]]> - + @@ -3377,7 +3377,7 @@ Result: '[{"fud":"hello"},{"fud":"world"}]' Expected: '[{"fud":"hello"},{"fud":"world"}]' ]]> - + @@ -3386,7 +3386,7 @@ Result: '["hello","world"]' Expected: '["hello","world"]' ]]> - + @@ -3395,7 +3395,7 @@ Result: 'null' Expected: 'null' ]]> - + @@ -3404,7 +3404,7 @@ Result: '"gotcha"' Expected: '"gotcha"' ]]> - + @@ -3413,7 +3413,7 @@ Result: '["hello","world"]' Expected: '["hello","world"]' ]]> - + @@ -3422,7 +3422,7 @@ Result: '[{"number":0},{"number":1},{"number":2}]' Expected: '[{"number":0},{"number":1},{"number":2}]' ]]> - + @@ -3431,7 +3431,7 @@ Result: '{"number":0}' Expected: '{"number":0}' ]]> - + @@ -3440,7 +3440,7 @@ Result: '[{"number":0}]' Expected: '[{"number":0}]' ]]> - + @@ -3449,7 +3449,7 @@ Result: '0' Expected: '0' ]]> - + @@ -3458,7 +3458,7 @@ Result: '0' Expected: '0' ]]> - + @@ -3467,7 +3467,7 @@ Result: '[0,1,2]' Expected: '[0,1,2]' ]]> - + @@ -3476,7 +3476,7 @@ Result: '{"Hello":"World"}' Expected: '{"Hello":"World"}' ]]> - + @@ -3485,7 +3485,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -3494,7 +3494,7 @@ Result: '[[34.45,21.67],[34.45,107.99]]' Expected: '[[34.45,21.67],[34.45,107.99]]' ]]> - + @@ -3503,7 +3503,7 @@ Result: '[1,2,3,4]' Expected: '[1,2,3,4]' ]]> - + @@ -3512,7 +3512,7 @@ Result: '[1,2,3,4]' Expected: '[1,2,3,4]' ]]> - + @@ -3521,7 +3521,7 @@ Result: '{"nest0":[1,2]}' Expected: '{"nest0":[1,2]}' ]]> - + @@ -3530,7 +3530,7 @@ Result: '{"nest0":[3,4]}' Expected: '{"nest0":[3,4]}' ]]> - + @@ -3539,7 +3539,7 @@ Result: '{"nest0":[3,4]}' Expected: '{"nest0":[3,4]}' ]]> - + @@ -3548,7 +3548,7 @@ Result: '[1,2]' Expected: '[1,2]' ]]> - + @@ -3557,7 +3557,7 @@ Result: '[3,4]' Expected: '[3,4]' ]]> - + @@ -3566,7 +3566,7 @@ Result: '1' Expected: '1' ]]> - + @@ -3575,7 +3575,7 @@ Result: '[[[[1],[2]],[[3],[4]]],[[[5],[6]],[[7],[8]]]]' Expected: '[[[[1],[2]],[[3],[4]]],[[[5],[6]],[[7],[8]]]]' ]]> - + @@ -3584,7 +3584,7 @@ Result: '[[[1],[2]],[[3],[4]],[[5],[6]],[[7],[8]]]' Expected: '[[[1],[2]],[[3],[4]],[[5],[6]],[[7],[8]]]' ]]> - + @@ -3593,7 +3593,7 @@ Result: '[[[1],[2],[3],[4]],[[5],[6],[7],[8]]]' Expected: '[[[1],[2],[3],[4]],[[5],[6],[7],[8]]]' ]]> - + @@ -3602,7 +3602,7 @@ Result: '[[[1,2],[3,4]],[[5,6],[7,8]]]' Expected: '[[[1,2],[3,4]],[[5,6],[7,8]]]' ]]> - + @@ -3611,7 +3611,7 @@ Result: '[[1,2,3,4],[5,6,7,8]]' Expected: '[[1,2,3,4],[5,6,7,8]]' ]]> - + @@ -3620,7 +3620,7 @@ Result: '[[1,2],[3,4],[5,6],[7,8]]' Expected: '[[1,2],[3,4],[5,6],[7,8]]' ]]> - + @@ -3629,7 +3629,7 @@ Result: '[[1],[2],[3],[4],[5],[6],[7],[8]]' Expected: '[[1],[2],[3],[4],[5],[6],[7],[8]]' ]]> - + @@ -3638,7 +3638,7 @@ Result: '[1,2,3,4,5,6,7,8]' Expected: '[1,2,3,4,5,6,7,8]' ]]> - + @@ -3647,7 +3647,7 @@ Result: '[[[[1],[2]],[[3],[4]]],[[[5],[6]],[[7],[8]]]]' Expected: '[[[[1],[2]],[[3],[4]]],[[[5],[6]],[[7],[8]]]]' ]]> - + @@ -3656,7 +3656,7 @@ Result: '[[[1],[2]],[[3],[4]],[[5],[6]],[[7],[8]]]' Expected: '[[[1],[2]],[[3],[4]],[[5],[6]],[[7],[8]]]' ]]> - + @@ -3665,7 +3665,7 @@ Result: '[[[1],[2],[3],[4]],[[5],[6],[7],[8]]]' Expected: '[[[1],[2],[3],[4]],[[5],[6],[7],[8]]]' ]]> - + @@ -3674,7 +3674,7 @@ Result: '[[[1,2],[3,4]],[[5,6],[7,8]]]' Expected: '[[[1,2],[3,4]],[[5,6],[7,8]]]' ]]> - + @@ -3683,7 +3683,7 @@ Result: '[[1,2,3,4],[5,6,7,8]]' Expected: '[[1,2,3,4],[5,6,7,8]]' ]]> - + @@ -3692,7 +3692,7 @@ Result: '[[1,2],[3,4],[5,6],[7,8]]' Expected: '[[1,2],[3,4],[5,6],[7,8]]' ]]> - + @@ -3701,7 +3701,7 @@ Result: '[[1],[2],[3],[4],[5],[6],[7],[8]]' Expected: '[[1],[2],[3],[4],[5],[6],[7],[8]]' ]]> - + @@ -3710,7 +3710,7 @@ Result: '[1,2,3,4,5,6,7,8]' Expected: '[1,2,3,4,5,6,7,8]' ]]> - + @@ -3719,7 +3719,7 @@ Result: '1' Expected: '1' ]]> - + @@ -3728,7 +3728,7 @@ Result: '1' Expected: '1' ]]> - + @@ -3737,7 +3737,7 @@ Result: '[1]' Expected: '[1]' ]]> - + @@ -3746,7 +3746,7 @@ Result: '[1]' Expected: '[1]' ]]> - + @@ -3755,7 +3755,7 @@ Result: '[[1]]' Expected: '[[1]]' ]]> - + @@ -3764,7 +3764,7 @@ Result: '[[1]]' Expected: '[[1]]' ]]> - + @@ -3773,7 +3773,7 @@ Result: '[1,2,3]' Expected: '[1,2,3]' ]]> - + @@ -3782,7 +3782,7 @@ Result: '[1,2,3]' Expected: '[1,2,3]' ]]> - + @@ -3791,7 +3791,7 @@ Result: '[1,3]' Expected: '[1,3]' ]]> - + @@ -3800,7 +3800,7 @@ Result: '[1]' Expected: '[1]' ]]> - + @@ -3809,7 +3809,7 @@ Result: '[1,3]' Expected: '[1,3]' ]]> - + @@ -3818,7 +3818,7 @@ Result: '[1,2,3,4]' Expected: '[1,2,3,4]' ]]> - + @@ -3827,7 +3827,7 @@ Result: '"077 7700 1234"' Expected: '"077 7700 1234"' ]]> - + @@ -3836,7 +3836,7 @@ Result: '["077 7700 1234"]' Expected: '["077 7700 1234"]' ]]> - + @@ -3845,7 +3845,7 @@ Result: '["077 7700 1234"]' Expected: '["077 7700 1234"]' ]]> - + @@ -3854,7 +3854,7 @@ Result: '["01962 001234","01962 001235"]' Expected: '["01962 001234","01962 001235"]' ]]> - + @@ -3863,7 +3863,7 @@ Result: '{"home":"0203 544 1234","office":["01962 001234","01962 001235"],"mobil Expected: '{"home":"0203 544 1234","office":["01962 001234","01962 001235"],"mobile":"077 7700 1234"}' ]]> - + @@ -3872,7 +3872,7 @@ Result: '{"home":["0203 544 1234"],"office":["01962 001234","01962 001235"],"mob Expected: '{"home":["0203 544 1234"],"office":["01962 001234","01962 001235"],"mobile":["077 7700 1234"]}' ]]> - + @@ -3881,7 +3881,7 @@ Result: '[{"type":"command"}]' Expected: '[{"type":"command"}]' ]]> - + @@ -3890,7 +3890,7 @@ Result: '[{"type":"command"}]' Expected: '[{"type":"command"}]' ]]> - + @@ -3899,7 +3899,7 @@ Result: '[5]' Expected: '[5]' ]]> - + @@ -3908,7 +3908,7 @@ Result: '[{"title":"example","description":"Hello"}]' Expected: '[{"title":"example","description":"Hello"}]' ]]> - + @@ -3917,7 +3917,7 @@ Result: '200000' Expected: '200000' ]]> - + @@ -3926,7 +3926,7 @@ Result: '200000' Expected: '200000' ]]> - + @@ -3935,7 +3935,7 @@ Result: '[[3,1578381600],[5,1578381700]]' Expected: '[[3,1578381600],[5,1578381700]]' ]]> - + @@ -3944,7 +3944,7 @@ Result: '[3,1578381600]' Expected: '[3,1578381600]' ]]> - + @@ -3953,7 +3953,7 @@ Result: '[[3,1578381600],[5,1578381700]]' Expected: '[[3,1578381600],[5,1578381700]]' ]]> - + @@ -3962,7 +3962,7 @@ Result: '[[3,1578381600]]' Expected: '[[3,1578381600]]' ]]> - + @@ -3971,7 +3971,7 @@ Result: '3.7' Expected: '3.7' ]]> - + @@ -3980,7 +3980,7 @@ Result: '3.7' Expected: '3.7' ]]> - + @@ -3989,7 +3989,7 @@ Result: '0' Expected: '0' ]]> - + @@ -3998,7 +3998,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -4007,7 +4007,7 @@ Result: '[1,2,3,4]' Expected: '[1,2,3,4]' ]]> - + @@ -4016,7 +4016,7 @@ Result: '[1,3,4]' Expected: '[1,3,4]' ]]> - + @@ -4025,7 +4025,7 @@ Result: '[1,2]' Expected: '[1,2]' ]]> - + @@ -4034,7 +4034,7 @@ Result: '1' Expected: '1' ]]> - + @@ -4043,7 +4043,7 @@ Result: '[2,3,4]' Expected: '[2,3,4]' ]]> - + @@ -4052,7 +4052,7 @@ Result: '[1]' Expected: '[1]' ]]> - + @@ -4061,7 +4061,7 @@ Result: '"ORDER103"' Expected: '"ORDER103"' ]]> - + @@ -4070,7 +4070,7 @@ Result: '"order103"' Expected: '"order103"' ]]> - + @@ -4079,7 +4079,7 @@ Result: '"order103order104"' Expected: '"order103order104"' ]]> - + @@ -4088,7 +4088,7 @@ Result: '"order103, order104"' Expected: '"order103, order104"' ]]> - + @@ -4097,7 +4097,7 @@ Result: '336.36' Expected: '336.36' ]]> - + @@ -4106,7 +4106,7 @@ Result: '"HELLO WORLD"' Expected: '"HELLO WORLD"' ]]> - + @@ -4115,7 +4115,7 @@ Result: '"example"' Expected: '"example"' ]]> - + @@ -4124,7 +4124,7 @@ Result: '""' Expected: '""' ]]> - + @@ -4133,7 +4133,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -4142,7 +4142,7 @@ Result: '"example"' Expected: '"example"' ]]> - + @@ -4151,7 +4151,7 @@ Result: '[1,4,9,16,25]' Expected: '[1,4,9,16,25]' ]]> - + @@ -4160,7 +4160,7 @@ Result: '55' Expected: '55' ]]> - + @@ -4169,7 +4169,7 @@ Result: '"foo"' Expected: '"foo"' ]]> - + @@ -4178,44 +4178,44 @@ Result: '225' Expected: '225' ]]> - + $f ~> $g }};$instructions := [$sum, $square, $string];$sumsq := $instructions ~> $reduce($chain);[1..5] ~> $sumsq()) ' ]]> - + @@ -4224,7 +4224,7 @@ Result: '225' Expected: '225' ]]> - + @@ -4233,7 +4233,7 @@ Result: '55' Expected: '55' ]]> - + @@ -4242,7 +4242,7 @@ Result: '14400' Expected: '14400' ]]> - + @@ -4251,7 +4251,7 @@ Result: '14400' Expected: '14400' ]]> - + @@ -4260,7 +4260,7 @@ Result: '336.36' Expected: '336.36' ]]> - + @@ -4270,7 +4270,7 @@ Expected: '336.36' "hello"' ]]> - + @@ -4279,14 +4279,14 @@ Result: '[858383,858236,858383]' Expected: '[858383,858236,858383]' ]]> - + - + @@ -4295,7 +4295,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -4304,14 +4304,14 @@ Result: '34.45' Expected: '34.45' ]]> - + - + @@ -4321,7 +4321,7 @@ Expected: '34.45' - + @@ -4331,14 +4331,14 @@ Expected: '34.45' - + - + @@ -4347,7 +4347,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -4356,7 +4356,7 @@ Result: '84.09' Expected: '84.09' ]]> - + @@ -4365,7 +4365,7 @@ Result: '[45.285,122.895]' Expected: '[45.285000000000004,122.89500000000001]' ]]> - + @@ -4374,7 +4374,7 @@ Result: '["order103: 45.285","order104: 122.895"]' Expected: '["order103: 45.285","order104: 122.895"]' ]]> - + @@ -4383,7 +4383,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -4392,7 +4392,7 @@ Result: '2' Expected: '2' ]]> - + @@ -4402,7 +4402,7 @@ Expected: '2' - + @@ -4412,7 +4412,7 @@ Expected: '2' - + @@ -4421,7 +4421,7 @@ Result: '1' Expected: '1' ]]> - + @@ -4431,7 +4431,7 @@ Expected: '1' - + @@ -4441,7 +4441,7 @@ Expected: '1' - + @@ -4451,7 +4451,7 @@ Expected: '1' - + @@ -4461,7 +4461,7 @@ Expected: '1' - + @@ -4470,7 +4470,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -4479,7 +4479,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -4488,7 +4488,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -4497,7 +4497,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -4506,7 +4506,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -4515,7 +4515,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -4524,7 +4524,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -4533,7 +4533,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -4542,7 +4542,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -4551,7 +4551,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -4560,7 +4560,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -4569,7 +4569,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -4578,7 +4578,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -4587,7 +4587,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -4596,7 +4596,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -4605,7 +4605,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -4614,7 +4614,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -4623,7 +4623,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -4632,7 +4632,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -4641,7 +4641,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -4650,7 +4650,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -4659,7 +4659,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -4668,7 +4668,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -4677,7 +4677,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -4687,7 +4687,7 @@ Expected: 'false' - + @@ -4696,7 +4696,7 @@ Result: '4' Expected: '4' ]]> - + @@ -4705,7 +4705,7 @@ Result: '-3' Expected: '-3' ]]> - + @@ -4714,7 +4714,7 @@ Result: '0' Expected: '0' ]]> - + @@ -4723,7 +4723,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -4732,7 +4732,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -4741,7 +4741,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -4750,7 +4750,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -4759,7 +4759,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -4768,7 +4768,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -4778,7 +4778,7 @@ Expected 'undefined' - + @@ -4788,7 +4788,7 @@ Expected 'undefined' - + @@ -4797,7 +4797,7 @@ Result: '4' Expected: '4' ]]> - + @@ -4806,7 +4806,7 @@ Result: '[2,2]' Expected: '[2,2]' ]]> - + @@ -4815,7 +4815,7 @@ Result: '["order103: 2","order104: 2"]' Expected: '["order103: 2","order104: 2"]' ]]> - + @@ -4824,7 +4824,7 @@ Result: '0' Expected: '0' ]]> - + @@ -4833,7 +4833,7 @@ Result: '3' Expected: '3' ]]> - + @@ -4842,7 +4842,7 @@ Result: '3' Expected: '3' ]]> - + @@ -4851,7 +4851,7 @@ Result: '3' Expected: '3' ]]> - + @@ -4860,7 +4860,7 @@ Result: '1' Expected: '1' ]]> - + @@ -4870,7 +4870,7 @@ Expected: '1' - + @@ -4880,7 +4880,7 @@ Expected: '1' - + @@ -4890,7 +4890,7 @@ Expected: '1' - + @@ -4900,7 +4900,7 @@ Expected: '1' - + @@ -4909,7 +4909,7 @@ Result: '0' Expected: '0' ]]> - + @@ -4918,7 +4918,7 @@ Result: '2' Expected: '2' ]]> - + @@ -4927,7 +4927,7 @@ Result: '"https://mozilla.org/?x=шеллы"' Expected: '"https://mozilla.org/?x=шеллы"' ]]> - + @@ -4936,7 +4936,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -4947,7 +4947,7 @@ Expected 'undefined' Result: '"%E0%A4%A"' ]]> - + @@ -4956,7 +4956,7 @@ Result: '"?x=test"' Expected: '"?x=test"' ]]> - + @@ -4965,7 +4965,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -4976,7 +4976,7 @@ Expected 'undefined' Result: '"%E0%A4%A"' ]]> - + @@ -4985,7 +4985,7 @@ Result: '[1,2,3,4]' Expected: '[1,2,3,4]' ]]> - + @@ -4994,7 +4994,7 @@ Result: '[1]' Expected: '[1]' ]]> - + @@ -5003,7 +5003,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -5012,7 +5012,7 @@ Result: 'null' Expected: 'null' ]]> - + @@ -5021,7 +5021,7 @@ Result: '"hello"' Expected: '"hello"' ]]> - + @@ -5030,7 +5030,7 @@ Result: '["0406654608","0406634348","040657863","0406654603"]' Expected: '["0406654608","0406634348","040657863","0406654603"]' ]]> - + @@ -5039,7 +5039,7 @@ Result: '["Bowler Hat","Trilby hat","Cloak"]' Expected: '["Bowler Hat","Trilby hat","Cloak"]' ]]> - + @@ -5048,7 +5048,7 @@ Result: '[{"Colour":"Purple","Width":300,"Height":200,"Depth":210,"Weight":0.75} Expected: '[{"Colour":"Purple","Width":300,"Height":200,"Depth":210,"Weight":0.75},{"Colour":"Orange","Width":300,"Height":200,"Depth":210,"Weight":0.6},{"Colour":"Black","Width":30,"Height":20,"Depth":210,"Weight":2}]' ]]> - + @@ -5057,7 +5057,7 @@ Result: '["Street: Hursley Park","City: Winchester","Postcode: SO21 2JN"]' Expected: '["Street: Hursley Park","City: Winchester","Postcode: SO21 2JN"]' ]]> - + @@ -5066,7 +5066,7 @@ Result: '["HELLO","WORLD"]' Expected: '["HELLO","WORLD"]' ]]> - + @@ -5075,7 +5075,7 @@ Result: '["c","d"]' Expected: '["c","d"]' ]]> - + @@ -5084,7 +5084,7 @@ Result: '"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B"' Expected: '"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B"' ]]> - + @@ -5093,7 +5093,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -5104,7 +5104,7 @@ Expected 'undefined' Result: '"%EF%BF%BD"' ]]> - + @@ -5113,7 +5113,7 @@ Result: '"%3Fx%3Dtest"' Expected: '"%3Fx%3Dtest"' ]]> - + @@ -5122,7 +5122,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -5133,14 +5133,14 @@ Expected 'undefined' Result: '"%EF%BF%BD"' ]]> - + 35 ? Account.Order[0].Product[0].Price : $error('Too Expensive')' ]]> - + @@ -5149,7 +5149,7 @@ Result: '34.45' Expected: '34.45' ]]> - + @@ -5158,14 +5158,14 @@ Result: '34.45' Expected: '34.45' ]]> - + 34 ? $error('Too Expensive') : Account.Order[0].Product[0].Price' ]]> - + @@ -5174,21 +5174,21 @@ Result: 'undefined' Expected 'undefined' ]]> - + - + - + @@ -5198,7 +5198,7 @@ Expected 'undefined' - + @@ -5208,21 +5208,21 @@ Expected 'undefined' - + - + - + @@ -5231,7 +5231,7 @@ Result: '[1,2,3]' Expected: '[1,2,3]' ]]> - + @@ -5240,7 +5240,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -5249,7 +5249,7 @@ Result: '[1,"2",3]' Expected: '[1,"2",3]' ]]> - + @@ -5258,7 +5258,7 @@ Result: '8' Expected: '8' ]]> - + @@ -5267,7 +5267,7 @@ Result: '[{"Name":"Bowler Hat","Total":68.9},{"Name":"Trilby hat","Total":21.67} Expected: '[{"Name":"Bowler Hat","Total":68.9},{"Name":"Trilby hat","Total":21.67},{"Name":"Bowler Hat","Total":137.8},{"Name":"Cloak","Total":107.99}]' ]]> - + @@ -5276,7 +5276,7 @@ Result: '[{"Name":"Bowler Hat","Volume":12600000},{"Name":"Trilby hat","Volume": Expected: '[{"Name":"Bowler Hat","Volume":12600000},{"Name":"Trilby hat","Volume":12600000},{"Name":"Bowler Hat","Volume":12600000},{"Name":"Cloak","Volume":126000}]' ]]> - + @@ -5286,26 +5286,26 @@ Expected: '[{"Name":"Bowler Hat","Volume":12600000},{"Name":"Trilby hat","Volume - + - + @@ -5314,7 +5314,7 @@ Result: '{"test":1}' Expected: '{"test":1}' ]]> - + @@ -5323,7 +5323,7 @@ Result: '{"test":1}' Expected: '{"test":1}' ]]> - + @@ -5332,7 +5332,7 @@ Result: '{"test":1}' Expected: '{"test":1}' ]]> - + @@ -5341,7 +5341,7 @@ Result: '{"test":1}' Expected: '{"test":1}' ]]> - + @@ -5350,7 +5350,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -5359,7 +5359,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -5368,7 +5368,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -5377,7 +5377,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -5386,7 +5386,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -5395,7 +5395,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -5404,7 +5404,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -5413,7 +5413,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -5422,7 +5422,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -5431,7 +5431,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -5440,7 +5440,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -5449,7 +5449,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -5458,7 +5458,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -5467,7 +5467,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -5476,7 +5476,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -5485,7 +5485,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -5494,7 +5494,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -5503,7 +5503,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -5512,7 +5512,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -5521,7 +5521,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -5530,7 +5530,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -5539,7 +5539,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -5548,7 +5548,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -5558,7 +5558,7 @@ Expected: 'false' - + @@ -5568,7 +5568,7 @@ Expected: 'false' - + @@ -5577,7 +5577,7 @@ Result: '3' Expected: '3' ]]> - + @@ -5586,7 +5586,7 @@ Result: '-4' Expected: '-4' ]]> - + @@ -5595,7 +5595,7 @@ Result: '0' Expected: '0' ]]> - + @@ -5604,7 +5604,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -5613,7 +5613,7 @@ Result: '"100"' Expected: '"100"' ]]> - + @@ -5622,7 +5622,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -5631,7 +5631,7 @@ Result: '"1100100"' Expected: '"1100100"' ]]> - + @@ -5640,26 +5640,26 @@ Result: '"-1100100"' Expected: '"-1100100"' ]]> - + - + @@ -5686,7 +5686,7 @@ Expected: '"1100100"' - + @@ -5696,7 +5696,7 @@ Expected: '"1100100"' - + @@ -5706,7 +5706,7 @@ Expected: '"1100100"' - + @@ -5716,7 +5716,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -5726,7 +5726,7 @@ Result: '"123"' Expected: '"123"' ]]> - + @@ -5736,7 +5736,7 @@ Result: '"0123"' Expected: '"0123"' ]]> - + @@ -5746,7 +5746,7 @@ Result: '"-0003"' Expected: '"-0003"' ]]> - + @@ -5756,7 +5756,7 @@ Result: '"1234"' Expected: '"1234"' ]]> - + @@ -5766,7 +5766,7 @@ Result: '"1234"' Expected: '"1234"' ]]> - + @@ -5776,7 +5776,7 @@ Result: '"12"' Expected: '"12"' ]]> - + @@ -5786,7 +5786,7 @@ Result: '"12"' Expected: '"12"' ]]> - + @@ -5814,7 +5814,7 @@ Expected: '"123rd"' - + @@ -5842,7 +5842,7 @@ Expected: '"1st"' - + @@ -5870,7 +5870,7 @@ Expected: '"28th"' - + @@ -5898,7 +5898,7 @@ Expected: '"1234th"' - + @@ -5926,7 +5926,7 @@ Expected: '"12th"' - + @@ -5954,7 +5954,7 @@ Expected: '"١٢٣٤٠"' - + @@ -5982,7 +5982,7 @@ Expected: '"12340"' - + @@ -6004,7 +6004,7 @@ Expected error D3131 - + @@ -6014,7 +6014,7 @@ Result: '"12"' Expected: '"12"' ]]> - + @@ -6024,7 +6024,7 @@ Result: '"1,200"' Expected: '"1,200"' ]]> - + @@ -6034,7 +6034,7 @@ Result: '"120,000"' Expected: '"120,000"' ]]> - + @@ -6044,7 +6044,7 @@ Result: '"12,345,678"' Expected: '"12,345,678"' ]]> - + @@ -6054,7 +6054,7 @@ Result: '"1,234,567,890"' Expected: '"1,234,567,890"' ]]> - + @@ -6064,7 +6064,7 @@ Result: '"1,234,567,890"' Expected: '"1,234,567,890"' ]]> - + @@ -6092,7 +6092,7 @@ Expected: '"1234:567,890"' - + @@ -6120,187 +6120,187 @@ Expected: '"12345,67,890"' - + - + - + - + - + - + - + - + - + - + @@ -6328,227 +6328,227 @@ Expected: '"Five Hundred and Fifty-Five"' - + - + - + - + - + - + - + - + - + - + - + - + @@ -6576,7 +6576,7 @@ Expected: '"twelfth"' - + @@ -6604,7 +6604,7 @@ Expected: '"twentieth"' - + @@ -6632,7 +6632,7 @@ Expected: '"thirty-fourth"' - + @@ -6660,7 +6660,7 @@ Expected: '"NINETY-NINTH"' - + @@ -6688,7 +6688,7 @@ Expected: '"one hundredth"' - + @@ -6716,7 +6716,7 @@ Expected: '"FIVE HUNDRED AND FIFTY-FIFTH"' - + @@ -6744,7 +6744,7 @@ Expected: '"nine hundred and nineteenth"' - + @@ -6772,7 +6772,7 @@ Expected: '"seven hundred and thirtieth"' - + @@ -6800,7 +6800,7 @@ Expected: '"one thousandth"' - + @@ -6828,7 +6828,7 @@ Expected: '"three thousand, seven hundred and thirty-first"' - + @@ -6856,7 +6856,7 @@ Expected: '"three hundred and twenty-seven thousand, seven hundred and thirteent - + @@ -6884,7 +6884,7 @@ Expected: '"four million, three hundred and twenty-seven thousand, seven hundred - + @@ -6912,127 +6912,127 @@ Expected: '"one trillion and first"' - + - + - + - + - + - + - + @@ -7054,7 +7054,7 @@ Expected error D3130 - + @@ -7063,7 +7063,7 @@ Result: '"12,345.60"' Expected: '"12,345.60"' ]]> - + @@ -7090,7 +7090,7 @@ Expected: '"12,345,678.90"' - + @@ -7099,7 +7099,7 @@ Result: '"123412345,6,78.90"' Expected: '"123412345,6,78.90"' ]]> - + @@ -7108,7 +7108,7 @@ Result: '"1,234.567,890"' Expected: '"1,234.567,890"' ]]> - + @@ -7117,7 +7117,7 @@ Result: '"0124"' Expected: '"0124"' ]]> - + @@ -7126,7 +7126,7 @@ Result: '"14%"' Expected: '"14%"' ]]> - + @@ -7135,7 +7135,7 @@ Result: '"485.7‰"' Expected: '"485.7‰"' ]]> - + @@ -7162,7 +7162,7 @@ Expected: '"140pm"' - + @@ -7171,7 +7171,7 @@ Result: '"-006"' Expected: '"-006"' ]]> - + @@ -7180,7 +7180,7 @@ Result: '"12.346e2"' Expected: '"12.346e2"' ]]> - + @@ -7189,7 +7189,7 @@ Result: '"12.346e002"' Expected: '"12.346e002"' ]]> - + @@ -7216,7 +7216,7 @@ Expected: '"①②.③④⑥e②"' - + @@ -7225,7 +7225,7 @@ Result: '"2.3e-1"' Expected: '"2.3e-1"' ]]> - + @@ -7252,7 +7252,7 @@ Expected: '"0.23e0"' - + @@ -7279,7 +7279,7 @@ Expected: '"0.1e0"' - + @@ -7288,7 +7288,7 @@ Result: '".23e0"' Expected: '".23e0"' ]]> - + @@ -7297,7 +7297,7 @@ Result: '"87,504.4812"' Expected: '"87,504.4812"' ]]> - + @@ -7306,7 +7306,7 @@ Result: '"PREFIX185.2812SUFFIX"' Expected: '"PREFIX185.2812SUFFIX"' ]]> - + @@ -7333,7 +7333,7 @@ Expected: '"100,000000,000000,000000"' - + @@ -7354,7 +7354,7 @@ Expected error D3080 - + @@ -7375,7 +7375,7 @@ Expected error D3081 - + @@ -7396,7 +7396,7 @@ Expected error D3082 - + @@ -7417,7 +7417,7 @@ Expected error D3083 - + @@ -7438,7 +7438,7 @@ Expected error D3084 - + @@ -7459,7 +7459,7 @@ Expected error D3085 - + @@ -7480,7 +7480,7 @@ Expected error D3086 - + @@ -7501,7 +7501,7 @@ Expected error D3087 - + @@ -7522,7 +7522,7 @@ Expected error D3088 - + @@ -7543,7 +7543,7 @@ Expected error D3089 - + @@ -7564,7 +7564,7 @@ Expected error D3090 - + @@ -7585,7 +7585,7 @@ Expected error D3091 - + @@ -7606,7 +7606,7 @@ Expected error D3092 - + @@ -7627,7 +7627,7 @@ Expected error D3093 - + @@ -7636,7 +7636,7 @@ Result: '"002.000"' Expected: '"002.000"' ]]> - + @@ -7663,7 +7663,7 @@ Expected: '"AAC.AAA"' - + @@ -7690,7 +7690,7 @@ Expected: '"Be-AAB"' - + @@ -7699,7 +7699,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -7726,7 +7726,7 @@ Expected: '"1970-01-01T00:00:00.001Z"' - + @@ -7753,7 +7753,7 @@ Expected: '"2017-10-30T16:25:32.935Z"' - + @@ -7762,7 +7762,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -7772,7 +7772,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -7800,7 +7800,7 @@ Expected: '"Hello"' - + @@ -7828,7 +7828,7 @@ Expected: '"Year: 2018"' - + @@ -7856,7 +7856,7 @@ Expected: '"Year: <2018>"' - + @@ -7884,7 +7884,7 @@ Expected: '"Year: <2,018>"' - + @@ -7912,7 +7912,7 @@ Expected: '"[Year: <2018>"' - + @@ -7940,7 +7940,7 @@ Expected: '"Year]: <2018>"' - + @@ -7968,7 +7968,7 @@ Expected: '"[Year]: [2018]"' - + @@ -7996,7 +7996,7 @@ Expected: '"23/3/2018"' - + @@ -8024,7 +8024,7 @@ Expected: '"7 Sunday"' - + @@ -8052,7 +8052,7 @@ Expected: '"1 Monday"' - + @@ -8080,7 +8080,7 @@ Expected: '"2018-03-23"' - + @@ -8108,7 +8108,7 @@ Expected: '"03/23/2018 at 10:33:36"' - + @@ -8136,7 +8136,7 @@ Expected: '"2018-03-23T10:33:36.617Z"' - + @@ -8165,7 +8165,7 @@ Expected: '"2018-03-23T10:33:36.617Z"' - + @@ -8193,7 +8193,7 @@ Expected: '"2018-03-23T13:33:36.617+03:00"' - + @@ -8221,7 +8221,7 @@ Expected: '"2018-07-11T15:00:00+03:00"' - + @@ -8249,7 +8249,7 @@ Expected: '"2018-07-11T12:00:00Z"' - + @@ -8277,7 +8277,7 @@ Expected: '"2018-07-11T15:00:00+03:00"' - + @@ -8305,7 +8305,7 @@ Expected: '"2018-07-11T07:00:00-5"' - + @@ -8333,7 +8333,7 @@ Expected: '"2018-07-11T15:00:00+03:00"' - + @@ -8361,7 +8361,7 @@ Expected: '"2018-07-11T15:00:00+03:00"' - + @@ -8389,7 +8389,7 @@ Expected: '"2018-07-11T17:30:00+5:30"' - + @@ -8417,7 +8417,7 @@ Expected: '"2018-07-11T07:00:00GMT-05:00"' - + @@ -8445,7 +8445,7 @@ Expected: '"2008-03-02T00:05:00+03:00"' - + @@ -8473,7 +8473,7 @@ Expected: '"2009-01-01T00:05:00+03:00"' - + @@ -8495,7 +8495,7 @@ Expected error D3134 - + @@ -8523,7 +8523,7 @@ Expected: '"23/03/18"' - + @@ -8551,7 +8551,7 @@ Expected: '"23/03/2018"' - + @@ -8579,7 +8579,7 @@ Expected: '"23/03/18"' - + @@ -8607,7 +8607,7 @@ Expected: '"23/03/18"' - + @@ -8635,7 +8635,7 @@ Expected: '"23 03 MMXVIII"' - + @@ -8663,7 +8663,7 @@ Expected: '"w C mmxviii"' - + @@ -8691,7 +8691,7 @@ Expected: '"23rd 03 2018"' - + @@ -8719,7 +8719,7 @@ Expected: '"two thousand and eighteen"' - + @@ -8747,7 +8747,7 @@ Expected: '"twenty-third 03 2018"' - + @@ -8775,7 +8775,7 @@ Expected: '"23rd March 2018"' - + @@ -8803,7 +8803,7 @@ Expected: '"23rd MARCH 2018"' - + @@ -8831,7 +8831,7 @@ Expected: '"Friday, 23rd March 2018"' - + @@ -8859,7 +8859,7 @@ Expected: '"Friday, the twenty-third of March 2018 ISO"' - + @@ -8887,7 +8887,7 @@ Expected: '"Fri, 23rd Mar 2018 ISO"' - + @@ -8915,7 +8915,7 @@ Expected: '"friday, 23/3/2018 10:33:36 am"' - + @@ -8943,7 +8943,7 @@ Expected: '"saturday, 1/3/2008 9:05:00 pm"' - + @@ -8971,7 +8971,7 @@ Expected: '"monday, 7/1/2008 12:00:00 am"' - + @@ -8999,7 +8999,7 @@ Expected: '"first day of the year"' - + @@ -9027,7 +9027,7 @@ Expected: '"365 days in 2018"' - + @@ -9055,7 +9055,7 @@ Expected: '"366 days in 2016"' - + @@ -9083,7 +9083,7 @@ Expected: '"Week: 1"' - + @@ -9111,7 +9111,7 @@ Expected: '"Week: 1"' - + @@ -9139,7 +9139,7 @@ Expected: '"Week: 52"' - + @@ -9167,7 +9167,7 @@ Expected: '"Week: 1"' - + @@ -9195,7 +9195,7 @@ Expected: '"Week: 1"' - + @@ -9223,7 +9223,7 @@ Expected: '"Week: 52"' - + @@ -9251,7 +9251,7 @@ Expected: '"Week: 52"' - + @@ -9279,7 +9279,7 @@ Expected: '"Week: 1"' - + @@ -9307,7 +9307,7 @@ Expected: '"Week: 2"' - + @@ -9335,7 +9335,7 @@ Expected: '"Week: 53"' - + @@ -9363,7 +9363,7 @@ Expected: '"Week: 53"' - + @@ -9391,7 +9391,7 @@ Expected: '"Week: 53"' - + @@ -9419,7 +9419,7 @@ Expected: '"Week: 5 of January"' - + @@ -9447,7 +9447,7 @@ Expected: '"Week: 5 of January"' - + @@ -9475,7 +9475,7 @@ Expected: '"Week: 5 of January"' - + @@ -9503,7 +9503,7 @@ Expected: '"Week: 1 of January"' - + @@ -9531,7 +9531,7 @@ Expected: '"Week: 5 of December"' - + @@ -9559,7 +9559,7 @@ Expected: '"Week: 1 of August"' - + @@ -9587,7 +9587,7 @@ Expected: '"Week: 1 of January"' - + @@ -9595,24 +9595,24 @@ Expected: '"Week: 1 of January"' - + @@ -9634,7 +9634,7 @@ Expected error D3133 - + @@ -9656,7 +9656,7 @@ Expected error D3135 - + @@ -9664,26 +9664,26 @@ Expected error D3135 - + @@ -9691,26 +9691,26 @@ Expr is '($ts := $toMillis('2005-01-01', '[Y]-[M]-[D]'); $fromMillis($ts, '[X000 - + @@ -9718,26 +9718,26 @@ Expr is '($ts := $toMillis('2005-01-02', '[Y]-[M]-[D]'); $fromMillis($ts, '[X000 - + @@ -9745,26 +9745,26 @@ Expr is '($ts := $toMillis('2005-12-31', '[Y]-[M]-[D]'); $fromMillis($ts, '[X000 - + @@ -9772,26 +9772,26 @@ Expr is '($ts := $toMillis('2006-01-01', '[Y]-[M]-[D]'); $fromMillis($ts, '[X000 - + @@ -9799,26 +9799,26 @@ Expr is '($ts := $toMillis('2006-01-02', '[Y]-[M]-[D]'); $fromMillis($ts, '[X000 - + @@ -9826,26 +9826,26 @@ Expr is '($ts := $toMillis('2006-12-31', '[Y]-[M]-[D]'); $fromMillis($ts, '[X000 - + @@ -9853,26 +9853,26 @@ Expr is '($ts := $toMillis('2007-01-01', '[Y]-[M]-[D]'); $fromMillis($ts, '[X000 - + @@ -9880,26 +9880,26 @@ Expr is '($ts := $toMillis('2007-12-30', '[Y]-[M]-[D]'); $fromMillis($ts, '[X000 - + @@ -9907,26 +9907,26 @@ Expr is '($ts := $toMillis('2007-12-31', '[Y]-[M]-[D]'); $fromMillis($ts, '[X000 - + @@ -9934,26 +9934,26 @@ Expr is '($ts := $toMillis('2008-01-01', '[Y]-[M]-[D]'); $fromMillis($ts, '[X000 - + @@ -9961,26 +9961,26 @@ Expr is '($ts := $toMillis('2008-12-28', '[Y]-[M]-[D]'); $fromMillis($ts, '[X000 - + @@ -9988,26 +9988,26 @@ Expr is '($ts := $toMillis('2008-12-29', '[Y]-[M]-[D]'); $fromMillis($ts, '[X000 - + @@ -10015,26 +10015,26 @@ Expr is '($ts := $toMillis('2008-12-30', '[Y]-[M]-[D]'); $fromMillis($ts, '[X000 - + @@ -10042,26 +10042,26 @@ Expr is '($ts := $toMillis('2008-12-31', '[Y]-[M]-[D]'); $fromMillis($ts, '[X000 - + @@ -10069,26 +10069,26 @@ Expr is '($ts := $toMillis('2009-01-01', '[Y]-[M]-[D]'); $fromMillis($ts, '[X000 - + @@ -10096,26 +10096,26 @@ Expr is '($ts := $toMillis('2009-12-31', '[Y]-[M]-[D]'); $fromMillis($ts, '[X000 - + @@ -10123,26 +10123,26 @@ Expr is '($ts := $toMillis('2010-01-01', '[Y]-[M]-[D]'); $fromMillis($ts, '[X000 - + @@ -10150,26 +10150,26 @@ Expr is '($ts := $toMillis('2010-01-02', '[Y]-[M]-[D]'); $fromMillis($ts, '[X000 - + @@ -10178,7 +10178,7 @@ Result: '"hello"' Expected: '"hello"' ]]> - + @@ -10187,7 +10187,7 @@ Result: '"hello"' Expected: '"hello"' ]]> - + @@ -10196,7 +10196,7 @@ Result: '"helloworld"' Expected: '"helloworld"' ]]> - + @@ -10205,7 +10205,7 @@ Result: '"hello, world"' Expected: '"hello, world"' ]]> - + @@ -10214,7 +10214,7 @@ Result: '""' Expected: '""' ]]> - + @@ -10223,7 +10223,7 @@ Result: '"Purple, Orange, Purple, Black"' Expected: '"Purple, Orange, Purple, Black"' ]]> - + @@ -10232,7 +10232,7 @@ Result: '"PurpleOrangePurpleBlack"' Expected: '"PurpleOrangePurpleBlack"' ]]> - + @@ -10241,7 +10241,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -10251,7 +10251,7 @@ Expected 'undefined' - + @@ -10261,7 +10261,7 @@ Expected 'undefined' - + @@ -10271,7 +10271,7 @@ Expected 'undefined' - + @@ -10281,7 +10281,7 @@ Expected 'undefined' - + @@ -10290,7 +10290,7 @@ Result: '["Account Name","Order"]' Expected: '["Account Name","Order"]' ]]> - + @@ -10299,7 +10299,7 @@ Result: '["Product Name","ProductID","SKU","Description","Price","Quantity"]' Expected: '["Product Name","ProductID","SKU","Description","Price","Quantity"]' ]]> - + @@ -10308,7 +10308,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -10317,7 +10317,7 @@ Result: '"foo"' Expected: '"foo"' ]]> - + @@ -10326,7 +10326,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -10335,7 +10335,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -10344,7 +10344,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -10353,7 +10353,7 @@ Result: '0' Expected: '0' ]]> - + @@ -10362,7 +10362,7 @@ Result: '5' Expected: '5' ]]> - + @@ -10371,7 +10371,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -10380,7 +10380,7 @@ Result: '10' Expected: '10' ]]> - + @@ -10407,7 +10407,7 @@ Expected: '1' - + @@ -10434,7 +10434,7 @@ Expected: '1' - + @@ -10443,7 +10443,7 @@ Result: '4' Expected: '4' ]]> - + @@ -10452,7 +10452,7 @@ Result: '1' Expected: '1' ]]> - + @@ -10461,7 +10461,7 @@ Result: '1' Expected: '1' ]]> - + @@ -10471,7 +10471,7 @@ Expected: '1' - + @@ -10481,7 +10481,7 @@ Expected: '1' - + @@ -10491,7 +10491,7 @@ Expected: '1' - + @@ -10501,7 +10501,7 @@ Expected: '1' - + @@ -10511,7 +10511,7 @@ Expected: '1' - + @@ -10521,7 +10521,7 @@ Expected: '1' - + @@ -10531,7 +10531,7 @@ Expected: '1' - + @@ -10558,7 +10558,7 @@ Expected: '2' - + @@ -10567,7 +10567,7 @@ Result: '"Firefly"' Expected: '"Firefly"' ]]> - + @@ -10576,7 +10576,7 @@ Result: '["Bowler Hat","Trilby hat","Bowler Hat","Cloak"]' Expected: '["Bowler Hat","Trilby hat","Bowler Hat","Cloak"]' ]]> - + @@ -10585,7 +10585,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -10594,7 +10594,7 @@ Result: 'null' Expected: 'null' ]]> - + @@ -10603,7 +10603,7 @@ Result: '"hello world"' Expected: '"hello world"' ]]> - + @@ -10612,7 +10612,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -10621,7 +10621,7 @@ Result: '137.8' Expected: '137.8' ]]> - + @@ -10630,7 +10630,7 @@ Result: '[68.9,137.8]' Expected: '[68.9,137.8]' ]]> - + @@ -10639,7 +10639,7 @@ Result: '["order103: 2","order104: 2"]' Expected: '["order103: 2","order104: 2"]' ]]> - + @@ -10648,7 +10648,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -10657,7 +10657,7 @@ Result: '3' Expected: '3' ]]> - + @@ -10667,7 +10667,7 @@ Expected: '3' - + @@ -10677,7 +10677,7 @@ Expected: '3' - + @@ -10686,7 +10686,7 @@ Result: '1' Expected: '1' ]]> - + @@ -10695,7 +10695,7 @@ Result: '-1' Expected: '-1' ]]> - + @@ -10705,7 +10705,7 @@ Expected: '-1' - + @@ -10715,7 +10715,7 @@ Expected: '-1' - + @@ -10725,7 +10725,7 @@ Expected: '-1' - + @@ -10735,7 +10735,7 @@ Expected: '-1' - + @@ -10744,7 +10744,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -10753,7 +10753,7 @@ Result: '21.67' Expected: '21.67' ]]> - + @@ -10762,7 +10762,7 @@ Result: '[21.67,107.99]' Expected: '[21.67,107.99]' ]]> - + @@ -10771,7 +10771,7 @@ Result: '["order103: 21.67","order104: 107.99"]' Expected: '["order103: 21.67","order104: 107.99"]' ]]> - + @@ -10780,7 +10780,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -10789,7 +10789,7 @@ Result: '1' Expected: '1' ]]> - + @@ -10799,7 +10799,7 @@ Expected: '1' - + @@ -10809,7 +10809,7 @@ Expected: '1' - + @@ -10818,7 +10818,7 @@ Result: '1' Expected: '1' ]]> - + @@ -10828,7 +10828,7 @@ Expected: '1' - + @@ -10838,7 +10838,7 @@ Expected: '1' - + @@ -10848,7 +10848,7 @@ Expected: '1' - + @@ -10858,7 +10858,7 @@ Expected: '1' - + @@ -10867,7 +10867,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -10876,7 +10876,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -10885,7 +10885,7 @@ Result: '{"a":1}' Expected: '{"a":1}' ]]> - + @@ -10894,7 +10894,7 @@ Result: '{"a":1,"b":2}' Expected: '{"a":1,"b":2}' ]]> - + @@ -10903,7 +10903,7 @@ Result: '{"a":1,"b":2,"c":3}' Expected: '{"a":1,"b":2,"c":3}' ]]> - + @@ -10912,7 +10912,7 @@ Result: '{"a":3,"b":2}' Expected: '{"a":3,"b":2}' ]]> - + @@ -10921,7 +10921,7 @@ Result: '0' Expected: '0' ]]> - + @@ -10930,7 +10930,7 @@ Result: '10' Expected: '10' ]]> - + @@ -10939,7 +10939,7 @@ Result: '-0.05' Expected: '-0.05' ]]> - + @@ -10948,7 +10948,7 @@ Result: '0' Expected: '0' ]]> - + @@ -10957,7 +10957,7 @@ Result: '-0.05' Expected: '-0.05' ]]> - + @@ -10966,7 +10966,7 @@ Result: '100' Expected: '100' ]]> - + @@ -10975,7 +10975,7 @@ Result: '0.01' Expected: '0.01' ]]> - + @@ -10984,7 +10984,7 @@ Result: '1' Expected: '1' ]]> - + @@ -10994,7 +10994,7 @@ Expected: '1' - + @@ -11004,7 +11004,7 @@ Expected: '1' - + @@ -11014,7 +11014,7 @@ Expected: '1' - + @@ -11024,7 +11024,7 @@ Expected: '1' - + @@ -11034,7 +11034,7 @@ Expected: '1' - + @@ -11043,7 +11043,7 @@ Result: '1' Expected: '1' ]]> - + @@ -11052,7 +11052,7 @@ Result: '0' Expected: '0' ]]> - + @@ -11061,7 +11061,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -11071,7 +11071,7 @@ Expected 'undefined' - + @@ -11081,7 +11081,7 @@ Expected 'undefined' - + @@ -11091,7 +11091,7 @@ Expected 'undefined' - + @@ -11101,7 +11101,7 @@ Expected 'undefined' - + @@ -11111,7 +11111,7 @@ Expected 'undefined' - + @@ -11121,7 +11121,7 @@ Expected 'undefined' - + @@ -11131,7 +11131,7 @@ Expected 'undefined' - + @@ -11141,7 +11141,7 @@ Expected 'undefined' - + @@ -11151,7 +11151,7 @@ Expected 'undefined' - + @@ -11161,7 +11161,7 @@ Expected 'undefined' - + @@ -11171,7 +11171,7 @@ Expected 'undefined' - + @@ -11180,7 +11180,7 @@ Result: '0' Expected: '0' ]]> - + @@ -11189,7 +11189,7 @@ Result: '123' Expected: '123' ]]> - + @@ -11198,7 +11198,7 @@ Result: '-7' Expected: '-7' ]]> - + @@ -11207,7 +11207,7 @@ Result: '0.00123' Expected: '0.00123' ]]> - + @@ -11216,7 +11216,7 @@ Result: '"foo "' Expected: '"foo "' ]]> - + @@ -11225,7 +11225,7 @@ Result: '" foo"' Expected: '" foo"' ]]> - + @@ -11234,7 +11234,7 @@ Result: '"##foo"' Expected: '"##foo"' ]]> - + @@ -11243,7 +11243,7 @@ Result: '"foo "' Expected: '"foo "' ]]> - + @@ -11252,7 +11252,7 @@ Result: '"foo"' Expected: '"foo"' ]]> - + @@ -11261,7 +11261,7 @@ Result: '"foo-+-+-"' Expected: '"foo-+-+-"' ]]> - + @@ -11270,7 +11270,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -11297,7 +11297,7 @@ Expected: '"a𝄞💩 "' - + @@ -11324,7 +11324,7 @@ Expected: '" 𝄞💩"' - + @@ -11351,7 +11351,7 @@ Expected: '"a𝄞💩💩💩💩💩"' - + @@ -11378,7 +11378,7 @@ Expected: '"a𝄞💩💩💩💩"' - + @@ -11388,7 +11388,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -11398,7 +11398,7 @@ Result: '123' Expected: '123' ]]> - + @@ -11408,7 +11408,7 @@ Result: '123' Expected: '123' ]]> - + @@ -11418,7 +11418,7 @@ Result: '1234' Expected: '1234' ]]> - + @@ -11428,7 +11428,7 @@ Result: '1234' Expected: '1234' ]]> - + @@ -11438,147 +11438,147 @@ Result: '12' Expected: '12' ]]> - + - + - + - + - + - + - + - + @@ -11588,927 +11588,927 @@ Result: '12' Expected: '12' ]]> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -12530,7 +12530,7 @@ Expected error D3130 - + @@ -12539,7 +12539,7 @@ Result: '16' Expected: '16' ]]> - + @@ -12548,7 +12548,7 @@ Result: '2' Expected: '2' ]]> - + @@ -12557,7 +12557,7 @@ Result: '0.01' Expected: '0.01' ]]> - + @@ -12566,7 +12566,7 @@ Result: '-8' Expected: '-8' ]]> - + @@ -12575,7 +12575,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -12585,7 +12585,7 @@ Expected 'undefined' - + @@ -12595,7 +12595,7 @@ Expected 'undefined' - + @@ -12604,7 +12604,7 @@ Result: '"Hello Everyone"' Expected: '"Hello Everyone"' ]]> - + @@ -12613,7 +12613,7 @@ Result: '"the cit sit on the mit"' Expected: '"the cit sit on the mit"' ]]> - + @@ -12622,7 +12622,7 @@ Result: '"the cat sat on the mat"' Expected: '"the cat sat on the mat"' ]]> - + @@ -12631,7 +12631,7 @@ Result: '"the cit sit on the mat"' Expected: '"the cit sit on the mat"' ]]> - + @@ -12640,7 +12640,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -12650,7 +12650,7 @@ Expected 'undefined' - + @@ -12660,7 +12660,7 @@ Expected 'undefined' - + @@ -12670,7 +12670,7 @@ Expected 'undefined' - + @@ -12680,7 +12680,7 @@ Expected 'undefined' - + @@ -12690,7 +12690,7 @@ Expected 'undefined' - + @@ -12700,7 +12700,7 @@ Expected 'undefined' - + @@ -12710,7 +12710,7 @@ Expected 'undefined' - + @@ -12719,7 +12719,7 @@ Result: '[5,4,3,2,1]' Expected: '[5,4,3,2,1]' ]]> - + @@ -12728,7 +12728,7 @@ Result: '[[1,2,3],[3,2,1],[1,2,3]]' Expected: '[[1,2,3],[3,2,1],[1,2,3]]' ]]> - + @@ -12737,7 +12737,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -12746,7 +12746,7 @@ Result: '[1]' Expected: '[1]' ]]> - + @@ -12755,7 +12755,7 @@ Result: '4' Expected: '4' ]]> - + @@ -12764,7 +12764,7 @@ Result: '2' Expected: '2' ]]> - + @@ -12773,7 +12773,7 @@ Result: '3' Expected: '3' ]]> - + @@ -12782,7 +12782,7 @@ Result: '2' Expected: '2' ]]> - + @@ -12791,7 +12791,7 @@ Result: '4' Expected: '4' ]]> - + @@ -12800,7 +12800,7 @@ Result: '0' Expected: '0' ]]> - + @@ -12809,7 +12809,7 @@ Result: '0' Expected: '0' ]]> - + @@ -12818,7 +12818,7 @@ Result: '0' Expected: '0' ]]> - + @@ -12827,7 +12827,7 @@ Result: '-8' Expected: '-8' ]]> - + @@ -12836,7 +12836,7 @@ Result: '-8' Expected: '-8' ]]> - + @@ -12845,7 +12845,7 @@ Result: '4.5' Expected: '4.5' ]]> - + @@ -12854,7 +12854,7 @@ Result: '4.52' Expected: '4.52' ]]> - + @@ -12863,7 +12863,7 @@ Result: '4.52' Expected: '4.52' ]]> - + @@ -12872,7 +12872,7 @@ Result: '12300' Expected: '12300' ]]> - + @@ -12881,7 +12881,7 @@ Result: '12400' Expected: '12400' ]]> - + @@ -12890,7 +12890,7 @@ Result: '12400' Expected: '12400' ]]> - + @@ -12899,7 +12899,7 @@ Result: '0.000000000000000000000060' Expected: '6E-23' ]]> - + @@ -12908,7 +12908,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -12917,7 +12917,7 @@ Result: '10' Expected: '10' ]]> - + @@ -12926,7 +12926,7 @@ Result: '[1,2,3,4,5,6,7,8,9,10]' Expected: '[1,2,3,4,5,6,7,8,9,10]' ]]> - + @@ -12935,7 +12935,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -12944,7 +12944,7 @@ Result: '[1]' Expected: '[1]' ]]> - + @@ -12953,7 +12953,7 @@ Result: '{"Address":{"Street":"Hursley Park","City":"Winchester","Postcode":"SO2 Expected: '{"Address":{"Street":"Hursley Park","City":"Winchester","Postcode":"SO21 2JN"},"Other":{"Over 18 ?":true,"Misc":null,"Alternative.Address":{"Street":"Brick Lane","City":"London","Postcode":"E1 6RF"}}}' ]]> - + @@ -12962,7 +12962,7 @@ Result: '[{"Address":{"Street":"Hursley Park","City":"Winchester","Postcode":"SO Expected: '[{"Address":{"Street":"Hursley Park","City":"Winchester","Postcode":"SO21 2JN"}},{"Alternative.Address":{"Street":"Brick Lane","City":"London","Postcode":"E1 6RF"}}]' ]]> - + @@ -12971,7 +12971,7 @@ Result: '{"Age":28,"Address":{"Street":"Hursley Park","City":"Winchester","Postc Expected: '{"Age":28,"Address":{"Street":"Hursley Park","City":"Winchester","Postcode":"SO21 2JN"}}' ]]> - + @@ -12980,7 +12980,7 @@ Result: '{"a":1}' Expected: '{"a":1}' ]]> - + @@ -12989,7 +12989,7 @@ Result: '{"a":"hello"}' Expected: '{"a":"hello"}' ]]> - + @@ -12997,19 +12997,19 @@ Expected: '{"a":"hello"}' {$not($arg)}(true)' ]]> - + @@ -13017,19 +13017,19 @@ Expected: '{"a":"hello"}' {$not($arg)}(foo)' ]]> - + @@ -13037,19 +13037,19 @@ Expected: '{"a":"hello"}' {$not($arg)}(null)' ]]> - + @@ -13057,19 +13057,19 @@ Expected: '{"a":"hello"}' {$x+$y}(2, 6)' ]]> - + @@ -13077,23 +13077,23 @@ Expected: '{"a":"hello"}' {$x+$y}(6)' ]]> - + @@ -13101,23 +13101,23 @@ Expected: '{"a":"hello"}' {$x+$y}(2, 6)' ]]> - + @@ -13125,23 +13125,23 @@ Expected: '{"a":"hello"}' {$x+$y}(6)' ]]> - + @@ -13149,19 +13149,19 @@ Expected: '{"a":"hello"}' {$uppercase($str)}("hello")' ]]> - + @@ -13169,23 +13169,23 @@ Expected: '{"a":"hello"}' {$uppercase($str)}()' ]]> - + @@ -13193,19 +13193,19 @@ Expected: '{"a":"hello"}' {$prefix & $str}("World", "Hello ")' ]]> - + @@ -13213,23 +13213,23 @@ Expected: '{"a":"hello"}' {$prefix & $str}("Hello ")' ]]> - + @@ -13237,19 +13237,19 @@ Expected: '{"a":"hello"}' s?:s>{$join($arr, $sep)}("a")' ]]> - + @@ -13257,19 +13257,19 @@ Expected: '{"a":"hello"}' s?:s>{$join($arr, $sep)}(["a"])' ]]> - + @@ -13277,19 +13277,19 @@ Expected: '{"a":"hello"}' s?:s>{$join($arr, $sep)}("a", "-")' ]]> - + @@ -13297,19 +13297,19 @@ Expected: '{"a":"hello"}' s?:s>{$join($arr, $sep)}(["a"], "-")' ]]> - + @@ -13317,19 +13317,19 @@ Expected: '{"a":"hello"}' s?:s>{$join($arr, $sep)}(["a", "b"], "-")' ]]> - + @@ -13337,19 +13337,19 @@ Expected: '{"a":"hello"}' {$join($arr, $sep)}(["a", "b"], "-")' ]]> - + @@ -13357,19 +13357,19 @@ Expected: '{"a":"hello"}' s?:s>{$join($arr, $sep)}([], "-")' ]]> - + @@ -13377,19 +13377,19 @@ Expected: '{"a":"hello"}' s?:s>{$join($arr, $sep)}(foo, "-")' ]]> - + @@ -13397,19 +13397,19 @@ Expected: '{"a":"hello"}' {$obj}({"hello": "world"})' ]]> - + @@ -13417,19 +13417,19 @@ Expected: '{"a":"hello"}' >>{$arr}([[1]])' ]]> - + @@ -13437,19 +13437,19 @@ Expected: '{"a":"hello"}' {$number($num)}(5)' ]]> - + @@ -13457,19 +13457,19 @@ Expected: '{"a":"hello"}' {$number($num)}("5")' ]]> - + @@ -13477,23 +13477,23 @@ Expected: '{"a":"hello"}' {$number($num)}()' ]]> - + @@ -13501,25 +13501,25 @@ Expected: '{"a":"hello"}' {function($x){$f($f($x))}};$add2 := function($x){$x+2};$add4 := $twice($add2);$add4(5))' ]]> - + @@ -13527,25 +13527,25 @@ Expected: '{"a":"hello"}' :f>{function($x){$f($f($x))}};$add2 := function($x){$x+2};$add4 := $twice($add2);$add4(5))' ]]> - + @@ -13553,19 +13553,19 @@ Expected: '{"a":"hello"}' >{$arg}(5)' ]]> - + @@ -13573,19 +13573,19 @@ Expected: '{"a":"hello"}' {[$arg1, $arg2]}(1,"2")' ]]> - + @@ -13593,19 +13593,19 @@ Expected: '{"a":"hello"}' {[$arg1, $arg2]}(1,3,"2")' ]]> - + @@ -13613,19 +13613,19 @@ Expected: '{"a":"hello"}' {[$arg1, $arg2]}(1,3, 2,"g")' ]]> - + @@ -13633,19 +13633,19 @@ Expected: '{"a":"hello"}' >{$arr}(["3"]) ' ]]> - + @@ -13653,19 +13653,19 @@ Expected: '{"a":"hello"}' >{$arr}([1, 2, "3"]) ' ]]> - + @@ -13673,19 +13673,19 @@ Expected: '{"a":"hello"}' >{$arr}("f")' ]]> - + @@ -13693,22 +13693,22 @@ Expected: '{"a":"hello"}' >{$arr};$fun("f"))' ]]> - + @@ -13726,7 +13726,7 @@ Expected: '{"a":"hello"}' )>>{$arr}([[1]])' ]]> - + @@ -13735,7 +13735,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -13744,7 +13744,7 @@ Result: '[1]' Expected: '[1]' ]]> - + @@ -13753,7 +13753,7 @@ Result: '[1,2,3]' Expected: '[1,2,3]' ]]> - + @@ -13762,7 +13762,7 @@ Result: '[1,3,11,22]' Expected: '[1,3,11,22]' ]]> - + @@ -13771,7 +13771,7 @@ Result: '[[1,3,2],[1,2,3],[1,3,2]]' Expected: '[[1,3,2],[1,2,3],[1,3,2]]' ]]> - + @@ -13780,7 +13780,7 @@ Result: '[21.67,34.45,34.45,107.99]' Expected: '[21.67,34.45,34.45,107.99]' ]]> - + @@ -13789,7 +13789,7 @@ Result: '["Bowler Hat","Bowler Hat","Cloak","Trilby hat"]' Expected: '["Bowler Hat","Bowler Hat","Cloak","Trilby hat"]' ]]> - + @@ -13799,7 +13799,7 @@ Expected: '["Bowler Hat","Bowler Hat","Cloak","Trilby hat"]' - + @@ -13808,7 +13808,7 @@ Result: '["21.67 x 1","34.45 x 2","107.99 x 1","34.45 x 4"]' Expected: '["21.67 x 1","34.45 x 2","107.99 x 1","34.45 x 4"]' ]]> - + @@ -13835,7 +13835,7 @@ Expected: '["0406634348","0406654608","040657863","0406654603"]' - + @@ -13867,7 +13867,7 @@ Expected: '["0406634348","040657863","0406654608","0406654603"]' - + @@ -13876,7 +13876,7 @@ Result: '["Hello","World"]' Expected: '["Hello","World"]' ]]> - + @@ -13885,7 +13885,7 @@ Result: '["Hello"]' Expected: '["Hello"]' ]]> - + @@ -13894,7 +13894,7 @@ Result: '["Hello","","World"]' Expected: '["Hello","","World"]' ]]> - + @@ -13903,7 +13903,7 @@ Result: '["H","e","l","l","o"]' Expected: '["H","e","l","l","o"]' ]]> - + @@ -13912,7 +13912,7 @@ Result: '15' Expected: '15' ]]> - + @@ -13921,7 +13921,7 @@ Result: '["a","b","c","d"]' Expected: '["a","b","c","d"]' ]]> - + @@ -13930,7 +13930,7 @@ Result: '["a","b"]' Expected: '["a","b"]' ]]> - + @@ -13939,7 +13939,7 @@ Result: '["a","b"]' Expected: '["a","b"]' ]]> - + @@ -13948,7 +13948,7 @@ Result: '["a","b","c","d"]' Expected: '["a","b","c","d"]' ]]> - + @@ -13957,7 +13957,7 @@ Result: '[]' Expected: '[]' ]]> - + @@ -13966,7 +13966,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -13976,7 +13976,7 @@ Expected 'undefined' - + @@ -13986,7 +13986,7 @@ Expected 'undefined' - + @@ -13996,7 +13996,7 @@ Expected 'undefined' - + @@ -14006,7 +14006,7 @@ Expected 'undefined' - + @@ -14016,7 +14016,7 @@ Expected 'undefined' - + @@ -14026,7 +14026,7 @@ Expected 'undefined' - + @@ -14036,7 +14036,7 @@ Expected 'undefined' - + @@ -14045,7 +14045,7 @@ Result: '["12","345","6"]' Expected: '["12","345","6"]' ]]> - + @@ -14054,7 +14054,7 @@ Result: '"Hello World"' Expected: '"Hello World"' ]]> - + @@ -14063,7 +14063,7 @@ Result: '[{"Colour":"Purple"},{"Width":300},{"Height":200},{"Depth":210},{"Weigh Expected: '[{"Colour":"Purple"},{"Width":300},{"Height":200},{"Depth":210},{"Weight":0.75},{"Colour":"Orange"},{"Width":300},{"Height":200},{"Depth":210},{"Weight":0.6},{"Colour":"Purple"},{"Width":300},{"Height":200},{"Depth":210},{"Weight":0.75},{"Colour":"Black"},{"Width":30},{"Height":20},{"Depth":210},{"Weight":2}]' ]]> - + @@ -14072,7 +14072,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -14081,7 +14081,7 @@ Result: '""' Expected: '""' ]]> - + @@ -14090,7 +14090,7 @@ Result: '2' Expected: '2' ]]> - + @@ -14099,7 +14099,7 @@ Result: '1.4142135623730951' Expected: '1.4142135623730951' ]]> - + @@ -14108,7 +14108,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -14118,7 +14118,7 @@ Expected 'undefined' - + @@ -14127,7 +14127,7 @@ Result: '"5"' Expected: '"5"' ]]> - + @@ -14154,7 +14154,7 @@ Expected: '"3.14285714285714"' - + @@ -14181,7 +14181,7 @@ Expected: '"1e+100"' - + @@ -14208,7 +14208,7 @@ Expected: '"1e-100"' - + @@ -14235,7 +14235,7 @@ Expected: '"0.000001"' - + @@ -14262,7 +14262,7 @@ Expected: '"1e-7"' - + @@ -14289,7 +14289,7 @@ Expected: '"100000000000000000000"' - + @@ -14316,7 +14316,7 @@ Expected: '"1e+21"' - + @@ -14325,7 +14325,7 @@ Result: '["90.57","245.79"]' Expected: '["90.57","245.79"]' ]]> - + @@ -14334,7 +14334,7 @@ Result: '"true"' Expected: '"true"' ]]> - + @@ -14343,7 +14343,7 @@ Result: '"false"' Expected: '"false"' ]]> - + @@ -14352,7 +14352,7 @@ Result: '"null"' Expected: '"null"' ]]> - + @@ -14361,7 +14361,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -14370,7 +14370,7 @@ Result: '""' Expected: '""' ]]> - + @@ -14379,7 +14379,7 @@ Result: '""' Expected: '""' ]]> - + @@ -14388,7 +14388,7 @@ Result: '""' Expected: '""' ]]> - + @@ -14397,7 +14397,7 @@ Result: '"{\"string\":\"hello\"}"' Expected: '"{\"string\":\"hello\"}"' ]]> - + @@ -14406,7 +14406,7 @@ Result: '"[\"string\",5]"' Expected: '"[\"string\",5]"' ]]> - + @@ -14433,7 +14433,7 @@ Expected: '"{\"string\":\"hello\",\"number\":39.4,\"null\":null,\"boolean\":fals - + @@ -14443,7 +14443,7 @@ Expected: '"{\"string\":\"hello\",\"number\":39.4,\"null\":null,\"boolean\":fals - + @@ -14464,7 +14464,7 @@ Expected error D1001 - + @@ -14474,7 +14474,7 @@ Expected error D1001 - + @@ -14483,7 +14483,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -14492,7 +14492,7 @@ Result: '"{\"string\":\"hello\"}"' Expected: '"{\"string\":\"hello\"}"' ]]> - + @@ -14519,7 +14519,7 @@ Expected: '"{\n \"string\": \"hello\"\n}"' - + @@ -14528,7 +14528,7 @@ Result: '"[\"string\",5]"' Expected: '"[\"string\",5]"' ]]> - + @@ -14555,7 +14555,7 @@ Expected: '"[\n \"string\",\n 5\n]"' - + @@ -14582,7 +14582,7 @@ Expected: '"{\"string\":\"hello\",\"number\":39.4,\"null\":null,\"boolean\":fals - + @@ -14609,7 +14609,7 @@ Expected: '"{\n \"string\": \"hello\",\n \"number\": 39.4,\n \"null\": null,\ - + @@ -14636,7 +14636,7 @@ Expected: '"[4,true]"' - + @@ -14645,7 +14645,7 @@ Result: '"hello"' Expected: '"hello"' ]]> - + @@ -14654,7 +14654,7 @@ Result: '"world"' Expected: '"world"' ]]> - + @@ -14663,7 +14663,7 @@ Result: '"world"' Expected: '"world"' ]]> - + @@ -14672,7 +14672,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -14699,7 +14699,7 @@ Expected: '"𝄞💩"' - + @@ -14726,7 +14726,7 @@ Expected: '"𝄞"' - + @@ -14753,7 +14753,7 @@ Expected: '"💩"' - + @@ -14762,7 +14762,7 @@ Result: '"world"' Expected: '"world"' ]]> - + @@ -14771,7 +14771,7 @@ Result: '"world"' Expected: '"world"' ]]> - + @@ -14780,7 +14780,7 @@ Result: '"worl"' Expected: '"worl"' ]]> - + @@ -14789,7 +14789,7 @@ Result: '"w"' Expected: '"w"' ]]> - + @@ -14798,7 +14798,7 @@ Result: '""' Expected: '""' ]]> - + @@ -14807,7 +14807,7 @@ Result: '""' Expected: '""' ]]> - + @@ -14816,7 +14816,7 @@ Result: '""' Expected: '""' ]]> - + @@ -14825,7 +14825,7 @@ Result: '"hel"' Expected: '"hel"' ]]> - + @@ -14852,7 +14852,7 @@ Expected: '"😁"' - + @@ -14879,7 +14879,7 @@ Expected: '"😂"' - + @@ -14906,7 +14906,7 @@ Expected: '"😂"' - + @@ -14933,7 +14933,7 @@ Expected: '"😂"' - + @@ -14942,7 +14942,7 @@ Result: '"World"' Expected: '"World"' ]]> - + @@ -14951,7 +14951,7 @@ Result: '"lo World"' Expected: '"lo World"' ]]> - + @@ -14960,7 +14960,7 @@ Result: '"Hello World"' Expected: '"Hello World"' ]]> - + @@ -14969,7 +14969,7 @@ Result: '""' Expected: '""' ]]> - + @@ -14978,7 +14978,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -14987,7 +14987,7 @@ Result: '"Hello"' Expected: '"Hello"' ]]> - + @@ -14996,7 +14996,7 @@ Result: '"He"' Expected: '"He"' ]]> - + @@ -15005,7 +15005,7 @@ Result: '"Hello World"' Expected: '"Hello World"' ]]> - + @@ -15014,7 +15014,7 @@ Result: '""' Expected: '""' ]]> - + @@ -15023,7 +15023,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -15032,7 +15032,7 @@ Result: '336.36' Expected: '336.36' ]]> - + @@ -15041,7 +15041,7 @@ Result: '[90.57,245.79]' Expected: '[90.57000000000001,245.79000000000002]' ]]> - + @@ -15050,7 +15050,7 @@ Result: '["order103: 90.57","order104: 245.79"]' Expected: '["order103: 90.57","order104: 245.79"]' ]]> - + @@ -15060,7 +15060,7 @@ Expected: '["order103: 90.57","order104: 245.79"]' - + @@ -15069,7 +15069,7 @@ Result: '1' Expected: '1' ]]> - + @@ -15079,7 +15079,7 @@ Expected: '1' - + @@ -15088,7 +15088,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -15096,19 +15096,19 @@ Expected 'undefined' - + @@ -15117,7 +15117,7 @@ Result: '1517478133123' Expected: '1517478133123' ]]> - + @@ -15125,19 +15125,19 @@ Expected: '1517478133123' - + @@ -15145,19 +15145,19 @@ Expected: '1517478133123' - + @@ -15165,40 +15165,40 @@ Expected: '1517478133123' - + - - + @@ -15208,7 +15208,7 @@ Expected: '1517478133123' - + @@ -15218,7 +15218,7 @@ Expected: '1517478133123' - + @@ -15228,29 +15228,29 @@ Expected: '1517478133123' - + - - + @@ -15258,20 +15258,20 @@ Expr is '$toMillis(undefined, 'pic')' - + @@ -15279,20 +15279,20 @@ Expr is '$toMillis('Hello', 'Hello')' - + @@ -15300,20 +15300,20 @@ Expr is '$toMillis('2018', '[Y1]')' - + @@ -15321,20 +15321,20 @@ Expr is '$toMillis('2018-03-27', '[Y1]-[M01]-[D01]')' - + @@ -15342,20 +15342,20 @@ Expr is '$toMillis('2018-03-27T14:03:00.123Z', '[Y0001]-[M01]-[D01]T[H01]:[m01]: - + @@ -15363,20 +15363,20 @@ Expr is '$toMillis('27th 3 1976', '[D1o] [M#1] [Y0001]')' - + @@ -15384,20 +15384,20 @@ Expr is '$toMillis('21st 12 1881', '[D1o] [M01] [Y0001]')' - + @@ -15405,20 +15405,20 @@ Expr is '$toMillis('2nd 12 2012', '[D1o] [M01] [Y0001]')' - + @@ -15426,20 +15426,20 @@ Expr is '$toMillis('MCMLXXXIV', '[YI]')' - + @@ -15447,20 +15447,20 @@ Expr is '$toMillis('27 03 MMXVIII', '[D1] [M01] [YI]')' - + @@ -15468,20 +15468,20 @@ Expr is '$toMillis('27 iii MMXVIII', '[D1] [Mi] [YI]')' - + @@ -15489,20 +15489,20 @@ Expr is '$toMillis('w C mmxviii', '[Da] [MA] [Yi]')' - + @@ -15510,20 +15510,20 @@ Expr is '$toMillis('ae C mmxviii', '[Da] [MA] [Yi]')' - + @@ -15531,20 +15531,20 @@ Expr is '$toMillis('27th April 2008', '[D1o] [MNn] [Y0001]')' - + @@ -15552,20 +15552,20 @@ Expr is '$toMillis('21 August 2017', '[D1] [MNn] [Y0001]')' - + @@ -15573,20 +15573,20 @@ Expr is '$toMillis('2 Feb 2012', '[D1] [MNn,3-3] [Y0001]')' - + @@ -15594,20 +15594,20 @@ Expr is '$toMillis('one thousand, nine hundred and eighty-four', '[Yw]')' - + @@ -15615,20 +15615,20 @@ Expr is '$toMillis('nineteen hundred and eighty-four', '[Yw]')' - + @@ -15636,20 +15636,20 @@ Expr is '$toMillis('twenty-seven April 2008', '[Dw] [MNn] [Y0001]')' - + @@ -15657,20 +15657,20 @@ Expr is '$toMillis('twenty-seventh April 2008', '[Dw] [MNn] [Y0001]')' - + @@ -15678,20 +15678,20 @@ Expr is '$toMillis('twenty-first August two thousand and seventeen', '[Dw] [MNn] - + @@ -15699,20 +15699,20 @@ Expr is '$toMillis('TWENTY-SECOND August two thousand and seventeen', '[DW] [MNn - + @@ -15720,20 +15720,20 @@ Expr is '$toMillis('Twentieth of August, two thousand and seventeen', '[DW] of [ - + @@ -15741,20 +15741,20 @@ Expr is '$toMillis('4/4/2018 12:06 am', '[D1]/[M1]/[Y0001] [h]:[m] [P]')' - + @@ -15762,20 +15762,20 @@ Expr is '$toMillis('4/4/2018 06:30 am', '[D1]/[M1]/[Y0001] [h]:[m] [P]')' - + @@ -15783,20 +15783,20 @@ Expr is '$toMillis('4/4/2018 12:06 pm', '[D1]/[M1]/[Y0001] [h]:[m] [P]')' - + @@ -15804,20 +15804,20 @@ Expr is '$toMillis('4/4/2018 11:30 pm', '[D1]/[M1]/[Y0001] [h]:[m] [P]')' - + @@ -15825,29 +15825,29 @@ Expr is '$toMillis('2018-094', '[Y0001]-[d001]')' $fromMillis() ~> $substringBefore('T') = $substringBefore($now(), 'T')' ]]> - + @@ -15855,26 +15855,26 @@ Expr is '$toMillis('13:45', '[H]:[m]') ~> $fromMillis() ~> $substringBefore('T') $fromMillis() ~> $substringAfter('T')' ]]> - + @@ -15882,23 +15882,23 @@ Expr is '$toMillis('13:45', '[H]:[m]') ~> $fromMillis() ~> $substringAfter('T')' $fromMillis()' ]]> - + @@ -15906,23 +15906,23 @@ Expr is '$toMillis('Wednesday, 14th November 2018', '[FNn], [D1o] [MNn] [Y]') ~> $fromMillis()' ]]> - + @@ -15930,23 +15930,23 @@ Expr is '$toMillis('Mon, Twelfth November 2018', '[FNn,*-3], [DWwo] [MNn] [Y]') $fromMillis()' ]]> - + @@ -15954,23 +15954,23 @@ Expr is '$toMillis('2018--180', '[Y]--[d]') ~> $fromMillis()' $fromMillis()' ]]> - + @@ -15978,20 +15978,20 @@ Expr is '$toMillis('three hundred and sixty-fifth day of 2018', '[dwo] day of [Y - + @@ -16002,7 +16002,7 @@ Expr is '$toMillis('irrelevent string', '[Y]-[M]-[D]')' Expr is '$toMillis('2018-05-22', '[Y]-[M]-[q]')' ]]> - + @@ -16013,7 +16013,7 @@ Expr is '$toMillis('2018-05-22', '[Y]-[M]-[q]')' Expr is '$toMillis('2018-05-22', '[YN]-[M]-[D]')' ]]> - + @@ -16024,7 +16024,7 @@ Expr is '$toMillis('2018-05-22', '[YN]-[M]-[D]')' Expr is '$toMillis('2018-22', '[Y]-[D]')' ]]> - + @@ -16035,7 +16035,7 @@ Expr is '$toMillis('2018-22', '[Y]-[D]')' Expr is '$toMillis('5-22 23:59', '[M]-[D] [m]:[s]')' ]]> - + @@ -16046,7 +16046,7 @@ Expr is '$toMillis('5-22 23:59', '[M]-[D] [m]:[s]')' Expr is '$toMillis('2018-3-2-5', '[X]-[x]-[w]-[F1]')' ]]> - + @@ -16057,7 +16057,7 @@ Expr is '$toMillis('2018-3-2-5', '[X]-[x]-[w]-[F1]')' Expr is '$toMillis('2018-32-5', '[X]-[W]-[F1]')' ]]> - + @@ -16065,23 +16065,23 @@ Expr is '$toMillis('2018-32-5', '[X]-[W]-[F1]')' $fromMillis() ' ]]> - + @@ -16089,23 +16089,23 @@ Expr is '$toMillis('2020-09-09 08:00:00 +02:00', '[Y0001]-[M01]-[D01] [H01]:[m01 $fromMillis() ' ]]> - + @@ -16113,23 +16113,23 @@ Expr is '$toMillis('2020-09-09 08:00:00 GMT-05:00', '[Y0001]-[M01]-[D01] [H01]:[ $fromMillis() ' ]]> - + @@ -16137,23 +16137,23 @@ Expr is '$toMillis('2020-09-09 12:00:00 +05:30', '[Y0001]-[M01]-[D01] [H01]:[m01 $fromMillis() ' ]]> - + @@ -16161,23 +16161,23 @@ Expr is '$toMillis('2020-09-09 12:00:00 GMT-5', '[Y0001]-[M01]-[D01] [H01]:[m01] $fromMillis() ' ]]> - + @@ -16186,7 +16186,7 @@ Result: '"Hello World"' Expected: '"Hello World"' ]]> - + @@ -16196,7 +16196,7 @@ Result: '"Hello World"' Expected: '"Hello World"' ]]> - + @@ -16205,7 +16205,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -16214,7 +16214,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -16223,7 +16223,7 @@ Result: '"null"' Expected: '"null"' ]]> - + @@ -16232,7 +16232,7 @@ Result: '"number"' Expected: '"number"' ]]> - + @@ -16241,7 +16241,7 @@ Result: '"string"' Expected: '"string"' ]]> - + @@ -16250,7 +16250,7 @@ Result: '"boolean"' Expected: '"boolean"' ]]> - + @@ -16259,7 +16259,7 @@ Result: '"string"' Expected: '"string"' ]]> - + @@ -16268,7 +16268,7 @@ Result: '"array"' Expected: '"array"' ]]> - + @@ -16277,7 +16277,7 @@ Result: '"array"' Expected: '"array"' ]]> - + @@ -16286,7 +16286,7 @@ Result: '"array"' Expected: '"array"' ]]> - + @@ -16295,7 +16295,7 @@ Result: '"function"' Expected: '"function"' ]]> - + @@ -16304,7 +16304,7 @@ Result: '"function"' Expected: '"function"' ]]> - + @@ -16313,7 +16313,7 @@ Result: '"object"' Expected: '"object"' ]]> - + @@ -16322,7 +16322,7 @@ Result: '"object"' Expected: '"object"' ]]> - + @@ -16331,7 +16331,7 @@ Result: '"HELLO WORLD"' Expected: '"HELLO WORLD"' ]]> - + @@ -16340,7 +16340,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -16349,7 +16349,7 @@ Result: '[[1,4],[2,5],[3,6]]' Expected: '[[1,4],[2,5],[3,6]]' ]]> - + @@ -16358,7 +16358,7 @@ Result: '[[1,4,7],[2,5,8],[3,6,9]]' Expected: '[[1,4,7],[2,5,8],[3,6,9]]' ]]> - + @@ -16367,7 +16367,7 @@ Result: '[[1,4,7],[2,5,8]]' Expected: '[[1,4,7],[2,5,8]]' ]]> - + @@ -16376,7 +16376,7 @@ Result: '[[1],[2],[3]]' Expected: '[[1],[2],[3]]' ]]> - + @@ -16385,7 +16385,7 @@ Result: '[[1,2,3]]' Expected: '[[1,2,3]]' ]]> - + @@ -16394,7 +16394,7 @@ Result: '[]' Expected: '[]' ]]> - + @@ -16403,7 +16403,7 @@ Result: '13' Expected: '13' ]]> - + @@ -16412,7 +16412,7 @@ Result: '720' Expected: '720' ]]> - + @@ -16421,7 +16421,7 @@ Result: '8' Expected: '8' ]]> - + @@ -16430,7 +16430,7 @@ Result: '"9780262510875"' Expected: '"9780262510875"' ]]> - + @@ -16439,7 +16439,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -16448,7 +16448,7 @@ Result: '5' Expected: '5' ]]> - + @@ -16457,7 +16457,7 @@ Result: '[1,2]' Expected: '[1,2]' ]]> - + @@ -16466,7 +16466,7 @@ Result: '[1,4,9,16,25]' Expected: '[1,4,9,16,25]' ]]> - + @@ -16476,7 +16476,7 @@ Expected: '[1,4,9,16,25]' - + @@ -16485,7 +16485,7 @@ Result: '["1","2","3"]' Expected: '["1","2","3"]' ]]> - + @@ -16494,7 +16494,7 @@ Result: '["1: Bowler Hat","2: Trilby hat","3: Bowler Hat","4: Cloak"]' Expected: '["1: Bowler Hat","2: Trilby hat","3: Bowler Hat","4: Cloak"]' ]]> - + @@ -16503,7 +16503,7 @@ Result: '["1/4: Bowler Hat","2/4: Trilby hat","3/4: Bowler Hat","4/4: Cloak"]' Expected: '["1/4: Bowler Hat","2/4: Trilby hat","3/4: Bowler Hat","4/4: Cloak"]' ]]> - + @@ -16512,7 +16512,7 @@ Result: '[1,2]' Expected: '[1,2]' ]]> - + @@ -16521,7 +16521,7 @@ Result: '[1,2]' Expected: '[1,2]' ]]> - + @@ -16530,7 +16530,7 @@ Result: '[null,1,2,null]' Expected: '[null,1,2,null]' ]]> - + @@ -16539,7 +16539,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -16548,7 +16548,7 @@ Result: '[false,true,true]' Expected: '[false,true,true]' ]]> - + @@ -16557,7 +16557,7 @@ Result: '15' Expected: '15' ]]> - + @@ -16566,7 +16566,7 @@ Result: '"1 ... 2 ... 3 ... 4 ... 5"' Expected: '"1 ... 2 ... 3 ... 4 ... 5"' ]]> - + @@ -16575,7 +16575,7 @@ Result: '17' Expected: '17' ]]> - + @@ -16584,7 +16584,7 @@ Result: '1' Expected: '1' ]]> - + @@ -16593,7 +16593,7 @@ Result: '1' Expected: '1' ]]> - + @@ -16602,7 +16602,7 @@ Result: '[2,1,4,1]' Expected: '[2,1,4,1]' ]]> - + @@ -16611,7 +16611,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -16620,7 +16620,7 @@ Result: '[1,2,4,8,16,32]' Expected: '[1,2,4,8,16,32]' ]]> - + @@ -16630,7 +16630,7 @@ Expected: '[1,2,4,8,16,32]' - + @@ -16651,7 +16651,7 @@ Result: '4' Expected: '4' ]]> - + @@ -16669,7 +16669,7 @@ Result: '6' Expected: '6' ]]> - + @@ -16678,7 +16678,7 @@ Result: '"9780262510875"' Expected: '"9780262510875"' ]]> - + @@ -16687,7 +16687,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -16696,7 +16696,7 @@ Result: '5' Expected: '5' ]]> - + @@ -16706,7 +16706,7 @@ Expected: '5' - + @@ -16716,7 +16716,7 @@ Expected: '5' - + @@ -16726,7 +16726,7 @@ Expected: '5' - + @@ -16735,7 +16735,7 @@ Result: '0' Expected: '0' ]]> - + @@ -16745,7 +16745,7 @@ Expected: '0' - + @@ -16754,7 +16754,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -16763,7 +16763,7 @@ Result: '"one"' Expected: '"one"' ]]> - + @@ -16772,7 +16772,7 @@ Result: '{"type":"home","number":"0203 544 1234"}' Expected: '{"type":"home","number":"0203 544 1234"}' ]]> - + @@ -16781,7 +16781,7 @@ Result: '[6,6,6,6,6]' Expected: '[6,6,6,6,6]' ]]> - + @@ -16790,7 +16790,7 @@ Result: '[6,6,6,6,6]' Expected: '[6,6,6,6,6]' ]]> - + @@ -16799,7 +16799,7 @@ Result: '6' Expected: '6' ]]> - + @@ -16808,7 +16808,7 @@ Result: '6' Expected: '6' ]]> - + @@ -16817,7 +16817,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -16826,7 +16826,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -16835,7 +16835,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -16844,7 +16844,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -16853,7 +16853,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -16862,7 +16862,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -16871,7 +16871,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -16880,7 +16880,7 @@ Result: '["The AWK Programming Language","Compilers: Principles, Techniques, and Expected: '["The AWK Programming Language","Compilers: Principles, Techniques, and Tools"]' ]]> - + @@ -16889,7 +16889,7 @@ Result: '"fakeintegrationname"' Expected: '"fakeintegrationname"' ]]> - + @@ -16907,7 +16907,7 @@ Expected: '"fakeintegrationname"' - + @@ -16925,7 +16925,7 @@ Expected: '"fakeintegrationname"' - + @@ -16943,7 +16943,7 @@ Expected: '"fakeintegrationname"' - + @@ -16961,7 +16961,7 @@ Expected: '"fakeintegrationname"' $join(', ') }' ]]> - + @@ -16979,7 +16979,7 @@ Expected: '"fakeintegrationname"' - + @@ -16997,7 +16997,7 @@ Expected: '"fakeintegrationname"' - + @@ -17015,7 +17015,7 @@ Expected: '"fakeintegrationname"' - + @@ -17033,7 +17033,7 @@ Expected: '"fakeintegrationname"' - + @@ -17051,7 +17051,7 @@ Expected: '"fakeintegrationname"' - + @@ -17069,7 +17069,7 @@ Expected: '"fakeintegrationname"' - + @@ -17087,7 +17087,7 @@ Expected: '"fakeintegrationname"' $) }' ]]> - + @@ -17105,7 +17105,7 @@ Expected: '"fakeintegrationname"' - + @@ -17123,7 +17123,7 @@ Expected: '"fakeintegrationname"' - + @@ -17141,7 +17141,7 @@ Expected: '"fakeintegrationname"' - + @@ -17163,7 +17163,7 @@ Expected: '"fakeintegrationname"' - + @@ -17183,7 +17183,7 @@ Expected: '"fakeintegrationname"' OrderID)@$o.Product.{ 'name':`Product Name`, 'orderid':$o.OrderID }' ]]> - + @@ -17201,7 +17201,7 @@ Expected: '"fakeintegrationname"' - + @@ -17219,7 +17219,7 @@ Expected: '"fakeintegrationname"' - + @@ -17237,7 +17237,7 @@ Expected: '"fakeintegrationname"' - + @@ -17255,7 +17255,7 @@ Expected: '"fakeintegrationname"' - + @@ -17273,7 +17273,7 @@ Expected: '"fakeintegrationname"' - + @@ -17291,7 +17291,7 @@ Expected: '"fakeintegrationname"' $)' ]]> - + @@ -17311,7 +17311,7 @@ Expected: '"fakeintegrationname"' - + @@ -17329,7 +17329,7 @@ Expected: '"fakeintegrationname"' - + @@ -17347,7 +17347,7 @@ Expected: '"fakeintegrationname"' - + @@ -17365,7 +17365,7 @@ Expected: '"fakeintegrationname"' - + @@ -17383,7 +17383,7 @@ Expected: '"fakeintegrationname"' - + @@ -17401,7 +17401,7 @@ Expected: '"fakeintegrationname"' - + @@ -17421,7 +17421,7 @@ Expected: '"fakeintegrationname"' =2]' ]]> - + @@ -17439,7 +17439,7 @@ Expected: '"fakeintegrationname"' - + @@ -17457,7 +17457,7 @@ Expected: '"fakeintegrationname"' - + @@ -17475,7 +17475,7 @@ Expected: '"fakeintegrationname"' - + @@ -17497,7 +17497,7 @@ Expected: '"fakeintegrationname"' ' ]]> - + @@ -17519,7 +17519,7 @@ Expected: '"fakeintegrationname"' ' ]]> - + @@ -17537,7 +17537,7 @@ Expected: '"fakeintegrationname"' - + @@ -17560,7 +17560,7 @@ Expected: '"fakeintegrationname"' ' ]]> - + @@ -17583,7 +17583,7 @@ Expected: '"fakeintegrationname"' ' ]]> - + @@ -17609,7 +17609,7 @@ Expected: '"fakeintegrationname"' ' ]]> - + @@ -17631,7 +17631,7 @@ Expected: '"fakeintegrationname"' ' ]]> - + @@ -17658,7 +17658,7 @@ Expected: '"fakeintegrationname"' ' ]]> - + @@ -17680,7 +17680,7 @@ Expected: '"fakeintegrationname"' ' ]]> - + @@ -17702,7 +17702,7 @@ Expected: '"fakeintegrationname"' ' ]]> - + @@ -17724,7 +17724,7 @@ Expected: '"fakeintegrationname"' ' ]]> - + @@ -17733,7 +17733,7 @@ Result: '25' Expected: '25' ]]> - + @@ -17742,7 +17742,7 @@ Result: '"foo"' Expected: '"foo"' ]]> - + @@ -17751,7 +17751,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -17760,7 +17760,7 @@ Result: '24' Expected: '24' ]]> - + @@ -17769,7 +17769,7 @@ Result: '[1,1,2,3,5,8,13,21,34]' Expected: '[1,1,2,3,5,8,13,21,34]' ]]> - + @@ -17778,7 +17778,7 @@ Result: '21.67' Expected: '21.67' ]]> - + @@ -17787,7 +17787,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -17796,7 +17796,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -17805,7 +17805,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -17814,7 +17814,7 @@ Result: '[4,3]' Expected: '[4,3]' ]]> - + @@ -17823,7 +17823,7 @@ Result: '[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]' Expected: '[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]' ]]> - + @@ -17832,7 +17832,7 @@ Result: '[0,2,4,6,8,10,12,14]' Expected: '[0,2,4,6,8,10,12,14]' ]]> - + @@ -17841,7 +17841,7 @@ Result: '4' Expected: '4' ]]> - + @@ -17850,7 +17850,7 @@ Result: '{"fgFoo:0:hausnummer":{"type":"de.example.api.PossibleValuesList","valu Expected: '{"fgFoo:0:hausnummer":{"type":"de.example.api.PossibleValuesList","value":[{"label":"","value":""}]}}' ]]> - + @@ -17859,7 +17859,7 @@ Result: '{"fgFoo:0:hausnummer":{"type":"de.example.api.PossibleValuesList","valu Expected: '{"fgFoo:0:hausnummer":{"type":"de.example.api.PossibleValuesList","value":[{"label":"","value":""}]}}' ]]> - + @@ -17868,7 +17868,7 @@ Result: '{"fgFoo:0:hausnummer":{"type":"de.example.api.PossibleValuesList","valu Expected: '{"fgFoo:0:hausnummer":{"type":"de.example.api.PossibleValuesList","value":[{"label":"","value":""}]}}' ]]> - + @@ -17877,7 +17877,7 @@ Result: '{"fgFoo:0:hausnummer":{"type":"de.example.api.PossibleValuesList","valu Expected: '{"fgFoo:0:hausnummer":{"type":"de.example.api.PossibleValuesList","value":[{"label":"","value":""}]}}' ]]> - + @@ -17886,7 +17886,7 @@ Result: '"hello"' Expected: '"hello"' ]]> - + @@ -17895,7 +17895,7 @@ Result: '"hello"' Expected: '"hello"' ]]> - + @@ -17904,7 +17904,7 @@ Result: '"Wayne's World"' Expected: '"Wayne's World"' ]]> - + @@ -17913,7 +17913,7 @@ Result: '42' Expected: '42' ]]> - + @@ -17922,7 +17922,7 @@ Result: '-42' Expected: '-42' ]]> - + @@ -17931,7 +17931,7 @@ Result: '3.14159' Expected: '3.14159' ]]> - + @@ -17940,7 +17940,7 @@ Result: '6.022E+23' Expected: '6.022E+23' ]]> - + @@ -17949,7 +17949,7 @@ Result: '1.602E-19' Expected: '1.602E-19' ]]> - + @@ -17970,7 +17970,7 @@ Expected error S0102 - + @@ -17979,7 +17979,7 @@ Result: '"hello\tworld"' Expected: '"hello\tworld"' ]]> - + @@ -17988,7 +17988,7 @@ Result: '"hello\nworld"' Expected: '"hello\nworld"' ]]> - + @@ -17997,7 +17997,7 @@ Result: '"hello \"world\""' Expected: '"hello \"world\""' ]]> - + @@ -18006,7 +18006,7 @@ Result: '"C:\\Test\\test.txt"' Expected: '"C:\\Test\\test.txt"' ]]> - + @@ -18015,7 +18015,7 @@ Result: '"λ-calculus rocks"' Expected: '"λ-calculus rocks"' ]]> - + @@ -18024,7 +18024,7 @@ Result: '"𝄞"' Expected: '"𝄞"' ]]> - + @@ -18045,7 +18045,7 @@ Expected: '"𝄞"' - + @@ -18067,7 +18067,7 @@ Expected: '"𝄞"' - + @@ -18089,7 +18089,7 @@ Expected: '"𝄞"' - + @@ -18098,7 +18098,7 @@ Result: '{"foo":{"sequence":123,"bar":"baz"}}' Expected: '{"foo":{"sequence":123,"bar":"baz"}}' ]]> - + @@ -18107,7 +18107,7 @@ Result: '{"foo":{"sequence":true,"bar":"baz"}}' Expected: '{"foo":{"sequence":true,"bar":"baz"}}' ]]> - + @@ -18115,16 +18115,16 @@ Expected: '{"foo":{"sequence":true,"bar":"baz"}}' - + @@ -18157,7 +18157,7 @@ Expected: '{"foo":{"sequence":true,"bar":"baz"}}' - + @@ -18166,7 +18166,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -18175,7 +18175,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -18184,7 +18184,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -18193,7 +18193,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -18202,7 +18202,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -18211,7 +18211,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -18220,7 +18220,7 @@ Result: '[2,3,4,9,10]' Expected: '[2,3,4,9,10]' ]]> - + @@ -18229,7 +18229,7 @@ Result: '[2,3,4,6,9]' Expected: '[2,3,4,6,9]' ]]> - + @@ -18238,7 +18238,7 @@ Result: '[1,2,3,4,5,6,7,8,9,10]' Expected: '[1,2,3,4,5,6,7,8,9,10]' ]]> - + @@ -18247,7 +18247,7 @@ Result: 'null' Expected: 'null' ]]> - + @@ -18256,7 +18256,7 @@ Result: '[null]' Expected: '[null]' ]]> - + @@ -18265,7 +18265,7 @@ Result: '[null,null]' Expected: '[null,null]' ]]> - + @@ -18274,7 +18274,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -18283,7 +18283,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -18292,7 +18292,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -18301,7 +18301,7 @@ Result: '{"true":true,"false":false,"null":null}' Expected: '{"true":true,"false":false,"null":null}' ]]> - + @@ -18310,7 +18310,7 @@ Result: '140' Expected: '140' ]]> - + @@ -18319,7 +18319,7 @@ Result: '140' Expected: '140' ]]> - + @@ -18328,7 +18328,7 @@ Result: '-56' Expected: '-56' ]]> - + @@ -18337,7 +18337,7 @@ Result: '56' Expected: '56' ]]> - + @@ -18346,7 +18346,7 @@ Result: '4116' Expected: '4116' ]]> - + @@ -18355,7 +18355,7 @@ Result: '4116' Expected: '4116' ]]> - + @@ -18364,7 +18364,7 @@ Result: '0.42857142857142855' Expected: '0.42857142857142855' ]]> - + @@ -18373,7 +18373,7 @@ Result: '2.3333333333333335' Expected: '2.3333333333333335' ]]> - + @@ -18382,7 +18382,7 @@ Result: '42' Expected: '42' ]]> - + @@ -18391,7 +18391,7 @@ Result: '14' Expected: '14' ]]> - + @@ -18400,7 +18400,7 @@ Result: '4214' Expected: '4214' ]]> - + @@ -18409,7 +18409,7 @@ Result: '4214' Expected: '4214' ]]> - + @@ -18418,7 +18418,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -18427,7 +18427,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -18448,7 +18448,7 @@ Expected error D1001 - + @@ -18458,7 +18458,7 @@ Expected error D1001 - + @@ -18467,7 +18467,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -18477,7 +18477,7 @@ Expected 'undefined' - + @@ -18498,7 +18498,7 @@ Expected error T2001 - + @@ -18507,7 +18507,7 @@ Result: '{}' Expected: '{}' ]]> - + @@ -18516,7 +18516,7 @@ Result: '{"key":"value"}' Expected: '{"key":"value"}' ]]> - + @@ -18525,7 +18525,7 @@ Result: '{"one":1,"two":2}' Expected: '{"one":1,"two":2}' ]]> - + @@ -18534,7 +18534,7 @@ Result: '2' Expected: '2' ]]> - + @@ -18543,7 +18543,7 @@ Result: '{"one":1,"two":{"three":3,"four":"4"}}' Expected: '{"one":1,"two":{"three":3,"four":"4"}}' ]]> - + @@ -18552,7 +18552,7 @@ Result: '{"one":1,"two":[3,"four"]}' Expected: '{"one":1,"two":[3,"four"]}' ]]> - + @@ -18561,7 +18561,7 @@ Result: '{}' Expected: '{}' ]]> - + @@ -18570,7 +18570,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -18579,7 +18579,7 @@ Result: '{"order103":["Bowler Hat","Trilby hat"],"order104":["Bowler Hat","Cloak Expected: '{"order103":["Bowler Hat","Trilby hat"],"order104":["Bowler Hat","Cloak"]}' ]]> - + @@ -18588,7 +18588,7 @@ Result: '[{"order103":["Bowler Hat","Trilby hat"]},{"order104":["Bowler Hat","Cl Expected: '[{"order103":["Bowler Hat","Trilby hat"]},{"order104":["Bowler Hat","Cloak"]}]' ]]> - + @@ -18597,7 +18597,7 @@ Result: '{"858383":[34.45,34.45],"858236":21.67,"345664":107.99}' Expected: '{"345664":107.99,"858236":21.67,"858383":[34.45,34.45]}' ]]> - + @@ -18606,7 +18606,7 @@ Result: '{"858383":34.45,"858236":21.67,"345664":107.99}' Expected: '{"345664":107.99,"858236":21.67,"858383":34.45}' ]]> - + @@ -18615,7 +18615,7 @@ Result: '[{"858383":34.45},{"858236":21.67},{"858383":34.45},{"345664":107.99}]' Expected: '[{"858383":34.45},{"858236":21.67},{"858383":34.45},{"345664":107.99}]' ]]> - + @@ -18625,7 +18625,7 @@ Expected: '[{"858383":34.45},{"858236":21.67},{"858383":34.45},{"345664":107.99} - + @@ -18635,7 +18635,7 @@ Expected: '[{"858383":34.45},{"858236":21.67},{"858383":34.45},{"345664":107.99} - + @@ -18644,7 +18644,7 @@ Result: '{"order103":90.57,"order104":245.79}' Expected: '{"order103":90.57000000000001,"order104":245.79000000000002}' ]]> - + @@ -18653,7 +18653,7 @@ Result: '[{"order103":90.57},{"order104":245.79}]' Expected: '[{"order103":90.57000000000001},{"order104":245.79000000000002}]' ]]> - + @@ -18663,7 +18663,7 @@ Expected: '[{"order103":90.57000000000001},{"order104":245.79000000000002}]' - + @@ -18672,7 +18672,7 @@ Result: '{"Bowler Hat":[34.45,34.45],"0406654608":34.45,"Trilby hat":21.67,"0406 Expected: '{"Bowler Hat":[34.45,34.45],"0406654608":34.45,"Trilby hat":21.67,"0406634348":21.67,"040657863":34.45,"Cloak":107.99,"0406654603":107.99}' ]]> - + @@ -18681,7 +18681,7 @@ Result: '{"order103":{"TotalPrice":90.57,"Items":["Bowler Hat","Trilby hat"]},"o Expected: '{"order103":{"TotalPrice":90.57000000000001,"Items":["Bowler Hat","Trilby hat"]},"order104":{"TotalPrice":245.79000000000002,"Items":["Bowler Hat","Cloak"]}}' ]]> - + @@ -18690,7 +18690,7 @@ Result: '{"Order":[{"ID":"order103","Product":[{"Name":"Bowler Hat","SKU":858383 Expected: '{"Order":[{"ID":"order103","Product":[{"Name":"Bowler Hat","SKU":858383,"Details":{"Weight":0.75,"Dimensions":"300 x 200 x 210"}},{"Name":"Trilby hat","SKU":858236,"Details":{"Weight":0.6,"Dimensions":"300 x 200 x 210"}}],"Total Price":90.57000000000001},{"ID":"order104","Product":[{"Name":"Bowler Hat","SKU":858383,"Details":{"Weight":0.75,"Dimensions":"300 x 200 x 210"}},{"Name":"Cloak","SKU":345664,"Details":{"Weight":2,"Dimensions":"30 x 20 x 210"}}],"Total Price":245.79000000000002}]}' ]]> - + @@ -18699,7 +18699,7 @@ Result: '{"Order":[{"ID":"order103","Product":[{"Name":"Bowler Hat","SKU":858383 Expected: '{"Order":[{"ID":"order103","Product":[{"Name":"Bowler Hat","SKU":858383,"Details":{"Weight":0.75,"Dimensions":"300 x 200 x 210"}},{"Name":"Trilby hat","SKU":858236,"Details":{"Weight":0.6,"Dimensions":"300 x 200 x 210"}}],"Total Price":90.57000000000001},{"ID":"order104","Product":[{"Name":"Bowler Hat","SKU":858383,"Details":{"Weight":0.75,"Dimensions":"300 x 200 x 210"}},{"Name":"Cloak","SKU":345664,"Details":{"Weight":2,"Dimensions":"30 x 20 x 210"}}],"Total Price":245.79000000000002}]}' ]]> - + @@ -18708,7 +18708,7 @@ Result: '{"home":"0203 544 1234","phone":["0203 544 1234","01962 001234","01962 Expected: '{"home":"0203 544 1234","phone":["0203 544 1234","01962 001234","01962 001235","077 7700 1234"],"office":"01962 001234, 01962 001235","mobile":"077 7700 1234"}' ]]> - + @@ -18718,7 +18718,7 @@ Expected: '{"home":"0203 544 1234","phone":["0203 544 1234","01962 001234","0196 - + @@ -18728,7 +18728,7 @@ Expected: '{"home":"0203 544 1234","phone":["0203 544 1234","01962 001234","0196 - + @@ -18745,7 +18745,7 @@ Result: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"2019- Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"2019-05":129360,"2019-06":484244,"2019-07":698748,"2019-08":788322}' ]]> - + @@ -18755,7 +18755,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -18765,7 +18765,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -18775,7 +18775,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -18785,7 +18785,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -18795,7 +18795,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -18805,7 +18805,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -18815,7 +18815,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -18825,7 +18825,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -18835,7 +18835,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -18845,7 +18845,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -18855,7 +18855,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -18865,7 +18865,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -18875,7 +18875,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -18885,7 +18885,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -18895,7 +18895,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -18905,7 +18905,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -18928,7 +18928,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 ' ]]> - + @@ -18951,7 +18951,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 ' ]]> - + @@ -18969,7 +18969,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -18989,7 +18989,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -19011,7 +19011,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -19029,7 +19029,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -19047,7 +19047,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -19065,7 +19065,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -19081,7 +19081,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -19099,7 +19099,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -19115,7 +19115,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -19133,7 +19133,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -19149,7 +19149,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -19172,7 +19172,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 ' ]]> - + @@ -19195,7 +19195,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 ' ]]> - + @@ -19218,7 +19218,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 ' ]]> - + @@ -19241,7 +19241,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 ' ]]> - + @@ -19264,7 +19264,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 ' ]]> - + @@ -19280,7 +19280,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -19296,7 +19296,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 %.%.OrderID)' ]]> - + @@ -19314,7 +19314,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -19334,7 +19334,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -19354,7 +19354,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -19374,7 +19374,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -19392,7 +19392,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -19410,7 +19410,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -19428,7 +19428,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -19446,7 +19446,7 @@ Expected: '{"2019-01":68281,"2019-02":63672,"2019-03":78625,"2019-04":76505,"201 - + @@ -19455,7 +19455,7 @@ Result: '["hello","world"]' Expected: '["hello","world"]' ]]> - + @@ -19464,7 +19464,7 @@ Result: '["hello","world"]' Expected: '["hello","world"]' ]]> - + @@ -19473,7 +19473,7 @@ Result: '["hello","world"]' Expected: '["hello","world"]' ]]> - + @@ -19482,7 +19482,7 @@ Result: '["hello","world"]' Expected: '["hello","world"]' ]]> - + @@ -19491,7 +19491,7 @@ Result: '["hello","world"]' Expected: '["hello","world"]' ]]> - + @@ -19500,7 +19500,7 @@ Result: '["hello","world"]' Expected: '["hello","world"]' ]]> - + @@ -19509,7 +19509,7 @@ Result: '["hello","world"]' Expected: '["hello","world"]' ]]> - + @@ -19518,7 +19518,7 @@ Result: '3' Expected: '3' ]]> - + @@ -19527,7 +19527,7 @@ Result: '5' Expected: '5' ]]> - + @@ -19536,7 +19536,7 @@ Result: '6' Expected: '6' ]]> - + @@ -19545,7 +19545,7 @@ Result: '"Hello"' Expected: '"Hello"' ]]> - + @@ -19555,7 +19555,7 @@ Expected: '"Hello"' - + @@ -19565,7 +19565,7 @@ Expected: '"Hello"' - + @@ -19574,7 +19574,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -19583,7 +19583,7 @@ Result: '7' Expected: '7' ]]> - + @@ -19592,7 +19592,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -19601,7 +19601,7 @@ Result: '[34.45,34.45]' Expected: '[34.45,34.45]' ]]> - + @@ -19610,7 +19610,7 @@ Result: '[{"baz":{"fud":"hello"}},{"baz":{"fud":"world"}},{"bazz":"gotcha"}]' Expected: '[{"baz":{"fud":"hello"}},{"baz":{"fud":"world"}},{"bazz":"gotcha"}]' ]]> - + @@ -19619,7 +19619,7 @@ Result: '["hello","world"]' Expected: '["hello","world"]' ]]> - + @@ -19628,7 +19628,7 @@ Result: '["hello","world"]' Expected: '["hello","world"]' ]]> - + @@ -19637,7 +19637,7 @@ Result: '"here"' Expected: '"here"' ]]> - + @@ -19646,7 +19646,7 @@ Result: '[{"baz":{"fud":"hello"}},{"baz":{"fud":"world"}},{"bazz":"gotcha"}]' Expected: '[{"baz":{"fud":"hello"}},{"baz":{"fud":"world"}},{"bazz":"gotcha"}]' ]]> - + @@ -19655,7 +19655,7 @@ Result: '["hello","world"]' Expected: '["hello","world"]' ]]> - + @@ -19664,7 +19664,7 @@ Result: '["hello","world"]' Expected: '["hello","world"]' ]]> - + @@ -19673,7 +19673,7 @@ Result: '"here"' Expected: '"here"' ]]> - + @@ -19682,7 +19682,7 @@ Result: '[0,1,2,3,4,5,6,7,8,9]' Expected: '[0,1,2,3,4,5,6,7,8,9]' ]]> - + @@ -19691,7 +19691,7 @@ Result: '[0,2,4,6,8]' Expected: '[0,2,4,6,8]' ]]> - + @@ -19700,7 +19700,7 @@ Result: '[0,4,5,6,7,8,9,20,22]' Expected: '[0,4,5,6,7,8,9,20,22]' ]]> - + @@ -19709,7 +19709,7 @@ Result: '[]' Expected: '[]' ]]> - + @@ -19718,7 +19718,7 @@ Result: '[2,3,4,5]' Expected: '[2,3,4,5]' ]]> - + @@ -19727,7 +19727,7 @@ Result: '[-2,-1,0,1,2]' Expected: '[-2,-1,0,1,2]' ]]> - + @@ -19736,7 +19736,7 @@ Result: '[4,1,0,1,4]' Expected: '[4,1,0,1,4]' ]]> - + @@ -19745,7 +19745,7 @@ Result: '[]' Expected: '[]' ]]> - + @@ -19754,7 +19754,7 @@ Result: '[3]' Expected: '[3]' ]]> - + @@ -19764,7 +19764,7 @@ Expected: '[3]' - + @@ -19774,7 +19774,7 @@ Expected: '[3]' - + @@ -19784,7 +19784,7 @@ Expected: '[3]' - + @@ -19794,7 +19794,7 @@ Expected: '[3]' - + @@ -19804,7 +19804,7 @@ Expected: '[3]' - + @@ -19814,7 +19814,7 @@ Expected: '[3]' - + @@ -19824,7 +19824,7 @@ Expected: '[3]' - + @@ -19834,7 +19834,7 @@ Expected: '[3]' - + @@ -19844,7 +19844,7 @@ Expected: '[3]' - + @@ -19854,7 +19854,7 @@ Expected: '[3]' - + @@ -19864,7 +19864,7 @@ Expected: '[3]' - + @@ -19874,7 +19874,7 @@ Expected: '[3]' - + @@ -19883,7 +19883,7 @@ Result: '10000000' Expected: '10000000' ]]> - + @@ -19893,7 +19893,7 @@ Expected: '10000000' $count()' ]]> - + @@ -19903,7 +19903,7 @@ Expected: '10000000' $count()' ]]> - + @@ -19912,7 +19912,7 @@ Result: '10000000' Expected: '10000000' ]]> - + @@ -19921,7 +19921,7 @@ Result: '["a","a","xa","cc"]' Expected: '["a","a","xa","cc"]' ]]> - + @@ -19930,7 +19930,7 @@ Result: '["a","a"]' Expected: '["a","a"]' ]]> - + @@ -19939,7 +19939,7 @@ Result: '["ababbxabbcc"]' Expected: '["ababbxabbcc"]' ]]> - + @@ -19948,7 +19948,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -19957,7 +19957,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -19966,7 +19966,7 @@ Result: '858236' Expected: '858236' ]]> - + @@ -19975,7 +19975,7 @@ Result: '[858383,858236,858383]' Expected: '[858383,858236,858383]' ]]> - + @@ -19984,7 +19984,7 @@ Result: '"ayyayyxayycc"' Expected: '"ayyayyxayycc"' ]]> - + @@ -19993,7 +19993,7 @@ Result: '"ayyayyxabbcc"' Expected: '"ayyayyxabbcc"' ]]> - + @@ -20002,7 +20002,7 @@ Result: '"ababbxabbcc"' Expected: '"ababbxabbcc"' ]]> - + @@ -20011,7 +20011,7 @@ Result: '"ababbxabbcc"' Expected: '"ababbxabbcc"' ]]> - + @@ -20020,7 +20020,7 @@ Result: '"Smith, John"' Expected: '"Smith, John"' ]]> - + @@ -20029,7 +20029,7 @@ Result: '"$265"' Expected: '"$265"' ]]> - + @@ -20038,7 +20038,7 @@ Result: '"$w"' Expected: '"$w"' ]]> - + @@ -20047,7 +20047,7 @@ Result: '"265USD -> $265"' Expected: '"265USD -> $265"' ]]> - + @@ -20074,7 +20074,7 @@ Expected: '"265USD265"' - + @@ -20083,7 +20083,7 @@ Result: '"[1=ab][2=]cd"' Expected: '"[1=ab][2=]cd"' ]]> - + @@ -20092,7 +20092,7 @@ Result: '"a*cada*"' Expected: '"a*cada*"' ]]> - + @@ -20101,7 +20101,7 @@ Result: '"*"' Expected: '"*"' ]]> - + @@ -20110,7 +20110,7 @@ Result: '"*c*bra"' Expected: '"*c*bra"' ]]> - + @@ -20119,7 +20119,7 @@ Result: '"brcdbr"' Expected: '"brcdbr"' ]]> - + @@ -20128,7 +20128,7 @@ Result: '"abbraccaddabbra"' Expected: '"abbraccaddabbra"' ]]> - + @@ -20149,7 +20149,7 @@ Expected error D1004 - + @@ -20158,7 +20158,7 @@ Result: '"b"' Expected: '"b"' ]]> - + @@ -20167,7 +20167,7 @@ Result: '"bbbb"' Expected: '"bbbb"' ]]> - + @@ -20176,7 +20176,7 @@ Result: '"carted"' Expected: '"carted"' ]]> - + @@ -20203,7 +20203,7 @@ Expected: '"hella8l3no"' - + @@ -20212,7 +20212,7 @@ Result: '"abcdefghijklmno"' Expected: '"abcdefghijklmno"' ]]> - + @@ -20239,7 +20239,7 @@ Expected: '"abcdefgh22823lmno"' - + @@ -20266,7 +20266,7 @@ Expected: '"abcdefghijk2ijk2ijk8ijk23lmno"' - + @@ -20275,7 +20275,7 @@ Result: '"abcdefgh$xlmno"' Expected: '"abcdefgh$xlmno"' ]]> - + @@ -20284,7 +20284,7 @@ Result: '"abcdefgh$x$lmno"' Expected: '"abcdefgh$x$lmno"' ]]> - + @@ -20293,7 +20293,7 @@ Result: '["Bowler foo","Trilby foo","Bowler foo","Cloak"]' Expected: '["Bowler foo","Trilby foo","Bowler foo","Cloak"]' ]]> - + @@ -20302,7 +20302,7 @@ Result: '["Bowler HAT","Trilby HAT","Bowler HAT","Cloak"]' Expected: '["Bowler HAT","Trilby HAT","Bowler HAT","Cloak"]' ]]> - + @@ -20311,7 +20311,7 @@ Result: '"temperature = 20C today"' Expected: '"temperature = 20C today"' ]]> - + @@ -20321,7 +20321,7 @@ Expected: '"temperature = 20C today"' - + @@ -20331,7 +20331,7 @@ Expected: '"temperature = 20C today"' - + @@ -20340,7 +20340,7 @@ Result: '["Felicia Saunders","Jimmy Schultz","Dolores Figueroa","Craig Moreno"," Expected: '["Felicia Saunders","Jimmy Schultz","Dolores Figueroa","Craig Moreno","Lindsey Hall","Bonnie Russell","Kristin Stewart","Owen Reid","Brenda Sherman","Dwayne Baldwin"]' ]]> - + @@ -20349,7 +20349,7 @@ Result: '["Felicia Saunders","Jimmy Schultz","Dolores Figueroa","Craig Moreno"," Expected: '["Felicia Saunders","Jimmy Schultz","Dolores Figueroa","Craig Moreno","Lindsey Hall","Bonnie Russell","Kristin Stewart","Owen Reid","Brenda Sherman","Dwayne Baldwin"]' ]]> - + @@ -20358,7 +20358,7 @@ Result: '[1,3,5,6]' Expected: '[1,3,5,6]' ]]> - + @@ -20367,7 +20367,7 @@ Result: '"hello"' Expected: '"hello"' ]]> - + @@ -20376,7 +20376,7 @@ Result: '"world"' Expected: '"world"' ]]> - + @@ -20385,7 +20385,7 @@ Result: '"gotcha"' Expected: '"gotcha"' ]]> - + @@ -20394,7 +20394,7 @@ Result: '"world"' Expected: '"world"' ]]> - + @@ -20403,7 +20403,7 @@ Result: '["hello","world"]' Expected: '["hello","world"]' ]]> - + @@ -20412,7 +20412,7 @@ Result: '["hello","world"]' Expected: '["hello","world"]' ]]> - + @@ -20421,7 +20421,7 @@ Result: '"hello"' Expected: '"hello"' ]]> - + @@ -20430,7 +20430,7 @@ Result: '"world"' Expected: '"world"' ]]> - + @@ -20439,7 +20439,7 @@ Result: '"world"' Expected: '"world"' ]]> - + @@ -20448,7 +20448,7 @@ Result: '"world"' Expected: '"world"' ]]> - + @@ -20457,7 +20457,7 @@ Result: '"hello"' Expected: '"hello"' ]]> - + @@ -20466,7 +20466,7 @@ Result: '"hello"' Expected: '"hello"' ]]> - + @@ -20475,7 +20475,7 @@ Result: '"hello"' Expected: '"hello"' ]]> - + @@ -20484,7 +20484,7 @@ Result: '"world"' Expected: '"world"' ]]> - + @@ -20493,7 +20493,7 @@ Result: '{"fud":"hello"}' Expected: '{"fud":"hello"}' ]]> - + @@ -20502,7 +20502,7 @@ Result: '[{"fud":"hello"},{"fud":"world"}]' Expected: '[{"fud":"hello"},{"fud":"world"}]' ]]> - + @@ -20511,7 +20511,7 @@ Result: '{"fud":"hello"}' Expected: '{"fud":"hello"}' ]]> - + @@ -20520,7 +20520,7 @@ Result: '[1,2]' Expected: '[1,2]' ]]> - + @@ -20529,7 +20529,7 @@ Result: '[3,4]' Expected: '[3,4]' ]]> - + @@ -20538,7 +20538,7 @@ Result: '[3,4]' Expected: '[3,4]' ]]> - + @@ -20547,7 +20547,7 @@ Result: '3' Expected: '3' ]]> - + @@ -20556,7 +20556,7 @@ Result: '3' Expected: '3' ]]> - + @@ -20565,7 +20565,7 @@ Result: '[21.67,34.45,34.45,107.99]' Expected: '[21.67,34.45,34.45,107.99]' ]]> - + @@ -20574,7 +20574,7 @@ Result: '[21.67,34.45,34.45,107.99]' Expected: '[21.67,34.45,34.45,107.99]' ]]> - + @@ -20583,7 +20583,7 @@ Result: '[107.99,34.45,34.45,21.67]' Expected: '[107.99,34.45,34.45,21.67]' ]]> - + @@ -20592,7 +20592,7 @@ Result: '["Orange","Purple","Purple","Black"]' Expected: '["Orange","Purple","Purple","Black"]' ]]> - + @@ -20601,7 +20601,7 @@ Result: '["0406634348","0406654608","040657863","0406654603"]' Expected: '["0406634348","0406654608","040657863","0406654603"]' ]]> - + @@ -20610,7 +20610,7 @@ Result: '["Orange","Purple","Black","Purple"]' Expected: '["Orange","Purple","Black","Purple"]' ]]> - + @@ -20619,7 +20619,7 @@ Result: '["Black","Orange","Purple","Purple"]' Expected: '["Black","Orange","Purple","Purple"]' ]]> - + @@ -20628,7 +20628,7 @@ Result: '["Orange","Black","Purple","Purple"]' Expected: '["Orange","Black","Purple","Purple"]' ]]> - + @@ -20637,7 +20637,7 @@ Result: '["0406634348","040657863","0406654603","0406654608"]' Expected: '["0406634348","040657863","0406654603","0406654608"]' ]]> - + @@ -20646,7 +20646,7 @@ Result: '["0406654608","040657863","0406654603","0406634348"]' Expected: '["0406654608","040657863","0406654603","0406634348"]' ]]> - + @@ -20655,7 +20655,7 @@ Result: '["040657863","0406654603","0406654608","0406634348"]' Expected: '["040657863","0406654603","0406654608","0406634348"]' ]]> - + @@ -20665,7 +20665,7 @@ Expected: '["040657863","0406654603","0406654608","0406634348"]' - + @@ -20675,7 +20675,7 @@ Expected: '["040657863","0406654603","0406654608","0406634348"]' - + @@ -20685,7 +20685,7 @@ Expected: '["040657863","0406654603","0406654608","0406634348"]' - + @@ -20694,7 +20694,7 @@ Result: '["Sally","Bill","Jim"]' Expected: '["Sally","Bill","Jim"]' ]]> - + @@ -20703,7 +20703,7 @@ Result: '["Sally","Bill","Jim"]' Expected: '["Sally","Bill","Jim"]' ]]> - + @@ -20712,7 +20712,7 @@ Result: '"Sally"' Expected: '"Sally"' ]]> - + @@ -20721,7 +20721,7 @@ Result: '"Sally"' Expected: '"Sally"' ]]> - + @@ -20730,7 +20730,7 @@ Result: '"Sally"' Expected: '"Sally"' ]]> - + @@ -20739,7 +20739,7 @@ Result: '{"name":"Bill","age":35}' Expected: '{"name":"Bill","age":35}' ]]> - + @@ -20757,7 +20757,7 @@ Expected: '{"name":"Bill","age":35}' - + @@ -20766,7 +20766,7 @@ Result: '"foobar"' Expected: '"foobar"' ]]> - + @@ -20775,7 +20775,7 @@ Result: '"foobar"' Expected: '"foobar"' ]]> - + @@ -20784,7 +20784,7 @@ Result: '"helloworld"' Expected: '"helloworld"' ]]> - + @@ -20793,7 +20793,7 @@ Result: '"helloworld"' Expected: '"helloworld"' ]]> - + @@ -20802,7 +20802,7 @@ Result: '"hello"' Expected: '"hello"' ]]> - + @@ -20811,7 +20811,7 @@ Result: '"world"' Expected: '"world"' ]]> - + @@ -20820,7 +20820,7 @@ Result: '"[1,2][3,4]"' Expected: '"[1,2][3,4]"' ]]> - + @@ -20829,7 +20829,7 @@ Result: '"[1,2]3"' Expected: '"[1,2]3"' ]]> - + @@ -20838,7 +20838,7 @@ Result: '"12"' Expected: '"12"' ]]> - + @@ -20847,7 +20847,7 @@ Result: '"1[2]"' Expected: '"1[2]"' ]]> - + @@ -20856,7 +20856,7 @@ Result: '"hello5"' Expected: '"hello5"' ]]> - + @@ -20865,7 +20865,7 @@ Result: '"Prices: [34.45,21.67,34.45,107.99]"' Expected: '"Prices: [34.45,21.67,34.45,107.99]"' ]]> - + @@ -20874,7 +20874,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -20901,7 +20901,7 @@ Expected: '9.33262154439441E+155' - + @@ -20922,7 +20922,7 @@ Expected error U1001 - + @@ -20931,7 +20931,7 @@ Result: '120' Expected: '120' ]]> - + @@ -20958,7 +20958,7 @@ Expected: '5.7133839564458575E+262' - + @@ -20975,7 +20975,7 @@ Expected: '5.7133839564458575E+262' - + @@ -20992,7 +20992,7 @@ Expected: '5.7133839564458575E+262' - + @@ -21009,7 +21009,7 @@ Expected: '5.7133839564458575E+262' - + @@ -21017,22 +21017,22 @@ Expected: '5.7133839564458575E+262' { $x > 0 ? $f([$s, $s], $x-1) : $s}; $f('a', 2) )' ]]> - + @@ -21040,22 +21040,22 @@ Expected: '5.7133839564458575E+262' { $x > 0 ? $f([$s, $s], $x-1) : $s}; $f('a', 2) )' ]]> - + @@ -21064,7 +21064,7 @@ Result: '33' Expected: '33' ]]> - + @@ -21073,7 +21073,7 @@ Result: '88' Expected: '88' ]]> - + @@ -21083,7 +21083,7 @@ Expected: '88' - + @@ -21093,7 +21093,7 @@ Expected: '88' - + @@ -21102,7 +21102,7 @@ Result: '{"Order":[{"ID":"order103","Product":[{"SKU":858383,"Details":{"Weight" Expected: '{"Order":[{"ID":"order103","Product":[{"SKU":858383,"Details":{"Weight":0.75,"Dimensions":"300 x 200 x 210"}},{"SKU":858236,"Details":{"Weight":0.6,"Dimensions":"300 x 200 x 210"}}],"Total Price":90.57000000000001},{"ID":"order104","Product":[{"SKU":858383,"Details":{"Weight":0.75,"Dimensions":"300 x 200 x 210"}},{"SKU":345664,"Details":{"Weight":2,"Dimensions":"30 x 20 x 210"}}],"Total Price":245.79000000000002}]}' ]]> - + @@ -21124,7 +21124,7 @@ Result: '{"tempReadings":[28.9,28,28.2,28.4,28.4],"sumTemperatures":141.9,"avgTe Expected: '{"tempReadings":[28.9,28,28.2,28.4,28.4],"sumTemperatures":141.9,"avgTemperature":28.38,"maxTemperature":28.9,"minTemperature":28}' ]]> - + @@ -21133,7 +21133,7 @@ Result: '{"output":{"is":{"same":{"as":"input"}}}}' Expected: '{"output":{"is":{"same":{"as":"input"}}}}' ]]> - + @@ -21142,7 +21142,7 @@ Result: '{"bar":42}' Expected: '{"bar":42}' ]]> - + @@ -21151,7 +21151,7 @@ Result: '{"gar":50}' Expected: '{"gar":50}' ]]> - + @@ -21160,7 +21160,7 @@ Result: '{"mama":45}' Expected: '{"mama":45}' ]]> - + @@ -21169,7 +21169,7 @@ Result: '{"wa":"hume"}' Expected: '{"wa":"hume"}' ]]> - + @@ -21178,7 +21178,7 @@ Result: '42' Expected: '42' ]]> - + @@ -21187,7 +21187,7 @@ Result: '{"bar":87}' Expected: '{"bar":87}' ]]> - + @@ -21196,7 +21196,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -21205,7 +21205,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -21214,7 +21214,7 @@ Result: '"foo"' Expected: '"foo"' ]]> - + @@ -21223,7 +21223,7 @@ Result: '"foo"' Expected: '"foo"' ]]> - + @@ -21232,7 +21232,7 @@ Result: '6754322' Expected: '6754322' ]]> - + @@ -21241,7 +21241,7 @@ Result: '0' Expected: '0' ]]> - + @@ -21250,7 +21250,7 @@ Result: '-24' Expected: '-24' ]]> - + @@ -21259,7 +21259,7 @@ Result: '6.54' Expected: '6.54' ]]> - + @@ -21268,7 +21268,7 @@ Result: 'true' Expected: 'true' ]]> - + @@ -21277,7 +21277,7 @@ Result: 'false' Expected: 'false' ]]> - + @@ -21286,7 +21286,7 @@ Result: 'null' Expected: 'null' ]]> - + @@ -21295,7 +21295,7 @@ Result: 'null' Expected: 'null' ]]> - + @@ -21304,7 +21304,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -21313,7 +21313,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -21322,7 +21322,7 @@ Result: '"\"Hello\""' Expected: '"\"Hello\""' ]]> - + @@ -21331,7 +21331,7 @@ Result: '"\"Hello\""' Expected: '"\"Hello\""' ]]> - + @@ -21340,7 +21340,7 @@ Result: '"'Hello'"' Expected: '"'Hello'"' ]]> - + @@ -21349,7 +21349,7 @@ Result: '"'Hello'"' Expected: '"'Hello'"' ]]> - + @@ -21358,7 +21358,7 @@ Result: '"mr"' Expected: '"mr"' ]]> - + @@ -21367,7 +21367,7 @@ Result: '"steve"' Expected: '"steve"' ]]> - + @@ -21376,7 +21376,7 @@ Result: '"/ˈspænɪʃ/"' Expected: '"/ˈspænɪʃ/"' ]]> - + @@ -21385,7 +21385,7 @@ Result: '"no10furbzness"' Expected: '"no10furbzness"' ]]> - + @@ -21394,7 +21394,7 @@ Result: '"compensation is : 1400000"' Expected: '"compensation is : 1400000"' ]]> - + @@ -21403,7 +21403,7 @@ Result: '"Hello"' Expected: '"Hello"' ]]> - + @@ -21412,7 +21412,7 @@ Result: '"MR"' Expected: '"MR"' ]]> - + @@ -21421,7 +21421,7 @@ Result: '"HELLO WORLD"' Expected: '"HELLO WORLD"' ]]> - + @@ -21430,7 +21430,7 @@ Result: '"鯵噂ソ竹"' Expected: '"鯵噂ソ竹"' ]]> - + @@ -21439,7 +21439,7 @@ Result: '"IBM UK is happy"' Expected: '"IBM UK is happy"' ]]> - + @@ -21448,7 +21448,7 @@ Result: '"IBM UK is pleased to employ Mr Smith"' Expected: '"IBM UK is pleased to employ Mr Smith"' ]]> - + @@ -21457,7 +21457,7 @@ Result: '"HELLO MR SMITH"' Expected: '"HELLO MR SMITH"' ]]> - + @@ -21466,7 +21466,7 @@ Result: '"MR SMITH - HAS 3 REGISTERED CARS"' Expected: '"MR SMITH - HAS 3 REGISTERED CARS"' ]]> - + @@ -21475,7 +21475,7 @@ Result: '"PERMANENT"' Expected: '"PERMANENT"' ]]> - + @@ -21484,7 +21484,7 @@ Result: '"Ho"' Expected: '"Ho"' ]]> - + @@ -21493,7 +21493,7 @@ Result: '"Ho"' Expected: '"Ho"' ]]> - + @@ -21502,7 +21502,7 @@ Result: '"Hola"' Expected: '"Hola"' ]]> - + @@ -21511,7 +21511,7 @@ Result: '""' Expected: '""' ]]> - + @@ -21520,7 +21520,7 @@ Result: '"鯵噂"' Expected: '"鯵噂"' ]]> - + @@ -21529,7 +21529,7 @@ Result: '"Cola"' Expected: '"Cola"' ]]> - + @@ -21538,7 +21538,7 @@ Result: '" Smith"' Expected: '" Smith"' ]]> - + @@ -21547,7 +21547,7 @@ Result: '" Senior Physician"' Expected: '" Senior Physician"' ]]> - + @@ -21556,7 +21556,7 @@ Result: '"a"' Expected: '"a"' ]]> - + @@ -21565,7 +21565,7 @@ Result: '"Hola"' Expected: '"Hola"' ]]> - + @@ -21574,7 +21574,7 @@ Result: '"senior physician (Senior Physician)"' Expected: '"senior physician (Senior Physician)"' ]]> - + @@ -21583,7 +21583,7 @@ Result: '"12 years of employment"' Expected: '"12 years of employment"' ]]> - + @@ -21592,7 +21592,7 @@ Result: '"MR SMITH - HAS 12 YEARS OF EMPLOYMENT"' Expected: '"MR SMITH - HAS 12 YEARS OF EMPLOYMENT"' ]]> - + @@ -21601,7 +21601,7 @@ Result: '"Phys"' Expected: '"Phys"' ]]> - + @@ -21610,7 +21610,7 @@ Result: '"cian"' Expected: '"cian"' ]]> - + @@ -21619,7 +21619,7 @@ Result: '"lo Wo"' Expected: '"lo Wo"' ]]> - + @@ -21629,7 +21629,7 @@ Expected: '"lo Wo"' - + @@ -21639,7 +21639,7 @@ Expected: '"lo Wo"' - + @@ -21649,7 +21649,7 @@ Expected: '"lo Wo"' - + @@ -21659,7 +21659,7 @@ Expected: '"lo Wo"' - + @@ -21668,7 +21668,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -21677,7 +21677,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -21687,7 +21687,7 @@ Expected 'undefined' - + @@ -21697,7 +21697,7 @@ Expected 'undefined' - + @@ -21707,7 +21707,7 @@ Expected 'undefined' - + @@ -21717,7 +21717,7 @@ Expected 'undefined' - + @@ -21727,7 +21727,7 @@ Expected 'undefined' - + @@ -21737,7 +21737,7 @@ Expected 'undefined' - + @@ -21747,7 +21747,7 @@ Expected 'undefined' - + @@ -21757,7 +21757,7 @@ Expected 'undefined' - + @@ -21767,7 +21767,7 @@ Expected 'undefined' - + @@ -21777,7 +21777,7 @@ Expected 'undefined' - + @@ -21787,7 +21787,7 @@ Expected 'undefined' - + @@ -21797,7 +21797,7 @@ Expected 'undefined' - + @@ -21807,7 +21807,7 @@ Expected 'undefined' - + @@ -21817,7 +21817,7 @@ Expected 'undefined' - + @@ -21827,7 +21827,7 @@ Expected 'undefined' - + @@ -21837,7 +21837,7 @@ Expected 'undefined' - + @@ -21847,7 +21847,7 @@ Expected 'undefined' - + @@ -21857,7 +21857,7 @@ Expected 'undefined' - + @@ -21867,7 +21867,7 @@ Expected 'undefined' - + @@ -21877,7 +21877,7 @@ Expected 'undefined' - + @@ -21887,7 +21887,7 @@ Expected 'undefined' - + @@ -21897,7 +21897,7 @@ Expected 'undefined' - + @@ -21907,7 +21907,7 @@ Expected 'undefined' - + @@ -21917,7 +21917,7 @@ Expected 'undefined' - + @@ -21927,7 +21927,7 @@ Expected 'undefined' - + @@ -21937,7 +21937,7 @@ Expected 'undefined' - + @@ -21947,7 +21947,7 @@ Expected 'undefined' - + @@ -21957,7 +21957,7 @@ Expected 'undefined' - + @@ -21967,7 +21967,7 @@ Expected 'undefined' - + @@ -21977,7 +21977,7 @@ Expected 'undefined' - + @@ -21987,7 +21987,7 @@ Expected 'undefined' - + @@ -21997,7 +21997,7 @@ Expected 'undefined' - + @@ -22007,7 +22007,7 @@ Expected 'undefined' - + @@ -22017,7 +22017,7 @@ Expected 'undefined' - + @@ -22027,7 +22027,7 @@ Expected 'undefined' - + @@ -22036,7 +22036,7 @@ Result: '" Worl"' Expected: '" Worl"' ]]> - + @@ -22046,7 +22046,7 @@ Expected: '" Worl"' - + @@ -22056,7 +22056,7 @@ Expected: '" Worl"' - + @@ -22065,7 +22065,7 @@ Result: '"stuff"' Expected: '"stuff"' ]]> - + @@ -22074,7 +22074,7 @@ Result: '"boo"' Expected: '"boo"' ]]> - + @@ -22083,7 +22083,7 @@ Result: '5' Expected: '5' ]]> - + @@ -22110,7 +22110,7 @@ Expected: '{"Account":{"Account Name":"Firefly","Order":[{"OrderID":"order103"," - + @@ -22137,7 +22137,7 @@ Expected: '[{"OrderID":"order103","Product":[{"Product Name":"Bowler Hat","Produ - + @@ -22164,7 +22164,7 @@ Expected: '{"Account":{"Account Name":"Firefly","Order":[{"OrderID":"order103"," - + @@ -22191,7 +22191,7 @@ Expected: '{"Account":{"Account Name":"Firefly","Order":[{"OrderID":"order103"," - + @@ -22218,7 +22218,7 @@ Expected: '{"Account":{"Account Name":"Firefly","Order":[{"OrderID":"order103"," - + @@ -22245,7 +22245,7 @@ Expected: '{"Account":{"Account Name":"Firefly","Order":[{"OrderID":"order103"," - + @@ -22254,7 +22254,7 @@ Result: '{"Account":{"Account Name":"Firefly","Order":[{"OrderID":"order103","Pr Expected: '{"Account":{"Account Name":"Firefly","Order":[{"OrderID":"order103","Product":[{"Product Name":"Bowler Hat","ProductID":858383,"SKU":"0406654608","Description":{"Colour":"Purple","Width":300,"Height":200,"Depth":210,"Weight":0.75},"Price":34.45,"Quantity":2},{"Product Name":"Trilby hat","ProductID":858236,"SKU":"0406634348","Description":{"Colour":"Orange","Width":300,"Height":200,"Depth":210,"Weight":0.6},"Price":21.67,"Quantity":1}]},{"OrderID":"order104","Product":[{"Product Name":"Bowler Hat","ProductID":858383,"SKU":"040657863","Description":{"Colour":"Purple","Width":300,"Height":200,"Depth":210,"Weight":0.75},"Price":34.45,"Quantity":4},{"ProductID":345664,"SKU":"0406654603","Product Name":"Cloak","Description":{"Colour":"Black","Width":30,"Height":20,"Depth":210,"Weight":2},"Price":107.99,"Quantity":1}]}]}}' ]]> - + @@ -22263,7 +22263,7 @@ Result: '{"Account Name":"Firefly","Order":[{"OrderID":"order103","Product":"bla Expected: '{"Account Name":"Firefly","Order":[{"OrderID":"order103","Product":"blah"},{"OrderID":"order104","Product":"blah"}]}' ]]> - + @@ -22272,7 +22272,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -22282,7 +22282,7 @@ Expected 'undefined' |Order|5|' ]]> - + @@ -22292,7 +22292,7 @@ Expected 'undefined' |Order|{},5|' ]]> - + @@ -22301,7 +22301,7 @@ Result: '{"Account Name":"Firefly","Order":[{"OrderID":"order103","Product":"bla Expected: '{"Account Name":"Firefly","Order":[{"OrderID":"order103","Product":"blah"},{"OrderID":"order104","Product":"blah"}]}' ]]> - + @@ -22311,26 +22311,26 @@ Expected: '{"Account Name":"Firefly","Order":[{"OrderID":"order103","Product":"b |$|['one', 'two', 'three']|' ]]> - + | ** ['hi'] | {'hello': hi}, ['hi'] |' ]]> - + @@ -22357,7 +22357,7 @@ Expected: '{"bye":null,"hello":"world"}' - + @@ -22366,7 +22366,7 @@ Result: '45' Expected: '45' ]]> - + @@ -22375,7 +22375,7 @@ Result: '45' Expected: '45' ]]> - + @@ -22384,7 +22384,7 @@ Result: '2' Expected: '2' ]]> - + @@ -22393,7 +22393,7 @@ Result: '42' Expected: '42' ]]> - + @@ -22402,7 +22402,7 @@ Result: '5' Expected: '5' ]]> - + @@ -22411,7 +22411,7 @@ Result: '5' Expected: '5' ]]> - + @@ -22420,7 +22420,7 @@ Result: '5' Expected: '5' ]]> - + @@ -22429,7 +22429,7 @@ Result: '5' Expected: '5' ]]> - + @@ -22438,7 +22438,7 @@ Result: '7' Expected: '7' ]]> - + @@ -22447,7 +22447,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -22456,7 +22456,7 @@ Result: '"defined"' Expected: '"defined"' ]]> - + @@ -22465,7 +22465,7 @@ Result: 'undefined' Expected 'undefined' ]]> - + @@ -22475,7 +22475,7 @@ Expected 'undefined' - + @@ -22484,7 +22484,7 @@ Result: '[42,{"baz":{"fud":"hello"}},{"baz":{"fud":"world"}},{"bazz":"gotcha"}," Expected: '[42,{"baz":{"fud":"hello"}},{"baz":{"fud":"world"}},{"bazz":"gotcha"},"here"]' ]]> - + @@ -22493,7 +22493,7 @@ Result: '[{"fud":"hello"},{"fud":"world"}]' Expected: '[{"fud":"hello"},{"fud":"world"}]' ]]> - + @@ -22502,7 +22502,7 @@ Result: '"gotcha"' Expected: '"gotcha"' ]]> - + @@ -22511,7 +22511,7 @@ Result: '["hello","world"]' Expected: '["hello","world"]' ]]> - + @@ -22520,7 +22520,7 @@ Result: '["hello","world"]' Expected: '["hello","world"]' ]]> - + @@ -22529,7 +22529,7 @@ Result: '["hello","world"]' Expected: '["hello","world"]' ]]> - + @@ -22538,7 +22538,7 @@ Result: '[{"type":"home","number":"0203 544 1234"},{"type":"home","address":["fr Expected: '[{"type":"home","number":"0203 544 1234"},{"type":"home","address":["freddy@my-social.com","frederic.smith@very-serious.com"]}]' ]]> - + @@ -22547,7 +22547,7 @@ Result: '[34.45,107.99]' Expected: '[34.45,107.99]' ]]> - + @@ -22556,7 +22556,7 @@ Result: '[34.45,107.99]' Expected: '[34.45,107.99]' ]]> - + diff --git a/src/Jsonata.Net.Native/Eval/Attributes.cs b/src/Jsonata.Net.Native/Eval/Attributes.cs index ba8bc38..ef1aef5 100644 --- a/src/Jsonata.Net.Native/Eval/Attributes.cs +++ b/src/Jsonata.Net.Native/Eval/Attributes.cs @@ -40,9 +40,9 @@ public OptionalArgumentAttribute(object? defaultValue) } } - //provides support for builtin functions that require EvaluationEnvironment + //provides support for builtin functions that require EvaluationSupplement [AttributeUsage(AttributeTargets.Parameter)] - internal sealed class EvalEnvironmentArgumentAttribute : Attribute + internal sealed class EvalSupplementArgumentAttribute : Attribute { } diff --git a/src/Jsonata.Net.Native/Eval/BuiltinFunctions.cs b/src/Jsonata.Net.Native/Eval/BuiltinFunctions.cs index 70a3014..72857a6 100644 --- a/src/Jsonata.Net.Native/Eval/BuiltinFunctions.cs +++ b/src/Jsonata.Net.Native/Eval/BuiltinFunctions.cs @@ -560,7 +560,7 @@ public static string replace([PropagateUndefined] string str, JToken pattern, JT { FunctionToken replacementFunction = (FunctionToken)replacement; StringBuilder builder = new StringBuilder(); - Environment env = Environment.CreateEvalEnvironment(); //TODO: think of providing proper env. Maybe via a func param? + EvaluationEnvironment env = EvaluationEnvironment.CreateEvalEnvironment(EvaluationEnvironment.DefaultEnvironment); //TODO: think of providing proper env. Maybe via a func param? int replacesCount = 0; int replaceStartAt = 0; foreach (Match match in matches) @@ -905,7 +905,7 @@ public static double sqrt([AllowContextAsValue][PropagateUndefined] double numbe Signature: $random() Returns a pseudo random number greater than or equal to zero and less than one (0 ≤ n < 1) */ - public static double random([EvalEnvironmentArgument] EvaluationEnvironment evalEnv) + public static double random([EvalSupplementArgument] EvaluationSupplement evalEnv) { return evalEnv.Random.NextDouble(); } @@ -1356,7 +1356,7 @@ public static JArray reverse([PropagateUndefined] JToken arrayToken) Signature: $shuffle(array) Returns an array containing all the values from the array parameter, but shuffled into random order. */ - public static JArray shuffle([PropagateUndefined] JToken arrayToken, [EvalEnvironmentArgument] EvaluationEnvironment evalEnv) + public static JArray shuffle([PropagateUndefined] JToken arrayToken, [EvalSupplementArgument] EvaluationSupplement evalEnv) { if (arrayToken.Type != JTokenType.Array) { @@ -1788,7 +1788,7 @@ public static string @type([PropagateUndefined] JToken value) Generates a UTC timestamp in ISO 8601 compatible format and returns it as a string. All invocations of $now() within an evaluation of an expression will all return the same timestamp value. If the optional picture and timezone parameters are supplied, then the current timestamp is formatted as described by the $fromMillis() function. */ - public static string now([OptionalArgument(UTC_FORMAT)] string picture, [OptionalArgument(null)] string? timezone, [EvalEnvironmentArgument] EvaluationEnvironment evalEnv) + public static string now([OptionalArgument(UTC_FORMAT)] string picture, [OptionalArgument(null)] string? timezone, [EvalSupplementArgument] EvaluationSupplement evalEnv) { return fromMillis(millis(evalEnv), picture, timezone); } @@ -1799,7 +1799,7 @@ public static string now([OptionalArgument(UTC_FORMAT)] string picture, [Optiona Returns the number of milliseconds since the Unix Epoch (1 January, 1970 UTC) as a number. All invocations of $millis() within an evaluation of an expression will all return the same value. */ - public static long millis([EvalEnvironmentArgument] EvaluationEnvironment evalEnv) + public static long millis([EvalSupplementArgument] EvaluationSupplement evalEnv) { return evalEnv.Now.ToUnixTimeMilliseconds(); } diff --git a/src/Jsonata.Net.Native/Eval/Environment.cs b/src/Jsonata.Net.Native/Eval/Environment.cs deleted file mode 100644 index 0c4a575..0000000 --- a/src/Jsonata.Net.Native/Eval/Environment.cs +++ /dev/null @@ -1,99 +0,0 @@ -using Newtonsoft.Json.Linq; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; - -namespace Jsonata.Net.Native.Eval -{ - public sealed class Environment - { - internal static readonly Environment DefaultEnvironment; - - static Environment() - { - Environment.DefaultEnvironment = Environment.CreateDefault(); - } - - - private readonly Dictionary m_bindings = new Dictionary(); - private readonly Environment? m_parent; - private readonly EvaluationEnvironment? m_evaluationEnvironment; - - private Environment(Environment? parent, EvaluationEnvironment? evaluationEnvironment) - { - this.m_parent = parent; - this.m_evaluationEnvironment = evaluationEnvironment; - } - - internal static Environment CreateDefault() - { - Environment result = new Environment(null, null); - foreach (MethodInfo mi in typeof(BuiltinFunctions).GetMethods(BindingFlags.Public | BindingFlags.Static)) - { - result.BindFunction(mi); - } - return result; - } - - internal static Environment CreateEvalEnvironment() - { - Environment result = new Environment(Environment.DefaultEnvironment, new EvaluationEnvironment()); - return result; - } - - internal static Environment CreateNestedEnvironment(Environment parent) - { - Environment result = new Environment(parent, parent.m_evaluationEnvironment); - return result; - } - - - internal void Bind(string name, JToken value) - { - this.m_bindings[name] = value; //allow overrides - } - - internal void BindFunction(MethodInfo mi) - { - this.m_bindings.Add(mi.Name, new FunctionTokenCsharp(mi.Name, mi)); - } - - internal JToken Lookup(string name) - { - if (this.m_bindings.TryGetValue(name, out JToken? result)) - { - return result; - } - else if (this.m_parent != null) - { - return this.m_parent.Lookup(name); - } - else - { - return EvalProcessor.UNDEFINED; - } - } - - internal EvaluationEnvironment GetEvaluationEnvironment() - { - if (this.m_evaluationEnvironment == null) - { - throw new Exception($"Calling {nameof(GetEvaluationEnvironment)}() at non-evaluation env. Should not happen"); - }; - return this.m_evaluationEnvironment; - } - } - - //created once for each EvalProcessor.EvaluateJson call - internal sealed class EvaluationEnvironment - { - private readonly Lazy m_random = new Lazy(); - private readonly DateTimeOffset m_now = DateTimeOffset.UtcNow; - - internal Random Random => this.m_random.Value; - internal DateTimeOffset Now => this.m_now; - } -} diff --git a/src/Jsonata.Net.Native/Eval/EvalProcessor.cs b/src/Jsonata.Net.Native/Eval/EvalProcessor.cs index 0c9cf09..d012d7a 100644 --- a/src/Jsonata.Net.Native/Eval/EvalProcessor.cs +++ b/src/Jsonata.Net.Native/Eval/EvalProcessor.cs @@ -13,19 +13,11 @@ internal static class EvalProcessor { internal static readonly JValue UNDEFINED = JValue.CreateUndefined(); - internal static JToken EvaluateJson(Node rootNode, JToken data, JObject? bindings) + internal static JToken EvaluateJson(Node rootNode, JToken data, EvaluationEnvironment parentEnvironment) { - Environment environment = Environment.CreateEvalEnvironment(); - //TODO: add default bindings - if (bindings != null) - { - foreach (JProperty property in bindings.Properties()) - { - environment.Bind(property.Name, property.Value); - } - }; - // put the input document into the environment as the root object - environment.Bind("$", data); + EvaluationEnvironment environment = EvaluationEnvironment.CreateEvalEnvironment(parentEnvironment); + + environment.BindValue("$", data); if (data.Type == JTokenType.Array) { @@ -46,7 +38,7 @@ internal static JToken EvaluateJson(Node rootNode, JToken data, JObject? binding return result; } - internal static JToken Eval(Node node, JToken input, Environment env) + internal static JToken Eval(Node node, JToken input, EvaluationEnvironment env) { JToken result = EvalInternal(node, input, env); if (result is Sequence sequence) @@ -63,7 +55,7 @@ internal static JToken Eval(Node node, JToken input, Environment env) return result; } - private static JToken EvalInternal(Node node, JToken input, Environment env) + private static JToken EvalInternal(Node node, JToken input, EvaluationEnvironment env) { switch (node) { @@ -132,12 +124,12 @@ private static JToken EvalInternal(Node node, JToken input, Environment env) } } - private static JToken evalRegex(RegexNode regexNode, JToken input, Environment env) + private static JToken evalRegex(RegexNode regexNode, JToken input, EvaluationEnvironment env) { return new FunctionTokenRegex(regexNode.regex); } - private static JToken evalSort(SortNode sortNode, JToken input, Environment env) + private static JToken evalSort(SortNode sortNode, JToken input, EvaluationEnvironment env) { JToken items = EvalProcessor.Eval(sortNode.expr, input, env); switch (items.Type) @@ -241,7 +233,7 @@ int comparison(JToken a, JToken b) } } - private static JToken evalObjectTransformation(ObjectTransformationNode transformationNode, JToken input, Environment env) + private static JToken evalObjectTransformation(ObjectTransformationNode transformationNode, JToken input, EvaluationEnvironment env) { return new FunctionTokenTransformation( pattern: transformationNode.pattern, @@ -251,7 +243,7 @@ private static JToken evalObjectTransformation(ObjectTransformationNode transfor ); } - private static JToken evalPartial(PartialNode partialNode, JToken input, Environment env) + private static JToken evalPartial(PartialNode partialNode, JToken input, EvaluationEnvironment env) { JToken func = Eval(partialNode.func, input, env); @@ -276,7 +268,7 @@ private static JToken evalPartial(PartialNode partialNode, JToken input, Environ return new FunctionTokenPartial(function, argsOrNulls); } - private static JToken evalLambda(LambdaNode lambdaNode, JToken input, Environment env) + private static JToken evalLambda(LambdaNode lambdaNode, JToken input, EvaluationEnvironment env) { return new FunctionTokenLambda( signature: lambdaNode.signature, @@ -287,7 +279,7 @@ private static JToken evalLambda(LambdaNode lambdaNode, JToken input, Environmen ); } - private static JToken evalConditional(ConditionalNode conditionalNode, JToken input, Environment env) + private static JToken evalConditional(ConditionalNode conditionalNode, JToken input, EvaluationEnvironment env) { JToken condition = Eval(conditionalNode.predicate, input, env); if (Helpers.Booleanize(condition)) @@ -304,7 +296,7 @@ private static JToken evalConditional(ConditionalNode conditionalNode, JToken in } } - private static JToken evalFunctionApplication(FunctionApplicationNode functionApplicationNode, JToken input, Environment env) + private static JToken evalFunctionApplication(FunctionApplicationNode functionApplicationNode, JToken input, EvaluationEnvironment env) { JToken lhs = Eval(functionApplicationNode.lhs, input, env); if (functionApplicationNode.rhs is FunctionCallNode functionCallNode) @@ -367,7 +359,7 @@ private static JToken evalFunctionApplication(FunctionApplicationNode functionAp } } - private static JToken evalRange(RangeNode rangeNode, JToken input, Environment env) + private static JToken evalRange(RangeNode rangeNode, JToken input, EvaluationEnvironment env) { JToken lhs = Eval(rangeNode.lhs, input, env); JToken rhs = Eval(rangeNode.rhs, input, env); @@ -412,18 +404,18 @@ private static JToken evalRange(RangeNode rangeNode, JToken input, Environment e return result; } - private static JToken evalAssignment(AssignmentNode assignmentNode, JToken input, Environment env) + private static JToken evalAssignment(AssignmentNode assignmentNode, JToken input, EvaluationEnvironment env) { JToken value = Eval(assignmentNode.value, input, env); - env.Bind(assignmentNode.name, value); + env.BindValue(assignmentNode.name, value); return value; } - private static JToken evalBlock(BlockNode blockNode, JToken input, Environment env) + private static JToken evalBlock(BlockNode blockNode, JToken input, EvaluationEnvironment env) { // create a new frame to limit the scope of variable assignments // TODO, only do this if the post-parse stage has flagged this as required - Environment localEnvironment = Environment.CreateNestedEnvironment(env); + EvaluationEnvironment localEnvironment = EvaluationEnvironment.CreateNestedEnvironment(env); // invoke each expression in turn // only return the result of the last one @@ -435,7 +427,7 @@ private static JToken evalBlock(BlockNode blockNode, JToken input, Environment e return result; } - private static JToken evalFunctionCall(FunctionCallNode functionCallNode, JToken input, Environment env, JToken? evalutedFirstArgFromApplication) + private static JToken evalFunctionCall(FunctionCallNode functionCallNode, JToken input, EvaluationEnvironment env, JToken? evalutedFirstArgFromApplication) { JToken func = Eval(functionCallNode.func, input, env); if (func is not FunctionToken function) @@ -459,12 +451,12 @@ private static JToken evalFunctionCall(FunctionCallNode functionCallNode, JToken return InvokeFunction(function, args, context, env); } - internal static JToken InvokeFunction(FunctionToken function, List args, JToken? context, Environment env) + internal static JToken InvokeFunction(FunctionToken function, List args, JToken? context, EvaluationEnvironment env) { return function.Invoke(args, context, env); } - private static JToken evalVariable(VariableNode variableNode, JToken input, Environment env) + private static JToken evalVariable(VariableNode variableNode, JToken input, EvaluationEnvironment env) { if (variableNode.name == "") { @@ -473,7 +465,7 @@ private static JToken evalVariable(VariableNode variableNode, JToken input, Envi return env.Lookup(variableNode.name); } - private static JToken evalPredicate(PredicateNode predicateNode, JToken input, Environment env) + private static JToken evalPredicate(PredicateNode predicateNode, JToken input, EvaluationEnvironment env) { JToken itemsToken = Eval(predicateNode.expr, input, env); if (itemsToken.Type == JTokenType.Undefined) @@ -508,7 +500,7 @@ private static JToken evalPredicate(PredicateNode predicateNode, JToken input, E return itemsArray; } - private static JArray evalFilter(Node filter, JArray itemsArray, Environment env) + private static JArray evalFilter(Node filter, JArray itemsArray, EvaluationEnvironment env) { if (filter is NumberNode numberNode) { @@ -594,7 +586,7 @@ void CheckAppendToken(Sequence result, JToken item, int itemIndex, JToken indexT } } - private static JToken evalStringConcatenation(StringConcatenationNode stringConcatenationNode, JToken input, Environment env) + private static JToken evalStringConcatenation(StringConcatenationNode stringConcatenationNode, JToken input, EvaluationEnvironment env) { string lstr = stringify(Eval(stringConcatenationNode.lhs, input, env)); string rstr = stringify(Eval(stringConcatenationNode.rhs, input, env)); @@ -623,7 +615,7 @@ private static string stringify(JToken token) } } - private static JToken evalComparisonOperator(ComparisonOperatorNode comparisonOperatorNode, JToken input, Environment env) + private static JToken evalComparisonOperator(ComparisonOperatorNode comparisonOperatorNode, JToken input, EvaluationEnvironment env) { JToken lhs = Eval(comparisonOperatorNode.lhs, input, env); JToken rhs = Eval(comparisonOperatorNode.rhs, input, env); @@ -778,7 +770,7 @@ JToken CompareStrings(ComparisonOperatorNode.ComparisonOperator op, string lhs, } } - private static JToken evalBooleanOperator(BooleanOperatorNode booleanOperatorNode, JToken input, Environment env) + private static JToken evalBooleanOperator(BooleanOperatorNode booleanOperatorNode, JToken input, EvaluationEnvironment env) { bool lhs = Helpers.Booleanize(Eval(booleanOperatorNode.lhs, input, env)); //here undefined works as false? see boolize() in jsonata-js //short-cirquit the operators if possible: @@ -809,7 +801,7 @@ private static JToken evalBooleanOperator(BooleanOperatorNode booleanOperatorNod return new JValue(result); } - private static JToken evalGroup(GroupNode groupNode, JToken input, Environment env) + private static JToken evalGroup(GroupNode groupNode, JToken input, EvaluationEnvironment env) { JToken items = Eval(groupNode.expr, input, env); return evalObject(groupNode.objectNode, items, env); @@ -827,7 +819,7 @@ internal KeyIndex(int pairIndex, JToken firstInput) } } - private static JToken evalObject(ObjectNode objectNode, JToken input, Environment env) + private static JToken evalObject(ObjectNode objectNode, JToken input, EvaluationEnvironment env) { JArray inputArray; if (input.Type == JTokenType.Array) @@ -897,7 +889,7 @@ private static JToken evalObject(ObjectNode objectNode, JToken input, Environmen return result; } - private static JToken evalNegation(NegationNode negationNode, JToken input, Environment env) + private static JToken evalNegation(NegationNode negationNode, JToken input, EvaluationEnvironment env) { JToken rhs = Eval(negationNode.rhs, input, env); switch (rhs.Type) @@ -913,7 +905,7 @@ private static JToken evalNegation(NegationNode negationNode, JToken input, Envi } } - private static JToken evalNumericOperator(NumericOperatorNode numericOperatorNode, JToken input, Environment env) + private static JToken evalNumericOperator(NumericOperatorNode numericOperatorNode, JToken input, EvaluationEnvironment env) { JToken lhs = Eval(numericOperatorNode.lhs, input, env); JToken rhs = Eval(numericOperatorNode.rhs, input, env); @@ -989,32 +981,32 @@ private static JToken evalDoubleOperator(double lhs, double rhs, NumericOperator } } - private static JToken evalNull(NullNode nullNode, JToken input, Environment env) + private static JToken evalNull(NullNode nullNode, JToken input, EvaluationEnvironment env) { return JValue.CreateNull(); } - private static JToken evalBoolean(BooleanNode booleanNode, JToken input, Environment env) + private static JToken evalBoolean(BooleanNode booleanNode, JToken input, EvaluationEnvironment env) { return new JValue(booleanNode.value); } - private static JToken evalString(StringNode stringNode, JToken input, Environment env) + private static JToken evalString(StringNode stringNode, JToken input, EvaluationEnvironment env) { return JValue.CreateString(stringNode.value); } - private static JToken evalNumber(NumberDoubleNode numberNode, JToken input, Environment env) + private static JToken evalNumber(NumberDoubleNode numberNode, JToken input, EvaluationEnvironment env) { return new JValue(numberNode.value); } - private static JToken evalNumber(NumberIntNode numberNode, JToken input, Environment env) + private static JToken evalNumber(NumberIntNode numberNode, JToken input, EvaluationEnvironment env) { return new JValue(numberNode.value); } - private static JToken evalArray(ArrayNode arrayNode, JToken input, Environment env) + private static JToken evalArray(ArrayNode arrayNode, JToken input, EvaluationEnvironment env) { JArray result = new ExplicitArray(); foreach (Node node in arrayNode.items) @@ -1048,7 +1040,7 @@ private static JToken evalArray(ArrayNode arrayNode, JToken input, Environment e return result; } - private static JToken evalDescendent(DescendentNode descendentNode, JToken input, Environment env) + private static JToken evalDescendent(DescendentNode descendentNode, JToken input, EvaluationEnvironment env) { Sequence result = new Sequence(); if (input.Type != JTokenType.Undefined) @@ -1081,7 +1073,7 @@ private static void recurseDescendents(Sequence result, JToken input) } } - private static JToken evalWildcard(WildcardNode wildcardNode, JToken input, Environment env) + private static JToken evalWildcard(WildcardNode wildcardNode, JToken input, EvaluationEnvironment env) { if (input is Sequence inputSequence && inputSequence.HasValues @@ -1138,7 +1130,7 @@ private static IEnumerable flattenArray(JToken input) } } - private static JToken evalName(NameNode nameNode, JToken data, Environment env) + private static JToken evalName(NameNode nameNode, JToken data, EvaluationEnvironment env) { switch (data) { @@ -1177,7 +1169,7 @@ private static JToken evalName(NameNode nameNode, JToken data, Environment env) } } - private static JToken evalPath(PathNode node, JToken data, Environment env) + private static JToken evalPath(PathNode node, JToken data, EvaluationEnvironment env) { if (node.steps.Count == 0) { @@ -1250,7 +1242,7 @@ private static JToken evalPath(PathNode node, JToken data, Environment env) return array; } - private static JArray evalPathStep(Node step, JArray array, Environment env, bool lastStep) + private static JArray evalPathStep(Node step, JArray array, EvaluationEnvironment env, bool lastStep) { List result = new List(array.Count); foreach (JToken obj in array.Children()) diff --git a/src/Jsonata.Net.Native/Eval/EvaluationSupplement.cs b/src/Jsonata.Net.Native/Eval/EvaluationSupplement.cs new file mode 100644 index 0000000..ba7b053 --- /dev/null +++ b/src/Jsonata.Net.Native/Eval/EvaluationSupplement.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Jsonata.Net.Native.Eval +{ + //created once for each EvalProcessor.EvaluateJson call + public sealed class EvaluationSupplement + { + private readonly Lazy m_random = new Lazy(); + private readonly DateTimeOffset m_now = DateTimeOffset.UtcNow; + + internal Random Random => this.m_random.Value; + internal DateTimeOffset Now => this.m_now; + } +} diff --git a/src/Jsonata.Net.Native/Eval/FunctionToken.cs b/src/Jsonata.Net.Native/Eval/FunctionToken.cs index 48a40a9..1f4ec0f 100644 --- a/src/Jsonata.Net.Native/Eval/FunctionToken.cs +++ b/src/Jsonata.Net.Native/Eval/FunctionToken.cs @@ -24,7 +24,7 @@ protected FunctionToken(string jsonName, int argumentsCount) this.RequiredArgsCount = argumentsCount; } - internal abstract JToken Invoke(List args, JToken? context, Environment env); + internal abstract JToken Invoke(List args, JToken? context, EvaluationEnvironment env); internal static JToken ReturnDoubleResult(double resultDouble) diff --git a/src/Jsonata.Net.Native/Eval/FunctionTokenCsharp.cs b/src/Jsonata.Net.Native/Eval/FunctionTokenCsharp.cs index 7e064a2..1390113 100644 --- a/src/Jsonata.Net.Native/Eval/FunctionTokenCsharp.cs +++ b/src/Jsonata.Net.Native/Eval/FunctionTokenCsharp.cs @@ -21,15 +21,20 @@ internal sealed class FunctionTokenCsharp : FunctionToken internal FunctionTokenCsharp(string funcName, MethodInfo methodInfo) : base($"{methodInfo.DeclaringType?.Name}.{methodInfo.Name}", methodInfo.GetParameters().Length) { + if (!methodInfo.IsStatic) + { + throw new ArgumentException("Only static methods are allowed to be bound as Jsonata functions"); + } + this.functionName = funcName; this.methodInfo = methodInfo; this.parameters = this.methodInfo.GetParameters() .Select(pi => new ArgumentInfo(funcName, pi)) .ToList(); this.hasContextParameter = this.parameters.Any(p => p.allowContextAsValue); - this.hasEnvParameter = this.parameters.Any(p => p.isEvaluationEnvironment); + this.hasEnvParameter = this.parameters.Any(p => p.isEvaluationSupplement); - this.RequiredArgsCount = this.parameters.Where(p => !p.isOptional && !p.isEvaluationEnvironment).Count(); + this.RequiredArgsCount = this.parameters.Where(p => !p.isOptional && !p.isEvaluationSupplement).Count(); } internal sealed class ArgumentInfo @@ -41,7 +46,7 @@ internal sealed class ArgumentInfo internal readonly bool packSingleValueToSequence; internal readonly bool isOptional; internal readonly object? defaultValueForOptional; - internal readonly bool isEvaluationEnvironment; + internal readonly bool isEvaluationSupplement; internal readonly bool isVariableArgumentsArray; internal ArgumentInfo(string functionName, ParameterInfo parameterInfo) @@ -64,10 +69,10 @@ internal ArgumentInfo(string functionName, ParameterInfo parameterInfo) this.defaultValueForOptional = null; }; - this.isEvaluationEnvironment = parameterInfo.IsDefined(typeof(EvalEnvironmentArgumentAttribute), false); - if (this.isEvaluationEnvironment && parameterInfo.ParameterType != typeof(EvaluationEnvironment)) + this.isEvaluationSupplement = parameterInfo.IsDefined(typeof(EvalSupplementArgumentAttribute), false); + if (this.isEvaluationSupplement && parameterInfo.ParameterType != typeof(EvaluationSupplement)) { - throw new JsonataException("????", $"Declaration error for function '{functionName}': attribute [{nameof(EvalEnvironmentArgumentAttribute)}] can only be specified for arguments of type {nameof(EvaluationEnvironment)}"); + throw new JsonataException("????", $"Declaration error for function '{functionName}': attribute [{nameof(EvalSupplementArgumentAttribute)}] can only be specified for arguments of type {nameof(EvaluationSupplement)}"); }; this.isVariableArgumentsArray = parameterInfo.IsDefined(typeof(VariableNumberArgumentAsArrayAttribute), false); @@ -78,7 +83,7 @@ internal ArgumentInfo(string functionName, ParameterInfo parameterInfo) } } - internal override JToken Invoke(List args, JToken? context, Environment env) + internal override JToken Invoke(List args, JToken? context, EvaluationEnvironment env) { object?[] parameters = this.BindFunctionArguments(args, context, env, out bool returnUndefined); if (returnUndefined) @@ -107,7 +112,7 @@ internal override JToken Invoke(List args, JToken? context, Environment return result; } - private object?[] BindFunctionArguments(List args, JToken? context, Environment env, out bool returnUndefined) + private object?[] BindFunctionArguments(List args, JToken? context, EvaluationEnvironment env, out bool returnUndefined) { try { @@ -128,7 +133,7 @@ internal override JToken Invoke(List args, JToken? context, Environment } - private object?[] TryBindFunctionArguments(List args, JToken? context, Environment env, out bool returnUndefined) + private object?[] TryBindFunctionArguments(List args, JToken? context, EvaluationEnvironment env, out bool returnUndefined) { returnUndefined = false; object?[] result = new object[this.parameters.Count]; @@ -145,9 +150,9 @@ internal override JToken Invoke(List args, JToken? context, Environment returnUndefined = true; } } - else if (argumentInfo.isEvaluationEnvironment) + else if (argumentInfo.isEvaluationSupplement) { - result[targetIndex] = env.GetEvaluationEnvironment(); + result[targetIndex] = env.GetEvaluationSupplement(); } else if (sourceIndex >= args.Count) { diff --git a/src/Jsonata.Net.Native/Eval/FunctionTokenLambda.cs b/src/Jsonata.Net.Native/Eval/FunctionTokenLambda.cs index b24cb0a..a9d4eca 100644 --- a/src/Jsonata.Net.Native/Eval/FunctionTokenLambda.cs +++ b/src/Jsonata.Net.Native/Eval/FunctionTokenLambda.cs @@ -16,10 +16,10 @@ internal sealed class FunctionTokenLambda : FunctionToken internal readonly List paramNames; internal readonly Node body; internal readonly JToken context; - internal readonly Environment environment; + internal readonly EvaluationEnvironment environment; - internal FunctionTokenLambda(LambdaNode.Signature? signature, List paramNames, Node body, JToken context, Environment environment) + internal FunctionTokenLambda(LambdaNode.Signature? signature, List paramNames, Node body, JToken context, EvaluationEnvironment environment) : base("lambda", paramNames.Count) { this.signature = signature; @@ -29,7 +29,7 @@ internal FunctionTokenLambda(LambdaNode.Signature? signature, List param this.environment = environment; } - internal override JToken Invoke(List args, JToken? context, Environment env) + internal override JToken Invoke(List args, JToken? context, EvaluationEnvironment env) { if (this.signature != null) { @@ -37,10 +37,10 @@ internal override JToken Invoke(List args, JToken? context, Environment }; List<(string, JToken)> alignedArgs = this.AlignArgs(args); - Environment executionEnv = Environment.CreateNestedEnvironment(this.environment); + EvaluationEnvironment executionEnv = EvaluationEnvironment.CreateNestedEnvironment(this.environment); foreach ((string name, JToken value) in alignedArgs) { - executionEnv.Bind(name, value); + executionEnv.BindValue(name, value); }; JToken result = EvalProcessor.Eval(this.body, this.context, executionEnv); diff --git a/src/Jsonata.Net.Native/Eval/FunctionTokenPartial.cs b/src/Jsonata.Net.Native/Eval/FunctionTokenPartial.cs index f41527e..dbb51d7 100644 --- a/src/Jsonata.Net.Native/Eval/FunctionTokenPartial.cs +++ b/src/Jsonata.Net.Native/Eval/FunctionTokenPartial.cs @@ -19,7 +19,7 @@ internal FunctionTokenPartial(FunctionToken func, List argsOrPlaceholde this.argsOrPlaceholders = argsOrPlaceholders; } - internal override JToken Invoke(List args, JToken? context, Environment env) + internal override JToken Invoke(List args, JToken? context, EvaluationEnvironment env) { List alignedArgs = this.AlignPartialFunctionArgs(args, context); JToken result = this.func.Invoke(alignedArgs, null, env); diff --git a/src/Jsonata.Net.Native/Eval/FunctionTokenRegex.cs b/src/Jsonata.Net.Native/Eval/FunctionTokenRegex.cs index 99967a1..b477a04 100644 --- a/src/Jsonata.Net.Native/Eval/FunctionTokenRegex.cs +++ b/src/Jsonata.Net.Native/Eval/FunctionTokenRegex.cs @@ -22,7 +22,7 @@ public FunctionTokenRegex(Regex regex) The ~> is the chain operator, and its use here implies that the result of /regex/ is a function. We'll see below that this is in fact the case. */ - internal override JToken Invoke(List args, JToken? context, Environment env) + internal override JToken Invoke(List args, JToken? context, EvaluationEnvironment env) { JToken arg; if (args.Count == 0 && context != null) diff --git a/src/Jsonata.Net.Native/Eval/FunctionTokenTransformation.cs b/src/Jsonata.Net.Native/Eval/FunctionTokenTransformation.cs index b06ad4c..0154b56 100644 --- a/src/Jsonata.Net.Native/Eval/FunctionTokenTransformation.cs +++ b/src/Jsonata.Net.Native/Eval/FunctionTokenTransformation.cs @@ -19,9 +19,9 @@ internal sealed class FunctionTokenTransformation : FunctionToken internal readonly Node pattern; internal readonly Node updates; internal readonly Node? deletes; - internal readonly Environment environment; + internal readonly EvaluationEnvironment environment; - public FunctionTokenTransformation(Node pattern, Node updates, Node? deletes, Environment environment) + public FunctionTokenTransformation(Node pattern, Node updates, Node? deletes, EvaluationEnvironment environment) : base("transform", 1) { this.pattern = pattern; @@ -38,7 +38,7 @@ and passes the value on the left hand side to the function on the right hand sid hence the |...|...| syntax generates a function with one argument. */ - internal override JToken Invoke(List args, JToken? context, Environment env) + internal override JToken Invoke(List args, JToken? context, EvaluationEnvironment env) { if (args.Count != this.ArgumentsCount) { diff --git a/src/Jsonata.Net.Native/EvaluationEnvironment.cs b/src/Jsonata.Net.Native/EvaluationEnvironment.cs new file mode 100644 index 0000000..5e5b2f0 --- /dev/null +++ b/src/Jsonata.Net.Native/EvaluationEnvironment.cs @@ -0,0 +1,112 @@ +using Jsonata.Net.Native.Eval; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace Jsonata.Net.Native +{ + public sealed class EvaluationEnvironment + { + internal static readonly EvaluationEnvironment DefaultEnvironment; + + static EvaluationEnvironment() + { + EvaluationEnvironment.DefaultEnvironment = EvaluationEnvironment.CreateDefault(); + } + + internal static EvaluationEnvironment CreateDefault() //main parent, contains default function bindings + { + EvaluationEnvironment result = new EvaluationEnvironment(null, null); + foreach (MethodInfo mi in typeof(BuiltinFunctions).GetMethods(BindingFlags.Public | BindingFlags.Static)) + { + result.BindFunction(mi); + } + return result; + } + + //used at actual EvalProcessor.EvaluateJson start to inject EvaluationSupplement + internal static EvaluationEnvironment CreateEvalEnvironment(EvaluationEnvironment parentEnvironment) + { + EvaluationEnvironment result = new EvaluationEnvironment(parentEnvironment, new EvaluationSupplement()); + return result; + } + + //used during evaluation when nesting + internal static EvaluationEnvironment CreateNestedEnvironment(EvaluationEnvironment parent) + { + EvaluationEnvironment result = new EvaluationEnvironment(parent, parent.m_evaluationSupplement); + return result; + } + + private readonly Dictionary m_bindings = new Dictionary(); + private readonly EvaluationEnvironment? m_parent; + private readonly EvaluationSupplement? m_evaluationSupplement; + + private EvaluationEnvironment(EvaluationEnvironment? parent, EvaluationSupplement? evaluationSupplement) + { + this.m_parent = parent; + this.m_evaluationSupplement = evaluationSupplement; + } + + //public version to provide for JsonataQuery.Eval() + public EvaluationEnvironment() + : this(EvaluationEnvironment.DefaultEnvironment, null) + { + + } + + public EvaluationEnvironment(JObject bindings) + : this() + { + foreach (JProperty property in bindings.Properties()) + { + this.BindValue(property.Name, property.Value); + } + } + + + public void BindValue(string name, JToken value) + { + this.m_bindings[name] = value; //allow overrides + } + + public void BindFunction(MethodInfo mi) + { + this.BindFunction(mi.Name, mi); + } + + public void BindFunction(string name, MethodInfo mi) + { + this.m_bindings.Add(name, new FunctionTokenCsharp(name, mi)); + } + + internal JToken Lookup(string name) + { + if (this.m_bindings.TryGetValue(name, out JToken? result)) + { + return result; + } + else if (this.m_parent != null) + { + return this.m_parent.Lookup(name); + } + else + { + return EvalProcessor.UNDEFINED; + } + } + + internal EvaluationSupplement GetEvaluationSupplement() + { + if (this.m_evaluationSupplement == null) + { + throw new Exception($"Calling {nameof(GetEvaluationSupplement)}() at non-evaluation env. Should not happen"); + }; + return this.m_evaluationSupplement; + } + } +} diff --git a/src/Jsonata.Net.Native/Jsonata.Net.Native.csproj b/src/Jsonata.Net.Native/Jsonata.Net.Native.csproj index db42d85..3eec47b 100644 --- a/src/Jsonata.Net.Native/Jsonata.Net.Native.csproj +++ b/src/Jsonata.Net.Native/Jsonata.Net.Native.csproj @@ -23,7 +23,7 @@ true snupkg true - 1.0.0 + 1.2.0 true diff --git a/src/Jsonata.Net.Native/JsonataQuery.cs b/src/Jsonata.Net.Native/JsonataQuery.cs index 2249c12..16b7c3a 100644 --- a/src/Jsonata.Net.Native/JsonataQuery.cs +++ b/src/Jsonata.Net.Native/JsonataQuery.cs @@ -27,7 +27,21 @@ public string Eval(string dataJson) public JToken Eval(JToken data, JObject? bindings = null) { - return EvalProcessor.EvaluateJson(this.m_node, data, bindings); + EvaluationEnvironment env; + if (bindings != null) + { + env = new EvaluationEnvironment(bindings); + } + else + { + env = EvaluationEnvironment.DefaultEnvironment; + }; + return EvalProcessor.EvaluateJson(this.m_node, data, env); + } + + public JToken Eval(JToken data, EvaluationEnvironment environment) + { + return EvalProcessor.EvaluateJson(this.m_node, data, environment); } } } diff --git a/src/Jsonata.Net.Native/Program.cs b/src/Jsonata.Net.Native/Program.cs deleted file mode 100644 index afceb2b..0000000 --- a/src/Jsonata.Net.Native/Program.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.IO; - -namespace Jsonata.Net.Native -{ - internal sealed class Program - { - static void Main(string[] args) - { - /* - JsonataExpression query = new JsonataExpression("nest0.nest1[0]"); - string json = File.ReadAllText(@"f:\Projects-misc\jsonata-js\test\test-suite\datasets\dataset4.json"); - string result = query.Eval(json); - Console.WriteLine("Hello World!"); - */ - - JsonataQuery query = new JsonataQuery("*.a"); - string json = "[{'a': 'b'}, { 'c': {'a': 'd'}}, {'a': 'e'}]"; - string result = query.Eval(json); - Console.WriteLine(result); - } - } -} diff --git a/src/TestApp/Program.cs b/src/TestApp/Program.cs index b4be3fe..4b232bb 100644 --- a/src/TestApp/Program.cs +++ b/src/TestApp/Program.cs @@ -15,15 +15,60 @@ static void Main(string[] args) //from string { string result = query.Eval("{\"a\": \"b\"}"); - Debug.Assert(result == "\"b\""); + Check(result, "\"b\""); } //from Json.Net { JToken data = JToken.Parse("{\"a\": \"b\"}"); JToken result = query.Eval(data); - Debug.Assert(result.ToString(Formatting.None) == "\"b\""); + Check(result, "\"b\""); } + + //with bindings + { + JToken data = JToken.Parse("{\"a\": \"b\"}"); + + JObject bindings = JObject.Parse("{\"x\": \"y\"}"); + + JsonataQuery query2 = new JsonataQuery("{'a': $.a, 'x': $x}"); + + JToken result = query2.Eval(data, bindings); + Check(result, "{\"a\":\"b\",\"x\":\"y\"}"); + } + + //with custom environment and function binding + { + JToken data = JToken.Parse("{\"a\": \"b\"}"); + + JObject bindings = JObject.Parse("{\"x\": \"y\"}"); + EvaluationEnvironment env = new EvaluationEnvironment(bindings); + env.BindFunction(typeof(Program).GetMethod(nameof(foo))); + + JsonataQuery query2 = new JsonataQuery("{'a': $.a, 'x': $x, 'z': $foo()}"); + + JToken result = query2.Eval(data, env); + Check(result, "{\"a\":\"b\",\"x\":\"y\",\"z\":\"bar\"}"); + } + } + + private static void Check(string value, string expected) + { + Console.WriteLine($"Expected: {expected}, got {value}"); + if (expected != value) + { + throw new Exception("Check failed"); + } + } + + private static void Check(JToken value, string expected) + { + Check(value.ToString(Formatting.None), expected); + } + + public static string foo() + { + return "bar"; } } }