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,196 @@
|
||||
// if / else
|
||||
var result = 0;
|
||||
if(true) result = 1;
|
||||
assert(result == 1);
|
||||
if(false) result = 2; else result = 3;
|
||||
assert(result == 3);
|
||||
if(0) { result = 4; } else if(1) { result = 5; } else { result = 6; }
|
||||
assert(result == 5);
|
||||
if(null) { result = 7; } else if("") { result = 8; } else { result = 9; }
|
||||
assert(result == 9);
|
||||
if(1) {
|
||||
if(0) {
|
||||
result = 10;
|
||||
} else {
|
||||
result = 11;
|
||||
}
|
||||
}
|
||||
assert(result == 11);
|
||||
|
||||
// while
|
||||
var i = 0;
|
||||
var sum = 0;
|
||||
while(i < 5) {
|
||||
sum += i;
|
||||
i++;
|
||||
}
|
||||
assert(sum == 10);
|
||||
assert(i == 5);
|
||||
while(false) { assert(false); }
|
||||
|
||||
// for
|
||||
sum = 0;
|
||||
for(var j = 0; j < 10; j++) sum += j;
|
||||
assert(sum == 45);
|
||||
sum = 0;
|
||||
for(var k = 10; k > 0; k -= 3) sum += k;
|
||||
assert(sum == 10 + 7 + 4 + 1);
|
||||
var count = 0;
|
||||
for(;;) {
|
||||
count++;
|
||||
if(count == 5) break;
|
||||
}
|
||||
assert(count == 5);
|
||||
var outer = 0;
|
||||
var inner = 0;
|
||||
for(var a = 0; a < 3; a++) {
|
||||
outer++;
|
||||
for(var b = 0; b < 4; b++) inner++;
|
||||
}
|
||||
assert(outer == 3 && inner == 12);
|
||||
|
||||
// break and continue
|
||||
sum = 0;
|
||||
for(var m = 0; m < 10; m++) {
|
||||
if(m % 2 == 0) continue;
|
||||
if(m > 7) break;
|
||||
sum += m;
|
||||
}
|
||||
assert(sum == 1 + 3 + 5 + 7);
|
||||
i = 0;
|
||||
sum = 0;
|
||||
while(true) {
|
||||
i++;
|
||||
if(i < 3) continue;
|
||||
sum += i;
|
||||
if(i >= 5) break;
|
||||
}
|
||||
assert(sum == 3 + 4 + 5);
|
||||
|
||||
// break only leaves the loop it is in
|
||||
var pairs = 0;
|
||||
for(var p = 0; p < 3; p++) {
|
||||
for(var q = 0; q < 10; q++) {
|
||||
if(q == 2) break;
|
||||
pairs++;
|
||||
}
|
||||
}
|
||||
assert(pairs == 6);
|
||||
|
||||
// foreach
|
||||
sum = 0;
|
||||
foreach(var v : [1, 2, 3, 4]) sum += v;
|
||||
assert(sum == 10);
|
||||
var seen = [];
|
||||
foreach(var item : ["a", 2, true, null, [1]]) push(seen, item);
|
||||
assert(len(seen) == 5);
|
||||
assert(seen[0] == "a" && seen[1] == 2 && seen[2] == true && isnull(seen[3]));
|
||||
foreach(var nothing : []) assert(false);
|
||||
sum = 0;
|
||||
foreach(var w : [1, 2, 3, 4, 5, 6]) {
|
||||
if(w == 2) continue;
|
||||
if(w == 5) break;
|
||||
sum += w;
|
||||
}
|
||||
assert(sum == 1 + 3 + 4);
|
||||
var letters = "";
|
||||
foreach(var ch : "xyz") letters += ch;
|
||||
assert(letters == "xyz");
|
||||
sum = 0;
|
||||
foreach(var row : [[1, 2], [3, 4]]) {
|
||||
foreach(var cell : row) sum += cell;
|
||||
}
|
||||
assert(sum == 10);
|
||||
|
||||
// Block scope: a variable of a block is gone after it
|
||||
var shadow = "outer";
|
||||
{
|
||||
var inside = 1;
|
||||
assert(inside == 1);
|
||||
}
|
||||
assert(shadow == "outer");
|
||||
|
||||
// switch
|
||||
function kind(value) {
|
||||
var out = "";
|
||||
switch(value) {
|
||||
case 1:
|
||||
out = "one";
|
||||
break;
|
||||
case 2:
|
||||
out = "two";
|
||||
break;
|
||||
case "s":
|
||||
out = "string";
|
||||
break;
|
||||
case true:
|
||||
out = "bool";
|
||||
break;
|
||||
default:
|
||||
out = "other";
|
||||
}
|
||||
return out;
|
||||
}
|
||||
assert(kind(1) == "one");
|
||||
assert(kind(2) == "two");
|
||||
assert(kind("s") == "string");
|
||||
assert(kind(true) == "bool");
|
||||
assert(kind(99) == "other");
|
||||
assert(kind(null) == "other");
|
||||
assert(kind("1") == "other");
|
||||
|
||||
// switch falls through without a break
|
||||
function fall(value) {
|
||||
var trace = "";
|
||||
switch(value) {
|
||||
case 1:
|
||||
trace += "a";
|
||||
case 2:
|
||||
trace += "b";
|
||||
break;
|
||||
case 3:
|
||||
trace += "c";
|
||||
}
|
||||
return trace;
|
||||
}
|
||||
assert(fall(1) == "ab");
|
||||
assert(fall(2) == "b");
|
||||
assert(fall(3) == "c");
|
||||
assert(fall(4) == "");
|
||||
|
||||
// switch in a loop: break leaves the switch, not the loop
|
||||
var hits = 0;
|
||||
for(var s = 0; s < 4; s++) {
|
||||
switch(s) {
|
||||
case 1:
|
||||
break;
|
||||
default:
|
||||
hits++;
|
||||
}
|
||||
}
|
||||
assert(hits == 3);
|
||||
// continue inside a switch continues the loop
|
||||
hits = 0;
|
||||
for(var t = 0; t < 4; t++) {
|
||||
switch(t) {
|
||||
case 0:
|
||||
continue;
|
||||
}
|
||||
hits++;
|
||||
}
|
||||
assert(hits == 3);
|
||||
|
||||
// switch with a default in the middle
|
||||
function middle(value) {
|
||||
switch(value) {
|
||||
case 1:
|
||||
return "one";
|
||||
default:
|
||||
return "default";
|
||||
case 2:
|
||||
return "two";
|
||||
}
|
||||
}
|
||||
assert(middle(1) == "one");
|
||||
assert(middle(2) == "two");
|
||||
assert(middle(3) == "default");
|
||||
Reference in new issue
Block a user