| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @license | 
					
						
							| 
									
										
										
										
											2020-05-19 12:08:49 -07:00
										 |  |  |  * Copyright Google LLC All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08: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 {ɵgetDOM as getDOM} from '@angular/common'; | 
					
						
							| 
									
										
										
										
											2019-10-07 22:53:02 +02:00
										 |  |  | import {AfterContentChecked, AfterContentInit, AfterViewChecked, AfterViewInit, ChangeDetectorRef, DoCheck, ElementRef, ErrorHandler, EventEmitter, Injector, OnChanges, OnDestroy, OnInit, Renderer2, SimpleChange, TemplateRef, ViewContainerRef,} from '@angular/core'; | 
					
						
							| 
									
										
										
										
											2017-01-27 13:19:00 -08:00
										 |  |  | import {getDebugContext} from '@angular/core/src/errors'; | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  | import {anchorDef, ArgumentType, asElementData, DepFlags, directiveDef, elementDef, NodeFlags, providerDef, Services, textDef} from '@angular/core/src/view/index'; | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  | import {TestBed, withModule} from '@angular/core/testing'; | 
					
						
							| 
									
										
										
										
											2019-01-17 18:48:39 +01:00
										 |  |  | import {ivyEnabled} from '@angular/private/testing'; | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  | import {ARG_TYPE_VALUES, checkNodeInlineOrDynamic, compViewDef, compViewDefFactory, createAndGetRootNodes, createRootView} from './helper'; | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-15 16:28:41 -08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08:00
										 |  |  |   describe(`View Providers`, () => { | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |     describe('create', () => { | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |       let instance: SomeService; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class SomeService { | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |         constructor(public dep: any) { | 
					
						
							|  |  |  |           instance = this; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |       beforeEach(() => { | 
					
						
							|  |  |  |         instance = null!; | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |       it('should create providers eagerly', () => { | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |         createAndGetRootNodes(compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |           elementDef(0, NodeFlags.None, null, null, 1, 'span'), | 
					
						
							|  |  |  |           directiveDef(1, NodeFlags.None, null, 0, SomeService, []) | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |         ])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expect(instance instanceof SomeService).toBe(true); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should create providers lazily', () => { | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |         let lazy: LazyService = undefined!; | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |         class LazyService { | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |           constructor() { | 
					
						
							|  |  |  |             lazy = this; | 
					
						
							|  |  |  |           } | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-23 16:59:20 -08:00
										 |  |  |         createAndGetRootNodes(compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |           elementDef(0, NodeFlags.None, null, null, 2, 'span'), | 
					
						
							| 
									
										
										
										
											2017-02-09 14:59:57 -08:00
										 |  |  |           providerDef( | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |               NodeFlags.TypeClassProvider | NodeFlags.LazyProvider, null, LazyService, LazyService, | 
					
						
							|  |  |  |               []), | 
					
						
							|  |  |  |           directiveDef(2, NodeFlags.None, null, 0, SomeService, [Injector]) | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |         ])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expect(lazy).toBeUndefined(); | 
					
						
							|  |  |  |         instance.dep.get(LazyService); | 
					
						
							|  |  |  |         expect(lazy instanceof LazyService).toBe(true); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should create value providers', () => { | 
					
						
							|  |  |  |         createAndGetRootNodes(compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |           elementDef(0, NodeFlags.None, null, null, 2, 'span'), | 
					
						
							|  |  |  |           providerDef(NodeFlags.TypeValueProvider, null, 'someToken', 'someValue', []), | 
					
						
							|  |  |  |           directiveDef(2, NodeFlags.None, null, 0, SomeService, ['someToken']), | 
					
						
							| 
									
										
										
										
											2017-01-23 16:59:20 -08:00
										 |  |  |         ])); | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |         expect(instance.dep).toBe('someValue'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should create factory providers', () => { | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |         function someFactory() { | 
					
						
							|  |  |  |           return 'someValue'; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         createAndGetRootNodes(compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |           elementDef(0, NodeFlags.None, null, null, 2, 'span'), | 
					
						
							|  |  |  |           providerDef(NodeFlags.TypeFactoryProvider, null, 'someToken', someFactory, []), | 
					
						
							|  |  |  |           directiveDef(2, NodeFlags.None, null, 0, SomeService, ['someToken']), | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |         ])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expect(instance.dep).toBe('someValue'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should create useExisting providers', () => { | 
					
						
							|  |  |  |         createAndGetRootNodes(compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |           elementDef(0, NodeFlags.None, null, null, 3, 'span'), | 
					
						
							|  |  |  |           providerDef(NodeFlags.TypeValueProvider, null, 'someExistingToken', 'someValue', []), | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |           providerDef( | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |               NodeFlags.TypeUseExistingProvider, null, 'someToken', null, ['someExistingToken']), | 
					
						
							|  |  |  |           directiveDef(3, NodeFlags.None, null, 0, SomeService, ['someToken']), | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |         ])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expect(instance.dep).toBe('someValue'); | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  |       it('should add a DebugContext to errors in provider factories', () => { | 
					
						
							|  |  |  |         class SomeService { | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |           constructor() { | 
					
						
							|  |  |  |             throw new Error('Test'); | 
					
						
							|  |  |  |           } | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let err: any; | 
					
						
							|  |  |  |         try { | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08:00
										 |  |  |           createRootView( | 
					
						
							|  |  |  |               compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-02-21 13:56:56 -08:00
										 |  |  |                 elementDef( | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |                     0, NodeFlags.None, null, null, 1, 'div', null, null, null, null, | 
					
						
							|  |  |  |                     () => compViewDef([textDef(0, null, ['a'])])), | 
					
						
							|  |  |  |                 directiveDef(1, NodeFlags.Component, null, 0, SomeService, []) | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08:00
										 |  |  |               ]), | 
					
						
							| 
									
										
										
										
											2019-08-28 16:22:36 -07:00
										 |  |  |               TestBed.inject(Injector), [], getDOM().createElement('div')); | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  |         } catch (e) { | 
					
						
							|  |  |  |           err = e; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         expect(err).toBeTruthy(); | 
					
						
							|  |  |  |         expect(err.message).toBe('Test'); | 
					
						
							| 
									
										
										
										
											2017-01-27 13:19:00 -08:00
										 |  |  |         const debugCtx = getDebugContext(err); | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  |         expect(debugCtx.view).toBeTruthy(); | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08:00
										 |  |  |         expect(debugCtx.nodeIndex).toBe(1); | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-29 23:34:28 +01:00
										 |  |  |       describe('deps', () => { | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |         class Dep {} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-30 17:14:53 +01:00
										 |  |  |         it('should inject deps from the same element', () => { | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |           createAndGetRootNodes(compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |             elementDef(0, NodeFlags.None, null, null, 2, 'span'), | 
					
						
							|  |  |  |             directiveDef(1, NodeFlags.None, null, 0, Dep, []), | 
					
						
							|  |  |  |             directiveDef(2, NodeFlags.None, null, 0, SomeService, [Dep]) | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |           ])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           expect(instance.dep instanceof Dep).toBeTruthy(); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-30 17:14:53 +01:00
										 |  |  |         it('should inject deps from a parent element', () => { | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |           createAndGetRootNodes(compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |             elementDef(0, NodeFlags.None, null, null, 3, 'span'), | 
					
						
							|  |  |  |             directiveDef(1, NodeFlags.None, null, 0, Dep, []), | 
					
						
							|  |  |  |             elementDef(2, NodeFlags.None, null, null, 1, 'span'), | 
					
						
							|  |  |  |             directiveDef(3, NodeFlags.None, null, 0, SomeService, [Dep]) | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |           ])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           expect(instance.dep instanceof Dep).toBeTruthy(); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-13 11:02:59 +01:00
										 |  |  |         it('should not inject deps from sibling root elements', () => { | 
					
						
							|  |  |  |           const rootElNodes = [ | 
					
						
							|  |  |  |             elementDef(0, NodeFlags.None, null, null, 1, 'span'), | 
					
						
							|  |  |  |             directiveDef(1, NodeFlags.None, null, 0, Dep, []), | 
					
						
							|  |  |  |             elementDef(2, NodeFlags.None, null, null, 1, 'span'), | 
					
						
							|  |  |  |             directiveDef(3, NodeFlags.None, null, 0, SomeService, [Dep]), | 
					
						
							|  |  |  |           ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           expect(() => createAndGetRootNodes(compViewDef(rootElNodes))) | 
					
						
							|  |  |  |               .toThrowError( | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |                   `${ | 
					
						
							|  |  |  |                       ivyEnabled ? | 
					
						
							|  |  |  |                           'R3InjectorError' : | 
					
						
							|  |  |  |                           'StaticInjectorError'}(DynamicTestModule)[SomeService -> Dep]: \n` +
 | 
					
						
							| 
									
										
										
										
											2018-12-13 11:02:59 +01:00
										 |  |  |                   '  StaticInjectorError(Platform: core)[SomeService -> Dep]: \n' + | 
					
						
							|  |  |  |                   '    NullInjectorError: No provider for Dep!'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           const nonRootElNodes = [ | 
					
						
							|  |  |  |             elementDef(0, NodeFlags.None, null, null, 4, 'span'), | 
					
						
							|  |  |  |             elementDef(1, NodeFlags.None, null, null, 1, 'span'), | 
					
						
							|  |  |  |             directiveDef(2, NodeFlags.None, null, 0, Dep, []), | 
					
						
							|  |  |  |             elementDef(3, NodeFlags.None, null, null, 1, 'span'), | 
					
						
							|  |  |  |             directiveDef(4, NodeFlags.None, null, 0, SomeService, [Dep]), | 
					
						
							|  |  |  |           ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           expect(() => createAndGetRootNodes(compViewDef(nonRootElNodes))) | 
					
						
							|  |  |  |               .toThrowError( | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |                   `${ | 
					
						
							|  |  |  |                       ivyEnabled ? | 
					
						
							|  |  |  |                           'R3InjectorError' : | 
					
						
							|  |  |  |                           'StaticInjectorError'}(DynamicTestModule)[SomeService -> Dep]: \n` +
 | 
					
						
							| 
									
										
										
										
											2018-12-13 11:02:59 +01:00
										 |  |  |                   '  StaticInjectorError(Platform: core)[SomeService -> Dep]: \n' + | 
					
						
							|  |  |  |                   '    NullInjectorError: No provider for Dep!'); | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-30 17:14:53 +01:00
										 |  |  |         it('should inject from a parent element in a parent view', () => { | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |           createAndGetRootNodes(compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-02-21 13:56:56 -08:00
										 |  |  |             elementDef( | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |                 0, NodeFlags.None, null, null, 1, 'div', null, null, null, null, | 
					
						
							| 
									
										
										
										
											2017-01-19 10:25:03 -08:00
										 |  |  |                 () => compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |                   elementDef(0, NodeFlags.None, null, null, 1, 'span'), | 
					
						
							|  |  |  |                   directiveDef(1, NodeFlags.None, null, 0, SomeService, [Dep]) | 
					
						
							| 
									
										
										
										
											2017-01-19 10:25:03 -08:00
										 |  |  |                 ])), | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |             directiveDef(1, NodeFlags.Component, null, 0, Dep, []), | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |           ])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           expect(instance.dep instanceof Dep).toBeTruthy(); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-13 11:02:59 +01:00
										 |  |  |         it('should throw for missing dependencies', () => { | 
					
						
							|  |  |  |           expect(() => createAndGetRootNodes(compViewDef([ | 
					
						
							|  |  |  |                    elementDef(0, NodeFlags.None, null, null, 1, 'span'), | 
					
						
							|  |  |  |                    directiveDef(1, NodeFlags.None, null, 0, SomeService, ['nonExistingDep']) | 
					
						
							|  |  |  |                  ]))) | 
					
						
							|  |  |  |               .toThrowError( | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |                   `${ | 
					
						
							|  |  |  |                       ivyEnabled ? 'R3InjectorError' : | 
					
						
							|  |  |  |                                    'StaticInjectorError'}(DynamicTestModule)[nonExistingDep]: \n` +
 | 
					
						
							| 
									
										
										
										
											2018-12-13 11:02:59 +01:00
										 |  |  |                   '  StaticInjectorError(Platform: core)[nonExistingDep]: \n' + | 
					
						
							|  |  |  |                   '    NullInjectorError: No provider for nonExistingDep!'); | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-30 17:14:53 +01:00
										 |  |  |         it('should use null for optional missing dependencies', () => { | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |           createAndGetRootNodes(compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |             elementDef(0, NodeFlags.None, null, null, 1, 'span'), | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |             directiveDef( | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |                 1, NodeFlags.None, null, 0, SomeService, [[DepFlags.Optional, 'nonExistingDep']]) | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |           ])); | 
					
						
							|  |  |  |           expect(instance.dep).toBe(null); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-30 17:14:53 +01:00
										 |  |  |         it('should skip the current element when using SkipSelf', () => { | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |           createAndGetRootNodes(compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |             elementDef(0, NodeFlags.None, null, null, 4, 'span'), | 
					
						
							|  |  |  |             providerDef(NodeFlags.TypeValueProvider, null, 'someToken', 'someParentValue', []), | 
					
						
							|  |  |  |             elementDef(2, NodeFlags.None, null, null, 2, 'span'), | 
					
						
							|  |  |  |             providerDef(NodeFlags.TypeValueProvider, null, 'someToken', 'someValue', []), | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |             directiveDef( | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |                 4, NodeFlags.None, null, 0, SomeService, [[DepFlags.SkipSelf, 'someToken']]) | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |           ])); | 
					
						
							|  |  |  |           expect(instance.dep).toBe('someParentValue'); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-30 17:14:53 +01:00
										 |  |  |         it('should ask the root injector', | 
					
						
							|  |  |  |            withModule({providers: [{provide: 'rootDep', useValue: 'rootValue'}]}, () => { | 
					
						
							|  |  |  |              createAndGetRootNodes(compViewDef([ | 
					
						
							|  |  |  |                elementDef(0, NodeFlags.None, null, null, 1, 'span'), | 
					
						
							|  |  |  |                directiveDef(1, NodeFlags.None, null, 0, SomeService, ['rootDep']) | 
					
						
							|  |  |  |              ])); | 
					
						
							| 
									
										
										
										
											2017-02-01 11:32:27 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-30 17:14:53 +01:00
										 |  |  |              expect(instance.dep).toBe('rootValue'); | 
					
						
							|  |  |  |            })); | 
					
						
							| 
									
										
										
										
											2017-02-01 11:32:27 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |         describe('builtin tokens', () => { | 
					
						
							| 
									
										
										
										
											2018-11-30 17:14:53 +01:00
										 |  |  |           it('should inject ViewContainerRef', () => { | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |             createAndGetRootNodes(compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |               anchorDef(NodeFlags.EmbeddedViews, null, null, 1), | 
					
						
							|  |  |  |               directiveDef(1, NodeFlags.None, null, 0, SomeService, [ViewContainerRef]), | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |             ])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             expect(instance.dep.createEmbeddedView).toBeTruthy(); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-30 17:14:53 +01:00
										 |  |  |           it('should inject TemplateRef', () => { | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |             createAndGetRootNodes(compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |               anchorDef(NodeFlags.None, null, null, 1, null, compViewDefFactory([anchorDef( | 
					
						
							|  |  |  |                                                                  NodeFlags.None, null, null, 0)])), | 
					
						
							|  |  |  |               directiveDef(1, NodeFlags.None, null, 0, SomeService, [TemplateRef]), | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |             ])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             expect(instance.dep.createEmbeddedView).toBeTruthy(); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-30 17:14:53 +01:00
										 |  |  |           it('should inject ElementRef', () => { | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  |             const {view} = createAndGetRootNodes(compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |               elementDef(0, NodeFlags.None, null, null, 1, 'span'), | 
					
						
							|  |  |  |               directiveDef(1, NodeFlags.None, null, 0, SomeService, [ElementRef]), | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |             ])); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  |             expect(instance.dep.nativeElement).toBe(asElementData(view, 0).renderElement); | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |           }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-30 17:14:53 +01:00
										 |  |  |           it('should inject Injector', () => { | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |             const {view} = createAndGetRootNodes(compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |               elementDef(0, NodeFlags.None, null, null, 1, 'span'), | 
					
						
							|  |  |  |               directiveDef(1, NodeFlags.None, null, 0, SomeService, [Injector]), | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |             ])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             expect(instance.dep.get(SomeService)).toBe(instance); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-30 17:14:53 +01:00
										 |  |  |           it('should inject ChangeDetectorRef for non component providers', () => { | 
					
						
							|  |  |  |             const {view} = createAndGetRootNodes(compViewDef([ | 
					
						
							|  |  |  |               elementDef(0, NodeFlags.None, null, null, 1, 'span'), | 
					
						
							|  |  |  |               directiveDef(1, NodeFlags.None, null, 0, SomeService, [ChangeDetectorRef]) | 
					
						
							|  |  |  |             ])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             expect(instance.dep._view).toBe(view); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           it('should inject ChangeDetectorRef for component providers', () => { | 
					
						
							|  |  |  |             const {view, rootNodes} = createAndGetRootNodes(compViewDef([ | 
					
						
							|  |  |  |               elementDef( | 
					
						
							|  |  |  |                   0, NodeFlags.None, null, null, 1, 'div', null, null, null, null, | 
					
						
							|  |  |  |                   () => compViewDef([ | 
					
						
							|  |  |  |                     elementDef(0, NodeFlags.None, null, null, 0, 'span'), | 
					
						
							|  |  |  |                   ])), | 
					
						
							|  |  |  |               directiveDef(1, NodeFlags.Component, null, 0, SomeService, [ChangeDetectorRef]), | 
					
						
							|  |  |  |             ])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             const compView = asElementData(view, 0).componentView; | 
					
						
							|  |  |  |             expect(instance.dep._view).toBe(compView); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           it('should inject Renderer2', () => { | 
					
						
							| 
									
										
										
										
											2017-02-16 13:55:55 -08:00
										 |  |  |             createAndGetRootNodes(compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-02-21 13:56:56 -08:00
										 |  |  |               elementDef( | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |                   0, NodeFlags.None, null, null, 1, 'span', null, null, null, null, | 
					
						
							|  |  |  |                   () => compViewDef([anchorDef(NodeFlags.None, null, null, 0)])), | 
					
						
							|  |  |  |               directiveDef(1, NodeFlags.Component, null, 0, SomeService, [Renderer2]) | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08:00
										 |  |  |             ])); | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08:00
										 |  |  |             expect(instance.dep.createElement).toBeTruthy(); | 
					
						
							|  |  |  |           }); | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |         }); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('data binding', () => { | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08:00
										 |  |  |       ARG_TYPE_VALUES.forEach((inlineDynamic) => { | 
					
						
							| 
									
										
										
										
											2017-02-27 09:14:18 -08:00
										 |  |  |         it(`should update via strategy ${inlineDynamic}`, () => { | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |           let instance: SomeService = undefined!; | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |           class SomeService { | 
					
						
							|  |  |  |             a: any; | 
					
						
							|  |  |  |             b: any; | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |             constructor() { | 
					
						
							|  |  |  |               instance = this; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |           } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           const {view, rootNodes} = createAndGetRootNodes(compViewDef( | 
					
						
							|  |  |  |               [ | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |                 elementDef(0, NodeFlags.None, null, null, 1, 'span'), | 
					
						
							| 
									
										
										
										
											2017-03-29 09:34:45 -07:00
										 |  |  |                 directiveDef( | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |                     1, NodeFlags.None, null, 0, SomeService, [], {a: [0, 'a'], b: [1, 'b']}) | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |               ], | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08:00
										 |  |  |               (check, view) => { | 
					
						
							|  |  |  |                 checkNodeInlineOrDynamic(check, view, 1, inlineDynamic, ['v1', 'v2']); | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  |               })); | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08:00
										 |  |  |           Services.checkAndUpdateView(view); | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |           expect(instance.a).toBe('v1'); | 
					
						
							|  |  |  |           expect(instance.b).toBe('v2'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08:00
										 |  |  |           const el = rootNodes[0]; | 
					
						
							| 
									
										
										
										
											2019-08-30 12:52:48 -07:00
										 |  |  |           expect(el.getAttribute('ng-reflect-a')).toBe('v1'); | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  |         }); | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-19 10:25:03 -08:00
										 |  |  |     describe('outputs', () => { | 
					
						
							|  |  |  |       it('should listen to provider events', () => { | 
					
						
							|  |  |  |         let emitter = new EventEmitter<any>(); | 
					
						
							|  |  |  |         let unsubscribeSpy: any; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         class SomeService { | 
					
						
							| 
									
										
										
										
											2019-11-27 13:00:59 -08:00
										 |  |  |           emitter = { | 
					
						
							|  |  |  |             subscribe: (callback: any) => { | 
					
						
							|  |  |  |               const subscription = emitter.subscribe(callback); | 
					
						
							|  |  |  |               unsubscribeSpy = spyOn(subscription, 'unsubscribe').and.callThrough(); | 
					
						
							|  |  |  |               return subscription; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           }; | 
					
						
							| 
									
										
										
										
											2017-01-19 10:25:03 -08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const handleEvent = jasmine.createSpy('handleEvent'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-20 12:15:03 -08:00
										 |  |  |         const {view, rootNodes} = createAndGetRootNodes(compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |           elementDef(0, NodeFlags.None, null, null, 1, 'span', null, null, null, handleEvent), | 
					
						
							| 
									
										
										
										
											2017-02-20 12:15:03 -08:00
										 |  |  |           directiveDef( | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |               1, NodeFlags.None, null, 0, SomeService, [], null, {emitter: 'someEventName'}) | 
					
						
							| 
									
										
										
										
											2017-02-20 12:15:03 -08:00
										 |  |  |         ])); | 
					
						
							| 
									
										
										
										
											2017-01-19 10:25:03 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         emitter.emit('someEventInstance'); | 
					
						
							| 
									
										
										
										
											2017-02-20 12:15:03 -08:00
										 |  |  |         expect(handleEvent).toHaveBeenCalledWith(view, 'someEventName', 'someEventInstance'); | 
					
						
							| 
									
										
										
										
											2017-01-19 10:25:03 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08:00
										 |  |  |         Services.destroyView(view); | 
					
						
							| 
									
										
										
										
											2017-01-19 10:25:03 -08:00
										 |  |  |         expect(unsubscribeSpy).toHaveBeenCalled(); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should report debug info on event errors', () => { | 
					
						
							| 
									
										
										
										
											2019-08-28 16:22:36 -07:00
										 |  |  |         const handleErrorSpy = spyOn(TestBed.inject(ErrorHandler), 'handleError'); | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  |         let emitter = new EventEmitter<any>(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         class SomeService { | 
					
						
							|  |  |  |           emitter = emitter; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-20 12:15:03 -08:00
										 |  |  |         const {view, rootNodes} = createAndGetRootNodes(compViewDef([ | 
					
						
							|  |  |  |           elementDef( | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |               0, NodeFlags.None, null, null, 1, 'span', null, null, null, | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |               () => { | 
					
						
							|  |  |  |                 throw new Error('Test'); | 
					
						
							|  |  |  |               }), | 
					
						
							| 
									
										
										
										
											2017-02-20 12:15:03 -08:00
										 |  |  |           directiveDef( | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |               1, NodeFlags.None, null, 0, SomeService, [], null, {emitter: 'someEventName'}) | 
					
						
							| 
									
										
										
										
											2017-02-20 12:15:03 -08:00
										 |  |  |         ])); | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-28 11:50:45 -07:00
										 |  |  |         emitter.emit('someEventInstance'); | 
					
						
							|  |  |  |         const err = handleErrorSpy.calls.mostRecent().args[0]; | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  |         expect(err).toBeTruthy(); | 
					
						
							| 
									
										
										
										
											2017-01-27 13:19:00 -08:00
										 |  |  |         const debugCtx = getDebugContext(err); | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  |         expect(debugCtx.view).toBe(view); | 
					
						
							|  |  |  |         // events are emitted with the index of the element, not the index of the provider.
 | 
					
						
							|  |  |  |         expect(debugCtx.nodeIndex).toBe(0); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2017-01-19 10:25:03 -08:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |     describe('lifecycle hooks', () => { | 
					
						
							|  |  |  |       it('should call the lifecycle hooks in the right order', () => { | 
					
						
							|  |  |  |         let instanceCount = 0; | 
					
						
							|  |  |  |         let log: string[] = []; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         class SomeService implements OnInit, DoCheck, OnChanges, AfterContentInit, | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |                                      AfterContentChecked, AfterViewInit, AfterViewChecked, | 
					
						
							|  |  |  |                                      OnDestroy { | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |           id: number; | 
					
						
							|  |  |  |           a: any; | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |           ngOnInit() { | 
					
						
							|  |  |  |             log.push(`${this.id}_ngOnInit`); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           ngDoCheck() { | 
					
						
							|  |  |  |             log.push(`${this.id}_ngDoCheck`); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           ngOnChanges() { | 
					
						
							|  |  |  |             log.push(`${this.id}_ngOnChanges`); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           ngAfterContentInit() { | 
					
						
							|  |  |  |             log.push(`${this.id}_ngAfterContentInit`); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           ngAfterContentChecked() { | 
					
						
							|  |  |  |             log.push(`${this.id}_ngAfterContentChecked`); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           ngAfterViewInit() { | 
					
						
							|  |  |  |             log.push(`${this.id}_ngAfterViewInit`); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           ngAfterViewChecked() { | 
					
						
							|  |  |  |             log.push(`${this.id}_ngAfterViewChecked`); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           ngOnDestroy() { | 
					
						
							|  |  |  |             log.push(`${this.id}_ngOnDestroy`); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           constructor() { | 
					
						
							|  |  |  |             this.id = instanceCount++; | 
					
						
							|  |  |  |           } | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const allFlags = NodeFlags.OnInit | NodeFlags.DoCheck | NodeFlags.OnChanges | | 
					
						
							|  |  |  |             NodeFlags.AfterContentInit | NodeFlags.AfterContentChecked | NodeFlags.AfterViewInit | | 
					
						
							|  |  |  |             NodeFlags.AfterViewChecked | NodeFlags.OnDestroy; | 
					
						
							|  |  |  |         const {view, rootNodes} = createAndGetRootNodes(compViewDef( | 
					
						
							|  |  |  |             [ | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |               elementDef(0, NodeFlags.None, null, null, 3, 'span'), | 
					
						
							|  |  |  |               directiveDef(1, allFlags, null, 0, SomeService, [], {a: [0, 'a']}), | 
					
						
							|  |  |  |               elementDef(2, NodeFlags.None, null, null, 1, 'span'), | 
					
						
							|  |  |  |               directiveDef(3, allFlags, null, 0, SomeService, [], {a: [0, 'a']}) | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |             ], | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08:00
										 |  |  |             (check, view) => { | 
					
						
							|  |  |  |               check(view, 1, ArgumentType.Inline, 'someValue'); | 
					
						
							|  |  |  |               check(view, 3, ArgumentType.Inline, 'someValue'); | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |             })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08:00
										 |  |  |         Services.checkAndUpdateView(view); | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // Note: After... hooks are called bottom up.
 | 
					
						
							|  |  |  |         expect(log).toEqual([ | 
					
						
							|  |  |  |           '0_ngOnChanges', | 
					
						
							|  |  |  |           '0_ngOnInit', | 
					
						
							|  |  |  |           '0_ngDoCheck', | 
					
						
							|  |  |  |           '1_ngOnChanges', | 
					
						
							|  |  |  |           '1_ngOnInit', | 
					
						
							|  |  |  |           '1_ngDoCheck', | 
					
						
							|  |  |  |           '1_ngAfterContentInit', | 
					
						
							|  |  |  |           '1_ngAfterContentChecked', | 
					
						
							|  |  |  |           '0_ngAfterContentInit', | 
					
						
							|  |  |  |           '0_ngAfterContentChecked', | 
					
						
							|  |  |  |           '1_ngAfterViewInit', | 
					
						
							|  |  |  |           '1_ngAfterViewChecked', | 
					
						
							|  |  |  |           '0_ngAfterViewInit', | 
					
						
							|  |  |  |           '0_ngAfterViewChecked', | 
					
						
							|  |  |  |         ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         log = []; | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08:00
										 |  |  |         Services.checkAndUpdateView(view); | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // Note: After... hooks are called bottom up.
 | 
					
						
							|  |  |  |         expect(log).toEqual([ | 
					
						
							|  |  |  |           '0_ngDoCheck', '1_ngDoCheck', '1_ngAfterContentChecked', '0_ngAfterContentChecked', | 
					
						
							|  |  |  |           '1_ngAfterViewChecked', '0_ngAfterViewChecked' | 
					
						
							|  |  |  |         ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         log = []; | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08:00
										 |  |  |         Services.destroyView(view); | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // Note: ngOnDestroy ist called bottom up.
 | 
					
						
							|  |  |  |         expect(log).toEqual(['1_ngOnDestroy', '0_ngOnDestroy']); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should call ngOnChanges with the changed values and the non minified names', () => { | 
					
						
							|  |  |  |         let changesLog: SimpleChange[] = []; | 
					
						
							|  |  |  |         let currValue = 'v1'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         class SomeService implements OnChanges { | 
					
						
							|  |  |  |           a: any; | 
					
						
							|  |  |  |           ngOnChanges(changes: {[name: string]: SimpleChange}) { | 
					
						
							|  |  |  |             changesLog.push(changes['nonMinifiedA']); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const {view, rootNodes} = createAndGetRootNodes(compViewDef( | 
					
						
							|  |  |  |             [ | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |               elementDef(0, NodeFlags.None, null, null, 1, 'span'), | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |               directiveDef( | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |                   1, NodeFlags.OnChanges, null, 0, SomeService, [], {a: [0, 'nonMinifiedA']}) | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |             ], | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |             (check, view) => { | 
					
						
							|  |  |  |               check(view, 1, ArgumentType.Inline, currValue); | 
					
						
							|  |  |  |             })); | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08:00
										 |  |  |         Services.checkAndUpdateView(view); | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |         expect(changesLog).toEqual([new SimpleChange(undefined, 'v1', true)]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         currValue = 'v2'; | 
					
						
							|  |  |  |         changesLog = []; | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08:00
										 |  |  |         Services.checkAndUpdateView(view); | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |         expect(changesLog).toEqual([new SimpleChange('v1', 'v2', false)]); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should add a DebugContext to errors in provider afterXXX lifecycles', () => { | 
					
						
							|  |  |  |         class SomeService implements AfterContentChecked { | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |           ngAfterContentChecked() { | 
					
						
							|  |  |  |             throw new Error('Test'); | 
					
						
							|  |  |  |           } | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const {view, rootNodes} = createAndGetRootNodes(compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |           elementDef(0, NodeFlags.None, null, null, 1, 'span'), | 
					
						
							|  |  |  |           directiveDef(1, NodeFlags.AfterContentChecked, null, 0, SomeService, [], {a: [0, 'a']}), | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  |         ])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let err: any; | 
					
						
							|  |  |  |         try { | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08:00
										 |  |  |           Services.checkAndUpdateView(view); | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  |         } catch (e) { | 
					
						
							|  |  |  |           err = e; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         expect(err).toBeTruthy(); | 
					
						
							|  |  |  |         expect(err.message).toBe('Test'); | 
					
						
							| 
									
										
										
										
											2017-01-27 13:19:00 -08:00
										 |  |  |         const debugCtx = getDebugContext(err); | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  |         expect(debugCtx.view).toBe(view); | 
					
						
							|  |  |  |         expect(debugCtx.nodeIndex).toBe(1); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08:00
										 |  |  |       it('should add a DebugContext to errors inServices.destroyView', () => { | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  |         class SomeService implements OnDestroy { | 
					
						
							| 
									
										
										
										
											2020-04-13 16:40:21 -07:00
										 |  |  |           ngOnDestroy() { | 
					
						
							|  |  |  |             throw new Error('Test'); | 
					
						
							|  |  |  |           } | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const {view, rootNodes} = createAndGetRootNodes(compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-09-22 14:29:16 -07:00
										 |  |  |           elementDef(0, NodeFlags.None, null, null, 1, 'span'), | 
					
						
							|  |  |  |           directiveDef(1, NodeFlags.OnDestroy, null, 0, SomeService, [], {a: [0, 'a']}), | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  |         ])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let err: any; | 
					
						
							|  |  |  |         try { | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08:00
										 |  |  |           Services.destroyView(view); | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  |         } catch (e) { | 
					
						
							|  |  |  |           err = e; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         expect(err).toBeTruthy(); | 
					
						
							|  |  |  |         expect(err.message).toBe('Test'); | 
					
						
							| 
									
										
										
										
											2017-01-27 13:19:00 -08:00
										 |  |  |         const debugCtx = getDebugContext(err); | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  |         expect(debugCtx.view).toBe(view); | 
					
						
							|  |  |  |         expect(debugCtx.nodeIndex).toBe(1); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | } |