Skip to content

Commit f3638f8

Browse files
staltzbenlesh
authored andcommitted
test(concat): add comprehensive tests for static concat
1 parent 8174947 commit f3638f8

File tree

1 file changed

+314
-1
lines changed

1 file changed

+314
-1
lines changed

spec/observables/concat-spec.js

Lines changed: 314 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,327 @@
1-
/* globals describe, it, expect, expectObservable, cold */
1+
/* globals describe, it, expect, expectObservable, expectSubscriptions, cold */
22
var Rx = require('../../dist/cjs/Rx');
33
var Observable = Rx.Observable;
4+
var immediateScheduler = Rx.Scheduler.immediate;
45

56
describe('Observable.concat', function () {
67
it('should emit elements from multiple sources', function () {
78
var e1 = cold('-a-b-c-|');
9+
var e1subs = '^ !';
810
var e2 = cold('-0-1-|');
11+
var e2subs = ' ^ !';
912
var e3 = cold('-w-x-y-z-|');
13+
var e3subs = ' ^ !';
1014
var expected = '-a-b-c--0-1--w-x-y-z-|';
1115

1216
expectObservable(Observable.concat(e1, e2, e3)).toBe(expected);
17+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
18+
expectSubscriptions(e2.subscriptions).toBe(e2subs);
19+
expectSubscriptions(e3.subscriptions).toBe(e3subs);
20+
});
21+
22+
it('should concat the same cold observable multiple times', function () {
23+
var inner = cold('--i-j-k-l-| ');
24+
var innersubs = ['^ ! ',
25+
' ^ ! ',
26+
' ^ ! ',
27+
' ^ !'];
28+
var expected = '--i-j-k-l---i-j-k-l---i-j-k-l---i-j-k-l-|';
29+
30+
var result = Observable.concat(inner, inner, inner, inner);
31+
32+
expectObservable(result).toBe(expected);
33+
expectSubscriptions(inner.subscriptions).toBe(innersubs);
34+
});
35+
36+
it('should concat the same cold observable multiple times, ' +
37+
'but the result is unsubscribed early', function () {
38+
var inner = cold('--i-j-k-l-| ');
39+
var unsub = ' !';
40+
var innersubs = ['^ ! ',
41+
' ^ !'];
42+
var expected = '--i-j-k-l---i-j-';
43+
44+
var result = Observable.concat(inner, inner, inner, inner);
45+
46+
expectObservable(result, unsub).toBe(expected);
47+
expectSubscriptions(inner.subscriptions).toBe(innersubs);
48+
});
49+
50+
it('should complete without emit if both sources are empty', function () {
51+
var e1 = cold('--|');
52+
var e1subs = '^ !';
53+
var e2 = cold( '----|');
54+
var e2subs = ' ^ !';
55+
var expected = '------|';
56+
57+
expectObservable(Observable.concat(e1, e2)).toBe(expected);
58+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
59+
expectSubscriptions(e2.subscriptions).toBe(e2subs);
60+
});
61+
62+
it('should not complete if first source does not completes', function () {
63+
var e1 = cold('-');
64+
var e1subs = '^';
65+
var e2 = cold('--|');
66+
var e2subs = [];
67+
var expected = '-';
68+
69+
expectObservable(Observable.concat(e1, e2)).toBe(expected);
70+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
71+
expectSubscriptions(e2.subscriptions).toBe(e2subs);
72+
});
73+
74+
it('should not complete if second source does not completes', function () {
75+
var e1 = cold('--|');
76+
var e1subs = '^ !';
77+
var e2 = cold('---');
78+
var e2subs = ' ^';
79+
var expected = '---';
80+
81+
expectObservable(Observable.concat(e1, e2)).toBe(expected);
82+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
83+
expectSubscriptions(e2.subscriptions).toBe(e2subs);
84+
});
85+
86+
it('should not complete if both sources do not complete', function () {
87+
var e1 = cold('-');
88+
var e1subs = '^';
89+
var e2 = cold('-');
90+
var e2subs = [];
91+
var expected = '-';
92+
93+
expectObservable(Observable.concat(e1, e2)).toBe(expected);
94+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
95+
expectSubscriptions(e2.subscriptions).toBe(e2subs);
96+
});
97+
98+
it('should raise error when first source is empty, second source raises error', function () {
99+
var e1 = cold('--|');
100+
var e1subs = '^ !';
101+
var e2 = cold( '----#');
102+
var e2subs = ' ^ !';
103+
var expected = '------#';
104+
105+
expectObservable(Observable.concat(e1, e2)).toBe(expected);
106+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
107+
expectSubscriptions(e2.subscriptions).toBe(e2subs);
108+
});
109+
110+
it('should raise error when first source raises error, second source is empty', function () {
111+
var e1 = cold('---#');
112+
var e1subs = '^ !';
113+
var e2 = cold('----|');
114+
var e2subs = [];
115+
var expected = '---#';
116+
117+
expectObservable(Observable.concat(e1, e2)).toBe(expected);
118+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
119+
expectSubscriptions(e2.subscriptions).toBe(e2subs);
120+
});
121+
122+
it('should raise first error when both source raise error', function () {
123+
var e1 = cold('---#');
124+
var e1subs = '^ !';
125+
var e2 = cold('------#');
126+
var e2subs = [];
127+
var expected = '---#';
128+
129+
expectObservable(Observable.concat(e1, e2)).toBe(expected);
130+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
131+
expectSubscriptions(e2.subscriptions).toBe(e2subs);
132+
});
133+
134+
it('should concat if first source emits once, second source is empty', function () {
135+
var e1 = cold('--a--|');
136+
var e1subs = '^ !';
137+
var e2 = cold( '--------|');
138+
var e2subs = ' ^ !';
139+
var expected = '--a----------|';
140+
141+
expectObservable(Observable.concat(e1, e2)).toBe(expected);
142+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
143+
expectSubscriptions(e2.subscriptions).toBe(e2subs);
144+
});
145+
146+
it('should concat if first source is empty, second source emits once', function () {
147+
var e1 = cold('--|');
148+
var e1subs = '^ !';
149+
var e2 = cold( '--a--|');
150+
var e2subs = ' ^ !';
151+
var expected = '----a--|';
152+
153+
expectObservable(Observable.concat(e1, e2)).toBe(expected);
154+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
155+
expectSubscriptions(e2.subscriptions).toBe(e2subs);
156+
});
157+
158+
it('should emit element from first source, and should not complete if second ' +
159+
'source does not completes', function () {
160+
var e1 = cold('--a--|');
161+
var e1subs = '^ !';
162+
var e2 = cold( '-');
163+
var e2subs = ' ^';
164+
var expected = '--a---';
165+
166+
expectObservable(Observable.concat(e1, e2)).toBe(expected);
167+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
168+
expectSubscriptions(e2.subscriptions).toBe(e2subs);
169+
});
170+
171+
it('should not complete if first source does not complete', function () {
172+
var e1 = cold('-');
173+
var e1subs = '^';
174+
var e2 = cold('--a--|');
175+
var e2subs = [];
176+
var expected = '-';
177+
178+
expectObservable(Observable.concat(e1, e2)).toBe(expected);
179+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
180+
expectSubscriptions(e2.subscriptions).toBe(e2subs);
181+
});
182+
183+
it('should emit elements from each source when source emit once', function () {
184+
var e1 = cold('---a|');
185+
var e1subs = '^ !';
186+
var e2 = cold( '-----b--|');
187+
var e2subs = ' ^ !';
188+
var expected = '---a-----b--|';
189+
190+
expectObservable(Observable.concat(e1, e2)).toBe(expected);
191+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
192+
expectSubscriptions(e2.subscriptions).toBe(e2subs);
193+
});
194+
195+
it('should unsubscribe to inner source if outer is unsubscribed early', function () {
196+
var e1 = cold('---a-a--a| ');
197+
var e1subs = '^ ! ';
198+
var e2 = cold( '-----b-b--b-|');
199+
var e2subs = ' ^ ! ';
200+
var unsub = ' ! ';
201+
var expected = '---a-a--a-----b-b ';
202+
203+
expectObservable(Observable.concat(e1, e2), unsub).toBe(expected);
204+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
205+
expectSubscriptions(e2.subscriptions).toBe(e2subs);
206+
});
207+
208+
it('should raise error from first source and does not emit from second source', function () {
209+
var e1 = cold('--#');
210+
var e1subs = '^ !';
211+
var e2 = cold('----a--|');
212+
var e2subs = [];
213+
var expected = '--#';
214+
215+
expectObservable(Observable.concat(e1, e2)).toBe(expected);
216+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
217+
expectSubscriptions(e2.subscriptions).toBe(e2subs);
218+
});
219+
220+
it('should emit element from first source then raise error from second source', function () {
221+
var e1 = cold('--a--|');
222+
var e1subs = '^ !';
223+
var e2 = cold( '-------#');
224+
var e2subs = ' ^ !';
225+
var expected = '--a---------#';
226+
227+
expectObservable(Observable.concat(e1, e2)).toBe(expected);
228+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
229+
expectSubscriptions(e2.subscriptions).toBe(e2subs);
230+
});
231+
232+
it('should emit all elements from both hot observable sources if first source ' +
233+
'completes before second source starts emit', function () {
234+
var e1 = hot('--a--b-|');
235+
var e1subs = '^ !';
236+
var e2 = hot('--------x--y--|');
237+
var e2subs = ' ^ !';
238+
var expected = '--a--b--x--y--|';
239+
240+
expectObservable(Observable.concat(e1, e2)).toBe(expected);
241+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
242+
expectSubscriptions(e2.subscriptions).toBe(e2subs);
243+
});
244+
245+
it('should emit elements from second source regardless of completion time ' +
246+
'when second source is cold observable', function () {
247+
var e1 = hot('--a--b--c---|');
248+
var e1subs = '^ !';
249+
var e2 = cold('-x-y-z-|');
250+
var e2subs = ' ^ !';
251+
var expected = '--a--b--c----x-y-z-|';
252+
253+
expectObservable(Observable.concat(e1, e2)).toBe(expected);
254+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
255+
expectSubscriptions(e2.subscriptions).toBe(e2subs);
256+
});
257+
258+
it('should not emit collapsing element from second source', function () {
259+
var e1 = hot('--a--b--c--|');
260+
var e1subs = '^ !';
261+
var e2 = hot('--------x--y--z--|');
262+
var e2subs = ' ^ !';
263+
var expected = '--a--b--c--y--z--|';
264+
265+
expectObservable(Observable.concat(e1, e2)).toBe(expected);
266+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
267+
expectSubscriptions(e2.subscriptions).toBe(e2subs);
268+
});
269+
270+
it('should return empty if concatenating an empty source', function () {
271+
var e1 = cold('|');
272+
var e1subs = ['(^!)', '(^!)'];
273+
var expected = '|';
274+
275+
var result = Observable.concat(e1, e1);
276+
277+
expectObservable(result).toBe(expected);
278+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
279+
});
280+
281+
it('should error immediately if given a just-throw source', function () {
282+
var e1 = cold( '#');
283+
var e1subs = '(^!)';
284+
var expected = '#';
285+
286+
var result = Observable.concat(e1, e1);
287+
288+
expectObservable(result).toBe(expected);
289+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
290+
});
291+
292+
it('should emit elements from second source regardless of completion time ' +
293+
'when second source is cold observable', function () {
294+
var e1 = hot('--a--b--c---|');
295+
var e1subs = '^ !';
296+
var e2 = cold('-x-y-z-|');
297+
var e2subs = ' ^ !';
298+
var expected = '--a--b--c----x-y-z-|';
299+
300+
expectObservable(Observable.concat(e1, e2)).toBe(expected);
301+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
302+
expectSubscriptions(e2.subscriptions).toBe(e2subs);
303+
});
304+
305+
it('should not emit collapsing element from second source', function () {
306+
var e1 = hot('--a--b--c--|');
307+
var e1subs = '^ !';
308+
var e2 = hot('--------x--y--z--|');
309+
var e2subs = ' ^ !';
310+
var expected = '--a--b--c--y--z--|';
311+
312+
expectObservable(Observable.concat(e1, e2)).toBe(expected);
313+
expectSubscriptions(e1.subscriptions).toBe(e1subs);
314+
expectSubscriptions(e2.subscriptions).toBe(e2subs);
315+
});
316+
317+
it('should concat an immediately-scheduled source with an immediately-scheduled second', function (done) {
318+
var a = Observable.of(1, 2, 3, immediateScheduler);
319+
var b = Observable.of(4, 5, 6, 7, 8, immediateScheduler);
320+
var r = [1, 2, 3, 4, 5, 6, 7, 8];
321+
var i = 0;
322+
323+
Observable.concat(a, b, immediateScheduler).subscribe(function (vals) {
324+
expect(vals).toBe(r[i++]);
325+
}, null, done);
13326
});
14327
});

0 commit comments

Comments
 (0)