summaryrefslogtreecommitdiffhomepage
path: root/tests/custom/03_stdlib/16_sort
diff options
context:
space:
mode:
Diffstat (limited to 'tests/custom/03_stdlib/16_sort')
-rw-r--r--tests/custom/03_stdlib/16_sort108
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 --