| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @license | 
					
						
							| 
									
										
										
										
											2020-05-19 12:08:49 -07:00
										 |  |  |  * Copyright Google LLC All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Use of this source code is governed by an MIT-style license that can be | 
					
						
							|  |  |  |  * found in the LICENSE file at https://angular.io/license
 | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  | import {interval, merge, Observable, of, range} from 'rxjs'; | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | import {expand, map, mergeAll, mergeMap, mergeMapTo, switchAll, switchMap, switchMapTo, take} from 'rxjs/operators'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import {asyncTest, ifEnvSupports} from '../test-util'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import {supportFeature} from './rxjs.util'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | describe('Observable.merge', () => { | 
					
						
							|  |  |  |   let log: any[]; | 
					
						
							|  |  |  |   let observable1: Observable<any>; | 
					
						
							|  |  |  |   let defaultTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   beforeEach(() => { | 
					
						
							|  |  |  |     log = []; | 
					
						
							|  |  |  |     jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000; | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |   afterEach(() => { | 
					
						
							|  |  |  |     jasmine.DEFAULT_TIMEOUT_INTERVAL = defaultTimeout; | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |   it('expand func callback should run in the correct zone', () => { | 
					
						
							|  |  |  |     const constructorZone1: Zone = Zone.current.fork({name: 'Constructor Zone1'}); | 
					
						
							|  |  |  |     const expandZone1: Zone = Zone.current.fork({name: 'Expand Zone1'}); | 
					
						
							|  |  |  |     const subscriptionZone: Zone = Zone.current.fork({name: 'Subscription Zone'}); | 
					
						
							|  |  |  |     const error = new Error('test'); | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |     observable1 = constructorZone1.run(() => { | 
					
						
							|  |  |  |       return of(2); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |     observable1 = expandZone1.run(() => { | 
					
						
							|  |  |  |       return observable1.pipe( | 
					
						
							|  |  |  |           expand((val: any) => { | 
					
						
							|  |  |  |             expect(Zone.current.name).toEqual(expandZone1.name); | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |             return of(1 + val); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |           }), | 
					
						
							|  |  |  |           take(2)); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     subscriptionZone.run(() => { | 
					
						
							|  |  |  |       observable1.subscribe( | 
					
						
							|  |  |  |           (result: any) => { | 
					
						
							|  |  |  |             log.push(result); | 
					
						
							|  |  |  |             expect(Zone.current.name).toEqual(subscriptionZone.name); | 
					
						
							|  |  |  |           }, | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |           (err: any) => { | 
					
						
							|  |  |  |             fail('should not call error'); | 
					
						
							|  |  |  |           }, | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |           () => { | 
					
						
							|  |  |  |             log.push('completed'); | 
					
						
							|  |  |  |             expect(Zone.current.name).toEqual(subscriptionZone.name); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |     expect(log).toEqual([2, 3, 'completed']); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('merge func callback should run in the correct zone', asyncTest((done: any) => { | 
					
						
							|  |  |  |        const constructorZone1: Zone = Zone.current.fork({name: 'Constructor Zone1'}); | 
					
						
							|  |  |  |        const subscriptionZone: Zone = Zone.current.fork({name: 'Subscription Zone'}); | 
					
						
							|  |  |  |        const error = new Error('test'); | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |        observable1 = constructorZone1.run(() => { | 
					
						
							|  |  |  |          return merge(interval(10).pipe(take(2)), interval(15).pipe(take(1))); | 
					
						
							|  |  |  |        }); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |        subscriptionZone.run(() => { | 
					
						
							|  |  |  |          observable1.subscribe( | 
					
						
							|  |  |  |              (result: any) => { | 
					
						
							|  |  |  |                log.push(result); | 
					
						
							|  |  |  |                expect(Zone.current.name).toEqual(subscriptionZone.name); | 
					
						
							|  |  |  |              }, | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |              (err: any) => { | 
					
						
							|  |  |  |                fail('should not call error'); | 
					
						
							|  |  |  |              }, | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |              () => { | 
					
						
							|  |  |  |                log.push('completed'); | 
					
						
							|  |  |  |                expect(Zone.current.name).toEqual(subscriptionZone.name); | 
					
						
							|  |  |  |                expect(log).toEqual([0, 0, 1, 'completed']); | 
					
						
							|  |  |  |                done(); | 
					
						
							|  |  |  |              }); | 
					
						
							|  |  |  |        }); | 
					
						
							|  |  |  |      }, Zone.root)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('mergeAll func callback should run in the correct zone', asyncTest((done: any) => { | 
					
						
							|  |  |  |        const constructorZone1: Zone = Zone.current.fork({name: 'Constructor Zone1'}); | 
					
						
							|  |  |  |        const subscriptionZone: Zone = Zone.current.fork({name: 'Subscription Zone'}); | 
					
						
							|  |  |  |        const error = new Error('test'); | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |        observable1 = constructorZone1.run(() => { | 
					
						
							|  |  |  |          return of(1, 2).pipe( | 
					
						
							|  |  |  |              map((v: any) => { | 
					
						
							|  |  |  |                return of(v + 1); | 
					
						
							|  |  |  |              }), | 
					
						
							|  |  |  |              mergeAll()); | 
					
						
							|  |  |  |        }); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |        subscriptionZone.run(() => { | 
					
						
							|  |  |  |          observable1.subscribe( | 
					
						
							|  |  |  |              (result: any) => { | 
					
						
							|  |  |  |                log.push(result); | 
					
						
							|  |  |  |                expect(Zone.current.name).toEqual(subscriptionZone.name); | 
					
						
							|  |  |  |              }, | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |              (err: any) => { | 
					
						
							|  |  |  |                fail('should not call error'); | 
					
						
							|  |  |  |              }, | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |              () => { | 
					
						
							|  |  |  |                log.push('completed'); | 
					
						
							|  |  |  |                expect(Zone.current.name).toEqual(subscriptionZone.name); | 
					
						
							|  |  |  |                expect(log).toEqual([2, 3, 'completed']); | 
					
						
							|  |  |  |                done(); | 
					
						
							|  |  |  |              }); | 
					
						
							|  |  |  |        }); | 
					
						
							|  |  |  |      }, Zone.root)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('mergeMap func callback should run in the correct zone', () => { | 
					
						
							|  |  |  |     const constructorZone1: Zone = Zone.current.fork({name: 'Constructor Zone1'}); | 
					
						
							|  |  |  |     const subscriptionZone: Zone = Zone.current.fork({name: 'Subscription Zone'}); | 
					
						
							|  |  |  |     const error = new Error('test'); | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |     observable1 = constructorZone1.run(() => { | 
					
						
							|  |  |  |       return of(1, 2).pipe(mergeMap((v: any) => { | 
					
						
							|  |  |  |         return of(v + 1); | 
					
						
							|  |  |  |       })); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |     subscriptionZone.run(() => { | 
					
						
							|  |  |  |       observable1.subscribe( | 
					
						
							|  |  |  |           (result: any) => { | 
					
						
							|  |  |  |             log.push(result); | 
					
						
							|  |  |  |             expect(Zone.current.name).toEqual(subscriptionZone.name); | 
					
						
							|  |  |  |           }, | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |           (err: any) => { | 
					
						
							|  |  |  |             fail('should not call error'); | 
					
						
							|  |  |  |           }, | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |           () => { | 
					
						
							|  |  |  |             log.push('completed'); | 
					
						
							|  |  |  |             expect(Zone.current.name).toEqual(subscriptionZone.name); | 
					
						
							|  |  |  |             expect(log).toEqual([2, 3, 'completed']); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('mergeMapTo func callback should run in the correct zone', () => { | 
					
						
							|  |  |  |     const constructorZone1: Zone = Zone.current.fork({name: 'Constructor Zone1'}); | 
					
						
							|  |  |  |     const subscriptionZone: Zone = Zone.current.fork({name: 'Subscription Zone'}); | 
					
						
							|  |  |  |     const error = new Error('test'); | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |     observable1 = constructorZone1.run(() => { | 
					
						
							|  |  |  |       return of(1, 2).pipe(mergeMapTo(of(10))); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |     subscriptionZone.run(() => { | 
					
						
							|  |  |  |       observable1.subscribe( | 
					
						
							|  |  |  |           (result: any) => { | 
					
						
							|  |  |  |             log.push(result); | 
					
						
							|  |  |  |             expect(Zone.current.name).toEqual(subscriptionZone.name); | 
					
						
							|  |  |  |           }, | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |           (err: any) => { | 
					
						
							|  |  |  |             fail('should not call error'); | 
					
						
							|  |  |  |           }, | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |           () => { | 
					
						
							|  |  |  |             log.push('completed'); | 
					
						
							|  |  |  |             expect(Zone.current.name).toEqual(subscriptionZone.name); | 
					
						
							|  |  |  |             expect(log).toEqual([10, 10, 'completed']); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('switch func callback should run in the correct zone', () => { | 
					
						
							|  |  |  |     const constructorZone1: Zone = Zone.current.fork({name: 'Constructor Zone1'}); | 
					
						
							|  |  |  |     const subscriptionZone: Zone = Zone.current.fork({name: 'Subscription Zone'}); | 
					
						
							|  |  |  |     observable1 = constructorZone1.run(() => { | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |       return range(0, 3).pipe( | 
					
						
							|  |  |  |           map(function(x: any) { | 
					
						
							|  |  |  |             return range(x, 3); | 
					
						
							|  |  |  |           }), | 
					
						
							|  |  |  |           switchAll()); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     subscriptionZone.run(() => { | 
					
						
							|  |  |  |       observable1.subscribe( | 
					
						
							|  |  |  |           (result: any) => { | 
					
						
							|  |  |  |             log.push(result); | 
					
						
							|  |  |  |             expect(Zone.current.name).toEqual(subscriptionZone.name); | 
					
						
							|  |  |  |           }, | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |           (err: any) => { | 
					
						
							|  |  |  |             fail('should not call error'); | 
					
						
							|  |  |  |           }, | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |           () => { | 
					
						
							|  |  |  |             log.push('completed'); | 
					
						
							|  |  |  |             expect(Zone.current.name).toEqual(subscriptionZone.name); | 
					
						
							|  |  |  |             expect(log).toEqual([0, 1, 2, 1, 2, 3, 2, 3, 4, 'completed']); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('switchMap func callback should run in the correct zone', () => { | 
					
						
							|  |  |  |     const constructorZone1: Zone = Zone.current.fork({name: 'Constructor Zone1'}); | 
					
						
							|  |  |  |     const subscriptionZone: Zone = Zone.current.fork({name: 'Subscription Zone'}); | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |     observable1 = constructorZone1.run(() => { | 
					
						
							|  |  |  |       return range(0, 3).pipe(switchMap(function(x: any) { | 
					
						
							|  |  |  |         return range(x, 3); | 
					
						
							|  |  |  |       })); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |     subscriptionZone.run(() => { | 
					
						
							|  |  |  |       observable1.subscribe( | 
					
						
							|  |  |  |           (result: any) => { | 
					
						
							|  |  |  |             log.push(result); | 
					
						
							|  |  |  |             expect(Zone.current.name).toEqual(subscriptionZone.name); | 
					
						
							|  |  |  |           }, | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |           (err: any) => { | 
					
						
							|  |  |  |             fail('should not call error'); | 
					
						
							|  |  |  |           }, | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |           () => { | 
					
						
							|  |  |  |             log.push('completed'); | 
					
						
							|  |  |  |             expect(Zone.current.name).toEqual(subscriptionZone.name); | 
					
						
							|  |  |  |             expect(log).toEqual([0, 1, 2, 1, 2, 3, 2, 3, 4, 'completed']); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('switchMapTo func callback should run in the correct zone', () => { | 
					
						
							|  |  |  |     const constructorZone1: Zone = Zone.current.fork({name: 'Constructor Zone1'}); | 
					
						
							|  |  |  |     const subscriptionZone: Zone = Zone.current.fork({name: 'Subscription Zone'}); | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |     observable1 = constructorZone1.run(() => { | 
					
						
							|  |  |  |       return range(0, 3).pipe(switchMapTo('a')); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |     subscriptionZone.run(() => { | 
					
						
							|  |  |  |       observable1.subscribe( | 
					
						
							|  |  |  |           (result: any) => { | 
					
						
							|  |  |  |             log.push(result); | 
					
						
							|  |  |  |             expect(Zone.current.name).toEqual(subscriptionZone.name); | 
					
						
							|  |  |  |           }, | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |           (err: any) => { | 
					
						
							|  |  |  |             fail('should not call error'); | 
					
						
							|  |  |  |           }, | 
					
						
							| 
									
										
										
										
											2019-06-01 00:56:07 +09:00
										 |  |  |           () => { | 
					
						
							|  |  |  |             log.push('completed'); | 
					
						
							|  |  |  |             expect(Zone.current.name).toEqual(subscriptionZone.name); | 
					
						
							|  |  |  |             expect(log).toEqual(['a', 'a', 'a', 'completed']); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | }); |