
When no case match we should not just execute the statements of the default case but also of any cases below the default case.
110 lines
2.9 KiB
JavaScript
110 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();
|
|
});
|
|
});
|