ladybird/Userland/Libraries/LibJS/Tests/switch-basic.js
davidot e5d48ee238 LibJS: Fix switch skipping case evaluation when hitting the default case
When no case match we should not just execute the statements of the
default case but also of any cases below the default case.
2021-09-30 08:16:32 +01:00

111 lines
2.9 KiB
JavaScript

describe("basic switch tests", () => {
test("string case does not match number target", () => {
switch (1 + 2) {
case "3":
expect().fail();
case 3:
return;
case 5:
case 1:
break;
default:
break;
}
expect().fail();
});
test("string concatenation in target", () => {
var a = "foo";
switch (a + "bar") {
case 1:
expect().fail();
case "foobar":
case 2:
return;
}
expect().fail();
});
test("default", () => {
switch (100) {
default:
return;
}
expect().fail();
});
test("return from switch statement", () => {
function foo(value) {
switch (value) {
case 42:
return "return from 'case 42'";
default:
return "return from 'default'";
}
}
expect(foo(42)).toBe("return from 'case 42'");
expect(foo(43)).toBe("return from 'default'");
});
test("continue from switch statement", () => {
let i = 0;
for (; i < 5; ++i) {
switch (i) {
case 0:
continue;
expect().fail();
case 0:
expect().fail();
default:
continue;
expect().fail();
}
expect().fail();
}
expect(i).toBe(5);
});
test("default branch is not taken if more exact branch exists", () => {
function switchTest(i) {
let result = 0;
switch (i) {
case 1:
result += 1;
break;
case 1:
expect().fail();
case 2:
result += 2;
default:
result += 4;
case 3:
result += 8;
break;
case 2:
expect().fail();
}
return result;
}
expect(switchTest(1)).toBe(1);
expect(switchTest(2)).toBe(14);
expect(switchTest(3)).toBe(8);
expect(switchTest(4)).toBe(12);
});
});
describe("errors", () => {
test("syntax errors", () => {
expect("switch () {}").not.toEval();
expect("switch () { case 1: continue; }").not.toEval();
expect("switch () { case 1: break doesnotexist; }").not.toEval();
expect("label: switch () { case 1: break not_the_right_label; }").not.toEval();
expect("label: switch () { case 1: continue label; }").not.toEval();
expect("switch (foo) { bar }").not.toEval();
expect("switch (foo) { default: default: }").not.toEval();
});
});