UNPKG

5.03 kBJavaScriptView Raw
1import { Notification, Observable } from 'rxjs';
2import { TestScheduler } from 'rxjs/testing';
3import { isEqual } from 'lodash';
4import { getTestScheduler, initTestScheduler, resetTestScheduler, } from './src/scheduler';
5import { TestColdObservable, TestHotObservable, } from './src/test-observables';
6import { unparseMarble } from './src/marble-unparser';
7import { mapSymbolsToNotifications } from './src/map-symbols-to-notifications';
8export { getTestScheduler, initTestScheduler, resetTestScheduler, } from './src/scheduler';
9export function hot(marbles, values, error) {
10 return new TestHotObservable(marbles.trim(), values, error);
11}
12export function cold(marbles, values, error) {
13 return new TestColdObservable(marbles.trim(), values, error);
14}
15export function time(marbles) {
16 return getTestScheduler().createTime(marbles.trim());
17}
18/*
19 * Based on source code found in rxjs library
20 * https://github.com/ReactiveX/rxjs/blob/master/src/testing/TestScheduler.ts
21 *
22 */
23function materializeInnerObservable(observable, outerFrame) {
24 const messages = [];
25 const scheduler = getTestScheduler();
26 observable.subscribe((value) => {
27 messages.push({
28 frame: scheduler.frame - outerFrame,
29 notification: Notification.createNext(value),
30 });
31 }, (err) => {
32 messages.push({
33 frame: scheduler.frame - outerFrame,
34 notification: Notification.createError(err),
35 });
36 }, () => {
37 messages.push({
38 frame: scheduler.frame - outerFrame,
39 notification: Notification.createComplete(),
40 });
41 });
42 return messages;
43}
44const toHaveSubscriptionsComparer = function (actual, marbles) {
45 const marblesArray = typeof marbles === 'string' ? [marbles] : marbles;
46 const results = marblesArray.map((marbles) => TestScheduler.parseMarblesAsSubscriptions(marbles));
47 expect(results).toEqual(actual.getSubscriptions());
48 return { pass: true, message: () => '' };
49};
50const toBeObservableComparer = function (actual, fixture) {
51 const results = [];
52 let subscription;
53 const scheduler = getTestScheduler();
54 scheduler.schedule(() => {
55 subscription = actual.subscribe((x) => {
56 let value = x;
57 // Support Observable-of-Observables
58 if (x instanceof Observable) {
59 value = materializeInnerObservable(value, scheduler.frame);
60 }
61 results.push({
62 frame: scheduler.frame,
63 notification: Notification.createNext(value),
64 });
65 }, (err) => {
66 results.push({
67 frame: scheduler.frame,
68 notification: Notification.createError(err),
69 });
70 }, () => {
71 results.push({
72 frame: scheduler.frame,
73 notification: Notification.createComplete(),
74 });
75 });
76 });
77 scheduler.flush();
78 const expected = TestScheduler.parseMarbles(fixture.marbles, fixture.values, fixture.error, true, true);
79 try {
80 expect(results).toEqual(expected);
81 return { pass: true, message: () => '' };
82 }
83 catch (e) {
84 const mapNotificationToSymbol = buildNotificationToSymbolMapper(fixture.marbles, expected, isEqual);
85 const receivedMarble = unparseMarble(results, mapNotificationToSymbol);
86 const message = formatMessage(fixture.marbles, expected, receivedMarble, results);
87 return { pass: false, message: () => message };
88 }
89};
90export function addMatchers() {
91 if (!expect.extend) {
92 jasmine.addMatchers({
93 toHaveSubscriptions: () => ({
94 compare: toHaveSubscriptionsComparer,
95 }),
96 toBeObservable: (utils, equalityTester) => ({
97 compare: toBeObservableComparer,
98 }),
99 });
100 }
101 else {
102 expect.extend({
103 toHaveSubscriptions: toHaveSubscriptionsComparer,
104 toBeObservable: toBeObservableComparer,
105 });
106 }
107}
108function buildNotificationToSymbolMapper(expectedMarbles, expectedMessages, equalityFn) {
109 const symbolsToNotificationsMap = mapSymbolsToNotifications(expectedMarbles, expectedMessages);
110 return (notification) => {
111 const mapped = Object.keys(symbolsToNotificationsMap).find((key) => {
112 return equalityFn(symbolsToNotificationsMap[key], notification);
113 });
114 return mapped || '?';
115 };
116}
117function formatMessage(expectedMarbles, expectedMessages, receivedMarbles, receivedMessages) {
118 return `
119 Expected: ${expectedMarbles},
120 Received: ${receivedMarbles},
121
122 Expected:
123 ${JSON.stringify(expectedMessages)}
124
125 Received:
126 ${JSON.stringify(receivedMessages)},
127 `;
128}
129export function setupEnvironment() {
130 beforeAll(() => addMatchers());
131 beforeEach(() => initTestScheduler());
132 afterEach(() => {
133 getTestScheduler().flush();
134 resetTestScheduler();
135 });
136}
137setupEnvironment();
138//# sourceMappingURL=index.js.map
\No newline at end of file