test262/test/built-ins/Promise/any/resolve-before-loop-exit-fr...

100 lines
2.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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: >
Cannot tamper remainingElementsCount when Promise.all resolve element function is called twice in a row.
info: |
Let result be PerformPromiseAny(iteratorRecord, C, promiseCapability).
Runtime Semantics: PerformPromiseAny
...
Let remainingElementsCount be a new Record { [[value]]: 1 }.
...
8.d ...
ii. Set remainingElementsCount.[[value]] to remainingElementsCount.[[value]] 1.
iii. If remainingElementsCount.[[value]] is 0,
1. Let error be a newly created AggregateError object.
2. Perform ! DefinePropertyOrThrow(error, "errors", Property Descriptor { [[Configurable]]: true, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: errors }).
3. Return ThrowCompletion(error).
...
Promise.any Reject Element Functions
...
Let alreadyCalled be the value of F's [[AlreadyCalled]] internal slot.
If alreadyCalled.[[value]] is true, return undefined.
Set alreadyCalled.[[value]] to true.
...
features: [Promise.any, arrow-function]
---*/
let callCount = 0;
let errorArray;
function Constructor(executor) {
function reject(error) {
callCount += 1;
errorArray = error.errors;
assert(Array.isArray(error.errors), "error is array");
assert.sameValue(error.errors.length, 3, "error.length");
assert.sameValue(error.errors[0], "p1-rejection", "error.errors[0] === 'p1-rejection'");
assert.sameValue(error.errors[1], "p2-rejection", "error.errors[1] === 'p2-rejection'");
assert.sameValue(error.errors[2], "p3-rejection", "error.errors[2] === 'p3-rejection'");
assert(error instanceof AggregateError, "error instanceof AggregateError");
}
executor(Test262Error.thrower, reject);
}
Constructor.resolve = function(v) {
return v;
};
let p1OnRejected;
let p1 = {
then(onResolved, onRejected) {
p1OnRejected = onRejected;
}
};
let p2 = {
then(onResolved, onRejected) {
onRejected("p2-rejection");
onRejected("unexpectedonRejectedValue");
}
};
let p3 = {
then(onResolved, onRejected) {
onRejected("p3-rejection");
}
};
assert.sameValue(callCount, 0, "callCount before call to any()");
Promise.any.call(Constructor, [p1, p2, p3]);
assert.sameValue(callCount, 0, "callCount after call to any()");
p1OnRejected("p1-rejection");
assert.sameValue(callCount, 1, "callCount after call to p1OnRejected()");
assert.sameValue(
errorArray[0],
"p1-rejection",
"errorArray[0] === 'p1-rejection', after call to p1OnRejected(...)"
);
assert.sameValue(
errorArray[1],
"p2-rejection",
"errorArray[1] === 'p2-rejection', after call to p1OnRejected(...)"
);
assert.sameValue(
errorArray[2],
"p3-rejection",
"errorArray[2] === 'p3-rejection', after call to p1OnRejected(...)"
);