Skip to content

Commit

Permalink
Improves iterator tests for Promise.any, Promise.allSettled, and …
Browse files Browse the repository at this point in the history
…`AggregateError` polyfills
  • Loading branch information
mhassan1 authored and JakeChampion committed Nov 23, 2021
1 parent 843c4a0 commit 999dbce
Show file tree
Hide file tree
Showing 3 changed files with 99 additions and 51 deletions.
33 changes: 24 additions & 9 deletions polyfills/AggregateError/tests.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,22 @@

/* globals proclaim, AggregateError */

function makeArrayIterator (array) {
var i = 0;
var iterator = {};
// polyfill for `Symbol.iterator` has been provided as part of `IterableToList`
iterator[self.Symbol.iterator] = function () {
return {
next: function() {
return i >= array.length
? { done: true }
: { value: array[i++] };
}
};
};
return iterator;
}

it('is a function', function () {
proclaim.isFunction(AggregateError);
});
Expand Down Expand Up @@ -29,15 +45,14 @@ describe('AggregateError', function () {
proclaim.deepStrictEqual(aggregateError.errors, errors);
});

if ('Symbol' in self && 'iterator' in self.Symbol && !!Array.prototype[self.Symbol.iterator]) {
it("constructs an AggregateError when passed an iterator", function () {
var errors = [new Error('x'), new Error('y')];
var aggregateError = new AggregateError(errors[self.Symbol.iterator]());
proclaim.equal(aggregateError.message, '');
proclaim.notEqual(aggregateError.errors, errors);
proclaim.deepStrictEqual(aggregateError.errors, errors);
});
}
it("constructs an AggregateError when passed an iterator", function () {
var errors = [new Error('x'), new Error('y')];
var iterator = makeArrayIterator(errors);
var aggregateError = new AggregateError(iterator);
proclaim.equal(aggregateError.message, '');
proclaim.notEqual(aggregateError.errors, errors);
proclaim.deepStrictEqual(aggregateError.errors, errors);
});

it("throws an error for input that is not iterable", function () {
proclaim['throws'](function () {
Expand Down
55 changes: 35 additions & 20 deletions polyfills/Promise/allSettled/tests.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,22 @@

/* globals proclaim, Promise */

function makeArrayIterator (array) {
var i = 0;
var iterator = {};
// polyfill for `Symbol.iterator` has been provided as part of `IterableToList`
iterator[self.Symbol.iterator] = function () {
return {
next: function() {
return i >= array.length
? { done: true }
: { value: array[i++] };
}
};
};
return iterator;
}

it('is a function', function () {
proclaim.isFunction(Promise.allSettled);
});
Expand Down Expand Up @@ -34,27 +50,26 @@ describe('allSettled', function () {
});
});

if ('Symbol' in self && 'iterator' in self.Symbol && !!Array.prototype[self.Symbol.iterator]) {
it("resolves to an array of results when passed an iterator", function () {
var promises = [1, Promise.resolve(2), Promise.reject(3)];
return Promise.allSettled(promises[self.Symbol.iterator]()).then(function (results) {
proclaim.deepStrictEqual(results, [
{
status: 'fulfilled',
value: 1
},
{
status: 'fulfilled',
value: 2
},
{
status: 'rejected',
reason: 3
}
]);
});
it("resolves to an array of results when passed an iterator", function () {
var promises = [1, Promise.resolve(2), Promise.reject(3)];
var iterator = makeArrayIterator(promises);
return Promise.allSettled(iterator).then(function (results) {
proclaim.deepStrictEqual(results, [
{
status: 'fulfilled',
value: 1
},
{
status: 'fulfilled',
value: 2
},
{
status: 'rejected',
reason: 3
}
]);
});
}
});

it("rejects with a TypeError for input that is not iterable", function () {
return Promise.allSettled(0)['catch'](function (err) {
Expand Down
62 changes: 40 additions & 22 deletions polyfills/Promise/any/tests.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,22 @@

/* globals proclaim, Promise */

function makeArrayIterator (array) {
var i = 0;
var iterator = {};
// polyfill for `Symbol.iterator` has been provided as part of `IterableToList`
iterator[self.Symbol.iterator] = function () {
return {
next: function() {
return i >= array.length
? { done: true }
: { value: array[i++] };
}
};
};
return iterator;
}

it('is a function', function () {
proclaim.isFunction(Promise.any);
});
Expand Down Expand Up @@ -40,33 +56,35 @@ describe('any', function () {
});
});

if ('Symbol' in self && 'iterator' in self.Symbol && !!Array.prototype[self.Symbol.iterator]) {
it("resolves to the first fulfilled promise when passed an iterator", function () {
var promises = [Promise.reject(1), Promise.resolve(2), 3];
return Promise.any(promises[self.Symbol.iterator]()).then(function (result) {
proclaim.strictEqual(result, 2);
});
it("resolves to the first fulfilled promise when passed an iterator", function () {
var promises = [Promise.reject(1), Promise.resolve(2), 3];
var iterator = makeArrayIterator(promises);
return Promise.any(iterator).then(function (result) {
proclaim.strictEqual(result, 2);
});
});

it("rejects with an AggregateError when passed an iterator containing rejected promises", function () {
var promises = [Promise.reject(1)];
return Promise.any(promises[self.Symbol.iterator]())['catch'](function (err) {
return err;
}).then(function (err) {
proclaim.equal(err.name, 'AggregateError');
proclaim.deepStrictEqual(err.errors, [1]);
});
it("rejects with an AggregateError when passed an iterator containing rejected promises", function () {
var promises = [Promise.reject(1)];
var iterator = makeArrayIterator(promises);
return Promise.any(iterator)['catch'](function (err) {
return err;
}).then(function (err) {
proclaim.equal(err.name, 'AggregateError');
proclaim.deepStrictEqual(err.errors, [1]);
});
});

it("rejects with an AggregateError when passed an empty iterable", function () {
return Promise.any([][self.Symbol.iterator]())['catch'](function (err) {
return err;
}).then(function (err) {
proclaim.equal(err.name, 'AggregateError');
proclaim.deepStrictEqual(err.errors, []);
});
it("rejects with an AggregateError when passed an empty iterable", function () {
var promises = [];
var iterator = makeArrayIterator(promises);
return Promise.any(iterator)['catch'](function (err) {
return err;
}).then(function (err) {
proclaim.equal(err.name, 'AggregateError');
proclaim.deepStrictEqual(err.errors, []);
});
}
});

it("rejects with a TypeError for input that is not iterable", function () {
return Promise.any(0)['catch'](function (err) {
Expand Down

0 comments on commit 999dbce

Please sign in to comment.