185 lines
5.5 KiB
JavaScript
185 lines
5.5 KiB
JavaScript
|
"use strict";
|
||
|
|
||
|
var assert = require("assert");
|
||
|
var testUtils = require("./helpers/util.js");
|
||
|
|
||
|
|
||
|
function promised(val) {
|
||
|
return new Promise(function(f) {
|
||
|
setTimeout(function() {
|
||
|
f(val);
|
||
|
}, 1);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function thenabled(val, arr) {
|
||
|
return {
|
||
|
then: function(f){
|
||
|
setTimeout(function() {
|
||
|
if (arr) arr.push(val);
|
||
|
f(val);
|
||
|
}, 1);
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
|
||
|
describe("Promise.each", function() {
|
||
|
|
||
|
it("should return the array's values mapped", function() {
|
||
|
var a = [promised(1), promised(2), promised(3)];
|
||
|
var b = [];
|
||
|
return Promise.resolve(a).mapSeries(function(val) {
|
||
|
b.push(3-val);
|
||
|
return val + 2;
|
||
|
}).then(function(ret) {
|
||
|
assert.deepEqual(ret, [3,4,5]);
|
||
|
assert.deepEqual(b, [2, 1, 0]);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
|
||
|
it("takes value, index and length", function() {
|
||
|
var a = [promised(1), promised(2), promised(3)];
|
||
|
var b = [];
|
||
|
return Promise.resolve(a).each(function(value, index, length) {
|
||
|
b.push(value, index, length);
|
||
|
}).then(function(ret) {
|
||
|
assert.deepEqual(b, [1, 0, 3, 2, 1, 3, 3, 2, 3]);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("waits for returned promise before proceeding next", function() {
|
||
|
var a = [promised(1), promised(2), promised(3)];
|
||
|
var b = [];
|
||
|
return Promise.resolve(a).each(function(value) {
|
||
|
b.push(value);
|
||
|
return Promise.delay(1).then(function(){
|
||
|
b.push(value*2);
|
||
|
});
|
||
|
}).then(function(ret) {
|
||
|
assert.deepEqual(b, [1,2,2,4,3,6]);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("waits for returned thenable before proceeding next", function() {
|
||
|
var b = [1, 2, 3];
|
||
|
var a = [thenabled(1), thenabled(2), thenabled(3)];
|
||
|
return Promise.resolve(a).each(function(val) {
|
||
|
b.push(val * 50);
|
||
|
return thenabled(val * 500, b);
|
||
|
}).then(function(ret) {
|
||
|
assert.deepEqual(b, [1, 2, 3, 50, 500, 100, 1000, 150, 1500]);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("doesnt iterate with an empty array", function() {
|
||
|
return Promise.each([], function(val) {
|
||
|
throw new Error();
|
||
|
}).then(function(ret) {
|
||
|
assert.deepEqual(ret, []);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("iterates with an array of single item", function() {
|
||
|
var b = [];
|
||
|
return Promise.each([promised(1)], function(val) {
|
||
|
b.push(val);
|
||
|
return thenabled(val*2, b);
|
||
|
}).then(function(ret) {
|
||
|
assert.deepEqual(b, [1,2]);
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("Promise.prototype.each", function() {
|
||
|
|
||
|
it("should return the array's values", function() {
|
||
|
var a = [promised(1), promised(2), promised(3)];
|
||
|
var b = [];
|
||
|
return Promise.resolve(a).each(function(val) {
|
||
|
b.push(3-val);
|
||
|
return val;
|
||
|
}).then(function(ret) {
|
||
|
assert.deepEqual(ret, [1,2,3]);
|
||
|
assert.deepEqual(b, [2, 1, 0]);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
|
||
|
it("takes value, index and length", function() {
|
||
|
var a = [promised(1), promised(2), promised(3)];
|
||
|
var b = [];
|
||
|
return Promise.resolve(a).each(function(value, index, length) {
|
||
|
b.push(value, index, length);
|
||
|
}).then(function(ret) {
|
||
|
assert.deepEqual(b, [1, 0, 3, 2, 1, 3, 3, 2, 3]);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("waits for returned promise before proceeding next", function() {
|
||
|
var a = [promised(1), promised(2), promised(3)];
|
||
|
var b = [];
|
||
|
return Promise.resolve(a).each(function(value) {
|
||
|
b.push(value);
|
||
|
return Promise.delay(1).then(function(){
|
||
|
b.push(value*2);
|
||
|
});
|
||
|
}).then(function(ret) {
|
||
|
assert.deepEqual(b, [1,2,2,4,3,6]);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("waits for returned thenable before proceeding next", function() {
|
||
|
var b = [1, 2, 3];
|
||
|
var a = [thenabled(1), thenabled(2), thenabled(3)];
|
||
|
return Promise.resolve(a).each(function(val) {
|
||
|
b.push(val * 50);
|
||
|
return thenabled(val * 500, b);
|
||
|
}).then(function(ret) {
|
||
|
assert.deepEqual(b, [1, 2, 3, 50, 500, 100, 1000, 150, 1500]);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("doesnt iterate with an empty array", function() {
|
||
|
return Promise.resolve([]).each(function(val) {
|
||
|
throw new Error();
|
||
|
}).then(function(ret) {
|
||
|
assert.deepEqual(ret, []);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("iterates with an array of single item", function() {
|
||
|
var b = [];
|
||
|
return Promise.resolve([promised(1)]).each(function(val) {
|
||
|
b.push(val);
|
||
|
return thenabled(val*2, b);
|
||
|
}).then(function(ret) {
|
||
|
assert.deepEqual(b, [1,2]);
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe("mapSeries and each", function() {
|
||
|
it("is mixed", function() {
|
||
|
return Promise.mapSeries([1, 2, 3], function(value) {
|
||
|
return value * 2;
|
||
|
}).then(function(result) {
|
||
|
assert.deepEqual(result, [2, 4, 6]);
|
||
|
}).then(function() {
|
||
|
return Promise.each([1, 2, 3], function(value) {
|
||
|
return value * 2;
|
||
|
}).then(function(result) {
|
||
|
assert.deepEqual(result, [1, 2, 3]);
|
||
|
});
|
||
|
}).thenReturn([1, 2, 3]).mapSeries(function(value) {
|
||
|
return value * 2;
|
||
|
}).then(function(result) {
|
||
|
assert.deepEqual(result, [2, 4, 6]);
|
||
|
}).thenReturn([1, 2, 3]).each(function(value) {
|
||
|
return value * 2;
|
||
|
}).then(function(result) {
|
||
|
assert.deepEqual(result, [1, 2, 3]);
|
||
|
});
|
||
|
})
|
||
|
});
|