diff options
Diffstat (limited to 'tests/custom/03_stdlib/16_sort')
-rw-r--r-- | tests/custom/03_stdlib/16_sort | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/tests/custom/03_stdlib/16_sort b/tests/custom/03_stdlib/16_sort new file mode 100644 index 0000000..ccc235f --- /dev/null +++ b/tests/custom/03_stdlib/16_sort @@ -0,0 +1,108 @@ +The `sort()` function performs an in-place sorting on the given array, +invoking the specified callback (if any) to compare items during the +sort process. + +If no callback is given or if the callback argument is `null`, a default +comparator function is used which will sort number values numerically +and all other value types lexically. + +Returns the sorted input array. + +Returns `null` if the given input array value is not an array. + + +-- Testcase -- +{% + print(join("\n", [ + // default numeric sort + sort([ 6, 4.3, 1, 45, 3.01, 2 ]), + + // default lexical sort + sort([ "qrx", "bar", "foo", "abc" ]), + + // default lexical sort due to implicit stringification + sort([ true, false, null, 1, "2b" ]), + + // sort with custom callback (by word length) + sort([ "apple", "pear", "banana", "grapefruit" ], (a, b) => length(a) - length(b)), + + // sort with custom callback (by type, then value) + sort([ 4, 1, 9, 2, "x", "a", "q", "b" ], (a, b) => { + let t1 = type(a), t2 = type(b); + if (t1 < t2) + return -1; + else if (t2 > t2) + return 1; + + if (a < b) + return -1; + else if (a > b) + return 1; + + return 0; + }) + ]), "\n"); +%} +-- End -- + +-- Expect stdout -- +[ 1, 2, 3.01, 4.3, 6, 45 ] +[ "abc", "bar", "foo", "qrx" ] +[ 1, "2b", false, null, true ] +[ "pear", "apple", "banana", "grapefruit" ] +[ 1, 2, 4, 9, "a", "b", "q", "x" ] +-- End -- + + +Supplying an invalid callback will trigger an exception. + +-- Testcase -- +{% + sort([3, 1, 2], "not_a_function") +%} +-- End -- + +-- Expect stderr -- +Type error: left-hand side is not a function +In line 2, byte 34: + + ` sort([3, 1, 2], "not_a_function")` + Near here --------------------------^ + + +-- End -- + + +Supplying an invalid array will yield `null`. + +-- Testcase -- +{% + printf("%.J\n", sort("not_an_array", function(a, b) { return a - b })); +%} +-- End -- + +-- Expect stdout -- +null +-- End -- + + +Exceptions in the callback terminate the sort process and are +propagated to the calling context. + +-- Testcase -- +{% + sort([ 1, 2, 3 ], function() { die() }); +%} +-- End -- + +-- Expect stderr -- +Died +In [anonymous function](), line 2, byte 37: + called from function sort ([C]) + called from anonymous function ([stdin]:2:40) + + ` sort([ 1, 2, 3 ], function() { die() });` + Near here -----------------------------^ + + +-- End -- |