// Copyright (C) 2015 André Bargull. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
es6id: 25.4.4.1.1
description: >
  Cannot tamper remainingElementsCount when Promise.all resolve element function is called twice in a row.
info: |
  Runtime Semantics: PerformPromiseAll( iteratorRecord, constructor, resultCapability)

  ...
  4. Let remainingElementsCount be a new Record { [[value]]: 1 }.
  ...
  6.d ...
    ii. Set remainingElementsCount.[[value]] to remainingElementsCount.[[value]] − 1.
    iii. If remainingElementsCount.[[value]] is 0,
      1. Let valuesArray be CreateArrayFromList(values).
      2. Let resolveResult be Call(resultCapability.[[Resolve]], undefined, «valuesArray»).
      3. ReturnIfAbrupt(resolveResult).
  ...

  25.4.4.1.2 Promise.all Resolve Element Functions
    1. Let alreadyCalled be the value of F's [[AlreadyCalled]] internal slot.
    2. If alreadyCalled.[[value]] is true, return undefined.
    3. Set alreadyCalled.[[value]] to true.
    ...
---*/

var callCount = 0;

function Constructor(executor) {
  function resolve(values) {
    callCount += 1;
    assert(Array.isArray(values), "values is array");
    assert.sameValue(values.length, 3, "values length");
    assert.sameValue(values[0], "p1-fulfill", "values[0]");
    assert.sameValue(values[1], "p2-fulfill", "values[1]");
    assert.sameValue(values[2], "p3-fulfill", "values[2]");
  }
  executor(resolve, $ERROR);
}
Constructor.resolve = function(v) { return v; };

var p1OnFulfilled;

var p1 = {
  then: function(onFulfilled, onRejected) {
    p1OnFulfilled = onFulfilled;
  }
};
var p2 = {
  then: function(onFulfilled, onRejected) {
    onFulfilled("p2-fulfill");
    onFulfilled("p2-fulfill-unexpected");
  }
};
var p3 = {
  then: function(onFulfilled, onRejected) {
    onFulfilled("p3-fulfill");
  }
};

assert.sameValue(callCount, 0, "callCount before call to all()");

Promise.all.call(Constructor, [p1, p2, p3]);

assert.sameValue(callCount, 0, "callCount after call to all()");

p1OnFulfilled("p1-fulfill");

assert.sameValue(callCount, 1, "callCount after resolving p1");
