• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1describe("unittests:: evaluation:: optionalCall", () => {
2    it("f?.()", async () => {
3        const result = evaluator.evaluateTypeScript(`
4            function f(a) {
5                output.push(a);
6                output.push(this);
7            }
8            export const output: any[] = [];
9            f?.(1);
10        `);
11        assert.strictEqual(result.output[0], 1);
12        assert.isUndefined(result.output[1]);
13    });
14    it("o.f?.()", async () => {
15        const result = evaluator.evaluateTypeScript(`
16            export const o = {
17                f(a) {
18                    output.push(a);
19                    output.push(this);
20                }
21            };
22            export const output: any[] = [];
23            o.f?.(1);
24        `);
25        assert.strictEqual(result.output[0], 1);
26        assert.strictEqual(result.output[1], result.o);
27    });
28    it("o.x.f?.()", async () => {
29        const result = evaluator.evaluateTypeScript(`
30            export const o = {
31                x: {
32                    f(a) {
33                        output.push(a);
34                        output.push(this);
35                    }
36                }
37            };
38            export const output: any[] = [];
39            o.x.f?.(1);
40        `);
41        assert.strictEqual(result.output[0], 1);
42        assert.strictEqual(result.output[1], result.o.x);
43    });
44    it("o?.f()", async () => {
45        const result = evaluator.evaluateTypeScript(`
46            export const o = {
47                f(a) {
48                    output.push(a);
49                    output.push(this);
50                }
51            };
52            export const output: any[] = [];
53            o?.f(1);
54        `);
55        assert.strictEqual(result.output[0], 1);
56        assert.strictEqual(result.output[1], result.o);
57    });
58    it("o?.f?.()", async () => {
59        const result = evaluator.evaluateTypeScript(`
60            export const o = {
61                f(a) {
62                    output.push(a);
63                    output.push(this);
64                }
65            };
66            export const output: any[] = [];
67            o?.f?.(1);
68        `);
69        assert.strictEqual(result.output[0], 1);
70        assert.strictEqual(result.output[1], result.o);
71    });
72    it("o.x?.f()", async () => {
73        const result = evaluator.evaluateTypeScript(`
74            export const o = {
75                x: {
76                    f(a) {
77                        output.push(a);
78                        output.push(this);
79                    }
80                }
81            };
82            export const output: any[] = [];
83            o.x?.f(1);
84        `);
85        assert.strictEqual(result.output[0], 1);
86        assert.strictEqual(result.output[1], result.o.x);
87    });
88    it("o?.x.f()", async () => {
89        const result = evaluator.evaluateTypeScript(`
90            export const o = {
91                x: {
92                    f(a) {
93                        output.push(a);
94                        output.push(this);
95                    }
96                }
97            };
98            export const output: any[] = [];
99            o?.x.f(1);
100        `);
101        assert.strictEqual(result.output[0], 1);
102        assert.strictEqual(result.output[1], result.o.x);
103    });
104    it("o?.x?.f()", async () => {
105        const result = evaluator.evaluateTypeScript(`
106            export const o = {
107                x: {
108                    f(a) {
109                        output.push(a);
110                        output.push(this);
111                    }
112                }
113            };
114            export const output: any[] = [];
115            o?.x?.f(1);
116        `);
117        assert.strictEqual(result.output[0], 1);
118        assert.strictEqual(result.output[1], result.o.x);
119    });
120    it("o?.x?.f?.()", async () => {
121        const result = evaluator.evaluateTypeScript(`
122            export const o = {
123                x: {
124                    f(a) {
125                        output.push(a);
126                        output.push(this);
127                    }
128                }
129            };
130            export const output: any[] = [];
131            o?.x?.f?.(1);
132        `);
133        assert.strictEqual(result.output[0], 1);
134        assert.strictEqual(result.output[1], result.o.x);
135    });
136    it("f?.()?.()", async () => {
137        const result = evaluator.evaluateTypeScript(`
138            function g(a) {
139                output.push(a);
140                output.push(this);
141            }
142            function f(a) {
143                output.push(a);
144                return g;
145            }
146            export const output: any[] = [];
147            f?.(1)?.(2)
148        `);
149        assert.strictEqual(result.output[0], 1);
150        assert.strictEqual(result.output[1], 2);
151        assert.isUndefined(result.output[2]);
152    });
153    it("f?.().f?.()", async () => {
154        const result = evaluator.evaluateTypeScript(`
155            export const o = {
156                f(a) {
157                    output.push(a);
158                    output.push(this);
159                }
160            };
161            function f(a) {
162                output.push(a);
163                return o;
164            }
165            export const output: any[] = [];
166            f?.(1).f?.(2)
167        `);
168        assert.strictEqual(result.output[0], 1);
169        assert.strictEqual(result.output[1], 2);
170        assert.strictEqual(result.output[2], result.o);
171    });
172    it("f?.()?.f?.()", async () => {
173        const result = evaluator.evaluateTypeScript(`
174            export const o = {
175                f(a) {
176                    output.push(a);
177                    output.push(this);
178                }
179            };
180            function f(a) {
181                output.push(a);
182                return o;
183            }
184            export const output: any[] = [];
185            f?.(1)?.f?.(2)
186        `);
187        assert.strictEqual(result.output[0], 1);
188        assert.strictEqual(result.output[1], 2);
189        assert.strictEqual(result.output[2], result.o);
190    });
191});
192