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