// Copyright (C) 2019 Leo Balter. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
esid: sec-promise.allsettled
description: >
  Throws a TypeError if capabilities executor already called with non-undefined values.
info: |
  Promise.allSettled ( iterable )

  ...
  3. Let promiseCapability be ? NewPromiseCapability(C).
  ...

  GetCapabilitiesExecutor Functions

  ...
  4. If promiseCapability.[[Resolve]] is not undefined, throw a TypeError exception.
  5. If promiseCapability.[[Reject]] is not undefined, throw a TypeError exception.
  6. Set promiseCapability.[[Resolve]] to resolve.
  7. Set promiseCapability.[[Reject]] to reject.
  ...
features: [Promise.allSettled]
---*/

var checkPoint = '';
function fn1(executor) {
  checkPoint += 'a';
  executor();
  checkPoint += 'b';
  executor(function() {}, function() {});
  checkPoint += 'c';
}
fn1.resolve = function() {
  throw new Test262Error();
};
Promise.allSettled.call(fn1, []);
assert.sameValue(checkPoint, 'abc', 'executor initially called with no arguments');

checkPoint = '';
function fn2(executor) {
  checkPoint += 'a';
  executor(undefined, undefined);
  checkPoint += 'b';
  executor(function() {}, function() {});
  checkPoint += 'c';
}
fn2.resolve = function() {
  throw new Test262Error();
};
Promise.allSettled.call(fn2, []);
assert.sameValue(checkPoint, 'abc', 'executor initially called with (undefined, undefined)');

checkPoint = '';
function fn3(executor) {
  checkPoint += 'a';
  executor(undefined, function() {});
  checkPoint += 'b';
  executor(function() {}, function() {});
  checkPoint += 'c';
}
Object.defineProperty(fn3, 'resolve', {
  get() {
    throw new Test262Error();
  }
});
assert.throws(TypeError, function() {
  Promise.allSettled.call(fn3, []);
}, 'executor initially called with (undefined, function)');
assert.sameValue(checkPoint, 'ab', 'executor initially called with (undefined, function)');

checkPoint = '';
function fn4(executor) {
  checkPoint += 'a';
  executor(function() {}, undefined);
  checkPoint += 'b';
  executor(function() {}, function() {});
  checkPoint += 'c';
}
Object.defineProperty(fn4, 'resolve', {
  get() {
    throw new Test262Error();
  }
});
assert.throws(TypeError, function() {
  Promise.allSettled.call(fn4, []);
}, 'executor initially called with (function, undefined)');
assert.sameValue(checkPoint, 'ab', 'executor initially called with (function, undefined)');

checkPoint = '';
function fn5(executor) {
  checkPoint += 'a';
  executor('invalid value', 123);
  checkPoint += 'b';
  executor(function() {}, function() {});
  checkPoint += 'c';
}
Object.defineProperty(fn5, 'resolve', {
  get() {
    throw new Test262Error();
  }
});
assert.throws(TypeError, function() {
  Promise.allSettled.call(fn5, []);
}, 'executor initially called with (String, Number)');
assert.sameValue(checkPoint, 'ab', 'executor initially called with (String, Number)');
