| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @license | 
					
						
							|  |  |  |  * Copyright Google Inc. All Rights Reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 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
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-07 16:36:12 -08:00
										 |  |  | import {AfterContentChecked, AfterContentInit, AfterViewChecked, AfterViewInit, ChangeDetectorRef, DoCheck, ElementRef, EventEmitter, Injector, OnChanges, OnDestroy, OnInit, RenderComponentType, Renderer, Renderer2, RootRenderer, Sanitizer, SecurityContext, SimpleChange, TemplateRef, ViewContainerRef, ViewEncapsulation, WrappedValue, getDebugNode} from '@angular/core'; | 
					
						
							| 
									
										
										
										
											2017-01-27 13:19:00 -08:00
										 |  |  | import {getDebugContext} from '@angular/core/src/errors'; | 
					
						
							| 
									
										
										
										
											2017-03-17 09:23:28 -07:00
										 |  |  | import {ArgumentType, BindingFlags, DebugContext, DepFlags, NodeDef, NodeFlags, RootData, Services, ViewData, ViewDefinition, ViewDefinitionFactory, ViewFlags, ViewHandleEventFn, ViewUpdateFn, anchorDef, asElementData, asProviderData, directiveDef, elementDef, providerDef, rootRenderNodes, textDef, viewDef} from '@angular/core/src/view/index'; | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08:00
										 |  |  | import {TestBed, inject, withModule} from '@angular/core/testing'; | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  | import {getDOM} from '@angular/platform-browser/src/dom/dom_adapter'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08:00
										 |  |  | import {ARG_TYPE_VALUES, checkNodeInlineOrDynamic, createRootView, isBrowser} from './helper'; | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | export function main() { | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08:00
										 |  |  |   describe(`View Providers`, () => { | 
					
						
							| 
									
										
										
										
											2017-01-19 10:25:03 -08:00
										 |  |  |     function compViewDef( | 
					
						
							| 
									
										
										
										
											2017-02-09 14:59:57 -08:00
										 |  |  |         nodes: NodeDef[], updateDirectives?: ViewUpdateFn, updateRenderer?: ViewUpdateFn, | 
					
						
							| 
									
										
										
										
											2017-02-20 12:15:03 -08:00
										 |  |  |         viewFlags: ViewFlags = ViewFlags.None): ViewDefinition { | 
					
						
							|  |  |  |       return viewDef(viewFlags, nodes, updateDirectives, updateRenderer); | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-02 15:01:35 -08:00
										 |  |  |     function embeddedViewDef(nodes: NodeDef[], update?: ViewUpdateFn): ViewDefinitionFactory { | 
					
						
							|  |  |  |       return () => viewDef(ViewFlags.None, nodes, update); | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function createAndGetRootNodes(viewDef: ViewDefinition): {rootNodes: any[], view: ViewData} { | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08:00
										 |  |  |       const view = createRootView(viewDef, {}); | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |       const rootNodes = rootRenderNodes(view); | 
					
						
							|  |  |  |       return {rootNodes, view}; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('create', () => { | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |       let instance: SomeService; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class SomeService { | 
					
						
							|  |  |  |         constructor(public dep: any) { instance = this; } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       beforeEach(() => { instance = null; }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |       it('should create providers eagerly', () => { | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |         createAndGetRootNodes(compViewDef([ | 
					
						
							|  |  |  |           elementDef(NodeFlags.None, null, null, 1, 'span'), | 
					
						
							|  |  |  |           directiveDef(NodeFlags.None, null, 0, SomeService, []) | 
					
						
							|  |  |  |         ])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expect(instance instanceof SomeService).toBe(true); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should create providers lazily', () => { | 
					
						
							|  |  |  |         let lazy: LazyService; | 
					
						
							|  |  |  |         class LazyService { | 
					
						
							|  |  |  |           constructor() { lazy = this; } | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-23 16:59:20 -08:00
										 |  |  |         createAndGetRootNodes(compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |           elementDef(NodeFlags.None, null, null, 2, 'span'), | 
					
						
							| 
									
										
										
										
											2017-02-09 14:59:57 -08:00
										 |  |  |           providerDef( | 
					
						
							| 
									
										
										
										
											2017-02-27 09:14:18 -08:00
										 |  |  |               NodeFlags.TypeClassProvider | NodeFlags.LazyProvider, null, LazyService, LazyService, | 
					
						
							|  |  |  |               []), | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |           directiveDef(NodeFlags.None, null, 0, SomeService, [Injector]) | 
					
						
							|  |  |  |         ])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expect(lazy).toBeUndefined(); | 
					
						
							|  |  |  |         instance.dep.get(LazyService); | 
					
						
							|  |  |  |         expect(lazy instanceof LazyService).toBe(true); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should create value providers', () => { | 
					
						
							|  |  |  |         createAndGetRootNodes(compViewDef([ | 
					
						
							|  |  |  |           elementDef(NodeFlags.None, null, null, 2, 'span'), | 
					
						
							| 
									
										
										
										
											2017-02-27 09:14:18 -08:00
										 |  |  |           providerDef(NodeFlags.TypeValueProvider, null, 'someToken', 'someValue', []), | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |           directiveDef(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', () => { | 
					
						
							|  |  |  |         function someFactory() { return 'someValue'; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         createAndGetRootNodes(compViewDef([ | 
					
						
							|  |  |  |           elementDef(NodeFlags.None, null, null, 2, 'span'), | 
					
						
							| 
									
										
										
										
											2017-02-27 09:14:18 -08:00
										 |  |  |           providerDef(NodeFlags.TypeFactoryProvider, null, 'someToken', someFactory, []), | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |           directiveDef(NodeFlags.None, null, 0, SomeService, ['someToken']), | 
					
						
							|  |  |  |         ])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         expect(instance.dep).toBe('someValue'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should create useExisting providers', () => { | 
					
						
							|  |  |  |         createAndGetRootNodes(compViewDef([ | 
					
						
							|  |  |  |           elementDef(NodeFlags.None, null, null, 3, 'span'), | 
					
						
							| 
									
										
										
										
											2017-02-27 09:14:18 -08:00
										 |  |  |           providerDef(NodeFlags.TypeValueProvider, null, 'someExistingToken', 'someValue', []), | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |           providerDef( | 
					
						
							| 
									
										
										
										
											2017-02-27 09:14:18 -08:00
										 |  |  |               NodeFlags.TypeUseExistingProvider, null, 'someToken', null, ['someExistingToken']), | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |           directiveDef(NodeFlags.None, null, 0, SomeService, ['someToken']), | 
					
						
							|  |  |  |         ])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         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 { | 
					
						
							|  |  |  |           constructor() { throw new Error('Test'); } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let err: any; | 
					
						
							|  |  |  |         try { | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08:00
										 |  |  |           createRootView( | 
					
						
							|  |  |  |               compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-02-21 13:56:56 -08:00
										 |  |  |                 elementDef( | 
					
						
							|  |  |  |                     NodeFlags.None, null, null, 1, 'div', null, null, null, null, | 
					
						
							|  |  |  |                     () => compViewDef([textDef(null, ['a'])])), | 
					
						
							| 
									
										
										
										
											2017-02-27 09:14:18 -08:00
										 |  |  |                 directiveDef(NodeFlags.Component, null, 0, SomeService, []) | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08:00
										 |  |  |               ]), | 
					
						
							|  |  |  |               TestBed.get(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
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |       describe('deps', () => { | 
					
						
							|  |  |  |         class Dep {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should inject deps from the same element', () => { | 
					
						
							|  |  |  |           createAndGetRootNodes(compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-01-31 08:51:42 -08:00
										 |  |  |             elementDef(NodeFlags.None, null, null, 2, 'span'), | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |             directiveDef(NodeFlags.None, null, 0, Dep, []), | 
					
						
							|  |  |  |             directiveDef(NodeFlags.None, null, 0, SomeService, [Dep]) | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |           ])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           expect(instance.dep instanceof Dep).toBeTruthy(); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should inject deps from a parent element', () => { | 
					
						
							|  |  |  |           createAndGetRootNodes(compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-01-31 08:51:42 -08:00
										 |  |  |             elementDef(NodeFlags.None, null, null, 3, 'span'), | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |             directiveDef(NodeFlags.None, null, 0, Dep, []), | 
					
						
							| 
									
										
										
										
											2017-01-31 08:51:42 -08:00
										 |  |  |             elementDef(NodeFlags.None, null, null, 1, 'span'), | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |             directiveDef(NodeFlags.None, null, 0, SomeService, [Dep]) | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |           ])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           expect(instance.dep instanceof Dep).toBeTruthy(); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should not inject deps from sibling root elements', () => { | 
					
						
							|  |  |  |           const nodes = [ | 
					
						
							| 
									
										
										
										
											2017-01-31 08:51:42 -08:00
										 |  |  |             elementDef(NodeFlags.None, null, null, 1, 'span'), | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |             directiveDef(NodeFlags.None, null, 0, Dep, []), | 
					
						
							| 
									
										
										
										
											2017-01-31 08:51:42 -08:00
										 |  |  |             elementDef(NodeFlags.None, null, null, 1, 'span'), | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |             directiveDef(NodeFlags.None, null, 0, SomeService, [Dep]) | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |           ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           // root elements
 | 
					
						
							|  |  |  |           expect(() => createAndGetRootNodes(compViewDef(nodes))) | 
					
						
							|  |  |  |               .toThrowError('No provider for Dep!'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           // non root elements
 | 
					
						
							|  |  |  |           expect( | 
					
						
							|  |  |  |               () => createAndGetRootNodes( | 
					
						
							| 
									
										
										
										
											2017-01-31 08:51:42 -08:00
										 |  |  |                   compViewDef([elementDef(NodeFlags.None, null, null, 4, 'span')].concat(nodes)))) | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |               .toThrowError('No provider for Dep!'); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should inject from a parent elment in a parent view', () => { | 
					
						
							|  |  |  |           createAndGetRootNodes(compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-02-21 13:56:56 -08:00
										 |  |  |             elementDef( | 
					
						
							|  |  |  |                 NodeFlags.None, null, null, 1, 'div', null, null, null, null, | 
					
						
							| 
									
										
										
										
											2017-01-19 10:25:03 -08:00
										 |  |  |                 () => compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-01-31 08:51:42 -08:00
										 |  |  |                   elementDef(NodeFlags.None, null, null, 1, 'span'), | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |                   directiveDef(NodeFlags.None, null, 0, SomeService, [Dep]) | 
					
						
							| 
									
										
										
										
											2017-01-19 10:25:03 -08:00
										 |  |  |                 ])), | 
					
						
							| 
									
										
										
										
											2017-02-27 09:14:18 -08:00
										 |  |  |             directiveDef(NodeFlags.Component, null, 0, Dep, []), | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |           ])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           expect(instance.dep instanceof Dep).toBeTruthy(); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |         it('should throw for missing dependencies', () => { | 
					
						
							|  |  |  |           expect(() => createAndGetRootNodes(compViewDef([ | 
					
						
							|  |  |  |                    elementDef(NodeFlags.None, null, null, 1, 'span'), | 
					
						
							|  |  |  |                    directiveDef(NodeFlags.None, null, 0, SomeService, ['nonExistingDep']) | 
					
						
							|  |  |  |                  ]))) | 
					
						
							|  |  |  |               .toThrowError('No provider for nonExistingDep!'); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should use null for optional missing dependencies', () => { | 
					
						
							|  |  |  |           createAndGetRootNodes(compViewDef([ | 
					
						
							|  |  |  |             elementDef(NodeFlags.None, null, null, 1, 'span'), | 
					
						
							|  |  |  |             directiveDef( | 
					
						
							|  |  |  |                 NodeFlags.None, null, 0, SomeService, [[DepFlags.Optional, 'nonExistingDep']]) | 
					
						
							|  |  |  |           ])); | 
					
						
							|  |  |  |           expect(instance.dep).toBe(null); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should skip the current element when using SkipSelf', () => { | 
					
						
							|  |  |  |           createAndGetRootNodes(compViewDef([ | 
					
						
							|  |  |  |             elementDef(NodeFlags.None, null, null, 4, 'span'), | 
					
						
							| 
									
										
										
										
											2017-02-27 09:14:18 -08:00
										 |  |  |             providerDef(NodeFlags.TypeValueProvider, null, 'someToken', 'someParentValue', []), | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |             elementDef(NodeFlags.None, null, null, 2, 'span'), | 
					
						
							| 
									
										
										
										
											2017-02-27 09:14:18 -08:00
										 |  |  |             providerDef(NodeFlags.TypeValueProvider, null, 'someToken', 'someValue', []), | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |             directiveDef( | 
					
						
							|  |  |  |                 NodeFlags.None, null, 0, SomeService, [[DepFlags.SkipSelf, 'someToken']]) | 
					
						
							|  |  |  |           ])); | 
					
						
							|  |  |  |           expect(instance.dep).toBe('someParentValue'); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08:00
										 |  |  |         it('should ask the root injector', | 
					
						
							|  |  |  |            withModule({providers: [{provide: 'rootDep', useValue: 'rootValue'}]}, () => { | 
					
						
							|  |  |  |              createAndGetRootNodes(compViewDef([ | 
					
						
							|  |  |  |                elementDef(NodeFlags.None, null, null, 1, 'span'), | 
					
						
							|  |  |  |                directiveDef(NodeFlags.None, null, 0, SomeService, ['rootDep']) | 
					
						
							|  |  |  |              ])); | 
					
						
							| 
									
										
										
										
											2017-02-01 11:32:27 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08: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', () => { | 
					
						
							|  |  |  |           it('should inject ViewContainerRef', () => { | 
					
						
							|  |  |  |             createAndGetRootNodes(compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-02-27 09:14:18 -08:00
										 |  |  |               anchorDef(NodeFlags.EmbeddedViews, null, null, 1), | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |               directiveDef(NodeFlags.None, null, 0, SomeService, [ViewContainerRef]) | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |             ])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             expect(instance.dep.createEmbeddedView).toBeTruthy(); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           it('should inject TemplateRef', () => { | 
					
						
							|  |  |  |             createAndGetRootNodes(compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-02-20 12:15:03 -08:00
										 |  |  |               anchorDef(NodeFlags.None, null, null, 1, null, embeddedViewDef([anchorDef( | 
					
						
							|  |  |  |                                                                  NodeFlags.None, null, null, 0)])), | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |               directiveDef(NodeFlags.None, null, 0, SomeService, [TemplateRef]) | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |             ])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             expect(instance.dep.createEmbeddedView).toBeTruthy(); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           it('should inject ElementRef', () => { | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  |             const {view} = createAndGetRootNodes(compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-01-31 08:51:42 -08:00
										 |  |  |               elementDef(NodeFlags.None, null, null, 1, 'span'), | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |               directiveDef(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
										 |  |  |           }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |           it('should inject Injector', () => { | 
					
						
							|  |  |  |             const {view} = createAndGetRootNodes(compViewDef([ | 
					
						
							|  |  |  |               elementDef(NodeFlags.None, null, null, 1, 'span'), | 
					
						
							|  |  |  |               directiveDef(NodeFlags.None, null, 0, SomeService, [Injector]) | 
					
						
							|  |  |  |             ])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             expect(instance.dep.get(SomeService)).toBe(instance); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           it('should inject ChangeDetectorRef for non component providers', () => { | 
					
						
							|  |  |  |             const {view} = createAndGetRootNodes(compViewDef([ | 
					
						
							|  |  |  |               elementDef(NodeFlags.None, null, null, 1, 'span'), | 
					
						
							|  |  |  |               directiveDef(NodeFlags.None, null, 0, SomeService, [ChangeDetectorRef]) | 
					
						
							|  |  |  |             ])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             expect(instance.dep._view).toBe(view); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           it('should inject ChangeDetectorRef for component providers', () => { | 
					
						
							|  |  |  |             const {view, rootNodes} = createAndGetRootNodes(compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-02-21 13:56:56 -08:00
										 |  |  |               elementDef( | 
					
						
							|  |  |  |                   NodeFlags.None, null, null, 1, 'div', null, null, null, null, | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |                   () => compViewDef([ | 
					
						
							|  |  |  |                     elementDef(NodeFlags.None, null, null, 0, 'span'), | 
					
						
							|  |  |  |                   ])), | 
					
						
							| 
									
										
										
										
											2017-02-27 09:14:18 -08:00
										 |  |  |               directiveDef(NodeFlags.Component, null, 0, SomeService, [ChangeDetectorRef]), | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |             ])); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-21 13:56:56 -08:00
										 |  |  |             const compView = asElementData(view, 0).componentView; | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |             expect(instance.dep._view).toBe(compView); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08:00
										 |  |  |           it('should inject RendererV1', () => { | 
					
						
							|  |  |  |             createAndGetRootNodes(compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-02-21 13:56:56 -08:00
										 |  |  |               elementDef( | 
					
						
							|  |  |  |                   NodeFlags.None, null, null, 1, 'span', null, null, null, null, | 
					
						
							|  |  |  |                   () => compViewDef([anchorDef(NodeFlags.None, null, null, 0)])), | 
					
						
							| 
									
										
										
										
											2017-02-27 09:14:18 -08:00
										 |  |  |               directiveDef(NodeFlags.Component, null, 0, SomeService, [Renderer]) | 
					
						
							| 
									
										
										
										
											2017-02-16 13:55:55 -08:00
										 |  |  |             ])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             expect(instance.dep.createElement).toBeTruthy(); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-07 16:36:12 -08:00
										 |  |  |           it('should inject Renderer2', () => { | 
					
						
							| 
									
										
										
										
											2017-02-16 13:55:55 -08:00
										 |  |  |             createAndGetRootNodes(compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-02-21 13:56:56 -08:00
										 |  |  |               elementDef( | 
					
						
							|  |  |  |                   NodeFlags.None, null, null, 1, 'span', null, null, null, null, | 
					
						
							|  |  |  |                   () => compViewDef([anchorDef(NodeFlags.None, null, null, 0)])), | 
					
						
							| 
									
										
										
										
											2017-03-07 16:36:12 -08:00
										 |  |  |               directiveDef(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-02-16 13:55:55 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('data binding', () => { | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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}`, () => { | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |           let instance: SomeService; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           class SomeService { | 
					
						
							|  |  |  |             a: any; | 
					
						
							|  |  |  |             b: any; | 
					
						
							|  |  |  |             constructor() { instance = this; } | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           const {view, rootNodes} = createAndGetRootNodes(compViewDef( | 
					
						
							|  |  |  |               [ | 
					
						
							| 
									
										
										
										
											2017-01-31 08:51:42 -08:00
										 |  |  |                 elementDef(NodeFlags.None, null, null, 1, 'span'), | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |                 directiveDef(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]; | 
					
						
							|  |  |  |           expect(getDOM().getAttribute(el, 'ng-reflect-a')).toBe('v1'); | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  |         }); | 
					
						
							| 
									
										
										
										
											2017-01-31 11:08:29 -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 { | 
					
						
							|  |  |  |           emitter = { | 
					
						
							|  |  |  |             subscribe: (callback: any) => { | 
					
						
							|  |  |  |               const subscription = emitter.subscribe(callback); | 
					
						
							|  |  |  |               unsubscribeSpy = spyOn(subscription, 'unsubscribe').and.callThrough(); | 
					
						
							|  |  |  |               return subscription; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           }; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const handleEvent = jasmine.createSpy('handleEvent'); | 
					
						
							|  |  |  |         const subscribe = spyOn(emitter, 'subscribe').and.callThrough(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-20 12:15:03 -08:00
										 |  |  |         const {view, rootNodes} = createAndGetRootNodes(compViewDef([ | 
					
						
							|  |  |  |           elementDef(NodeFlags.None, null, null, 1, 'span', null, null, null, handleEvent), | 
					
						
							|  |  |  |           directiveDef( | 
					
						
							|  |  |  |               NodeFlags.None, null, 0, SomeService, [], null, {emitter: 'someEventName'}) | 
					
						
							|  |  |  |         ])); | 
					
						
							| 
									
										
										
										
											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', () => { | 
					
						
							|  |  |  |         let emitter = new EventEmitter<any>(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         class SomeService { | 
					
						
							|  |  |  |           emitter = emitter; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-20 12:15:03 -08:00
										 |  |  |         const {view, rootNodes} = createAndGetRootNodes(compViewDef([ | 
					
						
							|  |  |  |           elementDef( | 
					
						
							|  |  |  |               NodeFlags.None, null, null, 1, 'span', null, null, null, | 
					
						
							|  |  |  |               () => { throw new Error('Test'); }), | 
					
						
							|  |  |  |           directiveDef( | 
					
						
							|  |  |  |               NodeFlags.None, null, 0, SomeService, [], null, {emitter: 'someEventName'}) | 
					
						
							|  |  |  |         ])); | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         let err: any; | 
					
						
							|  |  |  |         try { | 
					
						
							|  |  |  |           emitter.emit('someEventInstance'); | 
					
						
							|  |  |  |         } catch (e) { | 
					
						
							|  |  |  |           err = e; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         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, | 
					
						
							|  |  |  |             AfterContentChecked, AfterViewInit, AfterViewChecked, OnDestroy { | 
					
						
							|  |  |  |           id: number; | 
					
						
							|  |  |  |           a: any; | 
					
						
							|  |  |  |           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++; } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const allFlags = NodeFlags.OnInit | NodeFlags.DoCheck | NodeFlags.OnChanges | | 
					
						
							|  |  |  |             NodeFlags.AfterContentInit | NodeFlags.AfterContentChecked | NodeFlags.AfterViewInit | | 
					
						
							|  |  |  |             NodeFlags.AfterViewChecked | NodeFlags.OnDestroy; | 
					
						
							|  |  |  |         const {view, rootNodes} = createAndGetRootNodes(compViewDef( | 
					
						
							|  |  |  |             [ | 
					
						
							| 
									
										
										
										
											2017-01-31 08:51:42 -08:00
										 |  |  |               elementDef(NodeFlags.None, null, null, 3, 'span'), | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |               directiveDef(allFlags, null, 0, SomeService, [], {a: [0, 'a']}), | 
					
						
							| 
									
										
										
										
											2017-01-31 08:51:42 -08:00
										 |  |  |               elementDef(NodeFlags.None, null, null, 1, 'span'), | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |               directiveDef(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-01-31 08:51:42 -08:00
										 |  |  |               elementDef(NodeFlags.None, null, null, 1, 'span'), | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |               directiveDef( | 
					
						
							|  |  |  |                   NodeFlags.OnChanges, null, 0, SomeService, [], {a: [0, 'nonMinifiedA']}) | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |             ], | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08: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 { | 
					
						
							|  |  |  |           ngAfterContentChecked() { throw new Error('Test'); } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const {view, rootNodes} = createAndGetRootNodes(compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-01-31 08:51:42 -08:00
										 |  |  |           elementDef(NodeFlags.None, null, null, 1, 'span'), | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |           directiveDef(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 { | 
					
						
							|  |  |  |           ngOnDestroy() { throw new Error('Test'); } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const {view, rootNodes} = createAndGetRootNodes(compViewDef([ | 
					
						
							| 
									
										
										
										
											2017-01-31 08:51:42 -08:00
										 |  |  |           elementDef(NodeFlags.None, null, null, 1, 'span'), | 
					
						
							| 
									
										
										
										
											2017-02-01 07:27:38 -08:00
										 |  |  |           directiveDef(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
										 |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | } |