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>{});
 | 
						|
  });
 | 
						|
});
 |