summaryrefslogtreecommitdiffstats
path: root/js/src/tests/test262/built-ins/Promise/race/reject-from-same-thenable.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/tests/test262/built-ins/Promise/race/reject-from-same-thenable.js')
-rw-r--r--js/src/tests/test262/built-ins/Promise/race/reject-from-same-thenable.js65
1 files changed, 65 insertions, 0 deletions
diff --git a/js/src/tests/test262/built-ins/Promise/race/reject-from-same-thenable.js b/js/src/tests/test262/built-ins/Promise/race/reject-from-same-thenable.js
new file mode 100644
index 0000000000..25601b9361
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Promise/race/reject-from-same-thenable.js
@@ -0,0 +1,65 @@
+// Copyright (C) 2020 Rick Waldron. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-performpromiserace
+description: >
+ Promise.race does not prevent resolve from being called multiple times.
+info: |
+ PerformPromiseRace
+
+ Repeat,
+ Let next be IteratorStep(iteratorRecord).
+ If next is an abrupt completion, set iteratorRecord.[[Done]] to true.
+ ReturnIfAbrupt(next).
+ If next is false, then
+ Set iteratorRecord.[[Done]] to true.
+ Return resultCapability.[[Promise]].
+ Let nextValue be IteratorValue(next).
+ If nextValue is an abrupt completion, set iteratorRecord.[[Done]] to true.
+ ReturnIfAbrupt(nextValue).
+ Let nextPromise be ? Call(promiseResolve, constructor, « nextValue »).
+ Perform ? Invoke(nextPromise, "then", « resultCapability.[[Resolve]], resultCapability.[[Reject]] »).
+
+includes: [promiseHelper.js]
+---*/
+
+let callCount = 0;
+let sequence = [];
+
+function Constructor(executor) {
+ function reject(value) {
+ callCount += 1;
+ sequence.push(value);
+ }
+ executor(() => {
+ throw new Test262Error();
+ }, reject);
+}
+Constructor.resolve = function(v) {
+ return v;
+};
+
+let pReject;
+
+let a = {
+ then(_, rejecter) {
+ pReject = rejecter;
+ }
+};
+
+assert.sameValue(callCount, 0, 'callCount before call to race()');
+
+Promise.race.call(Constructor, [a]);
+
+assert.sameValue(callCount, 0, 'callCount after call to race()');
+
+pReject(1);
+pReject(2);
+pReject(3);
+
+assert.sameValue(callCount, 3, 'callCount after resolving a');
+assert.sameValue(sequence.length, 3);
+checkSequence(sequence);
+
+reportCompare(0, 0);