Files
dusk/test/duskscript/assets/pass_control.ds
YourWishesandClaude Sonnet 5.5 f6b884bf7f 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]>
2026-10-14 23:25:26 -05:00

197 lines
3.5 KiB
Plaintext

// 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");