Serenity Operating System
1describe("basic switch tests", () => {
2 test("string case does not match number target", () => {
3 switch (1 + 2) {
4 case "3":
5 expect().fail();
6 case 3:
7 return;
8 case 5:
9 case 1:
10 break;
11 default:
12 break;
13 }
14
15 expect().fail();
16 });
17
18 test("string concatenation in target", () => {
19 var a = "foo";
20
21 switch (a + "bar") {
22 case 1:
23 expect().fail();
24 case "foobar":
25 case 2:
26 return;
27 }
28 expect().fail();
29 });
30
31 test("default", () => {
32 switch (100) {
33 default:
34 return;
35 }
36
37 expect().fail();
38 });
39
40 test("return from switch statement", () => {
41 function foo(value) {
42 switch (value) {
43 case 42:
44 return "return from 'case 42'";
45 default:
46 return "return from 'default'";
47 }
48 }
49 expect(foo(42)).toBe("return from 'case 42'");
50 expect(foo(43)).toBe("return from 'default'");
51 });
52
53 test("continue from switch statement", () => {
54 let i = 0;
55 for (; i < 5; ++i) {
56 switch (i) {
57 case 0:
58 continue;
59 expect().fail();
60 case 0:
61 expect().fail();
62 default:
63 continue;
64 expect().fail();
65 }
66 expect().fail();
67 }
68 expect(i).toBe(5);
69 });
70
71 test("default branch is not taken if more exact branch exists", () => {
72 function switchTest(i) {
73 let result = 0;
74 switch (i) {
75 case 1:
76 result += 1;
77 break;
78 case 1:
79 expect().fail();
80 case 2:
81 result += 2;
82 default:
83 result += 4;
84 case 3:
85 result += 8;
86 break;
87 case 2:
88 expect().fail();
89 }
90 return result;
91 }
92
93 expect(switchTest(1)).toBe(1);
94 expect(switchTest(2)).toBe(14);
95 expect(switchTest(3)).toBe(8);
96 expect(switchTest(4)).toBe(12);
97 });
98});
99
100describe("errors", () => {
101 test("syntax errors", () => {
102 expect("switch () {}").not.toEval();
103 expect("switch () { case 1: continue; }").not.toEval();
104 expect("switch () { case 1: break doesnotexist; }").not.toEval();
105 expect("label: switch () { case 1: break not_the_right_label; }").not.toEval();
106 expect("label: switch () { case 1: continue label; }").not.toEval();
107 expect("switch (foo) { bar }").not.toEval();
108 expect("switch (foo) { default: default: }").not.toEval();
109 });
110});