// 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++;
      throw new Test262Error();
    }, () => {
      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);
