Testing ucode switch statements. 1. Ensure that execution starts at the first matching case. -- Expect stdout -- 1a -- End -- -- Testcase -- {% switch (1) { case 1: print("1a\n"); break; case 1: print("1b\n"); break; case 2: print("2\n"); break; } %} -- End -- 2. Ensure that default case is only used if no case matches, even if declared first. -- Expect stdout -- 1 default -- End -- -- Testcase -- {% for (n in [1, 3]) { switch (n) { default: print("default\n"); break; case 1: print("1\n"); break; case 2: print("2\n"); break; } } %} -- End -- 3. Ensure that cases without break fall through into subsequent cases. -- Expect stdout -- 1 2 default 1 2 -- End -- -- Testcase -- {% for (n in [1, 3]) { switch (n) { default: print("default\n"); case 1: print("1\n"); case 2: print("2\n"); } } %} -- End -- 4. Ensure that a single default case matches. -- Expect stdout -- default default -- End -- -- Testcase -- {% for (n in [1, 3]) { switch (n) { default: print("default\n"); } } %} -- End -- 5. Ensure that duplicate default cases emit a syntax error during parsing. -- Expect stderr -- Syntax error: more than one switch default case In line 6, byte 3: ` default:` ^-- Near here Syntax error: Expecting expression In line 8, byte 2: ` }` ^-- Near here -- End -- -- Testcase -- {% switch (1) { default: print("default1\n"); default: print("default2\n"); } %} -- End -- 6. Ensure that case values use strict comparison. -- Expect stdout -- b b -- End -- -- Testcase -- {% switch (1.0) { case 1: print("a\n"); break; case 1.0: print("b\n"); break; } switch ("123") { case 123: print("a\n"); break; case "123": print("b\n"); break; } %} -- End -- 7. Ensure that case values may be complex expressions. -- Expect stdout -- 2, 3, 1 -- End -- -- Testcase -- {% switch (1) { case a = 2, b = 3, c = 1: print(join(", ", [ a, b, c ]), "\n"); break; } %} -- End -- 8. Ensure that empty switch statements are accepted by the parser and that the test expression is evaluated. -- Expect stdout -- true -- End -- -- Testcase -- {% x = false; switch (x = true) { } print(x, "\n"); %} -- End -- 9. Ensure that `return` breaks out of switch statements. -- Expect stdout -- one two -- End -- -- Testcase -- {% function test(n) { switch (n) { case 1: return "one"; case 2: return "two"; default: return "three"; } } print(test(1), "\n"); print(test(2), "\n"); %} -- End -- 10. Ensure that `continue` breaks out of switch statements. -- Expect stdout -- one two -- End -- -- Testcase -- {% for (n in [1,2]) { switch (n) { case 1: print("one\n"); continue; case 2: print("two\n"); continue; default: print("three\n"); } } %} -- End -- 11. Ensure that exceptions break out of switch statements. -- Expect stdout -- one -- End -- -- Expect stderr -- Died In test(), line 6, byte 8: called from anonymous function ([stdin]:17:14) ` die();` Near here ------^ -- End -- -- Testcase -- {% function test(n) { switch (n) { case 1: print("one\n"); die(); case 2: print("two\n"); die(); default: print("three\n"); } } print(test(1), "\n"); %} -- End -- 12. Ensure that consecutive cases values are properly handled. -- Expect stdout -- three and four -- End -- -- Testcase -- {% switch (3) { case 1: case 2: print("one and two\n"); break; case 3: case 4: print("three and four\n"); break; default: print("five\n"); } %} -- End --