From 2b5efe135c56f6f06d05d2721e5afac7c82a48b6 Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Fri, 24 Jun 2016 15:26:40 -0400 Subject: [PATCH] Add test for abrupt completion during Promise.all --- .../all/capability-resolve-throws-no-close.js | 69 +++++++++++++++++++ .../all/capability-resolve-throws-reject.js | 64 +++++++++++++++++ 2 files changed, 133 insertions(+) create mode 100644 test/built-ins/Promise/all/capability-resolve-throws-no-close.js create mode 100644 test/built-ins/Promise/all/capability-resolve-throws-reject.js diff --git a/test/built-ins/Promise/all/capability-resolve-throws-no-close.js b/test/built-ins/Promise/all/capability-resolve-throws-no-close.js new file mode 100644 index 0000000000..9124a3a560 --- /dev/null +++ b/test/built-ins/Promise/all/capability-resolve-throws-no-close.js @@ -0,0 +1,69 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-promise.all +es6id: 25.4.4.1 +description: > + Iterator is not closed when the "resolve" capability returns an abrupt + completion. +info: | + 1. Let C be the this value. + [...] + 3. Let promiseCapability be ? NewPromiseCapability(C). + [...] + 7. Let result be PerformPromiseAll(iteratorRecord, C, promiseCapability). + 8. If result is an abrupt completion, then + a. If iteratorRecord.[[Done]] is false, let result be + IteratorClose(iterator, result). + b. IfAbruptRejectPromise(result, promiseCapability). + + 25.4.4.1.1 Runtime Semantics: PerformPromiseAll + + [...] + 6. Repeat + [...] + d. If next is false, then + [...] + iii. If remainingElementsCount.[[Value]] is 0, then + 1. Let valuesArray be CreateArrayFromList(values). + 2. Perform ? Call(resultCapability.[[Resolve]], undefined, « + valuesArray »). + + 25.4.1.1.1 IfAbruptRejectPromise + + IfAbruptRejectPromise is a short hand for a sequence of algorithm steps that + use a PromiseCapability Record. An algorithm step of the form: + + 1. IfAbruptRejectPromise(value, capability). + + means the same thing as: + + 1. If value is an abrupt completion, then + a. Perform ? Call(capability.[[Reject]], undefined, « value.[[Value]] »). + b. Return capability.[[Promise]]. + 2. Else if value is a Completion Record, let value be value.[[Value]]. +features: [Symbol.iterator] +---*/ + +var returnCount = 0; +var iter = {}; +iter[Symbol.iterator] = function() { + return { + next: function() { + return { done: true }; + }, + return: function() { + returnCount += 1; + return {}; + } + }; +}; +var P = function(executor) { + return new Promise(function(_, reject) { + executor(function() { throw new Test262Error(); }, reject); + }); +}; + +Promise.all.call(P, iter); + +assert.sameValue(returnCount, 0); diff --git a/test/built-ins/Promise/all/capability-resolve-throws-reject.js b/test/built-ins/Promise/all/capability-resolve-throws-reject.js new file mode 100644 index 0000000000..3ad3affdee --- /dev/null +++ b/test/built-ins/Promise/all/capability-resolve-throws-reject.js @@ -0,0 +1,64 @@ +// Copyright (C) 2016 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-promise.all +es6id: 25.4.4.1 +description: > + Promise is rejected when the "resolve" capability returns an abrupt + completion. +info: | + 1. Let C be the this value. + [...] + 3. Let promiseCapability be ? NewPromiseCapability(C). + [...] + 7. Let result be PerformPromiseAll(iteratorRecord, C, promiseCapability). + 8. If result is an abrupt completion, then + a. If iteratorRecord.[[Done]] is false, let result be + IteratorClose(iterator, result). + b. IfAbruptRejectPromise(result, promiseCapability). + + 25.4.4.1.1 Runtime Semantics: PerformPromiseAll + + [...] + 6. Repeat + [...] + d. If next is false, then + [...] + iii. If remainingElementsCount.[[Value]] is 0, then + 1. Let valuesArray be CreateArrayFromList(values). + 2. Perform ? Call(resultCapability.[[Resolve]], undefined, « + valuesArray »). + + 25.4.1.1.1 IfAbruptRejectPromise + + IfAbruptRejectPromise is a short hand for a sequence of algorithm steps that + use a PromiseCapability Record. An algorithm step of the form: + + 1. IfAbruptRejectPromise(value, capability). + + means the same thing as: + + 1. If value is an abrupt completion, then + a. Perform ? Call(capability.[[Reject]], undefined, « value.[[Value]] »). + b. Return capability.[[Promise]]. + 2. Else if value is a Completion Record, let value be value.[[Value]]. +flags: [async] +---*/ + +var thrown = new Test262Error(); +var P = function(executor) { + return new Promise(function(_, reject) { + executor(function() { throw thrown; }, reject); + }); +}; + +Promise.all.call(P, []) + .then(function() { + $DONE('Promise incorrectly fulfilled.'); + }, function(reason) { + if (reason !== thrown) { + $DONE('Promise rejected with incorrect "reason."'); + return; + } + $DONE(); + });