123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674 |
- /**
- * @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
- */
- (function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (factory());
- }(this, (function () { 'use strict';
-
- /**
- * @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
- */
- var __read = (undefined && undefined.__read) || function (o, n) {
- var m = typeof Symbol === "function" && o[Symbol.iterator];
- if (!m) return o;
- var i = m.call(o), r, ar = [], e;
- try {
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
- }
- catch (error) { e = { error: error }; }
- finally {
- try {
- if (r && !r.done && (m = i["return"])) m.call(i);
- }
- finally { if (e) throw e.error; }
- }
- return ar;
- };
- var __spread = (undefined && undefined.__spread) || function () {
- for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
- return ar;
- };
- (function (global) {
- var OriginalDate = global.Date;
- var FakeDate = /** @class */ (function () {
- function FakeDate() {
- if (arguments.length === 0) {
- var d = new OriginalDate();
- d.setTime(FakeDate.now());
- return d;
- }
- else {
- var args = Array.prototype.slice.call(arguments);
- return new (OriginalDate.bind.apply(OriginalDate, __spread([void 0], args)))();
- }
- }
- FakeDate.now = function () {
- var fakeAsyncTestZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
- if (fakeAsyncTestZoneSpec) {
- return fakeAsyncTestZoneSpec.getCurrentRealTime() + fakeAsyncTestZoneSpec.getCurrentTime();
- }
- return OriginalDate.now.apply(this, arguments);
- };
- return FakeDate;
- }());
- FakeDate.UTC = OriginalDate.UTC;
- FakeDate.parse = OriginalDate.parse;
- // keep a reference for zone patched timer function
- var timers = {
- setTimeout: global.setTimeout,
- setInterval: global.setInterval,
- clearTimeout: global.clearTimeout,
- clearInterval: global.clearInterval
- };
- var Scheduler = /** @class */ (function () {
- function Scheduler() {
- // Next scheduler id.
- this.nextId = 1;
- // Scheduler queue with the tuple of end time and callback function - sorted by end time.
- this._schedulerQueue = [];
- // Current simulated time in millis.
- this._currentTime = 0;
- // Current real time in millis.
- this._currentRealTime = OriginalDate.now();
- }
- Scheduler.prototype.getCurrentTime = function () {
- return this._currentTime;
- };
- Scheduler.prototype.getCurrentRealTime = function () {
- return this._currentRealTime;
- };
- Scheduler.prototype.setCurrentRealTime = function (realTime) {
- this._currentRealTime = realTime;
- };
- Scheduler.prototype.scheduleFunction = function (cb, delay, args, isPeriodic, isRequestAnimationFrame, id) {
- if (args === void 0) { args = []; }
- if (isPeriodic === void 0) { isPeriodic = false; }
- if (isRequestAnimationFrame === void 0) { isRequestAnimationFrame = false; }
- if (id === void 0) { id = -1; }
- var currentId = id < 0 ? this.nextId++ : id;
- var endTime = this._currentTime + delay;
- // Insert so that scheduler queue remains sorted by end time.
- var newEntry = {
- endTime: endTime,
- id: currentId,
- func: cb,
- args: args,
- delay: delay,
- isPeriodic: isPeriodic,
- isRequestAnimationFrame: isRequestAnimationFrame
- };
- var i = 0;
- for (; i < this._schedulerQueue.length; i++) {
- var currentEntry = this._schedulerQueue[i];
- if (newEntry.endTime < currentEntry.endTime) {
- break;
- }
- }
- this._schedulerQueue.splice(i, 0, newEntry);
- return currentId;
- };
- Scheduler.prototype.removeScheduledFunctionWithId = function (id) {
- for (var i = 0; i < this._schedulerQueue.length; i++) {
- if (this._schedulerQueue[i].id == id) {
- this._schedulerQueue.splice(i, 1);
- break;
- }
- }
- };
- Scheduler.prototype.tick = function (millis, doTick) {
- if (millis === void 0) { millis = 0; }
- var finalTime = this._currentTime + millis;
- var lastCurrentTime = 0;
- if (this._schedulerQueue.length === 0 && doTick) {
- doTick(millis);
- return;
- }
- while (this._schedulerQueue.length > 0) {
- var current = this._schedulerQueue[0];
- if (finalTime < current.endTime) {
- // Done processing the queue since it's sorted by endTime.
- break;
- }
- else {
- // Time to run scheduled function. Remove it from the head of queue.
- var current_1 = this._schedulerQueue.shift();
- lastCurrentTime = this._currentTime;
- this._currentTime = current_1.endTime;
- if (doTick) {
- doTick(this._currentTime - lastCurrentTime);
- }
- var retval = current_1.func.apply(global, current_1.args);
- if (!retval) {
- // Uncaught exception in the current scheduled function. Stop processing the queue.
- break;
- }
- }
- }
- this._currentTime = finalTime;
- };
- Scheduler.prototype.flush = function (limit, flushPeriodic, doTick) {
- if (limit === void 0) { limit = 20; }
- if (flushPeriodic === void 0) { flushPeriodic = false; }
- if (flushPeriodic) {
- return this.flushPeriodic(doTick);
- }
- else {
- return this.flushNonPeriodic(limit, doTick);
- }
- };
- Scheduler.prototype.flushPeriodic = function (doTick) {
- if (this._schedulerQueue.length === 0) {
- return 0;
- }
- // Find the last task currently queued in the scheduler queue and tick
- // till that time.
- var startTime = this._currentTime;
- var lastTask = this._schedulerQueue[this._schedulerQueue.length - 1];
- this.tick(lastTask.endTime - startTime, doTick);
- return this._currentTime - startTime;
- };
- Scheduler.prototype.flushNonPeriodic = function (limit, doTick) {
- var startTime = this._currentTime;
- var lastCurrentTime = 0;
- var count = 0;
- while (this._schedulerQueue.length > 0) {
- count++;
- if (count > limit) {
- throw new Error('flush failed after reaching the limit of ' + limit +
- ' tasks. Does your code use a polling timeout?');
- }
- // flush only non-periodic timers.
- // If the only remaining tasks are periodic(or requestAnimationFrame), finish flushing.
- if (this._schedulerQueue.filter(function (task) { return !task.isPeriodic && !task.isRequestAnimationFrame; })
- .length === 0) {
- break;
- }
- var current = this._schedulerQueue.shift();
- lastCurrentTime = this._currentTime;
- this._currentTime = current.endTime;
- if (doTick) {
- // Update any secondary schedulers like Jasmine mock Date.
- doTick(this._currentTime - lastCurrentTime);
- }
- var retval = current.func.apply(global, current.args);
- if (!retval) {
- // Uncaught exception in the current scheduled function. Stop processing the queue.
- break;
- }
- }
- return this._currentTime - startTime;
- };
- return Scheduler;
- }());
- var FakeAsyncTestZoneSpec = /** @class */ (function () {
- function FakeAsyncTestZoneSpec(namePrefix, trackPendingRequestAnimationFrame, macroTaskOptions) {
- if (trackPendingRequestAnimationFrame === void 0) { trackPendingRequestAnimationFrame = false; }
- this.trackPendingRequestAnimationFrame = trackPendingRequestAnimationFrame;
- this.macroTaskOptions = macroTaskOptions;
- this._scheduler = new Scheduler();
- this._microtasks = [];
- this._lastError = null;
- this._uncaughtPromiseErrors = Promise[Zone.__symbol__('uncaughtPromiseErrors')];
- this.pendingPeriodicTimers = [];
- this.pendingTimers = [];
- this.patchDateLocked = false;
- this.properties = { 'FakeAsyncTestZoneSpec': this };
- this.name = 'fakeAsyncTestZone for ' + namePrefix;
- // in case user can't access the construction of FakeAsyncTestSpec
- // user can also define macroTaskOptions by define a global variable.
- if (!this.macroTaskOptions) {
- this.macroTaskOptions = global[Zone.__symbol__('FakeAsyncTestMacroTask')];
- }
- }
- FakeAsyncTestZoneSpec.assertInZone = function () {
- if (Zone.current.get('FakeAsyncTestZoneSpec') == null) {
- throw new Error('The code should be running in the fakeAsync zone to call this function');
- }
- };
- FakeAsyncTestZoneSpec.prototype._fnAndFlush = function (fn, completers) {
- var _this = this;
- return function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- fn.apply(global, args);
- if (_this._lastError === null) {
- if (completers.onSuccess != null) {
- completers.onSuccess.apply(global);
- }
- // Flush microtasks only on success.
- _this.flushMicrotasks();
- }
- else {
- if (completers.onError != null) {
- completers.onError.apply(global);
- }
- }
- // Return true if there were no errors, false otherwise.
- return _this._lastError === null;
- };
- };
- FakeAsyncTestZoneSpec._removeTimer = function (timers, id) {
- var index = timers.indexOf(id);
- if (index > -1) {
- timers.splice(index, 1);
- }
- };
- FakeAsyncTestZoneSpec.prototype._dequeueTimer = function (id) {
- var _this = this;
- return function () {
- FakeAsyncTestZoneSpec._removeTimer(_this.pendingTimers, id);
- };
- };
- FakeAsyncTestZoneSpec.prototype._requeuePeriodicTimer = function (fn, interval, args, id) {
- var _this = this;
- return function () {
- // Requeue the timer callback if it's not been canceled.
- if (_this.pendingPeriodicTimers.indexOf(id) !== -1) {
- _this._scheduler.scheduleFunction(fn, interval, args, true, false, id);
- }
- };
- };
- FakeAsyncTestZoneSpec.prototype._dequeuePeriodicTimer = function (id) {
- var _this = this;
- return function () {
- FakeAsyncTestZoneSpec._removeTimer(_this.pendingPeriodicTimers, id);
- };
- };
- FakeAsyncTestZoneSpec.prototype._setTimeout = function (fn, delay, args, isTimer) {
- if (isTimer === void 0) { isTimer = true; }
- var removeTimerFn = this._dequeueTimer(this._scheduler.nextId);
- // Queue the callback and dequeue the timer on success and error.
- var cb = this._fnAndFlush(fn, { onSuccess: removeTimerFn, onError: removeTimerFn });
- var id = this._scheduler.scheduleFunction(cb, delay, args, false, !isTimer);
- if (isTimer) {
- this.pendingTimers.push(id);
- }
- return id;
- };
- FakeAsyncTestZoneSpec.prototype._clearTimeout = function (id) {
- FakeAsyncTestZoneSpec._removeTimer(this.pendingTimers, id);
- this._scheduler.removeScheduledFunctionWithId(id);
- };
- FakeAsyncTestZoneSpec.prototype._setInterval = function (fn, interval, args) {
- var id = this._scheduler.nextId;
- var completers = { onSuccess: null, onError: this._dequeuePeriodicTimer(id) };
- var cb = this._fnAndFlush(fn, completers);
- // Use the callback created above to requeue on success.
- completers.onSuccess = this._requeuePeriodicTimer(cb, interval, args, id);
- // Queue the callback and dequeue the periodic timer only on error.
- this._scheduler.scheduleFunction(cb, interval, args, true);
- this.pendingPeriodicTimers.push(id);
- return id;
- };
- FakeAsyncTestZoneSpec.prototype._clearInterval = function (id) {
- FakeAsyncTestZoneSpec._removeTimer(this.pendingPeriodicTimers, id);
- this._scheduler.removeScheduledFunctionWithId(id);
- };
- FakeAsyncTestZoneSpec.prototype._resetLastErrorAndThrow = function () {
- var error = this._lastError || this._uncaughtPromiseErrors[0];
- this._uncaughtPromiseErrors.length = 0;
- this._lastError = null;
- throw error;
- };
- FakeAsyncTestZoneSpec.prototype.getCurrentTime = function () {
- return this._scheduler.getCurrentTime();
- };
- FakeAsyncTestZoneSpec.prototype.getCurrentRealTime = function () {
- return this._scheduler.getCurrentRealTime();
- };
- FakeAsyncTestZoneSpec.prototype.setCurrentRealTime = function (realTime) {
- this._scheduler.setCurrentRealTime(realTime);
- };
- FakeAsyncTestZoneSpec.patchDate = function () {
- if (global['Date'] === FakeDate) {
- // already patched
- return;
- }
- global['Date'] = FakeDate;
- FakeDate.prototype = OriginalDate.prototype;
- // try check and reset timers
- // because jasmine.clock().install() may
- // have replaced the global timer
- FakeAsyncTestZoneSpec.checkTimerPatch();
- };
- FakeAsyncTestZoneSpec.resetDate = function () {
- if (global['Date'] === FakeDate) {
- global['Date'] = OriginalDate;
- }
- };
- FakeAsyncTestZoneSpec.checkTimerPatch = function () {
- if (global.setTimeout !== timers.setTimeout) {
- global.setTimeout = timers.setTimeout;
- global.clearTimeout = timers.clearTimeout;
- }
- if (global.setInterval !== timers.setInterval) {
- global.setInterval = timers.setInterval;
- global.clearInterval = timers.clearInterval;
- }
- };
- FakeAsyncTestZoneSpec.prototype.lockDatePatch = function () {
- this.patchDateLocked = true;
- FakeAsyncTestZoneSpec.patchDate();
- };
- FakeAsyncTestZoneSpec.prototype.unlockDatePatch = function () {
- this.patchDateLocked = false;
- FakeAsyncTestZoneSpec.resetDate();
- };
- FakeAsyncTestZoneSpec.prototype.tick = function (millis, doTick) {
- if (millis === void 0) { millis = 0; }
- FakeAsyncTestZoneSpec.assertInZone();
- this.flushMicrotasks();
- this._scheduler.tick(millis, doTick);
- if (this._lastError !== null) {
- this._resetLastErrorAndThrow();
- }
- };
- FakeAsyncTestZoneSpec.prototype.flushMicrotasks = function () {
- var _this = this;
- FakeAsyncTestZoneSpec.assertInZone();
- var flushErrors = function () {
- if (_this._lastError !== null || _this._uncaughtPromiseErrors.length) {
- // If there is an error stop processing the microtask queue and rethrow the error.
- _this._resetLastErrorAndThrow();
- }
- };
- while (this._microtasks.length > 0) {
- var microtask = this._microtasks.shift();
- microtask.func.apply(microtask.target, microtask.args);
- }
- flushErrors();
- };
- FakeAsyncTestZoneSpec.prototype.flush = function (limit, flushPeriodic, doTick) {
- FakeAsyncTestZoneSpec.assertInZone();
- this.flushMicrotasks();
- var elapsed = this._scheduler.flush(limit, flushPeriodic, doTick);
- if (this._lastError !== null) {
- this._resetLastErrorAndThrow();
- }
- return elapsed;
- };
- FakeAsyncTestZoneSpec.prototype.onScheduleTask = function (delegate, current, target, task) {
- switch (task.type) {
- case 'microTask':
- var args = task.data && task.data.args;
- // should pass additional arguments to callback if have any
- // currently we know process.nextTick will have such additional
- // arguments
- var additionalArgs = void 0;
- if (args) {
- var callbackIndex = task.data.cbIdx;
- if (typeof args.length === 'number' && args.length > callbackIndex + 1) {
- additionalArgs = Array.prototype.slice.call(args, callbackIndex + 1);
- }
- }
- this._microtasks.push({
- func: task.invoke,
- args: additionalArgs,
- target: task.data && task.data.target
- });
- break;
- case 'macroTask':
- switch (task.source) {
- case 'setTimeout':
- task.data['handleId'] = this._setTimeout(task.invoke, task.data['delay'], Array.prototype.slice.call(task.data['args'], 2));
- break;
- case 'setImmediate':
- task.data['handleId'] = this._setTimeout(task.invoke, 0, Array.prototype.slice.call(task.data['args'], 1));
- break;
- case 'setInterval':
- task.data['handleId'] = this._setInterval(task.invoke, task.data['delay'], Array.prototype.slice.call(task.data['args'], 2));
- break;
- case 'XMLHttpRequest.send':
- throw new Error('Cannot make XHRs from within a fake async test. Request URL: ' +
- task.data['url']);
- case 'requestAnimationFrame':
- case 'webkitRequestAnimationFrame':
- case 'mozRequestAnimationFrame':
- // Simulate a requestAnimationFrame by using a setTimeout with 16 ms.
- // (60 frames per second)
- task.data['handleId'] = this._setTimeout(task.invoke, 16, task.data['args'], this.trackPendingRequestAnimationFrame);
- break;
- default:
- // user can define which macroTask they want to support by passing
- // macroTaskOptions
- var macroTaskOption = this.findMacroTaskOption(task);
- if (macroTaskOption) {
- var args_1 = task.data && task.data['args'];
- var delay = args_1 && args_1.length > 1 ? args_1[1] : 0;
- var callbackArgs = macroTaskOption.callbackArgs ? macroTaskOption.callbackArgs : args_1;
- if (!!macroTaskOption.isPeriodic) {
- // periodic macroTask, use setInterval to simulate
- task.data['handleId'] = this._setInterval(task.invoke, delay, callbackArgs);
- task.data.isPeriodic = true;
- }
- else {
- // not periodic, use setTimeout to simulate
- task.data['handleId'] = this._setTimeout(task.invoke, delay, callbackArgs);
- }
- break;
- }
- throw new Error('Unknown macroTask scheduled in fake async test: ' + task.source);
- }
- break;
- case 'eventTask':
- task = delegate.scheduleTask(target, task);
- break;
- }
- return task;
- };
- FakeAsyncTestZoneSpec.prototype.onCancelTask = function (delegate, current, target, task) {
- switch (task.source) {
- case 'setTimeout':
- case 'requestAnimationFrame':
- case 'webkitRequestAnimationFrame':
- case 'mozRequestAnimationFrame':
- return this._clearTimeout(task.data['handleId']);
- case 'setInterval':
- return this._clearInterval(task.data['handleId']);
- default:
- // user can define which macroTask they want to support by passing
- // macroTaskOptions
- var macroTaskOption = this.findMacroTaskOption(task);
- if (macroTaskOption) {
- var handleId = task.data['handleId'];
- return macroTaskOption.isPeriodic ? this._clearInterval(handleId) :
- this._clearTimeout(handleId);
- }
- return delegate.cancelTask(target, task);
- }
- };
- FakeAsyncTestZoneSpec.prototype.onInvoke = function (delegate, current, target, callback, applyThis, applyArgs, source) {
- try {
- FakeAsyncTestZoneSpec.patchDate();
- return delegate.invoke(target, callback, applyThis, applyArgs, source);
- }
- finally {
- if (!this.patchDateLocked) {
- FakeAsyncTestZoneSpec.resetDate();
- }
- }
- };
- FakeAsyncTestZoneSpec.prototype.findMacroTaskOption = function (task) {
- if (!this.macroTaskOptions) {
- return null;
- }
- for (var i = 0; i < this.macroTaskOptions.length; i++) {
- var macroTaskOption = this.macroTaskOptions[i];
- if (macroTaskOption.source === task.source) {
- return macroTaskOption;
- }
- }
- return null;
- };
- FakeAsyncTestZoneSpec.prototype.onHandleError = function (parentZoneDelegate, currentZone, targetZone, error) {
- this._lastError = error;
- return false; // Don't propagate error to parent zone.
- };
- return FakeAsyncTestZoneSpec;
- }());
- // Export the class so that new instances can be created with proper
- // constructor params.
- Zone['FakeAsyncTestZoneSpec'] = FakeAsyncTestZoneSpec;
- })(typeof window === 'object' && window || typeof self === 'object' && self || global);
-
- /**
- * @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
- */
- Zone.__load_patch('fakeasync', function (global, Zone, api) {
- var FakeAsyncTestZoneSpec = Zone && Zone['FakeAsyncTestZoneSpec'];
- var ProxyZoneSpec = Zone && Zone['ProxyZoneSpec'];
- var _fakeAsyncTestZoneSpec = null;
- /**
- * Clears out the shared fake async zone for a test.
- * To be called in a global `beforeEach`.
- *
- * @experimental
- */
- function resetFakeAsyncZone() {
- if (_fakeAsyncTestZoneSpec) {
- _fakeAsyncTestZoneSpec.unlockDatePatch();
- }
- _fakeAsyncTestZoneSpec = null;
- // in node.js testing we may not have ProxyZoneSpec in which case there is nothing to reset.
- ProxyZoneSpec && ProxyZoneSpec.assertPresent().resetDelegate();
- }
- /**
- * Wraps a function to be executed in the fakeAsync zone:
- * - microtasks are manually executed by calling `flushMicrotasks()`,
- * - timers are synchronous, `tick()` simulates the asynchronous passage of time.
- *
- * If there are any pending timers at the end of the function, an exception will be thrown.
- *
- * Can be used to wrap inject() calls.
- *
- * ## Example
- *
- * {@example core/testing/ts/fake_async.ts region='basic'}
- *
- * @param fn
- * @returns The function wrapped to be executed in the fakeAsync zone
- *
- * @experimental
- */
- function fakeAsync(fn) {
- // Not using an arrow function to preserve context passed from call site
- return function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- var proxyZoneSpec = ProxyZoneSpec.assertPresent();
- if (Zone.current.get('FakeAsyncTestZoneSpec')) {
- throw new Error('fakeAsync() calls can not be nested');
- }
- try {
- // in case jasmine.clock init a fakeAsyncTestZoneSpec
- if (!_fakeAsyncTestZoneSpec) {
- if (proxyZoneSpec.getDelegate() instanceof FakeAsyncTestZoneSpec) {
- throw new Error('fakeAsync() calls can not be nested');
- }
- _fakeAsyncTestZoneSpec = new FakeAsyncTestZoneSpec();
- }
- var res = void 0;
- var lastProxyZoneSpec = proxyZoneSpec.getDelegate();
- proxyZoneSpec.setDelegate(_fakeAsyncTestZoneSpec);
- _fakeAsyncTestZoneSpec.lockDatePatch();
- try {
- res = fn.apply(this, args);
- flushMicrotasks();
- }
- finally {
- proxyZoneSpec.setDelegate(lastProxyZoneSpec);
- }
- if (_fakeAsyncTestZoneSpec.pendingPeriodicTimers.length > 0) {
- throw new Error(_fakeAsyncTestZoneSpec.pendingPeriodicTimers.length + " " +
- "periodic timer(s) still in the queue.");
- }
- if (_fakeAsyncTestZoneSpec.pendingTimers.length > 0) {
- throw new Error(_fakeAsyncTestZoneSpec.pendingTimers.length + " timer(s) still in the queue.");
- }
- return res;
- }
- finally {
- resetFakeAsyncZone();
- }
- };
- }
- function _getFakeAsyncZoneSpec() {
- if (_fakeAsyncTestZoneSpec == null) {
- _fakeAsyncTestZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
- if (_fakeAsyncTestZoneSpec == null) {
- throw new Error('The code should be running in the fakeAsync zone to call this function');
- }
- }
- return _fakeAsyncTestZoneSpec;
- }
- /**
- * Simulates the asynchronous passage of time for the timers in the fakeAsync zone.
- *
- * The microtasks queue is drained at the very start of this function and after any timer callback
- * has been executed.
- *
- * ## Example
- *
- * {@example core/testing/ts/fake_async.ts region='basic'}
- *
- * @experimental
- */
- function tick(millis) {
- if (millis === void 0) { millis = 0; }
- _getFakeAsyncZoneSpec().tick(millis);
- }
- /**
- * Simulates the asynchronous passage of time for the timers in the fakeAsync zone by
- * draining the macrotask queue until it is empty. The returned value is the milliseconds
- * of time that would have been elapsed.
- *
- * @param maxTurns
- * @returns The simulated time elapsed, in millis.
- *
- * @experimental
- */
- function flush(maxTurns) {
- return _getFakeAsyncZoneSpec().flush(maxTurns);
- }
- /**
- * Discard all remaining periodic tasks.
- *
- * @experimental
- */
- function discardPeriodicTasks() {
- var zoneSpec = _getFakeAsyncZoneSpec();
- var pendingTimers = zoneSpec.pendingPeriodicTimers;
- zoneSpec.pendingPeriodicTimers.length = 0;
- }
- /**
- * Flush any pending microtasks.
- *
- * @experimental
- */
- function flushMicrotasks() {
- _getFakeAsyncZoneSpec().flushMicrotasks();
- }
- Zone[api.symbol('fakeAsyncTest')] =
- { resetFakeAsyncZone: resetFakeAsyncZone, flushMicrotasks: flushMicrotasks, discardPeriodicTasks: discardPeriodicTasks, tick: tick, flush: flush, fakeAsync: fakeAsync };
- });
-
- })));
|