1 /** PURE_IMPORTS_START tslib,_Observable,_Notification,_ColdObservable,_HotObservable,_SubscriptionLog,_scheduler_VirtualTimeScheduler,_scheduler_AsyncScheduler PURE_IMPORTS_END */
2 import * as tslib_1 from "tslib";
3 import { Observable } from '../Observable';
4 import { Notification } from '../Notification';
5 import { ColdObservable } from './ColdObservable';
6 import { HotObservable } from './HotObservable';
7 import { SubscriptionLog } from './SubscriptionLog';
8 import { VirtualTimeScheduler, VirtualAction } from '../scheduler/VirtualTimeScheduler';
9 import { AsyncScheduler } from '../scheduler/AsyncScheduler';
10 var defaultMaxFrame = 750;
11 var TestScheduler = /*@__PURE__*/ (function (_super) {
12 tslib_1.__extends(TestScheduler, _super);
13 function TestScheduler(assertDeepEqual) {
14 var _this = _super.call(this, VirtualAction, defaultMaxFrame) || this;
15 _this.assertDeepEqual = assertDeepEqual;
16 _this.hotObservables = [];
17 _this.coldObservables = [];
18 _this.flushTests = [];
19 _this.runMode = false;
22 TestScheduler.prototype.createTime = function (marbles) {
23 var indexOf = marbles.indexOf('|');
25 throw new Error('marble diagram for time should have a completion marker "|"');
27 return indexOf * TestScheduler.frameTimeFactor;
29 TestScheduler.prototype.createColdObservable = function (marbles, values, error) {
30 if (marbles.indexOf('^') !== -1) {
31 throw new Error('cold observable cannot have subscription offset "^"');
33 if (marbles.indexOf('!') !== -1) {
34 throw new Error('cold observable cannot have unsubscription marker "!"');
36 var messages = TestScheduler.parseMarbles(marbles, values, error, undefined, this.runMode);
37 var cold = new ColdObservable(messages, this);
38 this.coldObservables.push(cold);
41 TestScheduler.prototype.createHotObservable = function (marbles, values, error) {
42 if (marbles.indexOf('!') !== -1) {
43 throw new Error('hot observable cannot have unsubscription marker "!"');
45 var messages = TestScheduler.parseMarbles(marbles, values, error, undefined, this.runMode);
46 var subject = new HotObservable(messages, this);
47 this.hotObservables.push(subject);
50 TestScheduler.prototype.materializeInnerObservable = function (observable, outerFrame) {
53 observable.subscribe(function (value) {
54 messages.push({ frame: _this.frame - outerFrame, notification: Notification.createNext(value) });
56 messages.push({ frame: _this.frame - outerFrame, notification: Notification.createError(err) });
58 messages.push({ frame: _this.frame - outerFrame, notification: Notification.createComplete() });
62 TestScheduler.prototype.expectObservable = function (observable, subscriptionMarbles) {
64 if (subscriptionMarbles === void 0) {
65 subscriptionMarbles = null;
68 var flushTest = { actual: actual, ready: false };
69 var subscriptionParsed = TestScheduler.parseMarblesAsSubscriptions(subscriptionMarbles, this.runMode);
70 var subscriptionFrame = subscriptionParsed.subscribedFrame === Number.POSITIVE_INFINITY ?
71 0 : subscriptionParsed.subscribedFrame;
72 var unsubscriptionFrame = subscriptionParsed.unsubscribedFrame;
74 this.schedule(function () {
75 subscription = observable.subscribe(function (x) {
77 if (x instanceof Observable) {
78 value = _this.materializeInnerObservable(value, _this.frame);
80 actual.push({ frame: _this.frame, notification: Notification.createNext(value) });
82 actual.push({ frame: _this.frame, notification: Notification.createError(err) });
84 actual.push({ frame: _this.frame, notification: Notification.createComplete() });
86 }, subscriptionFrame);
87 if (unsubscriptionFrame !== Number.POSITIVE_INFINITY) {
88 this.schedule(function () { return subscription.unsubscribe(); }, unsubscriptionFrame);
90 this.flushTests.push(flushTest);
91 var runMode = this.runMode;
93 toBe: function (marbles, values, errorValue) {
94 flushTest.ready = true;
95 flushTest.expected = TestScheduler.parseMarbles(marbles, values, errorValue, true, runMode);
99 TestScheduler.prototype.expectSubscriptions = function (actualSubscriptionLogs) {
100 var flushTest = { actual: actualSubscriptionLogs, ready: false };
101 this.flushTests.push(flushTest);
102 var runMode = this.runMode;
104 toBe: function (marbles) {
105 var marblesArray = (typeof marbles === 'string') ? [marbles] : marbles;
106 flushTest.ready = true;
107 flushTest.expected = marblesArray.map(function (marbles) {
108 return TestScheduler.parseMarblesAsSubscriptions(marbles, runMode);
113 TestScheduler.prototype.flush = function () {
115 var hotObservables = this.hotObservables;
116 while (hotObservables.length > 0) {
117 hotObservables.shift().setup();
119 _super.prototype.flush.call(this);
120 this.flushTests = this.flushTests.filter(function (test) {
122 _this.assertDeepEqual(test.actual, test.expected);
128 TestScheduler.parseMarblesAsSubscriptions = function (marbles, runMode) {
130 if (runMode === void 0) {
133 if (typeof marbles !== 'string') {
134 return new SubscriptionLog(Number.POSITIVE_INFINITY);
136 var len = marbles.length;
138 var subscriptionFrame = Number.POSITIVE_INFINITY;
139 var unsubscriptionFrame = Number.POSITIVE_INFINITY;
141 var _loop_1 = function (i) {
142 var nextFrame = frame;
143 var advanceFrameBy = function (count) {
144 nextFrame += count * _this.frameTimeFactor;
165 if (subscriptionFrame !== Number.POSITIVE_INFINITY) {
166 throw new Error('found a second subscription point \'^\' in a ' +
167 'subscription marble diagram. There can only be one.');
169 subscriptionFrame = groupStart > -1 ? groupStart : frame;
173 if (unsubscriptionFrame !== Number.POSITIVE_INFINITY) {
174 throw new Error('found a second subscription point \'^\' in a ' +
175 'subscription marble diagram. There can only be one.');
177 unsubscriptionFrame = groupStart > -1 ? groupStart : frame;
180 if (runMode && c.match(/^[0-9]$/)) {
181 if (i === 0 || marbles[i - 1] === ' ') {
182 var buffer = marbles.slice(i);
183 var match = buffer.match(/^([0-9]+(?:\.[0-9]+)?)(ms|s|m) /);
185 i += match[0].length - 1;
186 var duration = parseFloat(match[1]);
188 var durationInMs = void 0;
191 durationInMs = duration;
194 durationInMs = duration * 1000;
197 durationInMs = duration * 1000 * 60;
202 advanceFrameBy(durationInMs / this_1.frameTimeFactor);
207 throw new Error('there can only be \'^\' and \'!\' markers in a ' +
208 'subscription marble diagram. Found instead \'' + c + '\'.');
213 var this_1 = this, out_i_1;
214 for (var i = 0; i < len; i++) {
218 if (unsubscriptionFrame < 0) {
219 return new SubscriptionLog(subscriptionFrame);
222 return new SubscriptionLog(subscriptionFrame, unsubscriptionFrame);
225 TestScheduler.parseMarbles = function (marbles, values, errorValue, materializeInnerObservables, runMode) {
227 if (materializeInnerObservables === void 0) {
228 materializeInnerObservables = false;
230 if (runMode === void 0) {
233 if (marbles.indexOf('!') !== -1) {
234 throw new Error('conventional marble diagrams cannot have the ' +
235 'unsubscription marker "!"');
237 var len = marbles.length;
238 var testMessages = [];
239 var subIndex = runMode ? marbles.replace(/^[ ]+/, '').indexOf('^') : marbles.indexOf('^');
240 var frame = subIndex === -1 ? 0 : (subIndex * -this.frameTimeFactor);
241 var getValue = typeof values !== 'object' ?
242 function (x) { return x; } :
244 if (materializeInnerObservables && values[x] instanceof ColdObservable) {
245 return values[x].messages;
250 var _loop_2 = function (i) {
251 var nextFrame = frame;
252 var advanceFrameBy = function (count) {
253 nextFrame += count * _this.frameTimeFactor;
255 var notification = void 0;
275 notification = Notification.createComplete();
282 notification = Notification.createError(errorValue || 'error');
286 if (runMode && c.match(/^[0-9]$/)) {
287 if (i === 0 || marbles[i - 1] === ' ') {
288 var buffer = marbles.slice(i);
289 var match = buffer.match(/^([0-9]+(?:\.[0-9]+)?)(ms|s|m) /);
291 i += match[0].length - 1;
292 var duration = parseFloat(match[1]);
294 var durationInMs = void 0;
297 durationInMs = duration;
300 durationInMs = duration * 1000;
303 durationInMs = duration * 1000 * 60;
308 advanceFrameBy(durationInMs / this_2.frameTimeFactor);
313 notification = Notification.createNext(getValue(c));
318 testMessages.push({ frame: groupStart > -1 ? groupStart : frame, notification: notification });
323 var this_2 = this, out_i_2;
324 for (var i = 0; i < len; i++) {
330 TestScheduler.prototype.run = function (callback) {
331 var prevFrameTimeFactor = TestScheduler.frameTimeFactor;
332 var prevMaxFrames = this.maxFrames;
333 TestScheduler.frameTimeFactor = 1;
334 this.maxFrames = Number.POSITIVE_INFINITY;
336 AsyncScheduler.delegate = this;
338 cold: this.createColdObservable.bind(this),
339 hot: this.createHotObservable.bind(this),
340 flush: this.flush.bind(this),
341 expectObservable: this.expectObservable.bind(this),
342 expectSubscriptions: this.expectSubscriptions.bind(this),
345 var ret = callback(helpers);
350 TestScheduler.frameTimeFactor = prevFrameTimeFactor;
351 this.maxFrames = prevMaxFrames;
352 this.runMode = false;
353 AsyncScheduler.delegate = undefined;
356 return TestScheduler;
357 }(VirtualTimeScheduler));
358 export { TestScheduler };
359 //# sourceMappingURL=TestScheduler.js.map