123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372 |
- 'use strict';
- var aplus = require('promises-aplus-tests');
- var Promise = require('../lib');
- var adapter = {};
- var assert = require('assert');
-
- adapter.deferred = function () {
- var pending = {};
- pending.promise = new Promise(function (resolver, reject) {
- pending.resolve = resolver;
- pending.reject = reject;
- });
- return pending;
- };
- adapter.resolved = function (value) {
- return Promise.resolve(value);
- }
- adapter.rejected = function (reason) {
- return Promise.reject(reason);
- }
-
- describe('Lie', function () {
- it('should work resolving a promise new', function (done) {
- new Promise(function (resolve) {
- resolve(new Promise(function (resolve) {
- resolve(true);
- }));
- }).then(function (result) {
- if (result === true) {
- done();
- } else {
- done(true);
- }
- });
- });
- it('should throw if you don\'t pass a function', function (done) {
- try {
- new Promise(true);
- } catch (e) {
- if (e instanceof TypeError) {
- done();
- } else {
- done(e);
- }
- }
- });
- it('should have a working catch method', function (done) {
- new Promise(function () {
- throw new Error('boom');
- }).catch(function () {
- done();
- });
- });
- describe('resolve', function () {
- it('should work with true', function (done) {
- Promise.resolve(true).then(function (value) {
- if (value === true) {
- done();
- } else {
- done(true);
- }
- });
- });
- it('should work with false', function (done) {
- Promise.resolve(false).then(function (value) {
- if (value === false) {
- done();
- } else {
- done(true);
- }
- });
- });
- it('should work with null', function (done) {
- Promise.resolve(null).then(function (value) {
- if (value === null) {
- done();
- } else {
- done(true);
- }
- });
- });
- it('should work with undefined', function (done) {
- Promise.resolve(undefined).then(function (value) {
- if (value === undefined) {
- done();
- } else {
- done(true);
- }
- });
- });
- it('should work with 0', function (done) {
- Promise.resolve(0).then(function (value) {
- value++;
- return Promise.resolve(0);
- }).then(function (value) {
- if (value === 0) {
- done();
- } else {
- done(true);
- }
- });
- });
- it('should work with 1', function (done) {
- Promise.resolve(1).then(function (value) {
- if (value === 1) {
- done();
- } else {
- done(true);
- }
- });
- });
- it('should work with \'\'', function (done) {
- Promise.resolve('').then(function (value) {
- if (value === '') {
- done();
- } else {
- done(true);
- }
- });
- });
- it('should work with \'something\'', function (done) {
- Promise.resolve('something').then(function (value) {
- if (value === 'something') {
- done();
- } else {
- done(true);
- }
- });
- });
- });
- describe('Promise.all', function () {
- //https://github.com/domenic/promises-unwrapping/blob/master/reference-implementation/test/all.js
- it('fulfills if passed an empty array', function (done) {
- var iterable = [];
-
- Promise.all(iterable).then(function (value) {
- assert(Array.isArray(value));
- assert.deepEqual(value, []);
- done();
- });
- });
-
- it('fulfills if passed an array of mixed fulfilled promises and values', function (done) {
- var iterable = [0, Promise.resolve(1), 2, Promise.resolve(3)];
-
- Promise.all(iterable).then(function (value) {
- assert(Array.isArray(value));
- assert.deepEqual(value, [0, 1, 2, 3]);
- done();
- });
- });
-
- it('rejects if any passed promise is rejected', function (done) {
- var foreverPending = new Promise(function () {});
- var error = new Error('Rejected');
- var rejected = Promise.reject(error);
-
- var iterable = [foreverPending, rejected];
-
- Promise.all(iterable).then(
- function (value) {
- assert(false, 'should never get here');
- done();
- },
- function (reason) {
- assert.strictEqual(reason, error);
- done();
- }
- );
- });
-
- it('resolves foreign thenables', function (done) {
- var normal = Promise.resolve(1);
- var foreign = { then: function (f) { f(2); } };
-
- var iterable = [normal, foreign];
-
- Promise.all(iterable).then(function (value) {
- assert.deepEqual(value, [1, 2]);
- done();
- });
- });
-
- it('does not reject twice', function (done) {
- var normal = Promise.resolve(1);
- var error = new Error('rejected once');
- var two = Promise.reject(error);
- var three = new Promise(function (resolve, reject) {
- setTimeout(function () {
- reject(new Error('rejected twice'));
- }, 30);
- });
-
- var iterable = [normal, two, three];
-
- Promise.all(iterable).then(function (value) {
- assert(false, 'should never get here');
- done();
- }, function (value) {
- assert.deepEqual(value, error);
- done();
- });
- });
-
- it('fulfills when passed an sparse array, giving `undefined` for the omitted values', function (done) {
- var iterable = [Promise.resolve(0), , , Promise.resolve(1)];
-
- Promise.all(iterable).then(function (value) {
- assert.deepEqual(value, [0, undefined, undefined, 1]);
- done();
- });
- });
-
- it('does not modify the input array', function (done) {
- var input = [0, 1];
- var iterable = input;
-
- Promise.all(iterable).then(function (value) {
- assert.notStrictEqual(input, value);
- done();
- });
- });
-
-
- it('should reject with a TypeError if given a non-iterable', function (done) {
- var notIterable = {};
-
- Promise.all(notIterable).then(
- function () {
- assert(false, 'should never get here');
- done();
- },
- function (reason) {
- assert(reason instanceof TypeError);
- done();
- }
- );
- });
- });
- describe('Promise.race', function () {
- //https://github.com/domenic/promises-unwrapping/blob/master/reference-implementation/test/all.js
- function delay(value, time, rejectIt) {
- return new Promise(function (resolve, reject) {
- setTimeout(function () {
- if (rejectIt) {
- return reject(value);
- }
- resolve(value);
- }, time);
- });
- }
- it('fulfills if passed an empty array', function (done) {
- var iterable = [];
-
- Promise.race(iterable).then(function (value) {
- assert(Array.isArray(value));
- assert.deepEqual(value, []);
- done();
- });
- });
-
- it('fulfills if passed an array of mixed fulfilled promises and values', function (done) {
- var iterable = [delay(0, 20), Promise.resolve(1), delay(2, 30), delay(Promise.resolve(3), 20)];
-
- Promise.race(iterable).then(function (value) {
- assert.equal(value, 1);
- done();
- });
- });
-
- it('rejects if firsed resolved promise is rejected', function (done) {
- var error = new Error('Rejected');
-
- var iterable = [delay(true, 300), delay(error, 20, true)];
-
- Promise.race(iterable).then(
- function (value) {
- assert(false, 'should never get here');
- done();
- },
- function (reason) {
- assert.strictEqual(reason, error);
- done();
- }
- );
- });
-
- it('resolves if second resolved promise is rejected', function (done) {
- var error = new Error('Rejected');
-
- var iterable = [delay(true, 30), delay(error, 200, true)];
-
- Promise.race(iterable).then(
- function (value) {
- assert(value, 'should resolve');
- done();
- },
- function (reason) {
- assert(false, 'should never get here');
- done();
- }
- );
- });
-
- it('resolves foreign thenables', function (done) {
- var normal = Promise.resolve(1);
- var foreign = { then: function (f) { f(2); } };
-
- var iterable = [delay(Promise.resolve(1), 200), foreign];
-
- Promise.race(iterable).then(function (value) {
- assert.deepEqual(value, 2);
- done();
- });
- });
-
- it('fulfills when passed an sparse array, giving `undefined` for the omitted values', function (done) {
- var iterable = [delay(Promise.resolve(0), 300), , , delay(Promise.resolve(1), 300)];
-
- Promise.race(iterable).then(function (value) {
- assert.equal(value, undefined);
- done();
- });
- });
-
-
-
- it('should reject with a TypeError if given a non-iterable', function (done) {
- var notIterable = {};
-
- Promise.race(notIterable).then(
- function () {
- assert(false, 'should never get here');
- done();
- },
- function (reason) {
- assert(reason instanceof TypeError);
- done();
- }
- );
- });
- });
- if (!process.browser) {
- it('should emit events for unhandled errors', function (done) {
- var called = 0;
- var err1 = new Error('should be caught');
-
- var err2 = new Error('should be uncaught');
- var promise1 = Promise.reject(err1);
- var promise2 = Promise.reject(err2);
- promise1.catch(function () {});
- function onEvent(reason, promise) {
- if (!called) {
- called++;
- assert.equal(err2, reason);
- assert.equal(promise2, promise);
- setTimeout(function (){
- process.removeListener('unhandledRejection', onEvent);
- done();
- }, 100)
- } else {
- done(new Error('called more then once'));
- }
- }
- process.on('unhandledRejection', onEvent);
- });
- }
- describe('Promises/A+ Tests', function () {
- aplus.mocha(adapter);
- });
- });
|