Skip to content

Commit 00d2d4e

Browse files
committed
Refactor typeof tests
1 parent ceea8c9 commit 00d2d4e

1 file changed

Lines changed: 65 additions & 40 deletions

File tree

test/unit/typeof.spec.ts

Lines changed: 65 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -16,59 +16,84 @@ test.each(["{}", "[]"])("typeof object literal (%p)", inp => {
1616
util.testExpression`typeof ${inp}`.expectToMatchJsResult();
1717
});
1818

19+
test("typeof class", () => {
20+
util.testFunction`
21+
class MyClass {}
22+
return typeof MyClass;
23+
`.expectToEqual("object");
24+
});
25+
1926
test("typeof class instance", () => {
2027
util.testFunction`
21-
class myClass {}
22-
let inst = new myClass();
23-
return typeof inst;
28+
class MyClass {}
29+
return typeof new MyClass();
2430
`.expectToMatchJsResult();
2531
});
2632

2733
test("typeof function", () => {
2834
util.testExpression`typeof (() => 3)`.expectToMatchJsResult();
2935
});
3036

31-
test.each(["null", "undefined"])("typeof undefined (%p)", inp => {
37+
test.each(["null", "undefined"])("typeof %s", inp => {
3238
util.testExpression`typeof ${inp}`.expectToEqual("undefined");
3339
});
3440

35-
test.each([
36-
{ expression: "{}", operator: "===", compareTo: "object", expectResult: true },
37-
{ expression: "{}", operator: "!==", compareTo: "object", expectResult: false },
38-
{ expression: "{}", operator: "==", compareTo: "object", expectResult: true },
39-
{ expression: "{}", operator: "!=", compareTo: "object", expectResult: false },
40-
{ expression: "undefined", operator: "===", compareTo: "undefined", expectResult: true },
41-
{ expression: "() => {}", operator: "===", compareTo: "function", expectResult: true },
42-
{ expression: "1", operator: "===", compareTo: "number", expectResult: true },
43-
{ expression: "true", operator: "===", compareTo: "boolean", expectResult: true },
44-
{ expression: `"foo"`, operator: "===", compareTo: "string", expectResult: true },
45-
])("typeof literal comparison (%p)", ({ expression, operator, compareTo, expectResult }) => {
46-
const code = `
47-
let val = ${expression};
48-
return typeof val ${operator} "${compareTo}";`;
41+
interface ComparisonCase {
42+
expression: string;
43+
operator: string;
44+
compareTo: string;
45+
}
4946

50-
expect(util.transpileString(code)).not.toMatch("__TS__TypeOf");
51-
expect(util.transpileAndExecute(code)).toBe(expectResult);
52-
});
47+
const equalityComparisonCases: ComparisonCase[] = [
48+
{ expression: "{}", operator: "===", compareTo: "object" },
49+
{ expression: "{}", operator: "!==", compareTo: "object" },
50+
{ expression: "{}", operator: "==", compareTo: "object" },
51+
{ expression: "{}", operator: "!=", compareTo: "object" },
52+
{ expression: "undefined", operator: "===", compareTo: "undefined" },
53+
{ expression: "() => {}", operator: "===", compareTo: "function" },
54+
{ expression: "1", operator: "===", compareTo: "number" },
55+
{ expression: "true", operator: "===", compareTo: "boolean" },
56+
{ expression: `"foo"`, operator: "===", compareTo: "string" },
57+
];
58+
59+
const relationalComparisonCases: ComparisonCase[] = [
60+
{ expression: "undefined", operator: "<=", compareTo: "object" },
61+
{ expression: "undefined", operator: "<", compareTo: "object" },
62+
{ expression: "undefined", operator: ">=", compareTo: "object" },
63+
{ expression: "undefined", operator: ">", compareTo: "object" },
64+
];
5365

54-
test.each([
55-
{ expression: "{}", operator: "===", compareTo: "object", expectResult: true },
56-
{ expression: "{}", operator: "!==", compareTo: "object", expectResult: false },
57-
{ expression: "{}", operator: "==", compareTo: "object", expectResult: true },
58-
{ expression: "{}", operator: "!=", compareTo: "object", expectResult: false },
59-
{ expression: "{}", operator: "<=", compareTo: "object", expectResult: true },
60-
{ expression: "{}", operator: "<", compareTo: "object", expectResult: false },
61-
{ expression: "undefined", operator: "===", compareTo: "undefined", expectResult: true },
62-
{ expression: "() => {}", operator: "===", compareTo: "function", expectResult: true },
63-
{ expression: "1", operator: "===", compareTo: "number", expectResult: true },
64-
{ expression: "true", operator: "===", compareTo: "boolean", expectResult: true },
65-
{ expression: `"foo"`, operator: "===", compareTo: "string", expectResult: true },
66-
])("typeof non-literal comparison (%p)", ({ expression, operator, compareTo, expectResult }) => {
67-
const code = `
68-
let val = ${expression};
69-
let compareTo = "${compareTo}";
70-
return typeof val ${operator} compareTo;`;
66+
const expectTypeOfHelper: util.TapCallback = builder => expect(builder.getMainLuaCodeChunk()).toMatch("__TS__TypeOf");
67+
const expectNoTypeOfHelper: util.TapCallback = builder =>
68+
expect(builder.getMainLuaCodeChunk()).not.toMatch("__TS__TypeOf");
7169

72-
expect(util.transpileString(code)).toMatch("__TS__TypeOf");
73-
expect(util.transpileAndExecute(code)).toBe(expectResult);
70+
test.each(equalityComparisonCases)("typeof literal equality comparison (%p)", ({ expression, operator, compareTo }) => {
71+
util.testFunction`
72+
const value = ${expression};
73+
return typeof value ${operator} "${compareTo}";
74+
`
75+
.tap(expectNoTypeOfHelper)
76+
.expectToMatchJsResult();
7477
});
78+
79+
test.each(relationalComparisonCases)("typeof literal comparison (%p)", ({ expression, operator, compareTo }) => {
80+
util.testFunction`
81+
const value = ${expression};
82+
return typeof value ${operator} "${compareTo}";
83+
`
84+
.tap(expectTypeOfHelper)
85+
.expectToMatchJsResult();
86+
});
87+
88+
test.each([...equalityComparisonCases, ...relationalComparisonCases])(
89+
"typeof non-literal comparison (%p)",
90+
({ expression, operator, compareTo }) => {
91+
util.testFunction`
92+
const value = ${expression};
93+
const compareTo = "${compareTo}";
94+
return typeof value ${operator} compareTo;
95+
`
96+
.tap(expectTypeOfHelper)
97+
.expectToMatchJsResult();
98+
}
99+
);

0 commit comments

Comments
 (0)