summaryrefslogtreecommitdiff
path: root/test/built-ins/Promise/prototype/then/capability-executor-called-twice.js
diff options
context:
space:
mode:
Diffstat (limited to 'test/built-ins/Promise/prototype/then/capability-executor-called-twice.js')
-rwxr-xr-xtest/built-ins/Promise/prototype/then/capability-executor-called-twice.js96
1 files changed, 96 insertions, 0 deletions
diff --git a/test/built-ins/Promise/prototype/then/capability-executor-called-twice.js b/test/built-ins/Promise/prototype/then/capability-executor-called-twice.js
new file mode 100755
index 000000000..63368d6a1
--- /dev/null
+++ b/test/built-ins/Promise/prototype/then/capability-executor-called-twice.js
@@ -0,0 +1,96 @@
+// Copyright (C) 2015 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+es6id: 25.4.5.3
+description: >
+ Throws a TypeError if capabilities executor already called with non-undefined values.
+info: >
+ Promise.prototype.then ( onFulfilled , onRejected )
+
+ ...
+ 5. Let promiseCapability be NewPromiseCapability(C).
+ 6. ReturnIfAbrupt(promiseCapability).
+ ...
+
+ 25.4.1.5.1 GetCapabilitiesExecutor Functions
+ ...
+ 3. If promiseCapability.[[Resolve]] is not undefined, throw a TypeError exception.
+ 4. If promiseCapability.[[Reject]] is not undefined, throw a TypeError exception.
+ 5. Set promiseCapability.[[Resolve]] to resolve.
+ 6. Set promiseCapability.[[Reject]] to reject.
+ ...
+---*/
+
+var constructorFunction;
+
+var promise = new class extends Promise {
+ constructor(executor) {
+ if (constructorFunction) {
+ constructorFunction(executor);
+ return {};
+ }
+ return super(executor);
+ }
+}(function(){});
+
+var checkPoint = "";
+constructorFunction = function(executor) {
+ checkPoint += "a";
+ executor();
+ checkPoint += "b";
+ executor(function(){}, function(){});
+ checkPoint += "c";
+};
+promise.then();
+assert.sameValue(checkPoint, "abc", "executor initially called with no arguments");
+
+var checkPoint = "";
+constructorFunction = function(executor) {
+ checkPoint += "a";
+ executor(undefined, undefined);
+ checkPoint += "b";
+ executor(function(){}, function(){});
+ checkPoint += "c";
+};
+promise.then();
+assert.sameValue(checkPoint, "abc", "executor initially called with (undefined, undefined)");
+
+var checkPoint = "";
+assert.throws(TypeError, function() {
+ constructorFunction = function(executor) {
+ checkPoint += "a";
+ executor(undefined, function(){});
+ checkPoint += "b";
+ executor(function(){}, function(){});
+ checkPoint += "c";
+ };
+ promise.then();
+}, "executor initially called with (undefined, function)");
+assert.sameValue(checkPoint, "ab", "executor initially called with (undefined, function)");
+
+var checkPoint = "";
+assert.throws(TypeError, function() {
+ constructorFunction = function(executor) {
+ checkPoint += "a";
+ executor(function(){}, undefined);
+ checkPoint += "b";
+ executor(function(){}, function(){});
+ checkPoint += "c";
+ };
+ promise.then();
+}, "executor initially called with (function, undefined)");
+assert.sameValue(checkPoint, "ab", "executor initially called with (function, undefined)");
+
+var checkPoint = "";
+assert.throws(TypeError, function() {
+ constructorFunction = function(executor) {
+ checkPoint += "a";
+ executor("invalid value", 123);
+ checkPoint += "b";
+ executor(function(){}, function(){});
+ checkPoint += "c";
+ };
+ promise.then();
+}, "executor initially called with (String, Number)");
+assert.sameValue(checkPoint, "ab", "executor initially called with (String, Number)");