allSettled.js (2667B)
1 // Smoke test for `Promise.allSettled`, test262 should cover the function in 2 // more detail. 3 4 // Empty elements. 5 Promise.allSettled([]).then(v => { 6 assertDeepEq(v, []); 7 }); 8 9 // Single element. 10 Promise.allSettled([Promise.resolve(0)]).then(v => { 11 assertDeepEq(v, [ 12 {"status": "fulfilled", "value": 0}, 13 ]); 14 }); 15 Promise.allSettled([Promise.reject(1)]).then(v => { 16 assertDeepEq(v, [ 17 {"status": "rejected", "reason": 1}, 18 ]); 19 }); 20 21 // Multiple elements. 22 Promise.allSettled([Promise.resolve(1), Promise.resolve(2)]).then(v => { 23 assertDeepEq(v, [ 24 {"status": "fulfilled", "value": 1}, 25 {"status": "fulfilled", "value": 2}, 26 ]); 27 }); 28 Promise.allSettled([Promise.resolve(3), Promise.reject(4)]).then(v => { 29 assertDeepEq(v, [ 30 {"status": "fulfilled", "value": 3}, 31 {"status": "rejected", "reason": 4}, 32 ]); 33 }); 34 Promise.allSettled([Promise.reject(5), Promise.resolve(6)]).then(v => { 35 assertDeepEq(v, [ 36 {"status": "rejected", "reason": 5}, 37 {"status": "fulfilled", "value": 6}, 38 ]); 39 }); 40 Promise.allSettled([Promise.reject(7), Promise.reject(8)]).then(v => { 41 assertDeepEq(v, [ 42 {"status": "rejected", "reason": 7}, 43 {"status": "rejected", "reason": 8}, 44 ]); 45 }); 46 47 // Cross-Realm tests. 48 // 49 // Note: When |g| is a cross-compartment global, Promise.allSettled creates 50 // the result array in |g|'s Realm. This doesn't follow the spec, but the code 51 // in js/src/builtin/Promise.cpp claims this is useful when the Promise 52 // compartment is less-privileged. This means for this test we can't use 53 // assertDeepEq below, because the result array may have the wrong prototype. 54 let g = newGlobal(); 55 56 if (typeof isSameCompartment !== "function") { 57 var isSameCompartment = SpecialPowers.Cu.getJSTestingFunctions().isSameCompartment; 58 } 59 60 // Test wrapping when neither Promise.allSettled element function is called. 61 Promise.allSettled.call(g.Promise, []).then(v => { 62 assertEq(isSameCompartment(v, g), true); 63 64 assertEq(v.length, 0); 65 }); 66 67 // Test wrapping in `Promise.allSettled Resolve Element Function`. 68 Promise.allSettled.call(g.Promise, [Promise.resolve(0)]).then(v => { 69 assertEq(isSameCompartment(v, g), true); 70 71 assertEq(v.length, 1); 72 assertEq(v[0].status, "fulfilled"); 73 assertEq(v[0].value, 0); 74 }); 75 76 // Test wrapping in `Promise.allSettled Reject Element Function`. 77 Promise.allSettled.call(g.Promise, [Promise.reject(0)]).then(v => { 78 assertEq(isSameCompartment(v, g), true); 79 80 assertEq(v.length, 1); 81 assertEq(v[0].status, "rejected"); 82 assertEq(v[0].reason, 0); 83 }); 84 85 if (typeof reportCompare === "function") 86 reportCompare(0, 0);