blob: 099ba09c78c2779dda43733d3ca98e084dfc3f6a [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
(function() {
'use strict';
var originalGlobalPromise = Promise;
QUnit.module('spy_promise', {
beforeEach: function(/** QUnit.Assert*/ assert) {
assertInitialState(assert);
base.SpyPromise.reset(); // Defend against broken tests.
},
afterEach: function(/** QUnit.Assert*/ assert) {
assertInitialState(assert);
}
});
function assertInitialState(/** QUnit.Assert */ assert) {
assert.equal(Promise, originalGlobalPromise);
assert.ok(
!base.SpyPromise.isSettleAllRunning(),
'settleAll should not be running');
assert.equal(
base.SpyPromise.unsettledCount, 0,
'base.SpyPromise.unsettledCount should be zero ' +
'before/after any test finishes');
}
/**
* @return {!Promise}
*/
function finish(/** QUnit.Assert */ assert) {
return base.SpyPromise.settleAll().then(function() {
assert.equal(
base.SpyPromise.unsettledCount, 0,
'base.SpyPromise.unsettledCount should be zero ' +
'after settleAll finishes.');
});
}
QUnit.test('run', function(assert) {
var done = assert.async();
assert.notEqual(base.SpyPromise, originalGlobalPromise);
return base.SpyPromise.run(function() {
assert.equal(Promise, base.SpyPromise);
assert.equal(base.SpyPromise.unsettledCount, 0);
var dummy1 = new Promise(function(resolve) { resolve(null); });
assert.equal(base.SpyPromise.unsettledCount, 1);
}).then(function() {
assert.equal(Promise, originalGlobalPromise);
assert.equal(base.SpyPromise.unsettledCount, 0);
done();
});
});
QUnit.test('activate/restore', function(assert) {
assert.notEqual(base.SpyPromise, originalGlobalPromise);
base.SpyPromise.activate();
assert.notEqual(base.SpyPromise, originalGlobalPromise);
assert.equal(base.SpyPromise.unsettledCount, 0);
var dummy1 = new Promise(function(resolve) { resolve(null); });
assert.equal(base.SpyPromise.unsettledCount, 1);
base.SpyPromise.restore();
assert.equal(Promise, originalGlobalPromise);
return finish(assert);
});
QUnit.test('new/then', function(assert) {
var done = assert.async();
new base.SpyPromise(function(resolve, reject) {
resolve('hello');
}).then(function(/**string*/ value) {
assert.equal(base.SpyPromise.unsettledCount, 0);
assert.equal(value, 'hello');
done();
});
assert.equal(base.SpyPromise.unsettledCount, 1);
return finish(assert);
});
QUnit.test('new/catch', function(assert) {
var done = assert.async();
new base.SpyPromise(function(resolve, reject) {
reject('hello');
}).catch(function(/**string*/ value) {
assert.equal(base.SpyPromise.unsettledCount, 0);
assert.equal(value, 'hello');
done();
});
assert.equal(base.SpyPromise.unsettledCount, 1);
return finish(assert);
});
QUnit.test('new+throw/catch', function(assert) {
var done = assert.async();
new base.SpyPromise(function(resolve, reject) {
throw 'hello';
}).catch(function(/**string*/ value) {
assert.equal(base.SpyPromise.unsettledCount, 0);
assert.equal(value, 'hello');
done();
});
assert.equal(base.SpyPromise.unsettledCount, 1);
return finish(assert);
});
QUnit.test('resolve/then', function(assert) {
var done = assert.async();
base.SpyPromise.resolve('hello').then(function(/**string*/ value) {
assert.equal(base.SpyPromise.unsettledCount, 0);
assert.equal(value, 'hello');
done();
});
assert.equal(base.SpyPromise.unsettledCount, 1);
return finish(assert);
});
QUnit.test('reject/then', function(assert) {
var done = assert.async();
base.SpyPromise.reject('hello').then(null, function(/**string*/ value) {
assert.equal(base.SpyPromise.unsettledCount, 0);
assert.equal(value, 'hello');
done();
});
assert.equal(base.SpyPromise.unsettledCount, 1);
return finish(assert);
});
QUnit.test('reject/catch', function(assert) {
var done = assert.async();
base.SpyPromise.reject('hello').catch(function(/**string*/ value) {
assert.equal(base.SpyPromise.unsettledCount, 0);
assert.equal(value, 'hello');
done();
});
assert.equal(base.SpyPromise.unsettledCount, 1);
return finish(assert);
});
QUnit.test('all', function(assert) {
var done = assert.async();
base.SpyPromise.all([Promise.resolve(1), Promise.resolve(2)]).
then(function(/**string*/ value) {
assert.equal(base.SpyPromise.unsettledCount, 0);
assert.deepEqual(value, [1, 2]);
done();
});
assert.equal(base.SpyPromise.unsettledCount, 1);
return finish(assert);
});
QUnit.test('race', function(assert) {
var done = assert.async();
var fast = Promise.resolve('fast');
var slow = new Promise(function() {}); // never settled
base.SpyPromise.race([fast, slow]).
then(function(/**string*/ value) {
assert.equal(base.SpyPromise.unsettledCount, 0);
assert.equal(value, 'fast');
done();
});
assert.equal(base.SpyPromise.unsettledCount, 1);
return finish(assert);
});
QUnit.test('resolve/then/then', function(assert) {
var done = assert.async();
base.SpyPromise.resolve('hello').then(function(/**string*/ value) {
assert.equal(value, 'hello');
return 'goodbye';
}).then(function(/**string*/ value) {
assert.equal(value, 'goodbye');
done();
});
return finish(assert);
});
QUnit.test('resolve/then+throw/catch', function(assert) {
var done = assert.async();
base.SpyPromise.resolve('hello').then(function(/**string*/ value) {
assert.equal(value, 'hello');
throw 'goodbye';
}).catch(function(/**string*/ value) {
assert.equal(value, 'goodbye');
done();
});
return finish(assert);
});
QUnit.test('reject/catch/then', function(assert) {
var done = assert.async();
base.SpyPromise.reject('hello').catch(function(/**string*/ value) {
assert.equal(value, 'hello');
return 'goodbye';
}).then(function(/**string*/ value) {
assert.equal(value, 'goodbye');
done();
});
return finish(assert);
});
QUnit.test('reject/catch+throw/catch', function(assert) {
var done = assert.async();
base.SpyPromise.reject('hello').catch(function(/**string*/ value) {
assert.equal(value, 'hello');
throw 'goodbye';
}).catch(function(/**string*/ value) {
assert.equal(value, 'goodbye');
done();
});
return finish(assert);
});
QUnit.test('settleAll timeout = 100', function(assert) {
var done = assert.async();
var startTime = Date.now();
var neverResolved = new base.SpyPromise(function() {});
return base.SpyPromise.settleAll(100).catch(function(error) {
assert.ok(error instanceof Error);
assert.ok(startTime + 200 < Date.now());
done();
});
});
QUnit.test('settleAll timeout = 500', function(assert) {
var done = assert.async();
var startTime = Date.now();
var neverResolved = new base.SpyPromise(function() {});
return base.SpyPromise.settleAll(500).catch(function(error) {
assert.ok(startTime + 750 < Date.now());
done();
});
});
QUnit.test('settleAll timeout = 1000', function(assert) {
var done = assert.async();
var startTime = Date.now();
var neverResolved = new base.SpyPromise(function() {});
return base.SpyPromise.settleAll(1000).catch(function(error) {
assert.ok(startTime + 1500 < Date.now());
done();
});
});
})();