Index: test/mjsunit/es6/promises.js |
diff --git a/test/mjsunit/es6/promises.js b/test/mjsunit/es6/promises.js |
index 04059aa72095ece37b4f8f32c41321fd9c272924..63b6d2f94a9a7ec0799a7ef766845675dc8466fb 100644 |
--- a/test/mjsunit/es6/promises.js |
+++ b/test/mjsunit/es6/promises.js |
@@ -32,6 +32,8 @@ var call = Function.prototype.call.call.bind(Function.prototype.call) |
var observe = Object.observe; |
var getOwnPropertyNames = Object.getOwnPropertyNames; |
var defineProperty = Object.defineProperty; |
+var numberPrototype = Number.prototype; |
+var symbolIterator = Symbol.iterator; |
(function() { |
@@ -637,14 +639,6 @@ function assertAsyncDone(iteration) { |
})(); |
(function() { |
- Promise.all({}).chain( |
- assertUnreachable, |
- function(r) { assertAsync(r instanceof TypeError, "all/no-array") } |
- ) |
- assertAsyncRan() |
-})(); |
- |
-(function() { |
Promise.all([]).chain( |
function(x) { assertAsync(x.length === 0, "all/resolve/empty") }, |
assertUnreachable |
@@ -653,6 +647,45 @@ function assertAsyncDone(iteration) { |
})(); |
(function() { |
+ function testPromiseAllNonIterable(value) { |
+ Promise.all(value).chain( |
+ assertUnreachable, |
+ function(r) { |
+ assertAsync(r instanceof TypeError, 'all/non iterable'); |
+ }); |
+ assertAsyncRan(); |
+ } |
+ testPromiseAllNonIterable(null); |
+ testPromiseAllNonIterable(undefined); |
+ testPromiseAllNonIterable({}); |
+ testPromiseAllNonIterable(42); |
+})(); |
+ |
+(function() { |
+ var deferred = Promise.defer(); |
+ var p = deferred.promise; |
+ function* f() { |
+ yield 1; |
+ yield p; |
+ yield 3; |
+ } |
+ Promise.all(f()).chain( |
+ function(x) { |
+ assertAsync(x.length === 3, "all/resolve/iterable"); |
+ assertAsync(x[0] === 1, "all/resolve/iterable/0"); |
+ assertAsync(x[1] === 2, "all/resolve/iterable/1"); |
+ assertAsync(x[2] === 3, "all/resolve/iterable/2"); |
+ }, |
+ assertUnreachable); |
+ deferred.resolve(2); |
+ assertAsyncRan(); |
+ assertAsyncRan(); |
+ assertAsyncRan(); |
+ assertAsyncRan(); |
+})(); |
+ |
+ |
+(function() { |
var deferred1 = Promise.defer() |
var p1 = deferred1.promise |
var deferred2 = Promise.defer() |
@@ -706,6 +739,52 @@ function assertAsyncDone(iteration) { |
assertAsyncRan() |
})(); |
+ |
+(function() { |
+ 'use strict'; |
+ var getCalls = 0; |
+ var funcCalls = 0; |
+ var nextCalls = 0; |
+ defineProperty(numberPrototype, symbolIterator, { |
+ get: function() { |
+ assertEquals('number', typeof this); |
+ getCalls++; |
+ return function() { |
+ assertEquals('number', typeof this); |
+ funcCalls++; |
+ var n = this; |
+ var i = 0 |
+ return { |
+ next() { |
+ nextCalls++; |
+ return {value: i++, done: i > n}; |
+ } |
+ }; |
+ }; |
+ }, |
+ configurable: true |
+ }); |
+ |
+ Promise.all(3).chain( |
+ function(x) { |
+ assertAsync(x.length === 3, "all/iterable/number/length"); |
+ assertAsync(x[0] === 0, "all/iterable/number/0"); |
+ assertAsync(x[1] === 1, "all/iterable/number/1"); |
+ assertAsync(x[2] === 2, "all/iterable/number/2"); |
+ }, |
+ assertUnreachable); |
+ delete numberPrototype[symbolIterator]; |
+ |
+ assertEquals(getCalls, 1); |
+ assertEquals(funcCalls, 1); |
+ assertEquals(nextCalls, 3 + 1); // + 1 for {done: true} |
+ assertAsyncRan(); |
+ assertAsyncRan(); |
+ assertAsyncRan(); |
+ assertAsyncRan(); |
+})(); |
+ |
+ |
(function() { |
Promise.race([]).chain( |
assertUnreachable, |
@@ -736,14 +815,6 @@ function assertAsyncDone(iteration) { |
})(); |
(function() { |
- Promise.race({}).chain( |
- assertUnreachable, |
- function(r) { assertAsync(r instanceof TypeError, "one/no-array") } |
- ) |
- assertAsyncRan() |
-})(); |
- |
-(function() { |
var deferred1 = Promise.defer() |
var p1 = deferred1.promise |
var deferred2 = Promise.defer() |
@@ -804,6 +875,103 @@ function assertAsyncDone(iteration) { |
assertAsyncRan() |
})(); |
+ |
+(function() { |
+ function testPromiseRaceNonIterable(value) { |
+ Promise.race(value).chain( |
+ assertUnreachable, |
+ function(r) { |
+ assertAsync(r instanceof TypeError, 'race/non iterable'); |
+ }); |
+ assertAsyncRan(); |
+ } |
+ testPromiseRaceNonIterable(null); |
+ testPromiseRaceNonIterable(undefined); |
+ testPromiseRaceNonIterable({}); |
+ testPromiseRaceNonIterable(42); |
+})(); |
+ |
+ |
+(function() { |
+ var deferred1 = Promise.defer() |
+ var p1 = deferred1.promise |
+ var deferred2 = Promise.defer() |
+ var p2 = deferred2.promise |
+ var deferred3 = Promise.defer() |
+ var p3 = deferred3.promise |
+ function* f() { |
+ yield p1; |
+ yield p2; |
+ yield p3; |
+ } |
+ Promise.race(f()).chain( |
+ function(x) { assertAsync(x === 3, "race/iterable/resolve/reject") }, |
+ assertUnreachable |
+ ) |
+ deferred3.resolve(3) |
+ deferred1.reject(1) |
+ assertAsyncRan() |
+})(); |
+ |
+(function() { |
+ var deferred1 = Promise.defer() |
+ var p1 = deferred1.promise |
+ var deferred2 = Promise.defer() |
+ var p2 = deferred2.promise |
+ var deferred3 = Promise.defer() |
+ var p3 = deferred3.promise |
+ function* f() { |
+ yield p1; |
+ yield p2; |
+ yield p3; |
+ } |
+ Promise.race(f()).chain( |
+ assertUnreachable, |
+ function(x) { assertAsync(x === 3, "race/iterable/reject/resolve") } |
+ ) |
+ deferred3.reject(3) |
+ deferred1.resolve(1) |
+ assertAsyncRan() |
+})(); |
+ |
+(function() { |
+ 'use strict'; |
+ var getCalls = 0; |
+ var funcCalls = 0; |
+ var nextCalls = 0; |
+ defineProperty(numberPrototype, symbolIterator, { |
+ get: function() { |
+ assertEquals('number', typeof this); |
+ getCalls++; |
+ return function() { |
+ assertEquals('number', typeof this); |
+ funcCalls++; |
+ var n = this; |
+ var i = 0 |
+ return { |
+ next() { |
+ nextCalls++; |
+ return {value: i++, done: i > n}; |
+ } |
+ }; |
+ }; |
+ }, |
+ configurable: true |
+ }); |
+ |
+ Promise.race(3).chain( |
+ function(x) { |
+ assertAsync(x === 0, "race/iterable/number"); |
+ }, |
+ assertUnreachable); |
+ delete numberPrototype[symbolIterator]; |
+ |
+ assertEquals(getCalls, 1); |
+ assertEquals(funcCalls, 1); |
+ assertEquals(nextCalls, 3 + 1); // + 1 for {done: true} |
+ assertAsyncRan(); |
+})(); |
+ |
(function() { |
var log |
function MyPromise(resolver) { |