Skip to content

Commit 08d68e8

Browse files
lollekoPerryvw
authored andcommitted
Improves lua tests & Tests for "for loops" (#21)
* Moved Test functionality to util module & Added tests for loops * Added test "forin[Array]" & Fixed fail from previous PR Previous PR changed for in ipairs/pairs to \"pairs\" instead of pairs * Added Json lib for lua <-> js communication * Removed json decode from json lib
1 parent 1de303b commit 08d68e8

File tree

10 files changed

+332
-124
lines changed

10 files changed

+332
-124
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
*.js
22
node_modules/
33
*.lua
4+
!json.lua
45
!dist/*.js
56
!dist/lualib/*.lua
67

dist/Transpiler.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -246,11 +246,11 @@ var LuaTranspiler = /** @class */ (function () {
246246
var identifier = variable.name;
247247
// Transpile expression
248248
var expression = this.transpileExpression(node.expression);
249-
// Use ipairs for array types, pairs otherwise
250-
var isArray = TSHelper_1.TSHelper.isArrayType(this.checker.getTypeAtLocation(node.expression));
251-
var pairs = isArray ? "ipairs" : "pairs";
249+
if (TSHelper_1.TSHelper.isArrayType(this.checker.getTypeAtLocation(node.expression))) {
250+
throw new TranspileError("Iterating over arrays with 'for in' is not allowed.", node);
251+
}
252252
// Make header
253-
var result = this.indent + ("for " + identifier.escapedText + ", _ in " + pairs + "(" + expression + ") do\n");
253+
var result = this.indent + ("for " + identifier.escapedText + ", _ in pairs(" + expression + ") do\n");
254254
// For body
255255
this.pushIndent();
256256
result += this.transpileStatement(node.statement);
@@ -561,6 +561,8 @@ var LuaTranspiler = /** @class */ (function () {
561561
return "TS_slice(" + caller + ", " + params + ")";
562562
case "splice":
563563
return "TS_splice(" + caller + ", " + params + ")";
564+
case "join":
565+
return "table.concat(" + caller + ", " + params + ")";
564566
default:
565567
throw new TranspileError("Unsupported array function: " + expression.name.escapedText, node);
566568
}

package-lock.json

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"coverage": "nyc --reporter=lcov npm test && nyc report"
1010
},
1111
"devDependencies": {
12+
"deep-equal": "^1.0.1",
1213
"nyc": "^11.4.1"
1314
}
1415
}

src/Transpiler.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ export class LuaTranspiler {
274274
}
275275

276276
// Make header
277-
let result = this.indent + `for ${identifier.escapedText}, _ in "pairs"(${expression}) do\n`;
277+
let result = this.indent + `for ${identifier.escapedText}, _ in pairs(${expression}) do\n`;
278278

279279
// For body
280280
this.pushIndent();

test/integration/lua/loops.spec.ts

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import { Expect, Test, TestCase } from "alsatian";
2+
import * as util from "../../src/util"
3+
4+
const deepEqual = require('deep-equal')
5+
6+
export class LuaLoopTests {
7+
8+
@TestCase([0, 1, 2, 3], [1, 2, 3, 4])
9+
@Test("for")
10+
public for<T>(inp: T[], expected: T[]) {
11+
// Transpile
12+
let lua = util.transpileString(
13+
`let arrTest = ${JSON.stringify(inp)};
14+
for (let i = 0; i < arrTest.length; ++i) {
15+
arrTest[i] = arrTest[i] + 1;
16+
}
17+
return JSONStringify(arrTest);`
18+
, util.dummyTypes.Array
19+
);
20+
21+
// Execute
22+
let result = util.executeLua(lua);
23+
24+
// Assert
25+
Expect(result).toBe(JSON.stringify(expected));
26+
}
27+
28+
@TestCase({ ['test1']: 0, ['test2']: 1, ['test3']: 2 }, { ['test1']: 1, ['test2']: 2, ['test3']: 3 })
29+
@Test("forin[Object]")
30+
public forinObject<T>(inp: any, expected: any) {
31+
// Transpile
32+
let lua = util.transpileString(
33+
`let objTest = ${JSON.stringify(inp)};
34+
for (let key in objTest) {
35+
objTest[key] = objTest[key] + 1;
36+
}
37+
return JSONStringify(objTest);`
38+
, util.dummyTypes.Object
39+
);
40+
41+
// Execute
42+
let result = util.executeLua(lua);
43+
44+
// Assert
45+
Expect(deepEqual(JSON.parse(result), expected)).toBe(true);
46+
}
47+
48+
@TestCase([1,2,3])
49+
@Test("forin[Array]")
50+
public forinArray<T>(inp: T[]) {
51+
// Transpile & Assert
52+
Expect(() => {
53+
let lua = util.transpileString(
54+
`let arrTest = ${JSON.stringify(inp)};
55+
for (let key in arrTest) {
56+
arrTest[key]++;
57+
}`
58+
, util.dummyTypes.Array
59+
);
60+
}).toThrowError(Error, "Iterating over arrays with 'for in' is not allowed.");
61+
}
62+
63+
@TestCase([0,1,2], [1,2,3])
64+
@Test("forof")
65+
public forof<T>(inp: any, expected: any) {
66+
// Transpile
67+
let lua = util.transpileString(
68+
`let objTest = ${JSON.stringify(inp)};
69+
let arrResultTest = {};
70+
for (let value of objTest) {
71+
arrResultTest.push(value + 1)
72+
}
73+
return JSONStringify(arrResultTest);`
74+
, util.dummyTypes.Array
75+
);
76+
77+
// Execute
78+
let result = util.executeLua(lua);
79+
80+
// Assert
81+
Expect(result).toBe(JSON.stringify(expected));
82+
}
83+
}

0 commit comments

Comments
 (0)