Skip to content

Commit 54f957b

Browse files
trxcllntbenlesh
authored andcommitted
feat(operator): adds inspect and inspectTime operators
1 parent 90bf3f1 commit 54f957b

File tree

11 files changed

+622
-0
lines changed

11 files changed

+622
-0
lines changed

spec/operators/inspect-spec.js

Lines changed: 329 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,329 @@
1+
/* globals describe, it, expect, expectObservable, expectSubscription, hot, cold */
2+
var Rx = require('../../dist/cjs/Rx');
3+
var Observable = Rx.Observable;
4+
var Scheduler = Rx.Scheduler;
5+
var Promise = require('promise');
6+
7+
describe('Observable.prototype.inspect()', function () {
8+
it.asDiagram('inspect')('should emit the last value in each time window', function () {
9+
var e1 = hot('-a-xy-----b--x--cxxx-|');
10+
var e1subs = '^ !';
11+
var e2 = cold( '----| ');
12+
var e2subs = [' ^ ! ',
13+
' ^ ! ',
14+
' ^ ! '];
15+
var expected = '-----y--------x-----x|';
16+
17+
var result = e1.inspect(function () { return e2; });
18+
19+
expectObservable(result).toBe(expected);
20+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
21+
expectSubscriptions(e2.subscriptions).toBe(e2subs);
22+
});
23+
24+
it('should delay the source if values are not emitted often enough', function () {
25+
var e1 = hot('-a--------b-----c----|');
26+
var e1subs = '^ !';
27+
var e2 = cold( '----| ');
28+
var e2subs = [' ^ ! ',
29+
' ^ ! ',
30+
' ^ ! '];
31+
var expected = '-----a--------b-----c|';
32+
33+
var result = e1.inspect(function () { return e2; });
34+
35+
expectObservable(result).toBe(expected);
36+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
37+
expectSubscriptions(e2.subscriptions).toBe(e2subs);
38+
});
39+
40+
it('should inspect with duration Observable using next to close the duration', function () {
41+
var e1 = hot('-a-xy-----b--x--cxxx-|');
42+
var e1subs = '^ !';
43+
var e2 = cold( '----x-y-z ');
44+
var e2subs = [' ^ ! ',
45+
' ^ ! ',
46+
' ^ ! '];
47+
var expected = '-----y--------x-----x|';
48+
49+
var result = e1.inspect(function () { return e2; });
50+
51+
expectObservable(result).toBe(expected);
52+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
53+
expectSubscriptions(e2.subscriptions).toBe(e2subs);
54+
});
55+
56+
it('should interrupt source and duration when result is unsubscribed early', function () {
57+
var e1 = hot('-a-x-y-z-xyz-x-y-z----b--x-x-|');
58+
var unsub = ' ! ';
59+
var e1subs = '^ ! ';
60+
var e2 = cold( '-----x------------| ');
61+
var e2subs = [' ^ ! ',
62+
' ^ ! ',
63+
' ^! '];
64+
var expected = '------y-----z-- ';
65+
66+
var result = e1.inspect(function () { return e2; });
67+
68+
expectObservable(result, unsub).toBe(expected);
69+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
70+
expectSubscriptions(e2.subscriptions).toBe(e2subs);
71+
});
72+
73+
it('should not break unsubscription chains when result is unsubscribed explicitly', function () {
74+
var e1 = hot('-a-x-y-z-xyz-x-y-z----b--x-x-|');
75+
var e1subs = '^ ! ';
76+
var e2 = cold( '-----x------------| ');
77+
var e2subs = [' ^ ! ',
78+
' ^ ! ',
79+
' ^! '];
80+
var expected = '------y-----z-- ';
81+
var unsub = ' ! ';
82+
83+
var result = e1
84+
.mergeMap(function (x) { return Observable.of(x); })
85+
.inspect(function () { return e2; })
86+
.mergeMap(function (x) { return Observable.of(x); });
87+
88+
expectObservable(result, unsub).toBe(expected);
89+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
90+
expectSubscriptions(e2.subscriptions).toBe(e2subs);
91+
});
92+
93+
it('should handle a busy producer emitting a regular repeating sequence', function () {
94+
var e1 = hot('abcdefabcdefabcdefabcdefa|');
95+
var e1subs = '^ !';
96+
var e2 = cold('-----| ');
97+
var e2subs = ['^ ! ',
98+
' ^ ! ',
99+
' ^ ! ',
100+
' ^ ! ',
101+
' ^!'];
102+
var expected = '-----f-----f-----f-----f-|';
103+
104+
var result = e1.inspect(function () { return e2; });
105+
106+
expectObservable(result).toBe(expected);
107+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
108+
expectSubscriptions(e2.subscriptions).toBe(e2subs);
109+
});
110+
111+
it('should mirror source if durations are always empty', function () {
112+
var e1 = hot('abcdefabcdefabcdefabcdefa|');
113+
var e1subs = '^ !';
114+
var e2 = cold('|');
115+
var expected = 'abcdefabcdefabcdefabcdefa|';
116+
117+
var result = e1.inspect(function () { return e2; });
118+
119+
expectObservable(result).toBe(expected);
120+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
121+
});
122+
123+
it('should emit no values if duration is a never', function () {
124+
var e1 = hot('----abcdefabcdefabcdefabcdefa|');
125+
var e1subs = '^ !';
126+
var e2 = cold('-');
127+
var e2subs = ' ^ !';
128+
var expected = '-----------------------------|';
129+
130+
var result = e1.inspect(function () { return e2; });
131+
132+
expectObservable(result).toBe(expected);
133+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
134+
expectSubscriptions(e2.subscriptions).toBe(e2subs);
135+
});
136+
137+
it('should unsubscribe duration Observable when source raise error', function () {
138+
var e1 = hot('----abcdefabcdefabcdefabcdefa#');
139+
var e1subs = '^ !';
140+
var e2 = cold('-');
141+
var e2subs = ' ^ !';
142+
var expected = '-----------------------------#';
143+
144+
var result = e1.inspect(function () { return e2; });
145+
146+
expectObservable(result).toBe(expected);
147+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
148+
expectSubscriptions(e2.subscriptions).toBe(e2subs);
149+
});
150+
151+
it('should raise error as soon as just-throw duration is used', function () {
152+
var e1 = hot('----abcdefabcdefabcdefabcdefa|');
153+
var e1subs = '^ ! ';
154+
var e2 = cold('#');
155+
var e2subs = ' (^!) ';
156+
var expected = '----(-#) ';
157+
158+
var result = e1.inspect(function () { return e2; });
159+
160+
expectObservable(result).toBe(expected);
161+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
162+
expectSubscriptions(e2.subscriptions).toBe(e2subs);
163+
});
164+
165+
it('should inspect using durations of varying lengths', function () {
166+
var e1 = hot('abcdefabcdabcdefghabca| ');
167+
var e1subs = '^ ! ';
168+
var e2 = [cold('-----| '),
169+
cold( '---| '),
170+
cold( '-------| '),
171+
cold( '--| '),
172+
cold( '----|')];
173+
var e2subs = ['^ ! ',
174+
' ^ ! ',
175+
' ^ ! ',
176+
' ^ ! ',
177+
' ^! '];
178+
var expected = '-----f---d-------h--c-| ';
179+
180+
var i = 0;
181+
var result = e1.inspect(function () { return e2[i++]; });
182+
183+
expectObservable(result).toBe(expected);
184+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
185+
for (var j = 0; j < e2.length; j++) {
186+
expectSubscriptions(e2[j].subscriptions).toBe(e2subs[j]);
187+
}
188+
});
189+
190+
it('should propagate error from duration Observable', function () {
191+
var e1 = hot('abcdefabcdabcdefghabca| ');
192+
var e1subs = '^ ! ';
193+
var e2 = [cold('-----| '),
194+
cold( '---| '),
195+
cold( '-------# ')];
196+
var e2subs = ['^ ! ',
197+
' ^ ! ',
198+
' ^ ! '];
199+
var expected = '-----f---d-------# ';
200+
201+
var i = 0;
202+
var result = e1.inspect(function () { return e2[i++]; });
203+
204+
expectObservable(result).toBe(expected);
205+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
206+
for (var j = 0; j < e2.length; j++) {
207+
expectSubscriptions(e2[j].subscriptions).toBe(e2subs[j]);
208+
}
209+
});
210+
211+
it('should propagate error thrown from durationSelector function', function () {
212+
var e1 = hot('abcdefabcdabcdefghabca| ');
213+
var e1subs = '^ ! ';
214+
var e2 = [cold('-----| '),
215+
cold( '---| '),
216+
cold( '-------| ')];
217+
var e2subs = ['^ ! ',
218+
' ^ ! '];
219+
var expected = '-----f---d# ';
220+
221+
var i = 0;
222+
var result = e1.inspect(function () {
223+
if (i === 2) {
224+
throw 'error';
225+
}
226+
return e2[i++];
227+
});
228+
229+
expectObservable(result).toBe(expected);
230+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
231+
for (var j = 0; j < e2subs.length; j++) {
232+
expectSubscriptions(e2[j].subscriptions).toBe(e2subs[j]);
233+
}
234+
});
235+
236+
it('should complete when source does not emit', function () {
237+
var e1 = hot('-----|');
238+
var subs = '^ !';
239+
var expected = '-----|';
240+
function durationSelector() { return cold('-----|'); }
241+
242+
expectObservable(e1.inspect(durationSelector)).toBe(expected);
243+
expectSubscriptions(e1.subscriptions).toBe(subs);
244+
});
245+
246+
it('should raise error when source does not emit and raises error', function () {
247+
var e1 = hot('-----#');
248+
var subs = '^ !';
249+
var expected = '-----#';
250+
function durationSelector() { return cold('-----|'); }
251+
252+
expectObservable(e1.inspect(durationSelector)).toBe(expected);
253+
expectSubscriptions(e1.subscriptions).toBe(subs);
254+
});
255+
256+
it('should handle an empty source', function () {
257+
var e1 = cold('|');
258+
var subs = '(^!)';
259+
var expected = '|';
260+
function durationSelector() { return cold('-----|'); }
261+
262+
expectObservable(e1.inspect(durationSelector)).toBe(expected);
263+
expectSubscriptions(e1.subscriptions).toBe(subs);
264+
});
265+
266+
it('should handle a never source', function () {
267+
var e1 = cold('-');
268+
var subs = '^';
269+
var expected = '-';
270+
function durationSelector() { return cold('-----|'); }
271+
272+
expectObservable(e1.inspect(durationSelector)).toBe(expected);
273+
expectSubscriptions(e1.subscriptions).toBe(subs);
274+
});
275+
276+
it('should handle a throw source', function () {
277+
var e1 = cold('#');
278+
var subs = '(^!)';
279+
var expected = '#';
280+
function durationSelector() { return cold('-----|'); }
281+
282+
expectObservable(e1.inspect(durationSelector)).toBe(expected);
283+
expectSubscriptions(e1.subscriptions).toBe(subs);
284+
});
285+
286+
it('should inspect by promise resolves', function (done) {
287+
var e1 = Observable.interval(10).take(5);
288+
var expected = [0,1,2,3];
289+
290+
e1.inspect(function () {
291+
return new Promise(function (resolve) { resolve(42); });
292+
}).subscribe(
293+
function (x) {
294+
expect(x).toEqual(expected.shift()); },
295+
function () {
296+
done('should not be called');
297+
},
298+
function () {
299+
expect(expected.length).toBe(0);
300+
done();
301+
}
302+
);
303+
});
304+
305+
it('should raise error when promise rejects', function (done) {
306+
var e1 = Observable.interval(10).take(4);
307+
var expected = [0,1,2];
308+
var error = new Error('error');
309+
310+
e1.inspect(function (x) {
311+
if (x === 4) {
312+
return new Promise(function (resolve, reject) {reject(error);});
313+
} else {
314+
return new Promise(function (resolve) {resolve(42);});
315+
}
316+
}).subscribe(
317+
function (x) {
318+
expect(x).toEqual(expected.shift()); },
319+
function (err) {
320+
expect(err).toBe(error);
321+
expect(expected.length).toBe(0);
322+
done();
323+
},
324+
function () {
325+
done('should not be called');
326+
}
327+
);
328+
});
329+
});

0 commit comments

Comments
 (0)