blob: 976ed53a36d3f413c3c92934625537407628e5e1 [file] [log] [blame]
'use strict';
Object.defineProperty(exports, '__esModule', {
value: true
});
exports.default = void 0;
function _fakeTimers() {
const data = require('@sinonjs/fake-timers');
_fakeTimers = function () {
return data;
};
return data;
}
function _jestMessageUtil() {
const data = require('jest-message-util');
_jestMessageUtil = function () {
return data;
};
return data;
}
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
class FakeTimers {
constructor({global, config, maxLoops}) {
_defineProperty(this, '_clock', void 0);
_defineProperty(this, '_config', void 0);
_defineProperty(this, '_fakingTime', void 0);
_defineProperty(this, '_global', void 0);
_defineProperty(this, '_fakeTimers', void 0);
_defineProperty(this, '_maxLoops', void 0);
this._global = global;
this._config = config;
this._maxLoops = maxLoops || 100000;
this._fakingTime = false;
this._fakeTimers = (0, _fakeTimers().withGlobal)(global);
}
clearAllTimers() {
if (this._fakingTime) {
this._clock.reset();
}
}
dispose() {
this.useRealTimers();
}
runAllTimers() {
if (this._checkFakeTimers()) {
this._clock.runAll();
}
}
runOnlyPendingTimers() {
if (this._checkFakeTimers()) {
this._clock.runToLast();
}
}
advanceTimersToNextTimer(steps = 1) {
if (this._checkFakeTimers()) {
for (let i = steps; i > 0; i--) {
this._clock.next(); // Fire all timers at this point: https://github.com/sinonjs/fake-timers/issues/250
this._clock.tick(0);
if (this._clock.countTimers() === 0) {
break;
}
}
}
}
advanceTimersByTime(msToRun) {
if (this._checkFakeTimers()) {
this._clock.tick(msToRun);
}
}
runAllTicks() {
if (this._checkFakeTimers()) {
// @ts-expect-error
this._clock.runMicrotasks();
}
}
useRealTimers() {
if (this._fakingTime) {
this._clock.uninstall();
this._fakingTime = false;
}
}
useFakeTimers() {
if (!this._fakingTime) {
const toFake = Object.keys(this._fakeTimers.timers);
this._clock = this._fakeTimers.install({
loopLimit: this._maxLoops,
now: Date.now(),
target: this._global,
toFake
});
this._fakingTime = true;
}
}
reset() {
if (this._checkFakeTimers()) {
const {now} = this._clock;
this._clock.reset();
this._clock.setSystemTime(now);
}
}
setSystemTime(now) {
if (this._checkFakeTimers()) {
this._clock.setSystemTime(now);
}
}
getRealSystemTime() {
return Date.now();
}
getTimerCount() {
if (this._checkFakeTimers()) {
return this._clock.countTimers();
}
return 0;
}
_checkFakeTimers() {
if (!this._fakingTime) {
this._global.console.warn(
'A function to advance timers was called but the timers API is not ' +
'mocked with fake timers. Call `jest.useFakeTimers()` in this test or ' +
'enable fake timers globally by setting `"timers": "fake"` in the ' +
'configuration file\nStack Trace:\n' +
(0, _jestMessageUtil().formatStackTrace)(
new Error().stack,
this._config,
{
noStackTrace: false
}
)
);
}
return this._fakingTime;
}
}
exports.default = FakeTimers;