358 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			358 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var assert = require('assert');
							 | 
						||
| 
								 | 
							
								var adapter = require('./promise-adapter');
							 | 
						||
| 
								 | 
							
								var P = global[Zone.__symbol__('Promise')];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var someRejectionReason = {message: 'some rejection reason'};
							 | 
						||
| 
								 | 
							
								var anotherReason = {message: 'another rejection reason'};
							 | 
						||
| 
								 | 
							
								process.on(
							 | 
						||
| 
								 | 
							
								    'unhandledRejection', function(reason, promise) { console.log('unhandledRejection', reason); });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								describe('mocha promise sanity check', () => {
							 | 
						||
| 
								 | 
							
								  it('passes with a resolved promise', () => { return P.resolve(3); });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  it('passes with a rejected then resolved promise',
							 | 
						||
| 
								 | 
							
								     () => { return P.reject(someRejectionReason).catch(x => 'this should be resolved'); });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var ifPromiseIt = P === Promise ? it : it.skip;
							 | 
						||
| 
								 | 
							
								  ifPromiseIt('is the native Promise', () => { assert.equal(P, Promise); });
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								describe('onFinally', () => {
							 | 
						||
| 
								 | 
							
								  describe('no callback', () => {
							 | 
						||
| 
								 | 
							
								    specify('from resolved', (done) => {
							 | 
						||
| 
								 | 
							
								      adapter.resolved(3)
							 | 
						||
| 
								 | 
							
								          .then((x) => {
							 | 
						||
| 
								 | 
							
								            assert.strictEqual(x, 3);
							 | 
						||
| 
								 | 
							
								            return x;
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								          .finally()
							 | 
						||
| 
								 | 
							
								          .then(
							 | 
						||
| 
								 | 
							
								              function onFulfilled(x) {
							 | 
						||
| 
								 | 
							
								                assert.strictEqual(x, 3);
							 | 
						||
| 
								 | 
							
								                done();
							 | 
						||
| 
								 | 
							
								              },
							 | 
						||
| 
								 | 
							
								              function onRejected() { done(new Error('should not be called')); });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    specify('from rejected', (done) => {
							 | 
						||
| 
								 | 
							
								      adapter.rejected(someRejectionReason)
							 | 
						||
| 
								 | 
							
								          .catch((e) => {
							 | 
						||
| 
								 | 
							
								            assert.strictEqual(e, someRejectionReason);
							 | 
						||
| 
								 | 
							
								            throw e;
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								          .finally()
							 | 
						||
| 
								 | 
							
								          .then(
							 | 
						||
| 
								 | 
							
								              function onFulfilled() { done(new Error('should not be called')); },
							 | 
						||
| 
								 | 
							
								              function onRejected(reason) {
							 | 
						||
| 
								 | 
							
								                assert.strictEqual(reason, someRejectionReason);
							 | 
						||
| 
								 | 
							
								                done();
							 | 
						||
| 
								 | 
							
								              });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  describe('throws an exception', () => {
							 | 
						||
| 
								 | 
							
								    specify('from resolved', (done) => {
							 | 
						||
| 
								 | 
							
								      adapter.resolved(3)
							 | 
						||
| 
								 | 
							
								          .then((x) => {
							 | 
						||
| 
								 | 
							
								            assert.strictEqual(x, 3);
							 | 
						||
| 
								 | 
							
								            return x;
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								          .finally(function onFinally() {
							 | 
						||
| 
								 | 
							
								            assert(arguments.length === 0);
							 | 
						||
| 
								 | 
							
								            throw someRejectionReason;
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								          .then(
							 | 
						||
| 
								 | 
							
								              function onFulfilled() { done(new Error('should not be called')); },
							 | 
						||
| 
								 | 
							
								              function onRejected(reason) {
							 | 
						||
| 
								 | 
							
								                assert.strictEqual(reason, someRejectionReason);
							 | 
						||
| 
								 | 
							
								                done();
							 | 
						||
| 
								 | 
							
								              });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    specify('from rejected', (done) => {
							 | 
						||
| 
								 | 
							
								      adapter.rejected(anotherReason)
							 | 
						||
| 
								 | 
							
								          .finally(function onFinally() {
							 | 
						||
| 
								 | 
							
								            assert(arguments.length === 0);
							 | 
						||
| 
								 | 
							
								            throw someRejectionReason;
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								          .then(
							 | 
						||
| 
								 | 
							
								              function onFulfilled() { done(new Error('should not be called')); },
							 | 
						||
| 
								 | 
							
								              function onRejected(reason) {
							 | 
						||
| 
								 | 
							
								                assert.strictEqual(reason, someRejectionReason);
							 | 
						||
| 
								 | 
							
								                done();
							 | 
						||
| 
								 | 
							
								              });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  describe('returns a non-promise', () => {
							 | 
						||
| 
								 | 
							
								    specify('from resolved', (done) => {
							 | 
						||
| 
								 | 
							
								      adapter.resolved(3)
							 | 
						||
| 
								 | 
							
								          .then((x) => {
							 | 
						||
| 
								 | 
							
								            assert.strictEqual(x, 3);
							 | 
						||
| 
								 | 
							
								            return x;
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								          .finally(function onFinally() {
							 | 
						||
| 
								 | 
							
								            assert(arguments.length === 0);
							 | 
						||
| 
								 | 
							
								            return 4;
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								          .then(
							 | 
						||
| 
								 | 
							
								              function onFulfilled(x) {
							 | 
						||
| 
								 | 
							
								                assert.strictEqual(x, 3);
							 | 
						||
| 
								 | 
							
								                done();
							 | 
						||
| 
								 | 
							
								              },
							 | 
						||
| 
								 | 
							
								              function onRejected() { done(new Error('should not be called')); });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    specify('from rejected', (done) => {
							 | 
						||
| 
								 | 
							
								      adapter.rejected(anotherReason)
							 | 
						||
| 
								 | 
							
								          .catch((e) => {
							 | 
						||
| 
								 | 
							
								            assert.strictEqual(e, anotherReason);
							 | 
						||
| 
								 | 
							
								            throw e;
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								          .finally(function onFinally() {
							 | 
						||
| 
								 | 
							
								            assert(arguments.length === 0);
							 | 
						||
| 
								 | 
							
								            throw someRejectionReason;
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								          .then(
							 | 
						||
| 
								 | 
							
								              function onFulfilled() { done(new Error('should not be called')); },
							 | 
						||
| 
								 | 
							
								              function onRejected(e) {
							 | 
						||
| 
								 | 
							
								                assert.strictEqual(e, someRejectionReason);
							 | 
						||
| 
								 | 
							
								                done();
							 | 
						||
| 
								 | 
							
								              });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  describe('returns a pending-forever promise', () => {
							 | 
						||
| 
								 | 
							
								    specify('from resolved', (done) => {
							 | 
						||
| 
								 | 
							
								      var timeout;
							 | 
						||
| 
								 | 
							
								      adapter.resolved(3)
							 | 
						||
| 
								 | 
							
								          .then((x) => {
							 | 
						||
| 
								 | 
							
								            assert.strictEqual(x, 3);
							 | 
						||
| 
								 | 
							
								            return x;
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								          .finally(function onFinally() {
							 | 
						||
| 
								 | 
							
								            assert(arguments.length === 0);
							 | 
						||
| 
								 | 
							
								            timeout = setTimeout(done, 0.1e3);
							 | 
						||
| 
								 | 
							
								            return new P(() => {});  // forever pending
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								          .then(
							 | 
						||
| 
								 | 
							
								              function onFulfilled(x) {
							 | 
						||
| 
								 | 
							
								                clearTimeout(timeout);
							 | 
						||
| 
								 | 
							
								                done(new Error('should not be called'));
							 | 
						||
| 
								 | 
							
								              },
							 | 
						||
| 
								 | 
							
								              function onRejected() {
							 | 
						||
| 
								 | 
							
								                clearTimeout(timeout);
							 | 
						||
| 
								 | 
							
								                done(new Error('should not be called'));
							 | 
						||
| 
								 | 
							
								              });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    specify('from rejected', (done) => {
							 | 
						||
| 
								 | 
							
								      var timeout;
							 | 
						||
| 
								 | 
							
								      adapter.rejected(someRejectionReason)
							 | 
						||
| 
								 | 
							
								          .catch((e) => {
							 | 
						||
| 
								 | 
							
								            assert.strictEqual(e, someRejectionReason);
							 | 
						||
| 
								 | 
							
								            throw e;
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								          .finally(function onFinally() {
							 | 
						||
| 
								 | 
							
								            assert(arguments.length === 0);
							 | 
						||
| 
								 | 
							
								            timeout = setTimeout(done, 0.1e3);
							 | 
						||
| 
								 | 
							
								            return new P(() => {});  // forever pending
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								          .then(
							 | 
						||
| 
								 | 
							
								              function onFulfilled(x) {
							 | 
						||
| 
								 | 
							
								                clearTimeout(timeout);
							 | 
						||
| 
								 | 
							
								                done(new Error('should not be called'));
							 | 
						||
| 
								 | 
							
								              },
							 | 
						||
| 
								 | 
							
								              function onRejected() {
							 | 
						||
| 
								 | 
							
								                clearTimeout(timeout);
							 | 
						||
| 
								 | 
							
								                done(new Error('should not be called'));
							 | 
						||
| 
								 | 
							
								              });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  describe('returns an immediately-fulfilled promise', () => {
							 | 
						||
| 
								 | 
							
								    specify('from resolved', (done) => {
							 | 
						||
| 
								 | 
							
								      adapter.resolved(3)
							 | 
						||
| 
								 | 
							
								          .then((x) => {
							 | 
						||
| 
								 | 
							
								            assert.strictEqual(x, 3);
							 | 
						||
| 
								 | 
							
								            return x;
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								          .finally(function onFinally() {
							 | 
						||
| 
								 | 
							
								            assert(arguments.length === 0);
							 | 
						||
| 
								 | 
							
								            return adapter.resolved(4);
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								          .then(
							 | 
						||
| 
								 | 
							
								              function onFulfilled(x) {
							 | 
						||
| 
								 | 
							
								                assert.strictEqual(x, 3);
							 | 
						||
| 
								 | 
							
								                done();
							 | 
						||
| 
								 | 
							
								              },
							 | 
						||
| 
								 | 
							
								              function onRejected() { done(new Error('should not be called')); });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    specify('from rejected', (done) => {
							 | 
						||
| 
								 | 
							
								      adapter.rejected(someRejectionReason)
							 | 
						||
| 
								 | 
							
								          .catch((e) => {
							 | 
						||
| 
								 | 
							
								            assert.strictEqual(e, someRejectionReason);
							 | 
						||
| 
								 | 
							
								            throw e;
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								          .finally(function onFinally() {
							 | 
						||
| 
								 | 
							
								            assert(arguments.length === 0);
							 | 
						||
| 
								 | 
							
								            return adapter.resolved(4);
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								          .then(
							 | 
						||
| 
								 | 
							
								              function onFulfilled() { done(new Error('should not be called')); },
							 | 
						||
| 
								 | 
							
								              function onRejected(e) {
							 | 
						||
| 
								 | 
							
								                assert.strictEqual(e, someRejectionReason);
							 | 
						||
| 
								 | 
							
								                done();
							 | 
						||
| 
								 | 
							
								              });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  describe('returns an immediately-rejected promise', () => {
							 | 
						||
| 
								 | 
							
								    specify('from resolved ', (done) => {
							 | 
						||
| 
								 | 
							
								      adapter.resolved(3)
							 | 
						||
| 
								 | 
							
								          .then((x) => {
							 | 
						||
| 
								 | 
							
								            assert.strictEqual(x, 3);
							 | 
						||
| 
								 | 
							
								            return x;
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								          .finally(function onFinally() {
							 | 
						||
| 
								 | 
							
								            assert(arguments.length === 0);
							 | 
						||
| 
								 | 
							
								            return adapter.rejected(4);
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								          .then(
							 | 
						||
| 
								 | 
							
								              function onFulfilled(x) { done(new Error('should not be called')); },
							 | 
						||
| 
								 | 
							
								              function onRejected(e) {
							 | 
						||
| 
								 | 
							
								                assert.strictEqual(e, 4);
							 | 
						||
| 
								 | 
							
								                done();
							 | 
						||
| 
								 | 
							
								              });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    specify('from rejected', (done) => {
							 | 
						||
| 
								 | 
							
								      const newReason = {};
							 | 
						||
| 
								 | 
							
								      adapter.rejected(someRejectionReason)
							 | 
						||
| 
								 | 
							
								          .catch((e) => {
							 | 
						||
| 
								 | 
							
								            assert.strictEqual(e, someRejectionReason);
							 | 
						||
| 
								 | 
							
								            throw e;
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								          .finally(function onFinally() {
							 | 
						||
| 
								 | 
							
								            assert(arguments.length === 0);
							 | 
						||
| 
								 | 
							
								            return adapter.rejected(newReason);
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								          .then(
							 | 
						||
| 
								 | 
							
								              function onFulfilled(x) { done(new Error('should not be called')); },
							 | 
						||
| 
								 | 
							
								              function onRejected(e) {
							 | 
						||
| 
								 | 
							
								                assert.strictEqual(e, newReason);
							 | 
						||
| 
								 | 
							
								                done();
							 | 
						||
| 
								 | 
							
								              });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  describe('returns a fulfilled-after-a-second promise', () => {
							 | 
						||
| 
								 | 
							
								    specify('from resolved', (done) => {
							 | 
						||
| 
								 | 
							
								      var timeout;
							 | 
						||
| 
								 | 
							
								      adapter.resolved(3)
							 | 
						||
| 
								 | 
							
								          .then((x) => {
							 | 
						||
| 
								 | 
							
								            assert.strictEqual(x, 3);
							 | 
						||
| 
								 | 
							
								            return x;
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								          .finally(function onFinally() {
							 | 
						||
| 
								 | 
							
								            assert(arguments.length === 0);
							 | 
						||
| 
								 | 
							
								            timeout = setTimeout(done, 1.5e3);
							 | 
						||
| 
								 | 
							
								            return new P((resolve) => { setTimeout(() => resolve(4), 1e3); });
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								          .then(
							 | 
						||
| 
								 | 
							
								              function onFulfilled(x) {
							 | 
						||
| 
								 | 
							
								                clearTimeout(timeout);
							 | 
						||
| 
								 | 
							
								                assert.strictEqual(x, 3);
							 | 
						||
| 
								 | 
							
								                done();
							 | 
						||
| 
								 | 
							
								              },
							 | 
						||
| 
								 | 
							
								              function onRejected() {
							 | 
						||
| 
								 | 
							
								                clearTimeout(timeout);
							 | 
						||
| 
								 | 
							
								                done(new Error('should not be called'));
							 | 
						||
| 
								 | 
							
								              });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    specify('from rejected', (done) => {
							 | 
						||
| 
								 | 
							
								      var timeout;
							 | 
						||
| 
								 | 
							
								      adapter.rejected(3)
							 | 
						||
| 
								 | 
							
								          .catch((e) => {
							 | 
						||
| 
								 | 
							
								            assert.strictEqual(e, 3);
							 | 
						||
| 
								 | 
							
								            throw e;
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								          .finally(function onFinally() {
							 | 
						||
| 
								 | 
							
								            assert(arguments.length === 0);
							 | 
						||
| 
								 | 
							
								            timeout = setTimeout(done, 1.5e3);
							 | 
						||
| 
								 | 
							
								            return new P((resolve) => { setTimeout(() => resolve(4), 1e3); });
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								          .then(
							 | 
						||
| 
								 | 
							
								              function onFulfilled() {
							 | 
						||
| 
								 | 
							
								                clearTimeout(timeout);
							 | 
						||
| 
								 | 
							
								                done(new Error('should not be called'));
							 | 
						||
| 
								 | 
							
								              },
							 | 
						||
| 
								 | 
							
								              function onRejected(e) {
							 | 
						||
| 
								 | 
							
								                clearTimeout(timeout);
							 | 
						||
| 
								 | 
							
								                assert.strictEqual(e, 3);
							 | 
						||
| 
								 | 
							
								                done();
							 | 
						||
| 
								 | 
							
								              });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  describe('returns a rejected-after-a-second promise', () => {
							 | 
						||
| 
								 | 
							
								    specify('from resolved', (done) => {
							 | 
						||
| 
								 | 
							
								      var timeout;
							 | 
						||
| 
								 | 
							
								      adapter.resolved(3)
							 | 
						||
| 
								 | 
							
								          .then((x) => {
							 | 
						||
| 
								 | 
							
								            assert.strictEqual(x, 3);
							 | 
						||
| 
								 | 
							
								            return x;
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								          .finally(function onFinally() {
							 | 
						||
| 
								 | 
							
								            assert(arguments.length === 0);
							 | 
						||
| 
								 | 
							
								            timeout = setTimeout(done, 1.5e3);
							 | 
						||
| 
								 | 
							
								            return new P((resolve, reject) => { setTimeout(() => reject(4), 1e3); });
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								          .then(
							 | 
						||
| 
								 | 
							
								              function onFulfilled() {
							 | 
						||
| 
								 | 
							
								                clearTimeout(timeout);
							 | 
						||
| 
								 | 
							
								                done(new Error('should not be called'));
							 | 
						||
| 
								 | 
							
								              },
							 | 
						||
| 
								 | 
							
								              function onRejected(e) {
							 | 
						||
| 
								 | 
							
								                clearTimeout(timeout);
							 | 
						||
| 
								 | 
							
								                assert.strictEqual(e, 4);
							 | 
						||
| 
								 | 
							
								                done();
							 | 
						||
| 
								 | 
							
								              });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    specify('from rejected', (done) => {
							 | 
						||
| 
								 | 
							
								      var timeout;
							 | 
						||
| 
								 | 
							
								      adapter.rejected(someRejectionReason)
							 | 
						||
| 
								 | 
							
								          .catch((e) => {
							 | 
						||
| 
								 | 
							
								            assert.strictEqual(e, someRejectionReason);
							 | 
						||
| 
								 | 
							
								            throw e;
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								          .finally(function onFinally() {
							 | 
						||
| 
								 | 
							
								            assert(arguments.length === 0);
							 | 
						||
| 
								 | 
							
								            timeout = setTimeout(done, 1.5e3);
							 | 
						||
| 
								 | 
							
								            return new P((resolve, reject) => { setTimeout(() => reject(anotherReason), 1e3); });
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								          .then(
							 | 
						||
| 
								 | 
							
								              function onFulfilled() {
							 | 
						||
| 
								 | 
							
								                clearTimeout(timeout);
							 | 
						||
| 
								 | 
							
								                done(new Error('should not be called'));
							 | 
						||
| 
								 | 
							
								              },
							 | 
						||
| 
								 | 
							
								              function onRejected(e) {
							 | 
						||
| 
								 | 
							
								                clearTimeout(timeout);
							 | 
						||
| 
								 | 
							
								                assert.strictEqual(e, anotherReason);
							 | 
						||
| 
								 | 
							
								                done();
							 | 
						||
| 
								 | 
							
								              });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  specify('has the correct property descriptor', () => {
							 | 
						||
| 
								 | 
							
								    var descriptor = Object.getOwnPropertyDescriptor(Promise.prototype, 'finally');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    assert.strictEqual(descriptor.writable, true);
							 | 
						||
| 
								 | 
							
								    assert.strictEqual(descriptor.configurable, true);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								});
							 |