// Copyright 2018 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Flags: --allow-natives-syntax

load('test/mjsunit/test-async.js');

// We store the index in the hash code field of the Promise.all resolve
// element closures, so make sure we properly handle the cases where this
// magical field turns into a PropertyArray later.
(function() {
  class MyPromise extends Promise {
    then(resolve, reject) {
      this.resolve = resolve;
    }
  };
  const myPromise = new MyPromise(() => {});
  MyPromise.all([myPromise]);
  myPromise.resolve.x = 1;
  myPromise.resolve(1);
})();

// Same test as above, but for PropertyDictionary.
(function() {
  class MyPromise extends Promise {
    then(resolve, reject) {
      this.resolve = resolve;
    }
  };
  const myPromise = new MyPromise(() => {});
  MyPromise.all([myPromise]);
  for (let i = 0; i < 1025; ++i) {
    myPromise.resolve[`x${i}`] = i;
  }
  myPromise.resolve(1);
})();

// Test that we return a proper array even if (custom) "then" invokes the
// resolve callbacks right away.
(function() {
  class MyPromise extends Promise {
    constructor(executor, id) {
      super(executor);
      this.id = id;
    }

    then(resolve, reject) {
      if (this.id) return resolve(this.id);
      return super.then(resolve, reject)
    }
  };
  const a = new MyPromise(() => {}, 'a');
  const b = new MyPromise(() => {}, 'b');
  testAsync(assert => {
    assert.plan(1);
    MyPromise.all([a, b]).then(
        v => assert.equals(['a', 'b'], v),
        assert.unexpectedRejection());
  });
})();

// Test that we properly handle holes introduced into the resulting array
// by resolving some late elements immediately.
(function() {
  class MyPromise extends Promise {
    then(resolve, reject) {
      if (this.immediately) {
        resolve(42);
      } else {
        super.then(resolve, reject);
      }
    }
  };
  const a = new Array(1024);
  a.fill(MyPromise.resolve(1));
  const p = MyPromise.resolve(0);
  p.immediately = true;
  a.push(p);
  testAsync(assert => {
    assert.plan(1);
    MyPromise.all(a).then(
        b => assert.equals(42, b[1024]),
        assert.unexpectedRejection());
  });
})();
