optimized-promise-already-resolved.js (2233B)
1 // Promise created with default resolution functions (without instances) should 2 // behave in the same way as normal case. 3 4 class MockPromise { 5 constructor(...args) { 6 return new Promise(...args); 7 } 8 } 9 10 for (const expected of ["resolve", "reject"]) { 11 for (const unexpected of ["resolve", "reject"]) { 12 let resolve, reject; 13 const p = new Promise((a, b) => { 14 resolve = a; 15 reject = b; 16 }); 17 18 // To prevent fast path in Promise.resolve that returns the passed promise, 19 // modify constructor property. 20 p.constructor = MockPromise; 21 22 // Given `p` has custom constructor, Promise.resolve creates a new promise 23 // instead of returning `p` itself. 24 // 25 // Newly created promise `optimized` does not have resolution function 26 // instances. 27 const optimized = Promise.resolve(p); 28 29 // Newly created promise `normal` has resolution functions. 30 const normal = new Promise(r => r(p)); 31 32 // These calls should be ignored because [[AlreadyResolved]] == true, 33 if (unexpected === "resolve") { 34 resolvePromise(optimized, "unexpected resolve optimized"); 35 resolvePromise(normal, "unexpected resolve normal"); 36 } else { 37 rejectPromise(optimized, "unexpected reject optimized"); 38 rejectPromise(normal, "unexpected reject normal"); 39 } 40 41 if (expected === "resolve") { 42 resolve("resolve"); 43 } else { 44 reject("reject"); 45 } 46 47 let optimized_resolutionValue, optimized_rejectionValue; 48 optimized.then( 49 x => { optimized_resolutionValue = x; }, 50 x => { optimized_rejectionValue = x; } 51 ); 52 53 let normal_resolutionValue, normal_rejectionValue; 54 normal.then( 55 x => { normal_resolutionValue = x; }, 56 x => { normal_rejectionValue = x; } 57 ); 58 59 drainJobQueue(); 60 61 if (expected === "resolve") { 62 assertEq(optimized_resolutionValue, "resolve", 63 `${expected} + ${unexpected}`); 64 assertEq(normal_resolutionValue, "resolve", 65 `${expected} + ${unexpected}`); 66 } else { 67 assertEq(optimized_rejectionValue, "reject", 68 `${expected} + ${unexpected}`); 69 assertEq(normal_rejectionValue, "reject", 70 `${expected} + ${unexpected}`); 71 } 72 } 73 }