124 lines
4.3 KiB
TypeScript
124 lines
4.3 KiB
TypeScript
|
/**
|
||
|
* @license
|
||
|
* Copyright Google Inc. All Rights Reserved.
|
||
|
*
|
||
|
* Use of this source code is governed by an MIT-style license that can be
|
||
|
* found in the LICENSE file at https://angular.io/license
|
||
|
*/
|
||
|
|
||
|
import {isNode, zoneSymbol} from '../../lib/common/utils';
|
||
|
declare const global: any;
|
||
|
const wtfMock = global.wtfMock;
|
||
|
|
||
|
describe('setTimeout', function() {
|
||
|
it('should intercept setTimeout', function(done) {
|
||
|
let cancelId: any;
|
||
|
const testZone = Zone.current.fork((Zone as any)['wtfZoneSpec']).fork({name: 'TestZone'});
|
||
|
testZone.run(() => {
|
||
|
const timeoutFn = function() {
|
||
|
expect(Zone.current.name).toEqual(('TestZone'));
|
||
|
global[zoneSymbol('setTimeout')](function() {
|
||
|
expect(wtfMock.log[0]).toEqual('# Zone:fork("<root>::ProxyZone::WTF", "TestZone")');
|
||
|
expect(wtfMock.log[1])
|
||
|
.toEqual('> Zone:invoke:unit-test("<root>::ProxyZone::WTF::TestZone")');
|
||
|
expect(wtfMock.log[2])
|
||
|
.toContain('# Zone:schedule:macroTask:setTimeout("<root>::ProxyZone::WTF::TestZone"');
|
||
|
expect(wtfMock.log[3]).toEqual('< Zone:invoke:unit-test');
|
||
|
expect(wtfMock.log[4])
|
||
|
.toEqual('> Zone:invokeTask:setTimeout("<root>::ProxyZone::WTF::TestZone")');
|
||
|
expect(wtfMock.log[5]).toEqual('< Zone:invokeTask:setTimeout');
|
||
|
done();
|
||
|
});
|
||
|
};
|
||
|
expect(Zone.current.name).toEqual(('TestZone'));
|
||
|
cancelId = setTimeout(timeoutFn, 3);
|
||
|
if (isNode) {
|
||
|
expect(typeof cancelId.ref).toEqual(('function'));
|
||
|
expect(typeof cancelId.unref).toEqual(('function'));
|
||
|
}
|
||
|
expect(wtfMock.log[0]).toEqual('# Zone:fork("<root>::ProxyZone::WTF", "TestZone")');
|
||
|
expect(wtfMock.log[1]).toEqual('> Zone:invoke:unit-test("<root>::ProxyZone::WTF::TestZone")');
|
||
|
expect(wtfMock.log[2])
|
||
|
.toContain('# Zone:schedule:macroTask:setTimeout("<root>::ProxyZone::WTF::TestZone"');
|
||
|
}, null, undefined, 'unit-test');
|
||
|
});
|
||
|
|
||
|
it('should allow canceling of fns registered with setTimeout', function(done) {
|
||
|
const testZone = Zone.current.fork((Zone as any)['wtfZoneSpec']).fork({name: 'TestZone'});
|
||
|
testZone.run(() => {
|
||
|
const spy = jasmine.createSpy('spy');
|
||
|
const cancelId = setTimeout(spy, 0);
|
||
|
clearTimeout(cancelId);
|
||
|
setTimeout(function() {
|
||
|
expect(spy).not.toHaveBeenCalled();
|
||
|
done();
|
||
|
}, 1);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('should allow cancelation of fns registered with setTimeout after invocation', function(done) {
|
||
|
const testZone = Zone.current.fork((Zone as any)['wtfZoneSpec']).fork({name: 'TestZone'});
|
||
|
testZone.run(() => {
|
||
|
const spy = jasmine.createSpy('spy');
|
||
|
const cancelId = setTimeout(spy, 0);
|
||
|
setTimeout(function() {
|
||
|
expect(spy).toHaveBeenCalled();
|
||
|
setTimeout(function() {
|
||
|
clearTimeout(cancelId);
|
||
|
done();
|
||
|
});
|
||
|
}, 1);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('should allow cancelation of fns while the task is being executed', function(done) {
|
||
|
const spy = jasmine.createSpy('spy');
|
||
|
const cancelId = setTimeout(() => {
|
||
|
clearTimeout(cancelId);
|
||
|
done();
|
||
|
}, 0);
|
||
|
});
|
||
|
|
||
|
it('should allow cancelation of fns registered with setTimeout during invocation',
|
||
|
function(done) {
|
||
|
const testZone = Zone.current.fork((Zone as any)['wtfZoneSpec']).fork({name: 'TestZone'});
|
||
|
testZone.run(() => {
|
||
|
const cancelId = setTimeout(function() {
|
||
|
clearTimeout(cancelId);
|
||
|
done();
|
||
|
}, 0);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('should return the original timeout Id', function() {
|
||
|
// Node returns complex object from setTimeout, ignore this test.
|
||
|
if (isNode) return;
|
||
|
const cancelId = setTimeout(() => {}, 0);
|
||
|
expect(typeof cancelId).toEqual('number');
|
||
|
});
|
||
|
|
||
|
it('should allow cancelation by numeric timeout Id', function(done) {
|
||
|
// Node returns complex object from setTimeout, ignore this test.
|
||
|
if (isNode) {
|
||
|
done();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
const testZone = Zone.current.fork((Zone as any)['wtfZoneSpec']).fork({name: 'TestZone'});
|
||
|
testZone.run(() => {
|
||
|
const spy = jasmine.createSpy('spy');
|
||
|
const cancelId = setTimeout(spy, 0);
|
||
|
clearTimeout(cancelId);
|
||
|
setTimeout(function() {
|
||
|
expect(spy).not.toHaveBeenCalled();
|
||
|
done();
|
||
|
}, 1);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('should pass invalid values through', function() {
|
||
|
clearTimeout(null as any);
|
||
|
clearTimeout(<any>{});
|
||
|
});
|
||
|
});
|