1- /* globals describe, it, expect, expectObservable, cold */
1+ /* globals describe, it, expect, expectObservable, expectSubscriptions, cold */
22var Rx = require ( '../../dist/cjs/Rx' ) ;
33var Observable = Rx . Observable ;
4+ var immediateScheduler = Rx . Scheduler . immediate ;
45
56describe ( '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