mirror of https://github.com/tc39/test262.git
add tests for 24.4.4.1 - Promise.all
add more tests of Promise.all additional Promise test add tests of Promise.prototype add some tests for Promise.race additional Promise tests add Promise.reject and Promise.resolve tests correct test description rename badly-named files use current license and minor style cleanup correct understanding of undefined as thisArgument incorporate line notes Is this enough to make a constructor in ES6? more accurate use of resolved,fulfilled etc. remove some redundant tests add new tests remove "constant array" unclear language better description Update S25.4.2.1_A3.2_T1.js address dangling () changes per @anba line notes - if GetIterator is abrupt, the Promise.race / Promise.all should reject - if Promise.race is called with nonconforming constructor as 'this', TypeError should be thrown (cannot reject if exeption is thrown from NewPromiseCapability; no promise exists yet...) correct description of "this" testing in callbacks fix whitespace, formatting remove tab add "next-turn" checking to sequencers
This commit is contained in:
parent
61113dbfb3
commit
26787ab09b
|
@ -0,0 +1,18 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise reaction jobs have predictable environment
|
||||
author: Sam Mikes
|
||||
description: argument passes through "Identity"
|
||||
---*/
|
||||
|
||||
var obj = {};
|
||||
|
||||
var p = Promise.resolve(obj).then(/*Identity, Thrower*/)
|
||||
.then(function (arg) {
|
||||
if (arg !== obj) {
|
||||
$ERROR("Expected promise to be fulfilled with obj, actually " + arg);
|
||||
}
|
||||
}).then($DONE, $DONE);
|
|
@ -0,0 +1,20 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise reaction jobs have predictable environment
|
||||
author: Sam Mikes
|
||||
description: argument thrown through "Thrower"
|
||||
---*/
|
||||
|
||||
var obj = {};
|
||||
|
||||
var p = Promise.reject(obj).then(/*Identity, Thrower*/)
|
||||
.then(function () {
|
||||
$ERROR("Unexpected fulfillment - promise should reject.");
|
||||
}, function (arg) {
|
||||
if (arg !== obj) {
|
||||
$ERROR("Expected reject reason to be obj, actually " + arg);
|
||||
}
|
||||
}).then($DONE, $DONE);
|
|
@ -0,0 +1,23 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise reaction jobs have predictable environment
|
||||
author: Sam Mikes
|
||||
description: Promise.onFulfilled gets undefined as 'this'
|
||||
---*/
|
||||
|
||||
var expectedThis,
|
||||
obj = {};
|
||||
|
||||
(function () { expectedThis = this; }());
|
||||
|
||||
var p = Promise.resolve(obj).then(function(arg) {
|
||||
if (this !== expectedThis) {
|
||||
$ERROR("'this' must be same as for function called without explicit this got " + this);
|
||||
}
|
||||
if (arg !== obj) {
|
||||
$ERROR("Expected promise to be fulfilled by obj, actually " + arg);
|
||||
}
|
||||
}).then($DONE, $DONE);
|
|
@ -0,0 +1,28 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise reaction jobs have predictable environment
|
||||
'this' is global object in sloppy mode,
|
||||
undefined in strict mode
|
||||
author: Sam Mikes
|
||||
description: onRejected gets default 'this'
|
||||
---*/
|
||||
|
||||
var expectedThis,
|
||||
obj = {};
|
||||
|
||||
(function () { expectedThis = this; }());
|
||||
|
||||
var p = Promise.reject(obj).then(function () {
|
||||
$ERROR("Unexpected fulfillment; expected rejection.");
|
||||
}, function(arg) {
|
||||
if (this !== expectedThis) {
|
||||
$ERROR("'this' must be same as for function called without explicit this, got " + this);
|
||||
}
|
||||
|
||||
if (arg !== obj) {
|
||||
$ERROR("Expected promise to be rejected with obj, actually " + arg);
|
||||
}
|
||||
}).then($DONE, $DONE);
|
|
@ -0,0 +1,16 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise is the Promise property of the global object
|
||||
author: Sam Mikes
|
||||
description: Promise === global.Promise
|
||||
includes: [fnGlobalObject.js]
|
||||
---*/
|
||||
|
||||
var global = fnGlobalObject();
|
||||
|
||||
if (Promise !== global.Promise) {
|
||||
$ERROR("Expected Promise === global.Promise.");
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise throws TypeError when 'this' is not Object
|
||||
author: Sam Mikes
|
||||
description: Promise.call("non-object") throws TypeError
|
||||
negative: TypeError
|
||||
---*/
|
||||
|
||||
Promise.call("non-object", function () {});
|
|
@ -0,0 +1,14 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise throws TypeError when 'this' is constructed but unsettled promise
|
||||
author: Sam Mikes
|
||||
description: Promise.call(new Promise()) throws TypeError
|
||||
negative: TypeError
|
||||
---*/
|
||||
|
||||
var p = new Promise(function() {});
|
||||
|
||||
Promise.call(p, function () {});
|
|
@ -0,0 +1,21 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise throws TypeError when 'this' is resolved promise
|
||||
author: Sam Mikes
|
||||
description: Promise.call(resolved Promise) throws TypeError
|
||||
---*/
|
||||
|
||||
var p = new Promise(function(resolve) { resolve(1); });
|
||||
|
||||
p.then(function () {
|
||||
Promise.call(p, function () {});
|
||||
}).then(function () {
|
||||
$ERROR("Unexpected resolution - expected TypeError");
|
||||
}, function (err) {
|
||||
if (!(err instanceof TypeError)) {
|
||||
$ERROR("Expected TypeError, got " + err);
|
||||
}
|
||||
}).then($DONE, $DONE);
|
|
@ -0,0 +1,21 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise throws TypeError when 'this' is rejected promise
|
||||
author: Sam Mikes
|
||||
description: Promise.call(rejected Promise) throws TypeError
|
||||
---*/
|
||||
|
||||
var p = new Promise(function(resolve, reject) { reject(1) });
|
||||
|
||||
p.catch(function () {
|
||||
Promise.call(p, function () {});
|
||||
}).then(function () {
|
||||
$ERROR("Unexpected resolution - expected TypeError");
|
||||
}, function (err) {
|
||||
if (!(err instanceof TypeError)) {
|
||||
$ERROR("Expected TypeError, got " + err);
|
||||
}
|
||||
}).then($DONE, $DONE);
|
|
@ -0,0 +1,12 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise throws TypeError when executor is not callable
|
||||
author: Sam Mikes
|
||||
description: new Promise("not callable") throws TypeError
|
||||
negative: TypeError
|
||||
---*/
|
||||
|
||||
new Promise("not callable");
|
|
@ -0,0 +1,24 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise catches exceptions thrown from executor and turns
|
||||
them into reject
|
||||
author: Sam Mikes
|
||||
description: new Promise(function () { throw }) should reject
|
||||
---*/
|
||||
|
||||
var errorObject = {},
|
||||
p = new Promise(function () {
|
||||
throw errorObject;
|
||||
});
|
||||
|
||||
p.then(function() {
|
||||
$ERROR("Unexpected fulfill -- promise should reject.");
|
||||
}, function (err) {
|
||||
if (err !== errorObject) {
|
||||
$ERROR("Expected promise rejection reason to be thrown errorObject, actually " + err);
|
||||
}
|
||||
}).then($DONE, $DONE);
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise executor has predictable environment
|
||||
'this' should be global object in sloppy mode,
|
||||
undefined in strict mode
|
||||
author: Sam Mikes
|
||||
description: Promise executor gets default handling for 'this'
|
||||
---*/
|
||||
|
||||
var expectedThis;
|
||||
|
||||
(function () { expectedThis = this; }());
|
||||
|
||||
var p = new Promise(function (resolve) {
|
||||
if (this !== expectedThis) {
|
||||
$ERROR("'this' must be same as for function called without explicit this, got " + this);
|
||||
}
|
||||
|
||||
resolve();
|
||||
}).then($DONE, $DONE);
|
|
@ -1,17 +1,13 @@
|
|||
// Copyright 2014 Ecma International. All rights reserved.
|
||||
// Ecma International makes this code available under the terms and conditions set
|
||||
// forth on http://hg.ecmascript.org/tests/test262/raw-file/tip/LICENSE (the
|
||||
// "Use Terms"). Any redistribution of this code must retain the above
|
||||
// copyright and this notice and otherwise comply with the Use Terms.
|
||||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: Promise.all is callable
|
||||
es5id: 25.4.4.1_A1.1_T1
|
||||
author: Sam Mikes
|
||||
description: Promise.all is callable
|
||||
---*/
|
||||
|
||||
// CHECK#1
|
||||
var x = typeof Promise.all;
|
||||
if (x !== "function") {
|
||||
$ERROR('#1: x = typeof Promise.all; x === "function". Actual: ' + (x));
|
||||
if ((typeof Promise.all) !== "function") {
|
||||
$ERROR('Expected Promise.all to be a function');
|
||||
}
|
||||
|
|
|
@ -1,17 +1,14 @@
|
|||
// Copyright 2012 Ecma International. All rights reserved.
|
||||
// Ecma International makes this code available under the terms and conditions set
|
||||
// forth on http://hg.ecmascript.org/tests/test262/raw-file/tip/LICENSE (the
|
||||
// "Use Terms"). Any redistribution of this code must retain the above
|
||||
// copyright and this notice and otherwise comply with the Use Terms.
|
||||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: Promise.all expects 1 argument
|
||||
es5id: 25.4.4.1_A1.2_T1
|
||||
author: Sam Mikes
|
||||
description: Promise.all expects 1 argument
|
||||
---*/
|
||||
|
||||
// CHECK#1
|
||||
var x = Promise.all.length;
|
||||
if (x !== 1) {
|
||||
$ERROR('#1: x = Promise.all.length; x === 1. Actual: ' + (x));
|
||||
if (Promise.all.length !== 1) {
|
||||
$ERROR('Expected Promise.all to be a function of one argument.');
|
||||
}
|
||||
|
|
|
@ -1,17 +1,14 @@
|
|||
// Copyright 2014 Ecma International. All rights reserved.
|
||||
// Ecma International makes this code available under the terms and conditions set
|
||||
// forth on http://hg.ecmascript.org/tests/test262/raw-file/tip/LICENSE (the
|
||||
// "Use Terms"). Any redistribution of this code must retain the above
|
||||
// copyright and this notice and otherwise comply with the Use Terms.
|
||||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: Promise.all([]) is a Promise
|
||||
es5id: 25.4.4.1_A2.1_T1
|
||||
author: Sam Mikes
|
||||
description: Promise.all returns a Promise
|
||||
---*/
|
||||
|
||||
// CHECK#1
|
||||
var x = (Promise.all([]) instanceof Promise);
|
||||
if (x !== true) {
|
||||
$ERROR('#1: x (Promise.all([]) instanceof Promise); x === true. Actual: ' + (x));
|
||||
var p = Promise.all([]);
|
||||
if (!(p instanceof Promise)) {
|
||||
$ERROR('Expected p to be a Promise');
|
||||
}
|
||||
|
|
|
@ -1,25 +1,25 @@
|
|||
// Copyright 2014 Ecma International. All rights reserved.
|
||||
// Ecma International makes this code available under the terms and conditions set
|
||||
// forth on http://hg.ecmascript.org/tests/test262/raw-file/tip/LICENSE (the
|
||||
// "Use Terms"). Any redistribution of this code must retain the above
|
||||
// copyright and this notice and otherwise comply with the Use Terms.
|
||||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: Promise.all([]) is resolved immediately
|
||||
es5id: 25.4.4.1_A2.2_T1
|
||||
author: Sam Mikes
|
||||
includes: [PromiseHelper.js]
|
||||
description: Promise.all([]) returns immediately
|
||||
---*/
|
||||
|
||||
var sequence = [];
|
||||
|
||||
Promise.all([]).then(function () {
|
||||
sequence.push(1);
|
||||
sequence.push(2);
|
||||
}).catch($DONE);
|
||||
|
||||
Promise.resolve().then(function() {
|
||||
sequence.push(2);
|
||||
}).then(function () {
|
||||
sequence.push(3);
|
||||
}).then(function () {
|
||||
sequence.push(4);
|
||||
checkSequence(sequence, "Promises resolved in unexpected sequence");
|
||||
}).then($DONE,$DONE);
|
||||
}).then($DONE, $DONE);
|
||||
|
||||
sequence.push(1);
|
||||
|
|
|
@ -1,19 +1,17 @@
|
|||
// Copyright 2014 Ecma International. All rights reserved.
|
||||
// Ecma International makes this code available under the terms and conditions set
|
||||
// forth on http://hg.ecmascript.org/tests/test262/raw-file/tip/LICENSE (the
|
||||
// "Use Terms"). Any redistribution of this code must retain the above
|
||||
// copyright and this notice and otherwise comply with the Use Terms.
|
||||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: Promise.all is resolved with a new empty array
|
||||
info: Promise.all([]) returns a promise for a new empty array
|
||||
es5id: 25.4.4.1_A2.3_T1
|
||||
author: Sam Mikes
|
||||
description: Promise.all([]) returns a promise for an array
|
||||
---*/
|
||||
|
||||
var arg = [];
|
||||
|
||||
Promise.all(arg).then(function (result) {
|
||||
if((result instanceof Array) !== true) {
|
||||
if(!(result instanceof Array)) {
|
||||
$ERROR("expected an array from Promise.all, got " + result);
|
||||
}
|
||||
}).then($DONE,$DONE);
|
||||
}).then($DONE, $DONE);
|
||||
|
|
|
@ -1,13 +1,11 @@
|
|||
// Copyright 2014 Ecma International. All rights reserved.
|
||||
// Ecma International makes this code available under the terms and conditions set
|
||||
// forth on http://hg.ecmascript.org/tests/test262/raw-file/tip/LICENSE (the
|
||||
// "Use Terms"). Any redistribution of this code must retain the above
|
||||
// copyright and this notice and otherwise comply with the Use Terms.
|
||||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: Promise.all is resolved with a new empty array
|
||||
es5id: 25.4.4.1_A2.3_T2
|
||||
author: Sam Mikes
|
||||
description: Promise.all([]) returns a Promise for an empty array
|
||||
---*/
|
||||
|
||||
var arg = [];
|
||||
|
@ -16,4 +14,4 @@ Promise.all(arg).then(function (result) {
|
|||
if(result.length !== 0) {
|
||||
$ERROR("expected an empty array from Promise.all([]), got " + result);
|
||||
}
|
||||
}).then($DONE,$DONE);
|
||||
}).then($DONE, $DONE);
|
||||
|
|
|
@ -1,13 +1,11 @@
|
|||
// Copyright 2014 Ecma International. All rights reserved.
|
||||
// Ecma International makes this code available under the terms and conditions set
|
||||
// forth on http://hg.ecmascript.org/tests/test262/raw-file/tip/LICENSE (the
|
||||
// "Use Terms"). Any redistribution of this code must retain the above
|
||||
// copyright and this notice and otherwise comply with the Use Terms.
|
||||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: Promise.all is resolved with a new empty array
|
||||
info: Promise.all([]) is resolved with Promise for a new empty array
|
||||
es5id: 25.4.4.1_A2.3_T3
|
||||
author: Sam Mikes
|
||||
description: Promise.all([]) is resolved with a Promise for a new array
|
||||
---*/
|
||||
|
||||
var arg = [];
|
||||
|
@ -16,4 +14,4 @@ Promise.all(arg).then(function (result) {
|
|||
if(result === arg) {
|
||||
$ERROR("expected a new array from Promise.all but argument was re-used");
|
||||
}
|
||||
}).then($DONE,$DONE);
|
||||
}).then($DONE, $DONE);
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
// Copyright 2014 Ecma International. All rights reserved.
|
||||
// Ecma International makes this code available under the terms and conditions set
|
||||
// forth on http://hg.ecmascript.org/tests/test262/raw-file/tip/LICENSE (the
|
||||
// "Use Terms"). Any redistribution of this code must retain the above
|
||||
// copyright and this notice and otherwise comply with the Use Terms.
|
||||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
|
@ -11,6 +8,7 @@ info: >
|
|||
ref 7.4.2 GetIterator throws TypeError if CheckIterable fails
|
||||
es5id: 25.4.4.1_A3.1_T1
|
||||
author: Sam Mikes
|
||||
description: Promise.all(3) returns Promise rejected with TypeError
|
||||
---*/
|
||||
|
||||
var nonIterable = 3;
|
||||
|
@ -21,4 +19,4 @@ Promise.all(nonIterable).then(function () {
|
|||
if (!(err instanceof TypeError)) {
|
||||
$ERROR('Expected TypeError, got ' + err);
|
||||
}
|
||||
}).then($DONE,$DONE);
|
||||
}).then($DONE, $DONE);
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise.all expects an iterable argument;
|
||||
fails if recieves an abrupt completion
|
||||
ref 7.4.1 non-Object fails CheckIterable
|
||||
ref 7.4.2 GetIterator throws TypeError if CheckIterable fails
|
||||
author: Sam Mikes
|
||||
description: Promise.all(new Error()) returns Promise rejected with TypeError
|
||||
---*/
|
||||
|
||||
Promise.all(new Error("abrupt")).then(function () {
|
||||
$ERROR('Promise unexpectedly resolved: Promise.all(abruptCompletion) should throw TypeError');
|
||||
},function (err) {
|
||||
if (!(err instanceof TypeError)) {
|
||||
$ERROR('Expected TypeError, got ' + err);
|
||||
}
|
||||
}).then($DONE,$DONE);
|
|
@ -0,0 +1,25 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise.all expects an iterable argument;
|
||||
fails if GetIterator returns an abrupt completion.
|
||||
author: Sam Mikes
|
||||
description: Promise.all((throw on GetIterator)) returns Promise rejected with TypeError
|
||||
---*/
|
||||
|
||||
var iterThrows = {};
|
||||
Object.defineProperty(iterThrows, Symbol.iterator, {
|
||||
get: function () {
|
||||
throw new Error("abrupt completion");
|
||||
}
|
||||
});
|
||||
|
||||
Promise.all(iterThrows).then(function () {
|
||||
$ERROR('Promise unexpectedly fulfilled: Promise.all(iterThrows) should throw TypeError');
|
||||
},function (err) {
|
||||
if (!(err instanceof Error)) {
|
||||
$ERROR('Expected promise to be rejected with error, got ' + err);
|
||||
}
|
||||
}).then($DONE,$DONE);
|
|
@ -0,0 +1,15 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise.all should throw if 'this' does not conform to Promise constructor
|
||||
negative: TypeError
|
||||
description: this must conform to Promise constructor in Promise.all
|
||||
author: Sam Mikes
|
||||
---*/
|
||||
|
||||
function ZeroArgConstructor() {
|
||||
}
|
||||
|
||||
Promise.all.call(ZeroArgConstructor, []);
|
|
@ -0,0 +1,29 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise.all expects an iterable argument;
|
||||
rejects if IteratorStep() throws
|
||||
author: Sam Mikes
|
||||
description: iterator.next throws, causing Promise.all to reject
|
||||
---*/
|
||||
|
||||
var iterThrows = {};
|
||||
Object.defineProperty(iterThrows, Symbol.iterator, {
|
||||
get: function () {
|
||||
return {
|
||||
next: function () {
|
||||
throw new Error("abrupt completion");
|
||||
}
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
Promise.all(iterThrows).then(function () {
|
||||
$ERROR('Promise unexpectedly resolved: Promise.all(iterThrows) should throw TypeError');
|
||||
},function (err) {
|
||||
if (!(err instanceof TypeError)) {
|
||||
$ERROR('Expected TypeError, got ' + err);
|
||||
}
|
||||
}).then($DONE,$DONE);
|
|
@ -0,0 +1,15 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise.all with 0-element array
|
||||
author: Sam Mikes
|
||||
description: Promise.all([]) produces a promise
|
||||
---*/
|
||||
|
||||
var p = Promise.all([]);
|
||||
|
||||
if (!(p instanceof Promise)) {
|
||||
$ERROR('Expected Promise.all([]) to be instanceof Promise' + err);
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise.all with 0-element array
|
||||
should accept an empty array
|
||||
author: Sam Mikes
|
||||
description: Promise.all([]) returns a promise for an empty array
|
||||
---*/
|
||||
|
||||
var p = Promise.all([]);
|
||||
|
||||
p.then(function (result) {
|
||||
if (!(result instanceof Array)) {
|
||||
$ERROR("Expected Promise.all([]) to be Array, actually " + result);
|
||||
}
|
||||
if (result.length !== 0) {
|
||||
$ERROR("Expected Promise.all([]) to be empty Array, actually " + result);
|
||||
}
|
||||
}).then($DONE, $DONE);
|
|
@ -0,0 +1,29 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise.all with 1-element array
|
||||
should accept an array with settled promise
|
||||
author: Sam Mikes
|
||||
description: Promise.all([p1]) is resolved with a promise for a one-element array
|
||||
---*/
|
||||
|
||||
var p1 = Promise.resolve(3);
|
||||
|
||||
var pAll = Promise.all([p1]);
|
||||
|
||||
pAll.then(function (result) {
|
||||
if (!(pAll instanceof Promise)) {
|
||||
$ERROR("Expected Promise.all() to be promise, actually " + pAll);
|
||||
}
|
||||
if (!(result instanceof Array)) {
|
||||
$ERROR("Expected Promise.all() to be promise for an Array, actually " + result);
|
||||
}
|
||||
if (result.length !== 1) {
|
||||
$ERROR("Expected Promise.all([p1]) to be a promise for one-element Array, actually " + result);
|
||||
}
|
||||
if (result[0] !== 3) {
|
||||
$ERROR("Expected result[0] to be 3, actually " + result[0]);
|
||||
}
|
||||
}).then($DONE, $DONE);
|
|
@ -0,0 +1,32 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise.all with 1-element array
|
||||
should accept an array with settled promise
|
||||
author: Sam Mikes
|
||||
description: Promise.all() accepts a one-element array
|
||||
includes: [PromiseHelper.js]
|
||||
---*/
|
||||
|
||||
var sequence = [];
|
||||
|
||||
var p1 = new Promise(function (resolve) { resolve({}); } );
|
||||
|
||||
sequence.push(1);
|
||||
|
||||
Promise.all([p1]).then(function (resolved) {
|
||||
sequence.push(4);
|
||||
checkSequence(sequence, "Expected Promise.all().then to queue second");
|
||||
}).catch($DONE);
|
||||
|
||||
p1.then(function () {
|
||||
sequence.push(3);
|
||||
checkSequence(sequence, "Expected p1.then to queue first");
|
||||
}).then(function () {
|
||||
sequence.push(5);
|
||||
checkSequence(sequence, "Expected final then to queue last");
|
||||
}).then($DONE, $DONE);
|
||||
|
||||
sequence.push(2);
|
|
@ -0,0 +1,32 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
author: Sam Mikes
|
||||
description: Promise.all([p1, p2]) resolution functions are called in predictable sequence
|
||||
includes: [PromiseHelper.js]
|
||||
---*/
|
||||
|
||||
var sequence = [];
|
||||
|
||||
var p1 = new Promise(function (resolve) { resolve(1); } );
|
||||
var p2 = new Promise(function (resolve) { resolve(2); } );
|
||||
|
||||
sequence.push(1);
|
||||
|
||||
p1.then(function () {
|
||||
sequence.push(3);
|
||||
checkSequence(sequence, "Expected to be called first.");
|
||||
}).catch($DONE);
|
||||
|
||||
Promise.all([p1, p2]).then(function () {
|
||||
sequence.push(5);
|
||||
checkSequence(sequence, "Expected to be called third.");
|
||||
}).then($DONE, $DONE);
|
||||
|
||||
p2.then(function () {
|
||||
sequence.push(4);
|
||||
checkSequence(sequence, "Expected to be called second.");
|
||||
}).catch($DONE);
|
||||
|
||||
sequence.push(2);
|
|
@ -0,0 +1,26 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise.all with 2-element array
|
||||
author: Sam Mikes
|
||||
description: Promise.all() rejects when a promise in its array rejects
|
||||
includes: [PromiseHelper.js]
|
||||
---*/
|
||||
|
||||
var rejectP1,
|
||||
p1 = new Promise(function (resolve, reject) {
|
||||
rejectP1 = reject;
|
||||
}),
|
||||
p2 = Promise.resolve(2);
|
||||
|
||||
Promise.all([p1, p2]).then(function (resolve) {
|
||||
$ERROR("Did not expect promise to be fulfilled.");
|
||||
}, function (rejected) {
|
||||
if (rejected !== 1) {
|
||||
$ERROR("Expected promise to be rejected with 1, actually " + rejected);
|
||||
}
|
||||
}).then($DONE, $DONE);
|
||||
|
||||
rejectP1(1);
|
|
@ -0,0 +1,26 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise.all with 2-element array
|
||||
author: Sam Mikes
|
||||
description: Promise.all() rejects when second promise in array rejects
|
||||
includes: [PromiseHelper.js]
|
||||
---*/
|
||||
|
||||
var rejectP2,
|
||||
p1 = Promise.resolve(1),
|
||||
p2 = new Promise(function (resolve, reject) {
|
||||
rejectP2 = reject;
|
||||
});
|
||||
|
||||
Promise.all([p1, p2]).then(function () {
|
||||
$ERROR("Did not expect promise to be fulfilled.");
|
||||
}, function (rejected) {
|
||||
if (rejected !== 2) {
|
||||
$ERROR("Expected promise to be rejected with 2, actually " + rejected);
|
||||
}
|
||||
}).then($DONE, $DONE);
|
||||
|
||||
rejectP2(2);
|
|
@ -0,0 +1,19 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise prototype object exists, is object, not enumerable, writable,
|
||||
or configurable
|
||||
author: Sam Mikes
|
||||
description: Promise prototype exists
|
||||
---*/
|
||||
|
||||
if (Promise.prototype === undefined) {
|
||||
$ERROR("Expected Promise.prototype to be defined.");
|
||||
}
|
||||
|
||||
if (!(Promise.prototype instanceof Object)) {
|
||||
$ERROR("Expected Promise.prototype to be an object.");
|
||||
}
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: Promise.race is callable
|
||||
author: Sam Mikes
|
||||
description: Promise.race is callable
|
||||
---*/
|
||||
|
||||
if (typeof Promise.race !== "function") {
|
||||
$ERROR("Expected Promise.race to be a function, actually " + typeof Promise.race);
|
||||
}
|
||||
|
||||
if (Promise.race.length !== 1) {
|
||||
$ERROR("Expected Promise.race to be a function of 1 argument.");
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: Promise.race returns a new promise
|
||||
author: Sam Mikes
|
||||
description: Promise.race returns a new promise
|
||||
---*/
|
||||
|
||||
var p = Promise.race([]);
|
||||
|
||||
if (!(p instanceof Promise)) {
|
||||
$ERROR("Expected Promise.race([]) to return a promise.");
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: Promise.race rejects on non-iterable argument
|
||||
author: Sam Mikes
|
||||
description: Promise.race rejects if argument is not object or is non-iterable
|
||||
---*/
|
||||
|
||||
var nonIterable = 3;
|
||||
|
||||
Promise.race(nonIterable).then(function () {
|
||||
$ERROR('Promise unexpectedly fulfilled: Promise.race(nonIterable) should throw TypeError');
|
||||
}, function (err) {
|
||||
if (!(err instanceof TypeError)) {
|
||||
$ERROR('Expected TypeError, got ' + err);
|
||||
}
|
||||
}).then($DONE, $DONE);
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: Promise.race rejects on non-iterable argument
|
||||
author: Sam Mikes
|
||||
description: Promise.race rejects if argument is not object or is non-iterable
|
||||
---*/
|
||||
|
||||
Promise.race(new Error("abrupt")).then(function () {
|
||||
$ERROR('Promise unexpectedly resolved: Promise.race(abruptCompletion) should throw TypeError');
|
||||
}, function (err) {
|
||||
if (!(err instanceof TypeError)) {
|
||||
$ERROR('Expected TypeError, got ' + err);
|
||||
}
|
||||
}).then($DONE, $DONE);
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise.race rejects when GetIterator() returns an abrupt completion
|
||||
4. Let iterator be GetIterator(iterable).
|
||||
5. IfAbruptRejectPromise(iterator, promiseCapability)
|
||||
|
||||
author: Sam Mikes
|
||||
description: Promise.race rejects if GetIterator throws
|
||||
---*/
|
||||
|
||||
var iterThrows = {};
|
||||
Object.defineProperty(iterThrows, Symbol.iterator, {
|
||||
get: function () {
|
||||
throw new Error("abrupt completion");
|
||||
}
|
||||
});
|
||||
|
||||
Promise.race(iterThrows).then(function () {
|
||||
$ERROR('Promise unexpectedly fulfilled: Promise.race(iterThrows) should throw');
|
||||
}, function (err) {
|
||||
if (!(err instanceof Error)) {
|
||||
$ERROR('Expected Promise to be rejected with an error, got ' + err);
|
||||
}
|
||||
}).then($DONE, $DONE);
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise.race throws on invalid 'this'
|
||||
Note: must have at least one element in array, or else Promise.race
|
||||
never exercises the code that throws
|
||||
author: Sam Mikes
|
||||
description: Promise.race throws if 'this' does not conform to Promise constructor
|
||||
negative: TypeError
|
||||
---*/
|
||||
|
||||
function ZeroArgConstructor() {
|
||||
}
|
||||
|
||||
Promise.race.call(ZeroArgConstructor, [3]);
|
|
@ -0,0 +1,16 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise.race must throw TypeError per
|
||||
CreatePromiseCapabilityRecord step 8 when
|
||||
promiseCapabliity.[[Resolve]] is not callable
|
||||
author: Sam Mikes
|
||||
description: Promise.race throws TypeError, even on empty array, when 'this' does not conform to Promise constructor
|
||||
negative: TypeError
|
||||
---*/
|
||||
|
||||
function BadPromiseConstructor(f) { f(undefined, undefined); }
|
||||
|
||||
Promise.race.call(BadPromiseConstructor, []);
|
|
@ -0,0 +1,27 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
author: Sam Mikes
|
||||
description: Promise.race rejects if IteratorStep throws
|
||||
---*/
|
||||
|
||||
var iterThrows = {};
|
||||
Object.defineProperty(iterThrows, Symbol.iterator, {
|
||||
get: function () {
|
||||
return {
|
||||
next: function () {
|
||||
throw new Error("abrupt completion");
|
||||
}
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
Promise.race(iterThrows).then(function () {
|
||||
$ERROR('Promise unexpectedly fulfilled: Promise.race(iterThrows) should throw TypeError');
|
||||
},function (err) {
|
||||
if (!(err instanceof TypeError)) {
|
||||
$ERROR('Expected TypeError, got ' + err);
|
||||
}
|
||||
}).then($DONE,$DONE);
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
author: Sam Mikes
|
||||
description: Promise.race rejects if IteratorStep throws
|
||||
---*/
|
||||
|
||||
var iterThrows = {};
|
||||
Object.defineProperty(iterThrows, Symbol.iterator, {
|
||||
get: function () {
|
||||
return {
|
||||
next: function () {
|
||||
var v = {};
|
||||
Object.defineProperty(v, 'value', {
|
||||
get: function () {
|
||||
throw new Error("abrupt completion");
|
||||
}
|
||||
});
|
||||
return v;
|
||||
}
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
Promise.race(iterThrows).then(function () {
|
||||
$ERROR('Promise unexpectedly fulfilled: Promise.race(iterThrows) should throw TypeError');
|
||||
},function (err) {
|
||||
if (!(err instanceof TypeError)) {
|
||||
$ERROR('Expected TypeError, got ' + err);
|
||||
}
|
||||
}).then($DONE,$DONE);
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
author: Sam Mikes
|
||||
description: Promise.race([]) never settles
|
||||
---*/
|
||||
|
||||
var p = Promise.race([]);
|
||||
|
||||
p.then(function () {
|
||||
$ERROR("Never settles.");
|
||||
}, function () {
|
||||
$ERROR("Never settles.");
|
||||
}).then($DONE, $DONE);
|
||||
|
||||
// use three 'then's to allow above to settle
|
||||
// if this is a buggy Promise.race implementation
|
||||
Promise.resolve().then().then().then($DONE, $DONE);
|
|
@ -0,0 +1,29 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
author: Sam Mikes
|
||||
description: Promise.race([1]) settles immediately
|
||||
includes: [PromiseHelper.js]
|
||||
---*/
|
||||
|
||||
var sequence = [];
|
||||
|
||||
var p = Promise.race([1]);
|
||||
|
||||
sequence.push(1);
|
||||
|
||||
p.then(function () {
|
||||
sequence.push(4);
|
||||
checkSequence(sequence, "This happens second");
|
||||
}).catch($DONE);
|
||||
|
||||
Promise.resolve().then(function () {
|
||||
sequence.push(3);
|
||||
checkSequence(sequence, "This happens first");
|
||||
}).then(function () {
|
||||
sequence.push(5);
|
||||
checkSequence(sequence, "This happens third");
|
||||
}).then($DONE, $DONE);
|
||||
|
||||
sequence.push(2);
|
|
@ -0,0 +1,32 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
author: Sam Mikes
|
||||
description: Promise.race([p1]) settles immediately
|
||||
includes: [PromiseHelper.js]
|
||||
---*/
|
||||
|
||||
var sequence = [];
|
||||
|
||||
var p1 = Promise.reject(1),
|
||||
p = Promise.race([p1]);
|
||||
|
||||
sequence.push(1);
|
||||
|
||||
p.then(function () {
|
||||
$ERROR("Should not fulfill.");
|
||||
}, function () {
|
||||
sequence.push(4);
|
||||
checkSequence(sequence, "This happens second");
|
||||
}).catch($DONE);
|
||||
|
||||
Promise.resolve().then(function () {
|
||||
sequence.push(3);
|
||||
checkSequence(sequence, "This happens first");
|
||||
}).then(function () {
|
||||
sequence.push(5);
|
||||
checkSequence(sequence, "This happens third");
|
||||
}).then($DONE, $DONE);
|
||||
|
||||
sequence.push(2);
|
|
@ -0,0 +1,35 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
author: Sam Mikes
|
||||
description: Promise.race([p1, p2]) settles when first settles
|
||||
includes: [PromiseHelper.js]
|
||||
---*/
|
||||
|
||||
var sequence = [];
|
||||
|
||||
var p1 = Promise.resolve(1),
|
||||
p2 = Promise.resolve(2),
|
||||
p = Promise.race([p1, p2]);
|
||||
|
||||
sequence.push(1);
|
||||
|
||||
p.then(function (arg) {
|
||||
if (arg !== 1) {
|
||||
$ERROR("Expected promise to be fulfilled with 1, got " + arg);
|
||||
}
|
||||
|
||||
sequence.push(4);
|
||||
checkSequence(sequence, "This happens second");
|
||||
}).catch($DONE);
|
||||
|
||||
Promise.resolve().then(function () {
|
||||
sequence.push(3);
|
||||
checkSequence(sequence, "This happens first");
|
||||
}).then(function () {
|
||||
sequence.push(5);
|
||||
checkSequence(sequence, "This happens third");
|
||||
}).then($DONE, $DONE);
|
||||
|
||||
sequence.push(2);
|
|
@ -0,0 +1,35 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
author: Sam Mikes
|
||||
description: Promise.race([p1, p2]) settles when first settles
|
||||
includes: [PromiseHelper.js]
|
||||
---*/
|
||||
|
||||
var sequence = [];
|
||||
|
||||
var p1 = Promise.resolve(1),
|
||||
p2 = new Promise(function () {}),
|
||||
p = Promise.race([p1, p2]);
|
||||
|
||||
sequence.push(1);
|
||||
|
||||
p.then(function (arg) {
|
||||
if (arg !== 1) {
|
||||
$ERROR("Expected promise to be fulfilled with 1, got " + arg);
|
||||
}
|
||||
|
||||
sequence.push(4);
|
||||
checkSequence(sequence, "This happens second");
|
||||
}).catch($DONE);
|
||||
|
||||
Promise.resolve().then(function () {
|
||||
sequence.push(3);
|
||||
checkSequence(sequence, "This happens first");
|
||||
}).then(function () {
|
||||
sequence.push(5);
|
||||
checkSequence(sequence, "This happens third");
|
||||
}).then($DONE, $DONE);
|
||||
|
||||
sequence.push(2);
|
|
@ -0,0 +1,35 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
author: Sam Mikes
|
||||
description: Promise.race([p1, p2]) settles when first settles
|
||||
includes: [PromiseHelper.js]
|
||||
---*/
|
||||
|
||||
var sequence = [];
|
||||
|
||||
var p1 = new Promise(function () {}),
|
||||
p2 = Promise.resolve(2),
|
||||
p = Promise.race([p1, p2]);
|
||||
|
||||
sequence.push(1);
|
||||
|
||||
p.then(function (arg) {
|
||||
if (arg !== 2) {
|
||||
$ERROR("Expected promise to be fulfilled with 2, got " + arg);
|
||||
}
|
||||
|
||||
sequence.push(4);
|
||||
checkSequence(sequence, "This happens second");
|
||||
}).catch($DONE);
|
||||
|
||||
Promise.resolve().then(function () {
|
||||
sequence.push(3);
|
||||
checkSequence(sequence, "This happens first");
|
||||
}).then(function () {
|
||||
sequence.push(5);
|
||||
checkSequence(sequence, "This happens third");
|
||||
}).then($DONE, $DONE);
|
||||
|
||||
sequence.push(2);
|
|
@ -0,0 +1,37 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
author: Sam Mikes
|
||||
description: Promise.race([p1, p2]) settles when first settles
|
||||
includes: [PromiseHelper.js]
|
||||
---*/
|
||||
|
||||
var sequence = [];
|
||||
|
||||
var p1 = Promise.reject(1),
|
||||
p2 = Promise.resolve(2),
|
||||
p = Promise.race([p1, p2]);
|
||||
|
||||
sequence.push(1);
|
||||
|
||||
p.then(function () {
|
||||
$ERROR("Should not be fulfilled - expected rejection.");
|
||||
}, function (arg) {
|
||||
if (arg !== 1) {
|
||||
$ERROR("Expected rejection reason to be 1, got " + arg);
|
||||
}
|
||||
|
||||
sequence.push(4);
|
||||
checkSequence(sequence, "This happens second");
|
||||
}).catch($DONE);
|
||||
|
||||
Promise.resolve().then(function () {
|
||||
sequence.push(3);
|
||||
checkSequence(sequence, "This happens first");
|
||||
}).then(function () {
|
||||
sequence.push(5);
|
||||
checkSequence(sequence, "This happens third");
|
||||
}).then($DONE, $DONE);
|
||||
|
||||
sequence.push(2);
|
|
@ -0,0 +1,20 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
author: Sam Mikes
|
||||
description: Promise.race([p1, p2]) settles when first settles
|
||||
---*/
|
||||
|
||||
var resolveP1, rejectP2,
|
||||
p1 = new Promise(function (resolve) { resolveP1 = resolve; }),
|
||||
p2 = new Promise(function (resolve, reject) { rejectP2 = reject; });
|
||||
|
||||
rejectP2(new Error("Promise.race should not see this if P1 already resolved"));
|
||||
resolveP1(1);
|
||||
|
||||
Promise.race([p1, p2]).then(function (arg) {
|
||||
if (arg !== 1) {
|
||||
$ERROR("Expected fulfillment with 1, got " + arg);
|
||||
}
|
||||
}).then($DONE, $DONE);
|
|
@ -0,0 +1,23 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
author: Sam Mikes
|
||||
description: Promise.race([p1, p2]) settles when first settles
|
||||
---*/
|
||||
|
||||
var resolveP1, rejectP2,
|
||||
p1 = new Promise(function (resolve) { resolveP1 = resolve; }),
|
||||
p2 = new Promise(function (resolve, reject) { rejectP2 = reject; });
|
||||
|
||||
Promise.race([p1, p2]).then(function () {
|
||||
$ERROR("Should not be fulfilled: expected rejection.");
|
||||
}, function (arg) {
|
||||
if (arg !== 2) {
|
||||
$ERROR("Expected rejection reason to be 2, got " + arg);
|
||||
}
|
||||
}).then($DONE, $DONE);
|
||||
|
||||
rejectP2(2);
|
||||
resolveP1(1);
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise.reject
|
||||
author: Sam Mikes
|
||||
description: Promise.reject is a function
|
||||
---*/
|
||||
|
||||
if ((typeof Promise.reject) !== "function") {
|
||||
$ERROR("Expected Promise.reject to be a function");
|
||||
}
|
||||
|
||||
if (Promise.reject.length !== 1) {
|
||||
$ERROR("Expected Promise.reject to be a function of one argument");
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise.reject
|
||||
author: Sam Mikes
|
||||
description: Promise.reject creates a new settled promise
|
||||
---*/
|
||||
|
||||
var p = Promise.reject(3);
|
||||
|
||||
if (!(p instanceof Promise)) {
|
||||
$ERROR("Expected Promise.reject to return a promise.");
|
||||
}
|
||||
|
||||
p.then(function () {
|
||||
$ERROR("Promise should not be fulfilled.");
|
||||
}, function (arg) {
|
||||
if (arg !== 3) {
|
||||
$ERROR("Expected promise to be rejected with supplied arg, got " + arg);
|
||||
}
|
||||
}).then($DONE, $DONE);
|
|
@ -0,0 +1,15 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise.reject
|
||||
author: Sam Mikes
|
||||
description: Promise.reject throws TypeError for bad 'this'
|
||||
negative: TypeError
|
||||
---*/
|
||||
|
||||
function ZeroArgConstructor() {
|
||||
}
|
||||
|
||||
Promise.reject.call(ZeroArgConstructor, 4);
|
|
@ -0,0 +1,17 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise.resolve
|
||||
author: Sam Mikes
|
||||
description: Promise.resolve is a function
|
||||
---*/
|
||||
|
||||
if ((typeof Promise.resolve) !== "function") {
|
||||
$ERROR("Expected Promise.resolve to be a function");
|
||||
}
|
||||
|
||||
if (Promise.resolve.length !== 1) {
|
||||
$ERROR("Expected Promise.resolve to be a function of one argument");
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
author: Sam Mikes
|
||||
description: Promise.resolve passes through a promise w/ same Constructor
|
||||
---*/
|
||||
|
||||
var p1 = Promise.resolve(1),
|
||||
p2 = Promise.resolve(p1);
|
||||
|
||||
if (p1 !== p2) {
|
||||
$ERROR("Expected p1 === Promise.resolve(p1) because they have same constructor");
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
author: Sam Mikes
|
||||
description: Promise.resolve passes through an unsettled promise w/ same Constructor
|
||||
---*/
|
||||
|
||||
var resolveP1,
|
||||
p1 = new Promise(function (resolve) { resolveP1 = resolve; }),
|
||||
p2 = Promise.resolve(p1),
|
||||
obj = {};
|
||||
|
||||
if (p1 !== p2) {
|
||||
$ERROR("Expected p1 === Promise.resolve(p1) because they have same constructor");
|
||||
}
|
||||
|
||||
p2.then(function (arg) {
|
||||
if (arg !== obj) {
|
||||
$ERROR("Expected promise to be resolved with obj, actually " + arg);
|
||||
}
|
||||
}).then($DONE, $DONE);
|
||||
|
||||
resolveP1(obj);
|
|
@ -0,0 +1,26 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
author: Sam Mikes
|
||||
description: Promise.resolve passes through an unsettled promise w/ same Constructor
|
||||
---*/
|
||||
|
||||
var rejectP1,
|
||||
p1 = new Promise(function (resolve, reject) { rejectP1 = reject; }),
|
||||
p2 = Promise.resolve(p1),
|
||||
obj = {};
|
||||
|
||||
if (p1 !== p2) {
|
||||
$ERROR("Expected p1 === Promise.resolve(p1) because they have same constructor");
|
||||
}
|
||||
|
||||
p2.then(function () {
|
||||
$ERROR("Expected p2 to be rejected, not fulfilled.");
|
||||
}, function (arg) {
|
||||
if (arg !== obj) {
|
||||
$ERROR("Expected promise to be rejected with reason obj, actually " + arg);
|
||||
}
|
||||
}).then($DONE, $DONE);
|
||||
|
||||
rejectP1(obj);
|
|
@ -0,0 +1,32 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise.resolve
|
||||
author: Sam Mikes
|
||||
description: Promise.resolve delegates to foreign thenable
|
||||
includes: [PromiseHelper.js]
|
||||
---*/
|
||||
|
||||
var sequence = [];
|
||||
|
||||
var thenable = {
|
||||
then: function(onResolve, onReject) {
|
||||
sequence.push(3);
|
||||
checkSequence(sequence, "thenable.then called");
|
||||
|
||||
Promise.resolve().then(function () {
|
||||
sequence.push(4);
|
||||
checkSequence(sequence, "all done");
|
||||
}).then($DONE, $DONE);
|
||||
}
|
||||
};
|
||||
|
||||
sequence.push(1);
|
||||
checkSequence(sequence, "no async calls yet");
|
||||
|
||||
var p1 = Promise.resolve(thenable);
|
||||
|
||||
sequence.push(2);
|
||||
checkSequence(sequence, "thenable.then queued but not yet called");
|
|
@ -0,0 +1,22 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Section 25.4.1.4.2
|
||||
author: Sam Mikes
|
||||
description: self-resolved Promise throws TypeError
|
||||
---*/
|
||||
|
||||
var resolveP,
|
||||
p = new Promise(function (resolve) { resolveP = resolve; });
|
||||
|
||||
resolveP(p);
|
||||
|
||||
p.then(function () {
|
||||
$ERROR("Should not fulfill: should reject with TypeError.");
|
||||
}, function (err) {
|
||||
if (!(err instanceof TypeError)) {
|
||||
$ERROR("Expected TypeError, got " + err);
|
||||
}
|
||||
}).then($DONE, $DONE);
|
|
@ -0,0 +1,38 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Misc sequencing tests
|
||||
inspired by https://github.com/getify/native-promise-only/issues/34#issuecomment-54282002
|
||||
author: Sam Mikes
|
||||
description: Promise onResolved functions are called in predictable sequence
|
||||
includes: [PromiseHelper.js]
|
||||
---*/
|
||||
|
||||
var sequence = [];
|
||||
|
||||
var p = new Promise(function(resolve, reject){
|
||||
sequence.push(1);
|
||||
resolve("");
|
||||
});
|
||||
|
||||
p.then(function () {
|
||||
sequence.push(3);
|
||||
}).then(function () {
|
||||
sequence.push(5);
|
||||
}).then(function () {
|
||||
sequence.push(7);
|
||||
});
|
||||
|
||||
p.then(function () {
|
||||
sequence.push(4);
|
||||
}).then(function () {
|
||||
sequence.push(6);
|
||||
}).then(function () {
|
||||
sequence.push(8);
|
||||
}).then(function () {
|
||||
checkSequence(sequence, "Sequence should be as expected");
|
||||
}).then($DONE, $DONE);
|
||||
|
||||
sequence.push(2);
|
|
@ -0,0 +1,33 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Misc sequencing tests
|
||||
inspired by https://github.com/promises-aplus/promises-tests/issues/61
|
||||
Case "T1"
|
||||
author: Sam Mikes
|
||||
description: Promise onResolved functions are called in predictable sequence
|
||||
includes: [PromiseHelper.js]
|
||||
---*/
|
||||
|
||||
var resolveP1, rejectP2, sequence = [];
|
||||
|
||||
(new Promise(function (resolve, reject) {
|
||||
resolveP1 = resolve;
|
||||
})).then(function (msg) {
|
||||
sequence.push(msg);
|
||||
}).then(function () {
|
||||
checkSequence(sequence, "Expected 1,2,3");
|
||||
}).then($DONE, $DONE);
|
||||
|
||||
(new Promise(function (resolve, reject) {
|
||||
rejectP2 = reject;
|
||||
})).catch(function (msg) {
|
||||
sequence.push(msg);
|
||||
});
|
||||
|
||||
rejectP2(2);
|
||||
resolveP1(3);
|
||||
|
||||
sequence.push(1);
|
|
@ -0,0 +1,37 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Misc sequencing tests
|
||||
inspired by https://github.com/promises-aplus/promises-tests/issues/61
|
||||
Case "T2a"
|
||||
author: Sam Mikes
|
||||
description: Promise onResolved functions are called in predictable sequence
|
||||
includes: [PromiseHelper.js]
|
||||
---*/
|
||||
|
||||
var resolveP1, rejectP2, p1, p2,
|
||||
sequence = [];
|
||||
|
||||
p1 = new Promise(function (resolve, reject) {
|
||||
resolveP1 = resolve;
|
||||
});
|
||||
p2 = new Promise(function (resolve, reject) {
|
||||
rejectP2 = reject;
|
||||
});
|
||||
|
||||
rejectP2(3);
|
||||
resolveP1(2);
|
||||
|
||||
p1.then(function (msg) {
|
||||
sequence.push(msg);
|
||||
});
|
||||
|
||||
p2.catch(function (msg) {
|
||||
sequence.push(msg);
|
||||
}).then(function () {
|
||||
checkSequence(sequence, "Expected 1,2,3");
|
||||
}).then($DONE, $DONE);
|
||||
|
||||
sequence.push(1);
|
|
@ -0,0 +1,41 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Misc sequencing tests
|
||||
inspired by https://github.com/promises-aplus/promises-tests/issues/61
|
||||
Case "T2b"
|
||||
author: Sam Mikes
|
||||
description: Promise onResolved functions are called in predictable sequence
|
||||
includes: [PromiseHelper.js]
|
||||
---*/
|
||||
|
||||
var resolveP1, rejectP2, p1, p2,
|
||||
sequence = [];
|
||||
|
||||
p1 = new Promise(function (resolve, reject) {
|
||||
resolveP1 = resolve;
|
||||
});
|
||||
p2 = new Promise(function (resolve, reject) {
|
||||
rejectP2 = reject;
|
||||
});
|
||||
|
||||
rejectP2(3);
|
||||
resolveP1(2);
|
||||
|
||||
Promise.resolve().then(function () {
|
||||
p1.then(function (msg) {
|
||||
sequence.push(msg);
|
||||
});
|
||||
|
||||
p2.catch(function (msg) {
|
||||
sequence.push(msg);
|
||||
}).then(function () {
|
||||
checkSequence(sequence, "Expected 1,2,3");
|
||||
}).then($DONE, $DONE);
|
||||
});
|
||||
|
||||
sequence.push(1);
|
||||
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise prototype.catch is a function
|
||||
author: Sam Mikes
|
||||
description: Promise.prototype.catch is a function
|
||||
---*/
|
||||
|
||||
if (!(Promise.prototype.catch instanceof Function)) {
|
||||
$ERROR("Expected Promise.prototype.catch to be a function");
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
catch is a method on a Promise
|
||||
author: Sam Mikes
|
||||
description: catch is a method on a Promise
|
||||
---*/
|
||||
|
||||
var p = Promise.resolve(3);
|
||||
|
||||
if (!(p.catch instanceof Function)) {
|
||||
$ERROR("Expected p.catch to be a function");
|
||||
}
|
||||
|
||||
if (p.catch.length !== 1) {
|
||||
$ERROR("Expected p.catch to take one argument");
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
catch(arg) is equivalent to then(undefined, arg)
|
||||
author: Sam Mikes
|
||||
description: catch is implemented in terms of then
|
||||
---*/
|
||||
|
||||
var obj = {};
|
||||
|
||||
var p = Promise.resolve(obj);
|
||||
|
||||
p.catch(function () {
|
||||
$ERROR("Should not be called - promise is fulfilled");
|
||||
}).then(function (arg) {
|
||||
if (arg !== obj) {
|
||||
$ERROR("Expected promise to be fulfilled with obj, got " + arg);
|
||||
}
|
||||
}).then($DONE, $DONE);
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
catch(arg) is equivalent to then(undefined, arg)
|
||||
author: Sam Mikes
|
||||
description: catch is implemented in terms of then
|
||||
---*/
|
||||
|
||||
var obj = {};
|
||||
|
||||
var p = Promise.reject(obj);
|
||||
|
||||
p.then(function () {
|
||||
$ERROR("Should not be called: did not expect promise to be fulfilled");
|
||||
}).catch(function (arg) {
|
||||
if (arg !== obj) {
|
||||
$ERROR("Should have been rejected with reason obj, got " + arg);
|
||||
}
|
||||
}).then($DONE, $DONE);
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise.prototype.then is a function of two arguments
|
||||
author: Sam Mikes
|
||||
description: Promise.prototype.then is a function of two arguments
|
||||
---*/
|
||||
|
||||
if (!(Promise.prototype.then instanceof Function)) {
|
||||
$ERROR("Expected Promise.prototype.then to be a function");
|
||||
}
|
||||
|
||||
if (Promise.prototype.then.length !== 2) {
|
||||
$ERROR("Expected Promise.prototype.then to be a function of two arguments");
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise.prototype.then is a function of two arguments
|
||||
author: Sam Mikes
|
||||
description: Promise.prototype.then is a function of two arguments
|
||||
---*/
|
||||
|
||||
var p = new Promise(function () {});
|
||||
|
||||
if (!(p.then instanceof Function)) {
|
||||
$ERROR("Expected p.then to be a function");
|
||||
}
|
||||
|
||||
if (p.then.length !== 2) {
|
||||
$ERROR("Expected p.then to be a function of two arguments");
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise.prototype.then expects a constructor conforming to Promise as 'this'
|
||||
author: Sam Mikes
|
||||
description: Promise.prototype.then throw if 'this' is non-Object
|
||||
negative: TypeError
|
||||
---*/
|
||||
|
||||
var p = new Promise(function () {});
|
||||
|
||||
p.then.call(3, function () {}, function () {});
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise.prototype.then expects a Promise as 'this'
|
||||
author: Sam Mikes
|
||||
description: Promise.prototype.then throw if 'this' is non-Promise Object
|
||||
negative: TypeError
|
||||
---*/
|
||||
|
||||
function ZeroArgConstructor() {
|
||||
}
|
||||
|
||||
var z = new ZeroArgConstructor();
|
||||
|
||||
Promise.then.call(z, function () {}, function () {});
|
|
@ -0,0 +1,33 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise.prototype.then throws TypeError if Get(promise, "constructor") throws
|
||||
Ref 25.4.5.3 step 4 ReturnIfAbrupt(C)
|
||||
author: Sam Mikes
|
||||
description: Promise.prototype.then throws if Get(promise, "constructor") throws
|
||||
---*/
|
||||
|
||||
var p = Promise.resolve("foo");
|
||||
|
||||
Object.defineProperty(p, "constructor", {
|
||||
get: function () {
|
||||
throw new Error("abrupt completion");
|
||||
}
|
||||
});
|
||||
|
||||
try {
|
||||
p.then(function () {
|
||||
$ERROR("Should never be called.");
|
||||
}, function () {
|
||||
$ERROR("Should never be called.");
|
||||
});
|
||||
} catch (e) {
|
||||
if (!(e instanceof Error)) {
|
||||
$ERROR("Expected Error, got " + e);
|
||||
}
|
||||
if (e.message !== "abrupt completion") {
|
||||
$ERROR("Expected the Error we threw, got " + e);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
PerformPromiseThen
|
||||
Ref 25.4.5.3.1
|
||||
author: Sam Mikes
|
||||
description: Promise.prototype.then accepts 'undefined' as arg1, arg2
|
||||
---*/
|
||||
|
||||
var obj = {};
|
||||
var p = Promise.resolve(obj);
|
||||
|
||||
p.then(undefined, undefined)
|
||||
.then(function (arg) {
|
||||
if (arg !== obj) {
|
||||
$ERROR("Expected resolution object to be passed through, got " + arg);
|
||||
}
|
||||
}).then($DONE, $DONE);
|
|
@ -0,0 +1,21 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
PerformPromiseThen
|
||||
Ref 25.4.5.3.1
|
||||
author: Sam Mikes
|
||||
description: Promise.prototype.then accepts 'undefined' as arg1, arg2
|
||||
---*/
|
||||
|
||||
var obj = {};
|
||||
var p = Promise.reject(obj);
|
||||
|
||||
p.then(undefined, undefined).then(function () {
|
||||
$ERROR("Should not be called -- promise was rejected.");
|
||||
}, function (arg) {
|
||||
if (arg !== obj) {
|
||||
$ERROR("Expected resolution object to be passed through, got " + arg);
|
||||
}
|
||||
}).then($DONE, $DONE);
|
|
@ -0,0 +1,20 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
PerformPromiseThen
|
||||
Ref 25.4.5.3.1
|
||||
author: Sam Mikes
|
||||
description: Promise.prototype.then treats non-callable arg1, arg2 as undefined
|
||||
---*/
|
||||
|
||||
var obj = {};
|
||||
var p = Promise.resolve(obj);
|
||||
|
||||
p.then(3, 5)
|
||||
.then(function (arg) {
|
||||
if (arg !== obj) {
|
||||
$ERROR("Expected resolution object to be passed through, got " + arg);
|
||||
}
|
||||
}).then($DONE, $DONE);
|
|
@ -0,0 +1,21 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
PerformPromiseThen
|
||||
Ref 25.4.5.3.1
|
||||
author: Sam Mikes
|
||||
description: Promise.prototype.then treats non-callable arg1, arg2 as undefined
|
||||
---*/
|
||||
|
||||
var obj = {};
|
||||
var p = Promise.reject(obj);
|
||||
|
||||
p.then(3, 5).then(function () {
|
||||
$ERROR("Should not be called -- promise was rejected.");
|
||||
}, function (arg) {
|
||||
if (arg !== obj) {
|
||||
$ERROR("Expected resolution object to be passed through, got " + arg);
|
||||
}
|
||||
}).then($DONE, $DONE);
|
|
@ -0,0 +1,37 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
PerformPromiseThen
|
||||
Ref 25.4.5.3.1
|
||||
author: Sam Mikes
|
||||
description: Promise.prototype.then enqueues handler if pending
|
||||
includes: [PromiseHelper.js]
|
||||
---*/
|
||||
|
||||
var sequence = [],
|
||||
pResolve,
|
||||
p = new Promise(function (resolve, reject) {
|
||||
pResolve = resolve;
|
||||
});
|
||||
|
||||
sequence.push(1);
|
||||
|
||||
p.then(function () {
|
||||
sequence.push(3);
|
||||
checkSequence(sequence, "Should be second");
|
||||
}).catch($DONE);
|
||||
|
||||
Promise.resolve().then(function () {
|
||||
// enqueue another then-handler
|
||||
p.then(function () {
|
||||
sequence.push(4);
|
||||
checkSequence(sequence, "Should be third");
|
||||
}).then($DONE, $DONE);
|
||||
|
||||
sequence.push(2);
|
||||
checkSequence(sequence, "Should be first");
|
||||
|
||||
pResolve();
|
||||
}).catch($DONE);
|
|
@ -0,0 +1,39 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
PerformPromiseThen
|
||||
Ref 25.4.5.3.1
|
||||
author: Sam Mikes
|
||||
description: Promise.prototype.then immediately queues handler if fulfilled
|
||||
includes: [PromiseHelper.js]
|
||||
---*/
|
||||
|
||||
var sequence = [],
|
||||
pResolve,
|
||||
p = new Promise(function (resolve, reject) {
|
||||
pResolve = resolve;
|
||||
});
|
||||
|
||||
sequence.push(1);
|
||||
|
||||
pResolve();
|
||||
|
||||
p.then(function () {
|
||||
sequence.push(3);
|
||||
checkSequence(sequence, "Should be first");
|
||||
}).catch($DONE);
|
||||
|
||||
Promise.resolve().then(function () {
|
||||
// enqueue another then-handler
|
||||
p.then(function () {
|
||||
sequence.push(5);
|
||||
checkSequence(sequence, "Should be third");
|
||||
}).then($DONE, $DONE);
|
||||
|
||||
sequence.push(4);
|
||||
checkSequence(sequence, "Should be second");
|
||||
}).catch($DONE);
|
||||
|
||||
sequence.push(2);
|
|
@ -0,0 +1,43 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
PerformPromiseThen
|
||||
Ref 25.4.5.3.1
|
||||
author: Sam Mikes
|
||||
description: Promise.prototype.then immediately queues handler if rejected
|
||||
includes: [PromiseHelper.js]
|
||||
---*/
|
||||
|
||||
var sequence = [],
|
||||
pReject,
|
||||
p = new Promise(function (resolve, reject) {
|
||||
pReject = reject;
|
||||
});
|
||||
|
||||
sequence.push(1);
|
||||
|
||||
pReject();
|
||||
|
||||
p.then(function () {
|
||||
$ERROR("Should not be called -- Promise rejected.");
|
||||
}, function () {
|
||||
sequence.push(3);
|
||||
checkSequence(sequence, "Should be first");
|
||||
}).catch($DONE);
|
||||
|
||||
Promise.resolve().then(function () {
|
||||
// enqueue another then-handler
|
||||
p.then(function () {
|
||||
$ERROR("Should not be called (2) -- Promise rejected.");
|
||||
}, function () {
|
||||
sequence.push(5);
|
||||
checkSequence(sequence, "Should be third");
|
||||
}).then($DONE, $DONE);
|
||||
|
||||
sequence.push(4);
|
||||
checkSequence(sequence, "Should be second");
|
||||
}).catch($DONE);
|
||||
|
||||
sequence.push(2);
|
|
@ -0,0 +1,12 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise prototype object is an ordinary object
|
||||
author: Sam Mikes
|
||||
description: Promise prototype does not have [[PromiseState]] internal slot
|
||||
negative: TypeError
|
||||
---*/
|
||||
|
||||
Promise.call(Promise.prototype, function () {});
|
|
@ -0,0 +1,14 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise prototype object is an ordinary object
|
||||
author: Sam Mikes
|
||||
description: Promise prototype is a standard built-in Object
|
||||
---*/
|
||||
|
||||
if (!(Promise.prototype instanceof Object)) {
|
||||
$ERROR("Expected Promise.prototype to be an Object");
|
||||
}
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
// Copyright 2014 Cubane Canada, Inc. All rights reserved.
|
||||
// See LICENSE for details.
|
||||
|
||||
/*---
|
||||
info: >
|
||||
Promise.prototype.constructor is the Promise constructor
|
||||
author: Sam Mikes
|
||||
description: Promise.prototype.constructor is the Promise constructor
|
||||
---*/
|
||||
|
||||
if (Promise.prototype.constructor !== Promise) {
|
||||
$ERROR("Expected Promise.prototype.constructor to be Promise");
|
||||
}
|
||||
|
Loading…
Reference in New Issue