Allow script arrays to hold any value type, add script engine tests, archive old rpg code
Remove the per-array type category so arrays can mix types like structs. Add 13 passing and 125 expected-failure duskscript test fixtures with a table-driven runner. Also includes the in-progress entity/physics and archive moves from the working tree. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
This commit is contained in:
1 parent
5c259e46e2
commit
f6b884bf7f
710 files changed
+6172
-27594
No files matched your search
@@ -0,0 +1,218 @@
|
||||
// Creating and reading
|
||||
var a = [1, 2, 3];
|
||||
assert(len(a) == 3);
|
||||
assert(a[0] == 1 && a[2] == 3);
|
||||
assert(len([]) == 0);
|
||||
var nested = [[1, 2], [3, [4, 5]]];
|
||||
assert(nested[1][1][0] == 4);
|
||||
assert(len(nested[1]) == 2);
|
||||
|
||||
// Writing, assigning at the end appends
|
||||
a[1] = 20;
|
||||
assert(a[1] == 20);
|
||||
a[3] = 4;
|
||||
assert(len(a) == 4 && a[3] == 4);
|
||||
|
||||
// push, pop, shift, unshift return and remove as expected
|
||||
var q = [];
|
||||
assert(push(q, "a") == 1);
|
||||
assert(push(q, "b") == 2);
|
||||
assert(unshift(q, "z") == 3);
|
||||
assert(q[0] == "z" && q[1] == "a" && q[2] == "b");
|
||||
assert(pop(q) == "b");
|
||||
assert(shift(q) == "z");
|
||||
assert(len(q) == 1 && q[0] == "a");
|
||||
assert(pop(q) == "a");
|
||||
assert(isundefined(pop(q)));
|
||||
assert(isundefined(shift(q)));
|
||||
assert(len(q) == 0);
|
||||
|
||||
// insert, insertarr, splice
|
||||
var b = [1, 2, 5];
|
||||
assert(insert(b, 2, 3) == 4);
|
||||
assert(deepequal(b, [1, 2, 3, 5]));
|
||||
insert(b, 3, 4);
|
||||
assert(deepequal(b, [1, 2, 3, 4, 5]));
|
||||
insert(b, 0, 0);
|
||||
assert(deepequal(b, [0, 1, 2, 3, 4, 5]));
|
||||
insert(b, 6, 6);
|
||||
assert(deepequal(b, [0, 1, 2, 3, 4, 5, 6]));
|
||||
var c = [1, 4];
|
||||
assert(insertarr(c, 1, [2, 3]) == 4);
|
||||
assert(deepequal(c, [1, 2, 3, 4]));
|
||||
var d = [1, 2, 3, 4, 5];
|
||||
var removed = splice(d, 1, 2);
|
||||
assert(deepequal(removed, [2, 3]));
|
||||
assert(deepequal(d, [1, 4, 5]));
|
||||
removed = splice(d, 2);
|
||||
assert(deepequal(removed, [5]));
|
||||
assert(deepequal(d, [1, 4]));
|
||||
removed = splice(d, 0, 100);
|
||||
assert(deepequal(removed, [1, 4]));
|
||||
assert(len(d) == 0);
|
||||
removed = splice(d, 0, 0);
|
||||
assert(len(removed) == 0);
|
||||
|
||||
// subarr copies a range
|
||||
var e = [10, 20, 30, 40];
|
||||
assert(deepequal(subarr(e, 1, 3), [20, 30]));
|
||||
assert(deepequal(subarr(e, 2), [30, 40]));
|
||||
assert(deepequal(subarr(e, 0, 0), []));
|
||||
assert(deepequal(subarr(e, 4), []));
|
||||
var slice = subarr(e, 0, 2);
|
||||
slice[0] = 99;
|
||||
assert(e[0] == 10);
|
||||
|
||||
// indexof, lastindexof
|
||||
var f = [1, 2, 3, 2, 1];
|
||||
assert(indexof(f, 2) == 1);
|
||||
assert(lastindexof(f, 2) == 3);
|
||||
assert(indexof(f, 9) == -1);
|
||||
assert(lastindexof(f, 9) == -1);
|
||||
assert(indexof(["a", "b"], "b") == 1);
|
||||
assert(indexof([null, 1], null) == 0);
|
||||
|
||||
// reverse and sort
|
||||
var g = [1, 2, 3, 4];
|
||||
reverse(g);
|
||||
assert(deepequal(g, [4, 3, 2, 1]));
|
||||
var odd = [1, 2, 3];
|
||||
reverse(odd);
|
||||
assert(deepequal(odd, [3, 2, 1]));
|
||||
reverse([]);
|
||||
var h = [3, 1, 2, 10, -5, 2.5];
|
||||
sort(h);
|
||||
assert(deepequal(h, [-5, 1, 2, 2.5, 3, 10]));
|
||||
sort(h, true);
|
||||
assert(deepequal(h, [10, 3, 2.5, 2, 1, -5]));
|
||||
var words = ["banana", "Apple", "cherry", "apple"];
|
||||
sort(words);
|
||||
assert(words[0] == "Apple" || words[0] == "apple");
|
||||
assert(words[3] == "cherry");
|
||||
assert(words[2] == "banana");
|
||||
var byLength = ["ccc", "a", "bb"];
|
||||
sort(byLength, false, function(x, y) { return len(x) - len(y); });
|
||||
assert(deepequal(byLength, ["a", "bb", "ccc"]));
|
||||
var one = [7];
|
||||
sort(one);
|
||||
assert(one[0] == 7);
|
||||
var emptySort = [];
|
||||
sort(emptySort);
|
||||
// sort is stable: equal keys keep their order
|
||||
var records = [{k: 1, n: "a"}, {k: 0, n: "b"}, {k: 1, n: "c"}, {k: 0, n: "d"}];
|
||||
sort(records, false, function(x, y) { return x.k - y.k; });
|
||||
assert(records[0].n == "b" && records[1].n == "d" && records[2].n == "a" && records[3].n == "c");
|
||||
// a long sort
|
||||
var big = [];
|
||||
for(var i = 0; i < 100; i++) push(big, (i * 37) % 101);
|
||||
sort(big);
|
||||
var ordered = true;
|
||||
for(var j = 1; j < len(big); j++) {
|
||||
if(big[j - 1] > big[j]) ordered = false;
|
||||
}
|
||||
assert(ordered);
|
||||
|
||||
// fill, merge, empty
|
||||
var filled = [];
|
||||
fill(filled, 7, 3);
|
||||
assert(deepequal(filled, [7, 7, 7]));
|
||||
fill(filled, "x", 1);
|
||||
assert(deepequal(filled, ["x"]));
|
||||
fill(filled, 0, 0);
|
||||
assert(len(filled) == 0);
|
||||
var m1 = [1, 2];
|
||||
assert(merge(m1, [3, 4]) == 4);
|
||||
assert(deepequal(m1, [1, 2, 3, 4]));
|
||||
merge(m1, []);
|
||||
assert(len(m1) == 4);
|
||||
merge(m1, m1);
|
||||
assert(len(m1) == 8);
|
||||
var toEmpty = [1, 2, 3];
|
||||
empty(toEmpty);
|
||||
assert(len(toEmpty) == 0);
|
||||
push(toEmpty, "fresh");
|
||||
assert(toEmpty[0] == "fresh");
|
||||
|
||||
// filter, map, reduce
|
||||
var nums = [1, 2, 3, 4, 5, 6];
|
||||
var evens = clone(nums);
|
||||
filter(evens, function(v) { return v % 2 == 0; });
|
||||
assert(deepequal(evens, [2, 4, 6]));
|
||||
assert(len(nums) == 6);
|
||||
var withNulls = [1, null, 2, null];
|
||||
filter(withNulls);
|
||||
assert(deepequal(withNulls, [1, 2]));
|
||||
var indexes = clone(nums);
|
||||
filter(indexes, function(v, idx) { return idx < 2; });
|
||||
assert(deepequal(indexes, [1, 2]));
|
||||
assert(deepequal(map(nums, function(v) { return v * 10; }), [10, 20, 30, 40, 50, 60]));
|
||||
assert(deepequal(map(nums, function(v, idx) { return idx; }), [0, 1, 2, 3, 4, 5]));
|
||||
assert(len(map([], function(v) { return v; })) == 0);
|
||||
assert(reduce(nums, function(acc, v) { return acc + v; }, 0) == 21);
|
||||
assert(reduce(nums, function(acc, v) { return acc * v; }, 1) == 720);
|
||||
assert(reduce([], function(acc, v) { return acc + v; }, "start") == "start");
|
||||
assert(reduce(["a", "b"], function(acc, v) { return acc + v; }, "") == "ab");
|
||||
|
||||
// flatten and join
|
||||
assert(deepequal(flatten([[1], [2, 3], []]), [1, 2, 3]));
|
||||
assert(len(flatten([])) == 0);
|
||||
assert(deepequal(flatten([[[1]], [2]]), [[1], 2]));
|
||||
assert(join([1, 2, 3], ", ") == "1, 2, 3");
|
||||
|
||||
// Arrays are shared, clone is shallow, deepclone is not
|
||||
var original = [1, [2, 3]];
|
||||
var alias = original;
|
||||
alias[0] = 100;
|
||||
assert(original[0] == 100);
|
||||
var shallow = clone(original);
|
||||
shallow[0] = 5;
|
||||
assert(original[0] == 100);
|
||||
shallow[1][0] = 22;
|
||||
assert(original[1][0] == 22);
|
||||
var deep = deepclone(original);
|
||||
deep[1][0] = 33;
|
||||
assert(original[1][0] == 22);
|
||||
assert(deep[1][0] == 33);
|
||||
assert(deepequal(deepclone(original), original));
|
||||
assert(clone(original) != original);
|
||||
|
||||
// deepequal
|
||||
assert(deepequal([], []));
|
||||
assert(deepequal([1, "a", [true, null]], [1, "a", [true, null]]));
|
||||
assert(!deepequal([1, 2], [1, 3]));
|
||||
assert(!deepequal([1, 2], [1, 2, 3]));
|
||||
assert(!deepequal([1], ["1"]));
|
||||
assert(deepequal(1, 1));
|
||||
assert(!deepequal(1, 2));
|
||||
assert(deepequal({a: 1, b: [1]}, {b: [1], a: 1}));
|
||||
assert(!deepequal({a: 1}, {a: 2}));
|
||||
assert(!deepequal({a: 1}, {b: 1}));
|
||||
assert(!deepequal([], {}));
|
||||
|
||||
// Growing past the first capacity
|
||||
var grown = [];
|
||||
for(var n = 0; n < 200; n++) push(grown, n);
|
||||
assert(len(grown) == 200);
|
||||
assert(grown[0] == 0 && grown[199] == 199 && grown[100] == 100);
|
||||
var shrunk = 0;
|
||||
while(len(grown) > 0) {
|
||||
pop(grown);
|
||||
shrunk++;
|
||||
}
|
||||
assert(shrunk == 200);
|
||||
|
||||
// Many shifts
|
||||
var queue = [];
|
||||
for(var k = 0; k < 50; k++) push(queue, k);
|
||||
var taken = 0;
|
||||
while(len(queue) > 0) {
|
||||
assert(shift(queue) == taken);
|
||||
taken++;
|
||||
}
|
||||
assert(taken == 50);
|
||||
|
||||
// Looping while modifying a copy
|
||||
var source = [1, 2, 3];
|
||||
var copy = clone(source);
|
||||
foreach(var item : source) push(copy, item * 2);
|
||||
assert(deepequal(copy, [1, 2, 3, 2, 4, 6]));
|
||||
Reference in new issue
Block a user