| // Copyright (C) 2020 Rick Waldron. All rights reserved. |
| // This code is governed by the BSD license found in the LICENSE file. |
| /*--- |
| esid: sec-promise.any |
| description: > |
| Iterator is not closed when the "resolve" capability returns an abrupt |
| completion. |
| info: | |
| Let C be the this value. |
| Let promiseCapability be ? NewPromiseCapability(C). |
| Let iteratorRecord be GetIterator(iterable). |
| IfAbruptRejectPromise(iteratorRecord, promiseCapability). |
| Let result be PerformPromiseAny(iteratorRecord, C, promiseCapability). |
| If result is an abrupt completion, then |
| If iteratorRecord.[[Done]] is false, set result to IteratorClose(iteratorRecord, result). |
| IfAbruptRejectPromise(result, promiseCapability). |
| Return Completion(result). |
| |
| flags: [async] |
| features: [Promise.any, Symbol.iterator] |
| ---*/ |
| let callCount = 0; |
| let nextCount = 0; |
| let returnCount = 0; |
| let iter = { |
| [Symbol.iterator]() { |
| callCount++; |
| return { |
| next() { |
| callCount++ |
| nextCount++; |
| return { |
| done: true |
| }; |
| }, |
| return() { |
| callCount++; |
| returnCount++; |
| return {}; |
| } |
| }; |
| } |
| }; |
| |
| function P(executor) { |
| callCount++; |
| return new Promise((_, reject) => { |
| callCount++; |
| executor(() => { |
| callCount++; |
| $ERROR(); |
| }, () => { |
| callCount++; |
| reject(new Test262Error('reject throws')); |
| }); |
| }); |
| }; |
| |
| P.resolve = Promise.resolve; |
| |
| Promise.any.call(P, iter).then( |
| () => { |
| $DONE('The promise should be rejected.'); |
| }, (reason) => { |
| assert.sameValue(nextCount, 1); |
| assert.sameValue(returnCount, 0); |
| assert.sameValue(callCount, 5); |
| }).then($DONE, $DONE); |