Skip to content

Commit 8b265a4

Browse files
committed
improve break dead code tests: target affected versions, check output values
1 parent 0cf95fd commit 8b265a4

File tree

1 file changed

+41
-9
lines changed

1 file changed

+41
-9
lines changed
Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,93 @@
1+
import * as tstl from "../../../src";
12
import * as util from "../../util";
23

34
// In Lua 5.0, 5.1, and LuaJIT, break must be the last statement in a block.
45
// Any code after break is a syntax error (e.g. `while true do break; local b = 8 end`
56
// fails with "'end' expected near 'local'"). Lua 5.2+ relaxed this restriction.
67
// TSTL should strip dead code after break on all targets to avoid these errors.
78

9+
function expectNoDeadCode(builder: util.TestBuilder) {
10+
const lua = builder.getMainLuaCodeChunk();
11+
expect(lua).not.toContain("local b = 8");
12+
}
13+
14+
const affectedVersions: Record<tstl.LuaTarget, ((builder: util.TestBuilder) => void) | boolean> = {
15+
[tstl.LuaTarget.Universal]: false,
16+
[tstl.LuaTarget.Lua50]: builder => builder.tap(expectNoDeadCode).expectToMatchJsResult(),
17+
[tstl.LuaTarget.Lua51]: builder => builder.tap(expectNoDeadCode).expectToMatchJsResult(),
18+
[tstl.LuaTarget.Lua52]: false,
19+
[tstl.LuaTarget.Lua53]: false,
20+
[tstl.LuaTarget.Lua54]: false,
21+
[tstl.LuaTarget.Lua55]: false,
22+
[tstl.LuaTarget.LuaJIT]: builder => builder.tap(expectNoDeadCode),
23+
[tstl.LuaTarget.Luau]: false,
24+
};
25+
826
util.testEachVersion(
927
"for dead code after break",
1028
() => util.testFunction`
11-
for (let i = 0; i < 10; i++) { break; const b = 8; }
29+
let result = 0;
30+
for (let i = 0; i < 10; i++) { result = i; break; const b = 8; }
31+
return result;
1232
`,
13-
util.expectEachVersionExceptJit(builder => builder.expectNoExecutionError())
33+
affectedVersions
1434
);
1535

1636
util.testEachVersion(
1737
"for..in dead code after break",
1838
() => util.testFunction`
19-
for (let a in {"a": 5, "b": 8}) { break; const b = 8; }
39+
let result = "";
40+
for (let a in {"a": 5, "b": 8}) { result = a; break; const b = 8; }
41+
return result;
2042
`,
21-
util.expectEachVersionExceptJit(builder => builder.expectNoExecutionError())
43+
affectedVersions
2244
);
2345

2446
util.testEachVersion(
2547
"for..of dead code after break",
2648
() => util.testFunction`
27-
for (let a of [1,2,4]) { break; const b = 8; }
49+
let result = 0;
50+
for (let a of [1,2,4]) { result = a; break; const b = 8; }
51+
return result;
2852
`,
29-
util.expectEachVersionExceptJit(builder => builder.expectNoExecutionError())
53+
affectedVersions
3054
);
3155

3256
util.testEachVersion(
3357
"while dead code after break",
3458
() => util.testFunction`
59+
let result = "done";
3560
while (true) { break; const b = 8; }
61+
return result;
3662
`,
37-
util.expectEachVersionExceptJit(builder => builder.expectNoExecutionError())
63+
affectedVersions
3864
);
3965

4066
util.testEachVersion(
4167
"switch dead code after break",
4268
() => util.testFunction`
69+
let result = "none";
4370
switch ("abc" as string) {
4471
case "def":
72+
result = "def";
4573
break;
4674
let abc = 4;
4775
case "abc":
76+
result = "abc";
4877
break;
4978
let def = 6;
5079
}
80+
return result;
5181
`,
52-
util.expectEachVersionExceptJit(builder => builder.expectNoExecutionError())
82+
affectedVersions
5383
);
5484

5585
util.testEachVersion(
5686
"do-while dead code after break",
5787
() => util.testFunction`
88+
let result = "done";
5889
do { break; const b = 8; } while (true);
90+
return result;
5991
`,
60-
util.expectEachVersionExceptJit(builder => builder.expectNoExecutionError())
92+
affectedVersions
6193
);

0 commit comments

Comments
 (0)