JiaLiPassion c53f19ac47 refactor(zone.js): rename several internal apis in fake async zone spec (#39127)
In `FakeAsyncZoneSpec`, there are several variables and APIs to identify
different times, and the names are confusing, in this commit, they are
renamed for more clear understandings.

1. currentTickTime, the tick millis advanced.
2. getFakeBaseSystemTime(), return the fake base system time.
3. setFakeBaseSystemTime(), set the fake base system time.
4. getRealSystemTime(), get the underlying native system time.

PR Close #39127
2020-10-13 15:56:22 -07:00

423 lines
12 KiB
JavaScript

function assertInsideProxyZone() {
expect(Zone.current.name).toEqual('ProxyZone');
}
function assertInsideSyncDescribeZone() {
expect(Zone.current.name).toEqual('syncTestZone for jest.describe');
}
describe('describe', () => {
assertInsideSyncDescribeZone();
beforeEach(() => {
assertInsideProxyZone();
});
beforeAll(() => {
assertInsideProxyZone();
});
afterEach(() => {
assertInsideProxyZone();
});
afterAll(() => {
assertInsideProxyZone();
});
});
describe.each([[1, 2]])('describe.each', (arg1, arg2) => {
assertInsideSyncDescribeZone();
expect(arg1).toBe(1);
expect(arg2).toBe(2);
});
describe('test', () => {
it('it', () => {
assertInsideProxyZone();
});
it.each([[1, 2]])('it.each', (arg1, arg2) => {
assertInsideProxyZone();
expect(arg1).toBe(1);
expect(arg2).toBe(2);
});
test('test', () => {
assertInsideProxyZone();
});
test.each([[]])('test.each', () => {
assertInsideProxyZone();
});
});
it('it', () => {
assertInsideProxyZone();
});
it('it with done', done => {
assertInsideProxyZone();
done();
});
it.each([[1, 2]])('it.each', (arg1, arg2, done) => {
assertInsideProxyZone();
expect(arg1).toBe(1);
expect(arg2).toBe(2);
done();
});
it.each([2])('it.each with 1D array', arg1 => {
assertInsideProxyZone();
expect(arg1).toBe(2);
});
it.each([2])('it.each with 1D array and done', (arg1, done) => {
assertInsideProxyZone();
expect(arg1).toBe(2);
done();
});
it.each`
foo | bar
${1} | ${2}
`('it.each should work with table as a tagged template literal', ({foo, bar}) => {
expect(foo).toBe(1);
expect(bar).toBe(2);
});
it.each`
foo | bar
${1} | ${2}
`('it.each should work with table as a tagged template literal with done', ({foo, bar}, done) => {
expect(foo).toBe(1);
expect(bar).toBe(2);
done();
});
it.each`
foo | bar
${1} | ${2}
`('(async) it.each should work with table as a tagged template literal', async ({foo, bar}) => {
expect(foo).toBe(1);
expect(bar).toBe(2);
});
test('test', () => {
assertInsideProxyZone();
});
test.each([[]])('test.each', () => {
assertInsideProxyZone();
});
test.todo('todo');
function enableJestPatch() {
global[Zone.__symbol__('fakeAsyncDisablePatchingFakeTimer')] = true;
}
function disableJestPatch() {
global[Zone.__symbol__('fakeAsyncDisablePatchingFakeTimer')] = false;
}
const {resetFakeAsyncZone, flushMicrotasks, discardPeriodicTasks, tick, flush, fakeAsync} =
Zone[Zone.__symbol__('fakeAsyncTest')];
describe('jest modern fakeTimers with zone.js fakeAsync', () => {
beforeEach(() => {
jest.useFakeTimers('modern');
});
afterEach(() => {
jest.useRealTimers();
});
test('should run into fakeAsync() automatically', () => {
const fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
expect(fakeAsyncZoneSpec).toBeTruthy();
expect(typeof fakeAsyncZoneSpec.tick).toEqual('function');
});
test('setSystemTime should set FakeDate.currentFakeTime', () => {
const fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
let d = fakeAsyncZoneSpec.getRealSystemTime();
jest.setSystemTime(d);
expect(Date.now()).toEqual(d);
for (let i = 0; i < 100000; i++) {
}
expect(fakeAsyncZoneSpec.getRealSystemTime()).not.toEqual(d);
d = fakeAsyncZoneSpec.getRealSystemTime();
let timeoutTriggered = false;
setTimeout(() => {
timeoutTriggered = true;
}, 100);
jest.setSystemTime(d);
tick(100);
expect(timeoutTriggered).toBe(true);
expect(Date.now()).toEqual(d + 100);
});
test('runAllTicks should run all microTasks', () => {
const logs = [];
Promise.resolve(1).then(v => logs.push(v));
expect(logs).toEqual([]);
jest.runAllTicks();
expect(logs).toEqual([1]);
});
test('runAllTimers should run all macroTasks', () => {
const logs = [];
Promise.resolve(1).then(v => logs.push(v));
setTimeout(() => {logs.push('timeout')});
const id = setInterval(() => {logs.push('interval')}, 100);
expect(logs).toEqual([]);
jest.runAllTimers();
expect(logs).toEqual([1, 'timeout', 'interval']);
clearInterval(id);
});
test('advanceTimersByTime should act as tick', () => {
const logs = [];
setTimeout(() => {logs.push('timeout')}, 100);
expect(logs).toEqual([]);
jest.advanceTimersByTime(100);
expect(logs).toEqual(['timeout']);
});
test('runOnlyPendingTimers should run all macroTasks and ignore new spawn macroTasks', () => {
const logs = [];
Promise.resolve(1).then(v => logs.push(v));
let nestedTimeoutId;
setTimeout(() => {
logs.push('timeout');
nestedTimeoutId = setTimeout(() => {logs.push('new timeout')});
});
expect(logs).toEqual([]);
jest.runOnlyPendingTimers();
expect(logs).toEqual([1, 'timeout']);
clearTimeout(nestedTimeoutId);
});
test('advanceTimersToNextTimer should trigger correctly', () => {
const logs = [];
setTimeout(() => {logs.push('timeout1')}, 100);
setTimeout(() => {logs.push('timeout11')}, 100);
setTimeout(() => {logs.push('timeout2')}, 200);
setTimeout(() => {logs.push('timeout3')}, 300);
expect(logs).toEqual([]);
jest.advanceTimersToNextTimer();
expect(logs).toEqual(['timeout1', 'timeout11']);
jest.advanceTimersToNextTimer(2);
expect(logs).toEqual(['timeout1', 'timeout11', 'timeout2', 'timeout3']);
});
test('clearAllTimers should clear all macroTasks', () => {
const logs = [];
setTimeout(() => {logs.push('timeout1')}, 100);
setTimeout(() => {logs.push('timeout2')}, 200);
setInterval(() => {logs.push('interval')}, 100);
expect(logs).toEqual([]);
jest.clearAllTimers();
jest.advanceTimersByTime(300);
expect(logs).toEqual([]);
});
test('getTimerCount should get the count of macroTasks correctly', () => {
const logs = [];
setTimeout(() => {logs.push('timeout1')}, 100);
setTimeout(() => {logs.push('timeout2')}, 200);
setInterval(() => {logs.push('interval')}, 100);
expect(logs).toEqual([]);
expect(jest.getTimerCount()).toEqual(3);
jest.clearAllTimers();
});
});
describe('jest legacy fakeTimers with zone.js fakeAsync', () => {
beforeEach(() => {
jest.useFakeTimers();
});
afterEach(() => {
jest.useRealTimers();
});
test('should run into fakeAsync() automatically', () => {
const fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
expect(fakeAsyncZoneSpec).toBeTruthy();
expect(typeof fakeAsyncZoneSpec.tick).toEqual('function');
});
test('setSystemTime should set FakeDate.currentRealTime', () => {
const d = Date.now();
expect(() => {jest.setSystemTime(d)}).toThrow();
});
test('runAllTicks should run all microTasks', () => {
const logs = [];
Promise.resolve(1).then(v => logs.push(v));
expect(logs).toEqual([]);
jest.runAllTicks();
expect(logs).toEqual([1]);
});
test('runAllTimers should run all macroTasks', () => {
const logs = [];
Promise.resolve(1).then(v => logs.push(v));
setTimeout(() => {logs.push('timeout')});
const id = setInterval(() => {logs.push('interval')}, 100);
expect(logs).toEqual([]);
jest.runAllTimers();
expect(logs).toEqual([1, 'timeout', 'interval']);
clearInterval(id);
});
test('advanceTimersByTime should act as tick', () => {
const logs = [];
setTimeout(() => {logs.push('timeout')}, 100);
expect(logs).toEqual([]);
jest.advanceTimersByTime(100);
expect(logs).toEqual(['timeout']);
});
test('runOnlyPendingTimers should run all macroTasks and ignore new spawn macroTasks', () => {
const logs = [];
Promise.resolve(1).then(v => logs.push(v));
let nestedTimeoutId;
setTimeout(() => {
logs.push('timeout');
nestedTimeoutId = setTimeout(() => {logs.push('new timeout')});
});
expect(logs).toEqual([]);
jest.runOnlyPendingTimers();
expect(logs).toEqual([1, 'timeout']);
clearTimeout(nestedTimeoutId);
});
test('advanceTimersToNextTimer should trigger correctly', () => {
const logs = [];
setTimeout(() => {logs.push('timeout1')}, 100);
setTimeout(() => {logs.push('timeout11')}, 100);
setTimeout(() => {logs.push('timeout2')}, 200);
setTimeout(() => {logs.push('timeout3')}, 300);
expect(logs).toEqual([]);
jest.advanceTimersToNextTimer();
expect(logs).toEqual(['timeout1', 'timeout11']);
jest.advanceTimersToNextTimer(2);
expect(logs).toEqual(['timeout1', 'timeout11', 'timeout2', 'timeout3']);
});
test('clearAllTimers should clear all macroTasks', () => {
const logs = [];
setTimeout(() => {logs.push('timeout1')}, 100);
setTimeout(() => {logs.push('timeout2')}, 200);
setInterval(() => {logs.push('interval')}, 100);
expect(logs).toEqual([]);
jest.clearAllTimers();
jest.advanceTimersByTime(300);
expect(logs).toEqual([]);
});
test('getTimerCount should get the count of macroTasks correctly', () => {
const logs = [];
setTimeout(() => {logs.push('timeout1')}, 100);
setTimeout(() => {logs.push('timeout2')}, 200);
setInterval(() => {logs.push('interval')}, 100);
expect(logs).toEqual([]);
expect(jest.getTimerCount()).toEqual(3);
jest.clearAllTimers();
});
});
describe('jest fakeTimers inside test should call native delegate', () => {
test('setSystemTime should set FakeDate.currentRealTime', () => {
let fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
expect(fakeAsyncZoneSpec).toBeFalsy();
jest.useFakeTimers('modern');
fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
expect(fakeAsyncZoneSpec).toBeFalsy();
const d = Date.now();
jest.setSystemTime(d);
for (let i = 0; i < 100000; i++) {
}
expect(jest.getRealSystemTime()).not.toEqual(d);
jest.useRealTimers();
});
test('runAllTicks should run all microTasks', () => {
jest.useFakeTimers();
const logs = [];
process.nextTick(() => {logs.push(1)});
expect(logs).toEqual([]);
jest.runAllTicks();
expect(logs).toEqual([1]);
jest.useRealTimers();
});
test('runAllTimers should run all macroTasks', () => {
jest.useFakeTimers();
const logs = [];
process.nextTick(() => {logs.push(1)});
setTimeout(() => {logs.push('timeout')});
const id = setInterval(() => {
logs.push('interval');
clearInterval(id);
}, 100);
expect(logs).toEqual([]);
jest.runAllTimers();
expect(logs).toEqual([1, 'timeout', 'interval']);
jest.useRealTimers();
});
test('advanceTimersByTime should act as tick', () => {
jest.useFakeTimers();
const logs = [];
setTimeout(() => {logs.push('timeout')}, 100);
expect(logs).toEqual([]);
jest.advanceTimersByTime(100);
expect(logs).toEqual(['timeout']);
jest.useRealTimers();
});
test('runOnlyPendingTimers should run all macroTasks and ignore new spawn macroTasks', () => {
jest.useFakeTimers();
const logs = [];
let nestedTimeoutId;
setTimeout(() => {
logs.push('timeout');
nestedTimeoutId = setTimeout(() => {logs.push('new timeout')});
});
expect(logs).toEqual([]);
jest.runOnlyPendingTimers();
expect(logs).toEqual(['timeout']);
clearTimeout(nestedTimeoutId);
jest.useRealTimers();
});
test('advanceTimersToNextTimer should trigger correctly', () => {
jest.useFakeTimers();
const logs = [];
setTimeout(() => {logs.push('timeout1')}, 100);
setTimeout(() => {logs.push('timeout11')}, 100);
setTimeout(() => {logs.push('timeout2')}, 200);
setTimeout(() => {logs.push('timeout3')}, 300);
expect(logs).toEqual([]);
jest.advanceTimersToNextTimer();
expect(logs).toEqual(['timeout1', 'timeout11']);
jest.advanceTimersToNextTimer(2);
expect(logs).toEqual(['timeout1', 'timeout11', 'timeout2', 'timeout3']);
jest.useRealTimers();
});
test('clearAllTimers should clear all macroTasks', () => {
jest.useFakeTimers();
const logs = [];
setTimeout(() => {logs.push('timeout1')}, 100);
setTimeout(() => {logs.push('timeout2')}, 200);
setInterval(() => {logs.push('interval')}, 100);
expect(logs).toEqual([]);
jest.clearAllTimers();
jest.advanceTimersByTime(300);
expect(logs).toEqual([]);
jest.useRealTimers();
});
test('getTimerCount should get the count of macroTasks correctly', () => {
jest.useFakeTimers();
const logs = [];
setTimeout(() => {logs.push('timeout1')}, 100);
setTimeout(() => {logs.push('timeout2')}, 200);
setInterval(() => {logs.push('interval')}, 100);
expect(logs).toEqual([]);
expect(jest.getTimerCount()).toEqual(3);
jest.clearAllTimers();
jest.useRealTimers();
});
});