reject-element-function-multiple-calls.js (1463B)
1 // Copyright (C) 2020 Rick Waldron. All rights reserved. 2 // This code is governed by the BSD license found in the LICENSE file. 3 4 /*--- 5 esid: sec-performpromiseallsettled 6 description: > 7 Cannot tamper with remainingElementsCount when Promise.allSettled reject element function is called multiple times. 8 info: | 9 Runtime Semantics: PerformPromiseAllSettled ( iteratorRecord, constructor, resultCapability, ) 10 11 If alreadyCalled.[[Value]] is true, return undefined. 12 13 features: [Promise.allSettled] 14 ---*/ 15 16 let rejectCallCount = 0; 17 let returnValue = {}; 18 let error = new Test262Error(); 19 20 function Constructor(executor) { 21 function reject(value) { 22 assert.sameValue(value, error); 23 rejectCallCount += 1; 24 return returnValue; 25 } 26 executor(() => {throw error}, reject); 27 } 28 Constructor.resolve = function(v) { 29 return v; 30 }; 31 Constructor.reject = function(v) { 32 return v; 33 }; 34 35 let pOnRejected; 36 37 let p = { 38 then(onResolved, onRejected) { 39 pOnRejected = onRejected; 40 onResolved(); 41 } 42 }; 43 44 assert.sameValue(rejectCallCount, 0, 'rejectCallCount before call to allSettled()'); 45 46 Promise.allSettled.call(Constructor, [p]); 47 48 assert.sameValue(rejectCallCount, 1, 'rejectCallCount after call to allSettled()'); 49 assert.sameValue(pOnRejected(), undefined); 50 assert.sameValue(rejectCallCount, 1, 'rejectCallCount after call to pOnRejected()'); 51 pOnRejected(); 52 assert.sameValue(rejectCallCount, 1, 'rejectCallCount after call to pOnRejected()'); 53 54 55 56 reportCompare(0, 0);