-
-
Notifications
You must be signed in to change notification settings - Fork 184
Expand file tree
/
Copy pathobjectLiteral.spec.ts
More file actions
128 lines (114 loc) · 3.79 KB
/
objectLiteral.spec.ts
File metadata and controls
128 lines (114 loc) · 3.79 KB
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import * as util from "../util";
test.each(['{ a: 3, b: "4" }', '{ "a": 3, b: "4" }', '{ ["a"]: 3, b: "4" }', '{ ["a" + 123]: 3, b: "4" }'])(
"Object Literal (%p)",
inp => {
util.testExpression(inp).expectToMatchJsResult();
}
);
test("object literal with function call to get key", () => {
util.testFunction`
const myFunc = () => "a";
return { [myFunc() + "b"]: 3 };
`.expectToMatchJsResult();
});
test("object literal with shorthand property", () => {
util.testFunction`
const x = 5;
return { x };
`.expectToMatchJsResult();
});
describe("property shorthand", () => {
test("should support property shorthand", () => {
util.testFunction`
const x = 1;
const o = { x };
return o.x;
`.expectToMatchJsResult();
});
test.each([NaN, Infinity])("should support %p shorthand", identifier => {
util.testExpression`({ ${identifier} }).${identifier}`.expectToMatchJsResult();
});
test("should support _G shorthand", () => {
util.testExpression`({ _G })._G.foobar`
.setTsHeader("declare const _G: any;")
.setLuaHeader('foobar = "foobar"')
.expectToEqual("foobar");
});
test("should support export property shorthand", () => {
util.testModule`
export const x = 1;
const o = { x };
export const y = o.x;
`.expectToMatchJsResult();
});
});
test("undefined as object key", () => {
util.testFunction`
const foo = {undefined: "foo"};
return foo.undefined;
`.expectToMatchJsResult();
});
test.each(['{x: "foobar"}.x', '{x: "foobar"}["x"]', '{x: () => "foobar"}.x()', '{x: () => "foobar"}["x"]()'])(
"object literal property access (%p)",
expression => {
util.testExpression(expression).expectToMatchJsResult();
}
);
describe("noSelf in functions", () => {
test("Explicit this: void parameter", () => {
// language=TypeScript
util.testFunction`
const obj: Record<string, (this: void, arg: string) => string> = {
method(a) {
return a;
},
func: function(a) {
return a;
},
arrow: (a) => {
return a;
}
};
return [obj.method("a") ?? "nil", obj.func("b") ?? "nil", obj.arrow("c") ?? "nil"];
`.expectToMatchJsResult();
});
test("No self annotation", () => {
// language=TypeScript
util.testFunction`
const obj: Record<string, /** @noSelf */(arg: string) => string> = {
method(a) {
return a;
},
func: function(a) {
return a;
},
arrow: (a) => {
return a;
}
};
return [obj.method("a") ?? "nil", obj.func("b") ?? "nil", obj.arrow("c") ?? "nil"];
`.expectToMatchJsResult();
});
test("individual function types", () => {
// language=TypeScript
util.testFunction`
interface FunctionContainer {
method: (this: void, a: string) => string
func: (this: void, a: string) => string
arrow: (this: void, a: string) => string
}
const obj: FunctionContainer = {
method(a) {
return a
},
func: function(a) {
return a
},
arrow: (a) => {
return a
}
}
return [obj.method("a") ?? "nil", obj.func("b") ?? "nil", obj.arrow("c") ?? "nil"];
`.expectToMatchJsResult();
});
});