| 
									
										
										
										
											2021-09-14 06:56:31 +04:30
										 |  |  | test("parse optional-chaining", () => { | 
					
						
							|  |  |  |     expect(`a?.b`).toEval(); | 
					
						
							|  |  |  |     expect(`a?.4:.5`).toEval(); | 
					
						
							|  |  |  |     expect(`a?.[b]`).toEval(); | 
					
						
							|  |  |  |     expect(`a?.b[b]`).toEval(); | 
					
						
							|  |  |  |     expect(`a?.b(c)`).toEval(); | 
					
						
							|  |  |  |     expect(`a?.b?.(c, d)`).toEval(); | 
					
						
							|  |  |  |     expect(`a?.b?.()`).toEval(); | 
					
						
							|  |  |  |     expect("a?.b``").not.toEval(); | 
					
						
							|  |  |  |     expect("a?.b?.``").not.toEval(); | 
					
						
							|  |  |  |     expect("new Foo?.bar").not.toEval(); | 
					
						
							|  |  |  |     expect("new (Foo?.bar)").toEval(); | 
					
						
							| 
									
										
										
										
											2023-08-08 09:53:14 +02:00
										 |  |  |     expect("(new Foo)?.bar").toEval(); | 
					
						
							| 
									
										
										
										
											2021-09-14 06:56:31 +04:30
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | test("evaluate optional-chaining", () => { | 
					
						
							|  |  |  |     for (let nullishObject of [null, undefined]) { | 
					
						
							|  |  |  |         expect((() => nullishObject?.b)()).toBeUndefined(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect( | 
					
						
							|  |  |  |         (() => { | 
					
						
							|  |  |  |             let a = {}; | 
					
						
							|  |  |  |             return a?.foo?.bar?.baz; | 
					
						
							|  |  |  |         })() | 
					
						
							|  |  |  |     ).toBeUndefined(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect( | 
					
						
							|  |  |  |         (() => { | 
					
						
							|  |  |  |             let a = { foo: { bar: () => 42 } }; | 
					
						
							|  |  |  |             return `${a?.foo?.bar?.()}-${a?.foo?.baz?.()}`; | 
					
						
							|  |  |  |         })() | 
					
						
							|  |  |  |     ).toBe("42-undefined"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect(() => { | 
					
						
							|  |  |  |         let a = { foo: { bar: () => 42 } }; | 
					
						
							|  |  |  |         return a.foo?.baz.nonExistentProperty; | 
					
						
							|  |  |  |     }).toThrow(); | 
					
						
							|  |  |  | }); |