-
Notifications
You must be signed in to change notification settings - Fork 27
/
switch.test.mvm.js
112 lines (99 loc) · 2.23 KB
/
switch.test.mvm.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/*---
description: >
Switch statements
runExportedFunction: 0
# The disassembly uses different block numbers and optimizes the fall-through cases better
dontCompareDisassembly: true
assertionCount: 6
expectedPrintout: |
emptySwitch:after
switchWithOnlyDefault:default
switchWithOnlyDefault:after
1
2
4
c
d
!
1
2
b
c
d
!
x
y
z
---*/
vmExport(0, run);
function run() {
emptySwitch();
switchWithOnlyDefault();
assertEqual(convert(5), 'It was 5');
assertEqual(convert(6), 'It was 6');
assertEqual(convert(7), 'It was 7');
assertEqual(convert('x'), 'It was x');
assertEqual(convert('something else'), "Don't know what it was");
weirdSwitch(5);
weirdSwitch(2);
switchFallThroughBottom();
assertEqual(switchWithNoDefault(), 22);
}
function convert(x) {
let result;
switch (x) {
// TODO: break also affects loops. We should have tests for breaking out of loops nested in switches and vice versa
case 5: result = 'It was 5'; break;
case 6: result = 'It was 6'; break;
case 3+4: return 'It was 7';
case 'x': return 'It was x';
default: return "Don't know what it was";
}
return result;
}
function weirdSwitch(x) {
// JavaScript has weird (IMO) behavior with fall through from `default`. The
// test case for `4` is evaluated before the fallback to the default case, but
// then the consequent for the default case falls through to the consequent of
// case `4`.
switch (x) {
case evaluateCase(1): print('a');
case evaluateCase(2): print('b');
default: evaluateCase('c');
case evaluateCase(4): print('d');
}
print('!');
}
function evaluateCase(x) {
print(x);
return x;
}
function switchWithNoDefault(x) {
switch (5) {
case 1: return 1;
case 2: return 2;
case 3: return 3;
/* No cases matched, implicit default hit */
}
return 22;
}
function switchFallThroughBottom() {
switch (1) {
case 0: print('w');
case 1: print('x')
case 2: print('y');
/* Fall through bottom of switch */
}
print('z');
}
function emptySwitch() {
switch (1) {
}
print('emptySwitch:after')
}
function switchWithOnlyDefault() {
switch (1) {
default: print('switchWithOnlyDefault:default')
}
print('switchWithOnlyDefault:after')
}