mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-28 11:02:36 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			40 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			40 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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();
 | |
|     // FIXME: This should pass.
 | |
|     // expect("(new Foo)?.bar").toEval();
 | |
| });
 | |
| 
 | |
| 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();
 | |
| });
 | 
