| 
									
										
										
										
											2017-12-01 14:23:03 -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
 | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-05-28 11:57:36 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-05 14:43:58 +02:00
										 |  |  | import {ElementRef, QueryList, TemplateRef, ViewContainerRef} from '@angular/core'; | 
					
						
							| 
									
										
										
										
											2018-05-28 11:57:36 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-31 15:45:46 +02:00
										 |  |  | import {EventEmitter} from '../..'; | 
					
						
							| 
									
										
										
										
											2019-08-12 08:11:32 +03:00
										 |  |  | import {AttributeMarker, ɵɵProvidersFeature, ɵɵdefineComponent, ɵɵdefineDirective} from '../../src/render3/index'; | 
					
						
							|  |  |  | import {ɵɵcontainer, ɵɵcontainerRefreshEnd, ɵɵcontainerRefreshStart, ɵɵdirectiveInject, ɵɵelement, ɵɵelementContainerEnd, ɵɵelementContainerStart, ɵɵelementEnd, ɵɵelementStart, ɵɵembeddedViewEnd, ɵɵembeddedViewStart, ɵɵtemplate, ɵɵtext} from '../../src/render3/instructions/all'; | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  | import {RenderFlags} from '../../src/render3/interfaces/definition'; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  | import {ɵɵcontentQuery, ɵɵloadQuery, ɵɵqueryRefresh, ɵɵviewQuery} from '../../src/render3/query'; | 
					
						
							| 
									
										
										
										
											2018-11-21 21:14:06 -08:00
										 |  |  | import {getLView} from '../../src/render3/state'; | 
					
						
							| 
									
										
										
										
											2019-08-12 08:11:32 +03:00
										 |  |  | import {getNativeByIndex, load} from '../../src/render3/util/view_utils'; | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  | import {ɵɵtemplateRefExtractor} from '../../src/render3/view_engine_compatibility_prebound'; | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-04 11:41:52 -07:00
										 |  |  | import {ComponentFixture, TemplateFixture, createComponent, createDirective, getDirectiveOnNode, renderComponent} from './render_util'; | 
					
						
							| 
									
										
										
										
											2017-12-18 15:14:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-06 17:27:16 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-01 17:01:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-18 15:14:09 +01:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Helper function to check if a given candidate object resembles ElementRef | 
					
						
							|  |  |  |  * @param candidate | 
					
						
							| 
									
										
										
										
											2017-12-19 15:01:05 -08:00
										 |  |  |  * @returns true if `ElementRef`. | 
					
						
							| 
									
										
										
										
											2017-12-18 15:14:09 +01:00
										 |  |  |  */ | 
					
						
							|  |  |  | function isElementRef(candidate: any): boolean { | 
					
						
							|  |  |  |   return candidate.nativeElement != null; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Helper function to check if a given candidate object resembles TemplateRef | 
					
						
							|  |  |  |  * @param candidate | 
					
						
							| 
									
										
										
										
											2017-12-19 15:01:05 -08:00
										 |  |  |  * @returns true if `TemplateRef`. | 
					
						
							| 
									
										
										
										
											2017-12-18 15:14:09 +01:00
										 |  |  |  */ | 
					
						
							|  |  |  | function isTemplateRef(candidate: any): boolean { | 
					
						
							|  |  |  |   return candidate.createEmbeddedView != null && candidate.createComponent == null; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Helper function to check if a given candidate object resembles ViewContainerRef | 
					
						
							|  |  |  |  * @param candidate | 
					
						
							| 
									
										
										
										
											2017-12-19 15:01:05 -08:00
										 |  |  |  * @returns true if `ViewContainerRef`. | 
					
						
							| 
									
										
										
										
											2017-12-18 15:14:09 +01:00
										 |  |  |  */ | 
					
						
							|  |  |  | function isViewContainerRef(candidate: any): boolean { | 
					
						
							|  |  |  |   return candidate.createEmbeddedView != null && candidate.createComponent != null; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | describe('query', () => { | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  |   it('should match projected query children', () => { | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |     const Child = createComponent('child', function(rf: RenderFlags, ctx: any) {}); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     let child1 = null; | 
					
						
							|  |  |  |     let child2 = null; | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |     const Cmp = createComponent( | 
					
						
							|  |  |  |         'cmp', | 
					
						
							|  |  |  |         function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |           /** | 
					
						
							|  |  |  |            * <child> | 
					
						
							|  |  |  |            *   <child> | 
					
						
							|  |  |  |            *   </child> | 
					
						
							|  |  |  |            * </child> | 
					
						
							|  |  |  |            * class Cmp { | 
					
						
							|  |  |  |            *   @ViewChildren(Child) query0; | 
					
						
							|  |  |  |            *   @ViewChildren(Child, {descend: true}) query1; | 
					
						
							|  |  |  |            * } | 
					
						
							|  |  |  |            */ | 
					
						
							|  |  |  |           if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |             ɵɵelementStart(0, 'child'); | 
					
						
							|  |  |  |             { ɵɵelement(1, 'child'); } | 
					
						
							|  |  |  |             ɵɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |           } | 
					
						
							|  |  |  |           if (rf & RenderFlags.Update) { | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |             child1 = getDirectiveOnNode(0); | 
					
						
							|  |  |  |             child2 = getDirectiveOnNode(1); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |           } | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |         2, 0, [Child], [], | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |           if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-07-20 12:32:29 +02:00
										 |  |  |             ɵɵviewQuery(Child, false); | 
					
						
							|  |  |  |             ɵɵviewQuery(Child, true); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |           } | 
					
						
							|  |  |  |           if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |             let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |             ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                 (ctx.query0 = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |             ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                 (ctx.query1 = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |           } | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const parent = renderComponent(Cmp); | 
					
						
							|  |  |  |     expect((parent.query0 as QueryList<any>).toArray()).toEqual([child1]); | 
					
						
							|  |  |  |     expect((parent.query1 as QueryList<any>).toArray()).toEqual([child1, child2]); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2017-12-12 14:42:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |   describe('predicate', () => { | 
					
						
							|  |  |  |     describe('types', () => { | 
					
						
							| 
									
										
										
										
											2017-12-20 12:19:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |       it('should query using type predicate and read a specified token', () => { | 
					
						
							|  |  |  |         const Child = createDirective('child'); | 
					
						
							|  |  |  |         let elToQuery; | 
					
						
							|  |  |  |         /** | 
					
						
							|  |  |  |          * <div child></div> | 
					
						
							|  |  |  |          * class Cmpt { | 
					
						
							|  |  |  |          *  @ViewChildren(Child, {read: ElementRef}) query; | 
					
						
							|  |  |  |          * } | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         const Cmpt = createComponent( | 
					
						
							|  |  |  |             'cmpt', | 
					
						
							|  |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |                 ɵɵelement(0, 'div', 0); | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                 elToQuery = getNativeByIndex(0, getLView()); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |             1, 0, [Child], [], | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵviewQuery(Child, false, ElementRef); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                 let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                     (ctx.query = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |             }, | 
					
						
							|  |  |  |             [], [], undefined, [['child', '']]); | 
					
						
							| 
									
										
										
										
											2017-12-20 12:19:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         const cmptInstance = renderComponent(Cmpt); | 
					
						
							|  |  |  |         const qList = (cmptInstance.query as QueryList<any>); | 
					
						
							|  |  |  |         expect(qList.length).toBe(1); | 
					
						
							|  |  |  |         expect(isElementRef(qList.first)).toBeTruthy(); | 
					
						
							|  |  |  |         expect(qList.first.nativeElement).toBe(elToQuery); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2017-12-20 17:35:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |       it('should query using type predicate and read another directive type', () => { | 
					
						
							|  |  |  |         const Child = createDirective('child'); | 
					
						
							|  |  |  |         const OtherChild = createDirective('otherChild'); | 
					
						
							|  |  |  |         let otherChildInstance; | 
					
						
							|  |  |  |         /** | 
					
						
							|  |  |  |          * <div child otherChild></div> | 
					
						
							|  |  |  |          * class Cmpt { | 
					
						
							|  |  |  |          *  @ViewChildren(Child, {read: OtherChild}) query; | 
					
						
							|  |  |  |          * } | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         const Cmpt = createComponent( | 
					
						
							|  |  |  |             'cmpt', | 
					
						
							|  |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |                 ɵɵelementStart(0, 'div', 0); | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                 { otherChildInstance = getDirectiveOnNode(0, 1); } | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |             1, 0, [Child, OtherChild], [], | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵviewQuery(Child, false, OtherChild); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                 let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                     (ctx.query = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |             }, | 
					
						
							|  |  |  |             [], [], undefined, [['child', '', 'otherChild', '']]); | 
					
						
							| 
									
										
										
										
											2017-12-20 17:35:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         const cmptInstance = renderComponent(Cmpt); | 
					
						
							|  |  |  |         const qList = (cmptInstance.query as QueryList<any>); | 
					
						
							|  |  |  |         expect(qList.length).toBe(1); | 
					
						
							|  |  |  |         expect(qList.first).toBe(otherChildInstance); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2017-12-20 17:35:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |       it('should not add results to query if a requested token cant be read', () => { | 
					
						
							|  |  |  |         const Child = createDirective('child'); | 
					
						
							|  |  |  |         const OtherChild = createDirective('otherChild'); | 
					
						
							|  |  |  |         /** | 
					
						
							|  |  |  |          * <div child></div> | 
					
						
							|  |  |  |          * class Cmpt { | 
					
						
							|  |  |  |          *  @ViewChildren(Child, {read: OtherChild}) query; | 
					
						
							|  |  |  |          * } | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         const Cmpt = createComponent( | 
					
						
							|  |  |  |             'cmpt', | 
					
						
							|  |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |                 ɵɵelement(0, 'div', 0); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |             1, 0, [Child, OtherChild], [], | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵviewQuery(Child, false, OtherChild); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                 let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                     (ctx.query = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |             }, | 
					
						
							|  |  |  |             [], [], undefined, [['child', '']]); | 
					
						
							| 
									
										
										
										
											2017-12-20 17:35:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         const cmptInstance = renderComponent(Cmpt); | 
					
						
							|  |  |  |         const qList = (cmptInstance.query as QueryList<any>); | 
					
						
							|  |  |  |         expect(qList.length).toBe(0); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2017-12-20 17:35:03 +01:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2017-12-20 12:19:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-18 21:04:05 +01:00
										 |  |  |     describe('providers', () => { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class Service {} | 
					
						
							|  |  |  |       class Alias {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       let directive: MyDirective|null = null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class MyDirective { | 
					
						
							|  |  |  |         constructor(public service: Service) {} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-11 14:18:45 -07:00
										 |  |  |         static ɵfac = function MyDirective_Factory() { | 
					
						
							| 
									
										
										
										
											2019-08-12 09:26:20 +03:00
										 |  |  |           return directive = new MyDirective(ɵɵdirectiveInject(Service)); | 
					
						
							|  |  |  |         }; | 
					
						
							| 
									
										
										
										
											2019-10-11 12:28:12 -07:00
										 |  |  |         static ɵdir = ɵɵdefineDirective({ | 
					
						
							| 
									
										
										
										
											2018-11-18 21:04:05 +01:00
										 |  |  |           type: MyDirective, | 
					
						
							|  |  |  |           selectors: [['', 'myDir', '']], | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |           features: [ɵɵProvidersFeature([Service, {provide: Alias, useExisting: Service}])], | 
					
						
							| 
									
										
										
										
											2018-11-18 21:04:05 +01:00
										 |  |  |         }); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       beforeEach(() => directive = null); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // https://stackblitz.com/edit/ng-viewengine-viewchild-providers?file=src%2Fapp%2Fapp.component.ts
 | 
					
						
							|  |  |  |       it('should query for providers that are present on a directive', () => { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /** | 
					
						
							|  |  |  |          * <div myDir></div> | 
					
						
							|  |  |  |          * class App { | 
					
						
							|  |  |  |          *  @ViewChild(MyDirective) directive: MyDirective; | 
					
						
							|  |  |  |          *  @ViewChild(Service) service: Service; | 
					
						
							|  |  |  |          *  @ViewChild(Alias) alias: Alias; | 
					
						
							|  |  |  |          * } | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         class App { | 
					
						
							|  |  |  |           directive?: MyDirective; | 
					
						
							|  |  |  |           service?: Service; | 
					
						
							|  |  |  |           alias?: Alias; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-11 14:18:45 -07:00
										 |  |  |           static ɵfac = function App_Factory() { return new App(); }; | 
					
						
							| 
									
										
										
										
											2019-10-10 14:57:15 -07:00
										 |  |  |           static ɵcmp = ɵɵdefineComponent({ | 
					
						
							| 
									
										
										
										
											2018-11-18 21:04:05 +01:00
										 |  |  |             type: App, | 
					
						
							|  |  |  |             selectors: [['app']], | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |             decls: 1, | 
					
						
							| 
									
										
										
										
											2018-11-18 21:04:05 +01:00
										 |  |  |             vars: 0, | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |             consts: [['myDir']], | 
					
						
							| 
									
										
										
										
											2018-11-18 21:04:05 +01:00
										 |  |  |             template: function App_Template(rf: RenderFlags, ctx: App) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |                 ɵɵelement(0, 'div', 0); | 
					
						
							| 
									
										
										
										
											2018-11-18 21:04:05 +01:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             viewQuery: function(rf: RenderFlags, ctx: App) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-07-20 12:32:29 +02:00
										 |  |  |                 ɵɵviewQuery(MyDirective, false); | 
					
						
							|  |  |  |                 ɵɵviewQuery(Service, false); | 
					
						
							|  |  |  |                 ɵɵviewQuery(Alias, false); | 
					
						
							| 
									
										
										
										
											2018-11-18 21:04:05 +01:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                 let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && (ctx.directive = tmp.first); | 
					
						
							|  |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && (ctx.service = tmp.first); | 
					
						
							|  |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && (ctx.alias = tmp.first); | 
					
						
							| 
									
										
										
										
											2018-11-18 21:04:05 +01:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             directives: [MyDirective] | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const componentFixture = new ComponentFixture(App); | 
					
						
							|  |  |  |         expect(componentFixture.component.directive).toBe(directive !); | 
					
						
							|  |  |  |         expect(componentFixture.component.service).toBe(directive !.service); | 
					
						
							|  |  |  |         expect(componentFixture.component.alias).toBe(directive !.service); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should resolve a provider if given as read token', () => { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /** | 
					
						
							|  |  |  |          * <div myDir></div> | 
					
						
							|  |  |  |          * class App { | 
					
						
							|  |  |  |          *  @ViewChild(MyDirective, {read: Alias}}) service: Service; | 
					
						
							|  |  |  |          * } | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         class App { | 
					
						
							|  |  |  |           service?: Service; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-11 14:18:45 -07:00
										 |  |  |           static ɵfac = function App_Factory() { return new App(); }; | 
					
						
							| 
									
										
										
										
											2019-10-10 14:57:15 -07:00
										 |  |  |           static ɵcmp = ɵɵdefineComponent({ | 
					
						
							| 
									
										
										
										
											2018-11-18 21:04:05 +01:00
										 |  |  |             type: App, | 
					
						
							|  |  |  |             selectors: [['app']], | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |             decls: 1, | 
					
						
							| 
									
										
										
										
											2018-11-18 21:04:05 +01:00
										 |  |  |             vars: 0, | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |             consts: [['myDir']], | 
					
						
							| 
									
										
										
										
											2018-11-18 21:04:05 +01:00
										 |  |  |             template: function App_Template(rf: RenderFlags, ctx: App) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |                 ɵɵelement(0, 'div', 0); | 
					
						
							| 
									
										
										
										
											2018-11-18 21:04:05 +01:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             viewQuery: function(rf: RenderFlags, ctx: App) { | 
					
						
							|  |  |  |               let tmp: any; | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵviewQuery(MyDirective, false, Alias); | 
					
						
							| 
									
										
										
										
											2018-11-18 21:04:05 +01:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && (ctx.service = tmp.first); | 
					
						
							| 
									
										
										
										
											2018-11-18 21:04:05 +01:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             directives: [MyDirective] | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const componentFixture = new ComponentFixture(App); | 
					
						
							|  |  |  |         expect(componentFixture.component.service).toBe(directive !.service); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |     describe('local names', () => { | 
					
						
							| 
									
										
										
										
											2017-12-12 14:42:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |       it('should query for a single element and read ElementRef by default', () => { | 
					
						
							| 
									
										
										
										
											2017-12-12 14:42:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         let elToQuery; | 
					
						
							|  |  |  |         /** | 
					
						
							|  |  |  |          * <div #foo></div> | 
					
						
							|  |  |  |          * <div></div> | 
					
						
							|  |  |  |          * class Cmpt { | 
					
						
							|  |  |  |          *  @ViewChildren('foo') query; | 
					
						
							|  |  |  |          * } | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         const Cmpt = createComponent( | 
					
						
							|  |  |  |             'cmpt', | 
					
						
							|  |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵelement(0, 'div', null, ['foo', '']); | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                 elToQuery = getNativeByIndex(0, getLView()); | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵelement(2, 'div'); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |             3, 0, [], [], | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-07-20 12:32:29 +02:00
										 |  |  |                 ɵɵviewQuery(['foo'], false); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                 let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                     (ctx.query = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const cmptInstance = renderComponent(Cmpt); | 
					
						
							|  |  |  |         const qList = (cmptInstance.query as QueryList<any>); | 
					
						
							|  |  |  |         expect(qList.length).toBe(1); | 
					
						
							|  |  |  |         expect(qList.first.nativeElement).toEqual(elToQuery); | 
					
						
							| 
									
										
										
										
											2017-12-12 14:42:28 +01:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |       it('should query multiple locals on the same element', () => { | 
					
						
							|  |  |  |         let elToQuery; | 
					
						
							| 
									
										
										
										
											2017-12-12 14:42:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         /** | 
					
						
							|  |  |  |          * <div #foo #bar></div> | 
					
						
							|  |  |  |          * <div></div> | 
					
						
							|  |  |  |          * class Cmpt { | 
					
						
							|  |  |  |          *  @ViewChildren('foo') fooQuery; | 
					
						
							|  |  |  |          *  @ViewChildren('bar') barQuery; | 
					
						
							|  |  |  |          * } | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         const Cmpt = createComponent( | 
					
						
							|  |  |  |             'cmpt', | 
					
						
							|  |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵelement(0, 'div', null, ['foo', '', 'bar', '']); | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                 elToQuery = getNativeByIndex(0, getLView()); | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵelement(3, 'div'); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |             4, 0, [], [], | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-07-20 12:32:29 +02:00
										 |  |  |                 ɵɵviewQuery(['foo'], false); | 
					
						
							|  |  |  |                 ɵɵviewQuery(['bar'], false); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                 let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |                     (ctx.fooQuery = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |                     (ctx.barQuery = tmp as QueryList<any>); | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             }); | 
					
						
							| 
									
										
										
										
											2018-03-15 12:18:31 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         const cmptInstance = renderComponent(Cmpt); | 
					
						
							| 
									
										
										
										
											2018-03-15 12:18:31 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         const fooList = (cmptInstance.fooQuery as QueryList<any>); | 
					
						
							|  |  |  |         expect(fooList.length).toBe(1); | 
					
						
							|  |  |  |         expect(fooList.first.nativeElement).toEqual(elToQuery); | 
					
						
							| 
									
										
										
										
											2018-03-15 12:18:31 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         const barList = (cmptInstance.barQuery as QueryList<any>); | 
					
						
							|  |  |  |         expect(barList.length).toBe(1); | 
					
						
							|  |  |  |         expect(barList.first.nativeElement).toEqual(elToQuery); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2018-03-15 12:18:31 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |       it('should query for multiple elements and read ElementRef by default', () => { | 
					
						
							| 
									
										
										
										
											2018-03-15 12:18:31 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         let el1ToQuery; | 
					
						
							|  |  |  |         let el2ToQuery; | 
					
						
							|  |  |  |         /** | 
					
						
							|  |  |  |          * <div #foo></div> | 
					
						
							|  |  |  |          * <div></div> | 
					
						
							|  |  |  |          * <div #bar></div> | 
					
						
							|  |  |  |          * class Cmpt { | 
					
						
							|  |  |  |          *  @ViewChildren('foo,bar') query; | 
					
						
							|  |  |  |          * } | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         const Cmpt = createComponent( | 
					
						
							|  |  |  |             'cmpt', | 
					
						
							|  |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵelement(0, 'div', null, ['foo', '']); | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                 el1ToQuery = getNativeByIndex(0, getLView()); | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵelement(2, 'div'); | 
					
						
							|  |  |  |                 ɵɵelement(3, 'div', null, ['bar', '']); | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                 el2ToQuery = getNativeByIndex(3, getLView()); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |             5, 0, [], [], | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-07-20 12:32:29 +02:00
										 |  |  |                 ɵɵviewQuery(['foo', 'bar'], false); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                 let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                     (ctx.query = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }); | 
					
						
							| 
									
										
										
										
											2017-12-12 14:42:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         const cmptInstance = renderComponent(Cmpt); | 
					
						
							|  |  |  |         const qList = (cmptInstance.query as QueryList<any>); | 
					
						
							|  |  |  |         expect(qList.length).toBe(2); | 
					
						
							|  |  |  |         expect(qList.first.nativeElement).toEqual(el1ToQuery); | 
					
						
							|  |  |  |         expect(qList.last.nativeElement).toEqual(el2ToQuery); | 
					
						
							| 
									
										
										
										
											2017-12-12 14:42:28 +01:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |       it('should read ElementRef from an element when explicitly asked for', () => { | 
					
						
							| 
									
										
										
										
											2017-12-12 14:42:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         let elToQuery; | 
					
						
							|  |  |  |         /** | 
					
						
							|  |  |  |          * <div #foo></div> | 
					
						
							|  |  |  |          * <div></div> | 
					
						
							|  |  |  |          * class Cmpt { | 
					
						
							|  |  |  |          *  @ViewChildren('foo', {read: ElementRef}) query; | 
					
						
							|  |  |  |          * } | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         const Cmpt = createComponent( | 
					
						
							|  |  |  |             'cmpt', | 
					
						
							|  |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵelement(0, 'div', null, ['foo', '']); | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                 elToQuery = getNativeByIndex(0, getLView()); | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵelement(2, 'div'); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |             3, 0, [], [], | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-07-20 12:32:29 +02:00
										 |  |  |                 ɵɵviewQuery(['foo'], false); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                 let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                     (ctx.query = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }); | 
					
						
							| 
									
										
										
										
											2017-12-18 15:14:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         const cmptInstance = renderComponent(Cmpt); | 
					
						
							|  |  |  |         const qList = (cmptInstance.query as QueryList<any>); | 
					
						
							|  |  |  |         expect(qList.length).toBe(1); | 
					
						
							|  |  |  |         expect(isElementRef(qList.first)).toBeTruthy(); | 
					
						
							|  |  |  |         expect(qList.first.nativeElement).toEqual(elToQuery); | 
					
						
							| 
									
										
										
										
											2017-12-18 15:14:09 +01:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-26 17:22:41 +02:00
										 |  |  |       it('should query for <ng-container> and read ElementRef with a native element pointing to comment node', | 
					
						
							|  |  |  |          () => { | 
					
						
							|  |  |  |            let elToQuery; | 
					
						
							|  |  |  |            /** | 
					
						
							|  |  |  |             * <ng-container #foo></ng-container> | 
					
						
							|  |  |  |             * class Cmpt { | 
					
						
							| 
									
										
										
										
											2018-08-22 17:30:27 +02:00
										 |  |  |             *  @ViewChildren('foo', {read: ElementRef}) query; | 
					
						
							| 
									
										
										
										
											2018-07-26 17:22:41 +02:00
										 |  |  |             * } | 
					
						
							|  |  |  |             */ | 
					
						
							|  |  |  |            const Cmpt = createComponent( | 
					
						
							|  |  |  |                'cmpt', | 
					
						
							|  |  |  |                function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |                  if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                    ɵɵelementContainerStart(0, null, ['foo', '']); | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                    elToQuery = getNativeByIndex(0, getLView()); | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                    ɵɵelementContainerEnd(); | 
					
						
							| 
									
										
										
										
											2018-07-26 17:22:41 +02:00
										 |  |  |                  } | 
					
						
							|  |  |  |                }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                2, 0, [], [], | 
					
						
							| 
									
										
										
										
											2018-07-26 17:22:41 +02:00
										 |  |  |                function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |                  if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                    ɵɵviewQuery(['foo'], false, ElementRef); | 
					
						
							| 
									
										
										
										
											2018-07-26 17:22:41 +02:00
										 |  |  |                  } | 
					
						
							|  |  |  |                  if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                    let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                    ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2018-07-26 17:22:41 +02:00
										 |  |  |                        (ctx.query = tmp as QueryList<any>); | 
					
						
							|  |  |  |                  } | 
					
						
							|  |  |  |                }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            const cmptInstance = renderComponent(Cmpt); | 
					
						
							|  |  |  |            const qList = (cmptInstance.query as QueryList<any>); | 
					
						
							|  |  |  |            expect(qList.length).toBe(1); | 
					
						
							|  |  |  |            expect(isElementRef(qList.first)).toBeTruthy(); | 
					
						
							|  |  |  |            expect(qList.first.nativeElement).toEqual(elToQuery); | 
					
						
							|  |  |  |          }); | 
					
						
							| 
									
										
										
										
											2018-08-08 11:13:37 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-22 17:30:27 +02:00
										 |  |  |       it('should query for <ng-container> and read ElementRef without explicit read option', () => { | 
					
						
							|  |  |  |         let elToQuery; | 
					
						
							|  |  |  |         /** | 
					
						
							|  |  |  |          * <ng-container #foo></ng-container> | 
					
						
							|  |  |  |          * class Cmpt { | 
					
						
							|  |  |  |          *  @ViewChildren('foo') query; | 
					
						
							|  |  |  |          * } | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         const Cmpt = createComponent( | 
					
						
							|  |  |  |             'cmpt', | 
					
						
							|  |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵelementContainerStart(0, null, ['foo', '']); | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                 elToQuery = getNativeByIndex(0, getLView()); | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵelementContainerEnd(); | 
					
						
							| 
									
										
										
										
											2018-08-22 17:30:27 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |             2, 0, [], [], | 
					
						
							| 
									
										
										
										
											2018-08-22 17:30:27 +02:00
										 |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-07-20 12:32:29 +02:00
										 |  |  |                 ɵɵviewQuery(['foo'], true); | 
					
						
							| 
									
										
										
										
											2018-08-22 17:30:27 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                 let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                     (ctx.query = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2018-08-22 17:30:27 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const cmptInstance = renderComponent(Cmpt); | 
					
						
							|  |  |  |         const qList = (cmptInstance.query as QueryList<any>); | 
					
						
							|  |  |  |         expect(qList.length).toBe(1); | 
					
						
							|  |  |  |         expect(isElementRef(qList.first)).toBeTruthy(); | 
					
						
							|  |  |  |         expect(qList.first.nativeElement).toEqual(elToQuery); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-08 11:13:37 +02:00
										 |  |  |       /** | 
					
						
							| 
									
										
										
										
											2018-11-26 09:53:00 +01:00
										 |  |  |        * BREAKING CHANGE: this tests asserts different behavior as compared to Renderer2 when it | 
					
						
							| 
									
										
										
										
											2018-08-08 11:13:37 +02:00
										 |  |  |        * comes to descendants: false option and <ng-container>. | 
					
						
							|  |  |  |        * | 
					
						
							| 
									
										
										
										
											2018-11-26 09:53:00 +01:00
										 |  |  |        * Previous behavior: queries with descendants: false would descend into <ng-container>. | 
					
						
							|  |  |  |        * New behavior: queries with descendants: false would NOT descend into <ng-container>. | 
					
						
							| 
									
										
										
										
											2018-08-08 11:13:37 +02:00
										 |  |  |        * | 
					
						
							| 
									
										
										
										
											2018-11-26 09:53:00 +01:00
										 |  |  |        * Reasoning: the Renderer2 behavior is inconsistent and hard to explain to users when it | 
					
						
							| 
									
										
										
										
											2018-08-08 11:13:37 +02:00
										 |  |  |        * comes to descendants: false interpretation (see | 
					
						
							|  |  |  |        * https://github.com/angular/angular/issues/14769#issuecomment-356609267) so we are changing
 | 
					
						
							|  |  |  |        * it in ngIvy. | 
					
						
							|  |  |  |        * | 
					
						
							|  |  |  |        * In ngIvy implementation queries with the descendants: false option are interpreted as | 
					
						
							|  |  |  |        * "don't descend" into children of a given element when looking for matches. In other words | 
					
						
							|  |  |  |        * only direct children of a given component / directive are checked for matches. This applies | 
					
						
							|  |  |  |        * to both regular elements (ex. <div>) and grouping elements (<ng-container>, | 
					
						
							|  |  |  |        * <ng-template>)). | 
					
						
							|  |  |  |        * | 
					
						
							|  |  |  |        * Grouping elements (<ng-container>, <ng-template>) are treated as regular elements since we | 
					
						
							|  |  |  |        * can query for <ng-container> and <ng-template>, so they behave like regular elements from | 
					
						
							|  |  |  |        * this point of view. | 
					
						
							|  |  |  |        */ | 
					
						
							|  |  |  |       it('should not descend into <ng-container> when descendants: false', () => { | 
					
						
							|  |  |  |         let elToQuery; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /** | 
					
						
							|  |  |  |           * <ng-container> | 
					
						
							|  |  |  |           *    <div #foo></div> | 
					
						
							|  |  |  |           * </ng-container> | 
					
						
							|  |  |  |           * class Cmpt { | 
					
						
							|  |  |  |           *  @ViewChildren('foo') deep; | 
					
						
							|  |  |  |           *  @ViewChildren('foo', {descendants: false}) shallow; | 
					
						
							|  |  |  |           * } | 
					
						
							|  |  |  |           */ | 
					
						
							|  |  |  |         const Cmpt = createComponent( | 
					
						
							|  |  |  |             'cmpt', | 
					
						
							|  |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵelementContainerStart(0); | 
					
						
							| 
									
										
										
										
											2018-08-08 11:13:37 +02:00
										 |  |  |                 { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                   ɵɵelement(1, 'div', null, ['foo', '']); | 
					
						
							| 
									
										
										
										
											2018-11-21 21:14:06 -08:00
										 |  |  |                   elToQuery = getNativeByIndex(3, getLView()); | 
					
						
							| 
									
										
										
										
											2018-08-08 11:13:37 +02:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵelementContainerEnd(); | 
					
						
							| 
									
										
										
										
											2018-08-08 11:13:37 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |             3, 0, [], [], | 
					
						
							| 
									
										
										
										
											2018-08-08 11:13:37 +02:00
										 |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵviewQuery(['foo'], true, ElementRef); | 
					
						
							|  |  |  |                 ɵɵviewQuery(['foo'], false, ElementRef); | 
					
						
							| 
									
										
										
										
											2018-08-08 11:13:37 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                 let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                     (ctx.deep = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2018-08-08 11:13:37 +02:00
										 |  |  |                     (ctx.shallow = tmp as QueryList<any>); | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const fixture = new ComponentFixture(Cmpt); | 
					
						
							|  |  |  |         const deepQList = fixture.component.deep; | 
					
						
							|  |  |  |         const shallowQList = fixture.component.shallow; | 
					
						
							|  |  |  |         expect(deepQList.length).toBe(1); | 
					
						
							|  |  |  |         expect(shallowQList.length).toBe(0); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2018-07-26 17:22:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |       it('should read ViewContainerRef from element nodes when explicitly asked for', () => { | 
					
						
							|  |  |  |         /** | 
					
						
							|  |  |  |          * <div #foo></div> | 
					
						
							|  |  |  |          * class Cmpt { | 
					
						
							|  |  |  |          *  @ViewChildren('foo', {read: ViewContainerRef}) query; | 
					
						
							|  |  |  |          * } | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         const Cmpt = createComponent( | 
					
						
							|  |  |  |             'cmpt', | 
					
						
							|  |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵelement(0, 'div', null, ['foo', '']); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |             2, 0, [], [], | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵviewQuery(['foo'], false, ViewContainerRef); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                 let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                     (ctx.query = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }); | 
					
						
							| 
									
										
										
										
											2017-12-18 15:14:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         const cmptInstance = renderComponent(Cmpt); | 
					
						
							|  |  |  |         const qList = (cmptInstance.query as QueryList<any>); | 
					
						
							|  |  |  |         expect(qList.length).toBe(1); | 
					
						
							|  |  |  |         expect(isViewContainerRef(qList.first)).toBeTruthy(); | 
					
						
							| 
									
										
										
										
											2017-12-18 15:14:09 +01:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |       it('should read ViewContainerRef from container nodes when explicitly asked for', () => { | 
					
						
							|  |  |  |         /** | 
					
						
							|  |  |  |          * <ng-template #foo></ng-template> | 
					
						
							|  |  |  |          * class Cmpt { | 
					
						
							|  |  |  |          *  @ViewChildren('foo', {read: ViewContainerRef}) query; | 
					
						
							|  |  |  |          * } | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         const Cmpt = createComponent( | 
					
						
							|  |  |  |             'cmpt', | 
					
						
							|  |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵtemplate(0, null, 0, 0, 'ng-template', null, ['foo', '']); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |             2, 0, [], [], | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵviewQuery(['foo'], false, ViewContainerRef); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                 let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                     (ctx.query = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }); | 
					
						
							| 
									
										
										
										
											2017-12-18 15:14:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         const cmptInstance = renderComponent(Cmpt); | 
					
						
							|  |  |  |         const qList = (cmptInstance.query as QueryList<any>); | 
					
						
							|  |  |  |         expect(qList.length).toBe(1); | 
					
						
							|  |  |  |         expect(isViewContainerRef(qList.first)).toBeTruthy(); | 
					
						
							| 
									
										
										
										
											2017-12-18 15:14:09 +01:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |       it('should read ElementRef with a native element pointing to comment DOM node from containers', | 
					
						
							|  |  |  |          () => { | 
					
						
							|  |  |  |            /** | 
					
						
							|  |  |  |             * <ng-template #foo></ng-template> | 
					
						
							|  |  |  |             * class Cmpt { | 
					
						
							|  |  |  |             *  @ViewChildren('foo', {read: ElementRef}) query; | 
					
						
							|  |  |  |             * } | 
					
						
							|  |  |  |             */ | 
					
						
							|  |  |  |            const Cmpt = createComponent( | 
					
						
							|  |  |  |                'cmpt', | 
					
						
							|  |  |  |                function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |                  if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                    ɵɵtemplate(0, null, 0, 0, 'ng-template', null, ['foo', '']); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |                  } | 
					
						
							|  |  |  |                }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                2, 0, [], [], | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |                function(rf: RenderFlags, ctx: any) { | 
					
						
							| 
									
										
										
										
											2017-12-18 15:14:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |                  if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                    ɵɵviewQuery(['foo'], false, ElementRef); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |                  } | 
					
						
							|  |  |  |                  if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                    let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                    ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |                        (ctx.query = tmp as QueryList<any>); | 
					
						
							|  |  |  |                  } | 
					
						
							|  |  |  |                }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            const cmptInstance = renderComponent(Cmpt); | 
					
						
							|  |  |  |            const qList = (cmptInstance.query as QueryList<any>); | 
					
						
							|  |  |  |            expect(qList.length).toBe(1); | 
					
						
							|  |  |  |            expect(isElementRef(qList.first)).toBeTruthy(); | 
					
						
							|  |  |  |            expect(qList.first.nativeElement.nodeType).toBe(8);  // Node.COMMENT_NODE = 8
 | 
					
						
							| 
									
										
										
										
											2017-12-18 15:14:09 +01:00
										 |  |  |          }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |       it('should read TemplateRef from container nodes by default', () => { | 
					
						
							|  |  |  |         // http://plnkr.co/edit/BVpORly8wped9I3xUYsX?p=preview
 | 
					
						
							|  |  |  |         /** | 
					
						
							|  |  |  |          * <ng-template #foo></ng-template> | 
					
						
							|  |  |  |          * class Cmpt { | 
					
						
							|  |  |  |          *  @ViewChildren('foo') query; | 
					
						
							|  |  |  |          * } | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         const Cmpt = createComponent( | 
					
						
							|  |  |  |             'cmpt', | 
					
						
							|  |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵtemplate(0, null, 0, 0, 'ng-template', null, ['foo', '']); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |             2, 0, [], [], | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-07-20 12:32:29 +02:00
										 |  |  |                 ɵɵviewQuery(['foo'], false); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                 let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                     (ctx.query = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }); | 
					
						
							| 
									
										
										
										
											2017-12-18 15:14:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         const cmptInstance = renderComponent(Cmpt); | 
					
						
							|  |  |  |         const qList = (cmptInstance.query as QueryList<any>); | 
					
						
							|  |  |  |         expect(qList.length).toBe(1); | 
					
						
							|  |  |  |         expect(isTemplateRef(qList.first)).toBeTruthy(); | 
					
						
							| 
									
										
										
										
											2017-12-18 15:14:09 +01:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |       it('should read TemplateRef from container nodes when explicitly asked for', () => { | 
					
						
							|  |  |  |         /** | 
					
						
							|  |  |  |          * <ng-template #foo></ng-template> | 
					
						
							|  |  |  |          * class Cmpt { | 
					
						
							|  |  |  |          *  @ViewChildren('foo', {read: TemplateRef}) query; | 
					
						
							|  |  |  |          * } | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         const Cmpt = createComponent( | 
					
						
							|  |  |  |             'cmpt', | 
					
						
							|  |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵtemplate(0, null, 0, 0, 'ng-template', null, ['foo', '']); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |             2, 0, [], [], | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵviewQuery(['foo'], false, TemplateRef); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                 let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                     (ctx.query = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }); | 
					
						
							| 
									
										
										
										
											2017-12-18 15:14:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         const cmptInstance = renderComponent(Cmpt); | 
					
						
							|  |  |  |         const qList = (cmptInstance.query as QueryList<any>); | 
					
						
							|  |  |  |         expect(qList.length).toBe(1); | 
					
						
							|  |  |  |         expect(isTemplateRef(qList.first)).toBeTruthy(); | 
					
						
							| 
									
										
										
										
											2017-12-18 15:14:09 +01:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |       it('should read component instance if element queried for is a component host', () => { | 
					
						
							|  |  |  |         const Child = createComponent('child', function(rf: RenderFlags, ctx: any) {}); | 
					
						
							| 
									
										
										
										
											2017-12-18 15:14:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         let childInstance; | 
					
						
							|  |  |  |         /** | 
					
						
							|  |  |  |          * <child #foo></child> | 
					
						
							|  |  |  |          * class Cmpt { | 
					
						
							|  |  |  |          *  @ViewChildren('foo') query; | 
					
						
							|  |  |  |          * } | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         const Cmpt = createComponent( | 
					
						
							|  |  |  |             'cmpt', | 
					
						
							|  |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵelement(0, 'child', null, ['foo', '']); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                 childInstance = getDirectiveOnNode(0); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |             2, 0, [Child], [], | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-07-20 12:32:29 +02:00
										 |  |  |                 ɵɵviewQuery(['foo'], true); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                 let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                     (ctx.query = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }); | 
					
						
							| 
									
										
										
										
											2017-12-19 16:51:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         const cmptInstance = renderComponent(Cmpt); | 
					
						
							|  |  |  |         const qList = (cmptInstance.query as QueryList<any>); | 
					
						
							|  |  |  |         expect(qList.length).toBe(1); | 
					
						
							|  |  |  |         expect(qList.first).toBe(childInstance); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2017-12-19 16:51:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |       it('should read component instance with explicit exportAs', () => { | 
					
						
							|  |  |  |         let childInstance: Child; | 
					
						
							| 
									
										
										
										
											2017-12-19 16:51:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         class Child { | 
					
						
							| 
									
										
										
										
											2019-10-11 14:18:45 -07:00
										 |  |  |           static ɵfac = () => childInstance = new Child(); | 
					
						
							| 
									
										
										
										
											2019-10-10 14:57:15 -07:00
										 |  |  |           static ɵcmp = ɵɵdefineComponent({ | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |             type: Child, | 
					
						
							|  |  |  |             selectors: [['child']], | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |             decls: 0, | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |             vars: 0, | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |             template: (rf: RenderFlags, ctx: Child) => {}, | 
					
						
							| 
									
										
										
										
											2019-01-10 22:24:32 +01:00
										 |  |  |             exportAs: ['child'] | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |           }); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-03-14 14:29:47 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         /** | 
					
						
							|  |  |  |          * <child #foo="child"></child> | 
					
						
							|  |  |  |          * class Cmpt { | 
					
						
							|  |  |  |          *  @ViewChildren('foo') query; | 
					
						
							|  |  |  |          * } | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         const Cmpt = createComponent( | 
					
						
							|  |  |  |             'cmpt', | 
					
						
							|  |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵelement(0, 'child', null, ['foo', 'child']); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |             2, 0, [Child], [], | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-07-20 12:32:29 +02:00
										 |  |  |                 ɵɵviewQuery(['foo'], true); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                 let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                     (ctx.query = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }); | 
					
						
							| 
									
										
										
										
											2018-03-14 14:29:47 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         const cmptInstance = renderComponent(Cmpt); | 
					
						
							|  |  |  |         const qList = (cmptInstance.query as QueryList<any>); | 
					
						
							|  |  |  |         expect(qList.length).toBe(1); | 
					
						
							|  |  |  |         expect(qList.first).toBe(childInstance !); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2018-03-14 14:29:47 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |       it('should read directive instance if element queried for has an exported directive with a matching name', | 
					
						
							|  |  |  |          () => { | 
					
						
							| 
									
										
										
										
											2019-01-10 22:24:32 +01:00
										 |  |  |            const Child = createDirective('child', {exportAs: ['child']}); | 
					
						
							| 
									
										
										
										
											2018-03-14 14:29:47 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |            let childInstance; | 
					
						
							|  |  |  |            /** | 
					
						
							|  |  |  |             * <div #foo="child" child></div> | 
					
						
							|  |  |  |             * class Cmpt { | 
					
						
							|  |  |  |             *  @ViewChildren('foo') query; | 
					
						
							|  |  |  |             * } | 
					
						
							|  |  |  |             */ | 
					
						
							|  |  |  |            const Cmpt = createComponent( | 
					
						
							|  |  |  |                'cmpt', | 
					
						
							|  |  |  |                function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |                  if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |                    ɵɵelement(0, 'div', 0, ['foo', 'child']); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |                  } | 
					
						
							|  |  |  |                  if (rf & RenderFlags.Update) { | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                    childInstance = getDirectiveOnNode(0); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |                  } | 
					
						
							|  |  |  |                }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                2, 0, [Child], [], | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |                function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |                  if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-07-20 12:32:29 +02:00
										 |  |  |                    ɵɵviewQuery(['foo'], true); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |                  } | 
					
						
							|  |  |  |                  if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                    let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                    ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |                        (ctx.query = tmp as QueryList<any>); | 
					
						
							|  |  |  |                  } | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |                }, | 
					
						
							|  |  |  |                [], [], undefined, [['child', '']]); | 
					
						
							| 
									
										
										
										
											2017-12-19 16:51:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |            const cmptInstance = renderComponent(Cmpt); | 
					
						
							|  |  |  |            const qList = (cmptInstance.query as QueryList<any>); | 
					
						
							|  |  |  |            expect(qList.length).toBe(1); | 
					
						
							|  |  |  |            expect(qList.first).toBe(childInstance); | 
					
						
							|  |  |  |          }); | 
					
						
							| 
									
										
										
										
											2017-12-19 16:51:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |       it('should read all matching directive instances from a given element', () => { | 
					
						
							| 
									
										
										
										
											2019-01-10 22:24:32 +01:00
										 |  |  |         const Child1 = createDirective('child1', {exportAs: ['child1']}); | 
					
						
							|  |  |  |         const Child2 = createDirective('child2', {exportAs: ['child2']}); | 
					
						
							| 
									
										
										
										
											2017-12-19 16:51:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         let child1Instance, child2Instance; | 
					
						
							|  |  |  |         /** | 
					
						
							|  |  |  |          * <div #foo="child1" child1 #bar="child2" child2></div> | 
					
						
							|  |  |  |          * class Cmpt { | 
					
						
							|  |  |  |          *  @ViewChildren('foo, bar') query; | 
					
						
							|  |  |  |          * } | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         const Cmpt = createComponent( | 
					
						
							|  |  |  |             'cmpt', | 
					
						
							|  |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |                 ɵɵelement(0, 'div', 0, ['foo', 'child1', 'bar', 'child2']); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                 child1Instance = getDirectiveOnNode(0, 0); | 
					
						
							|  |  |  |                 child2Instance = getDirectiveOnNode(0, 1); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |             3, 0, [Child1, Child2], [], | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-07-20 12:32:29 +02:00
										 |  |  |                 ɵɵviewQuery(['foo', 'bar'], true); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                 let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                     (ctx.query = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |             }, | 
					
						
							|  |  |  |             [], [], undefined, [['child1', '', 'child2', '']]); | 
					
						
							| 
									
										
										
										
											2017-12-19 16:51:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         const cmptInstance = renderComponent(Cmpt); | 
					
						
							|  |  |  |         const qList = (cmptInstance.query as QueryList<any>); | 
					
						
							|  |  |  |         expect(qList.length).toBe(2); | 
					
						
							|  |  |  |         expect(qList.first).toBe(child1Instance); | 
					
						
							|  |  |  |         expect(qList.last).toBe(child2Instance); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2017-12-19 16:51:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |       it('should read multiple locals exporting the same directive from a given element', () => { | 
					
						
							| 
									
										
										
										
											2019-01-10 22:24:32 +01:00
										 |  |  |         const Child = createDirective('child', {exportAs: ['child']}); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         let childInstance; | 
					
						
							| 
									
										
										
										
											2018-03-15 12:18:31 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         /** | 
					
						
							|  |  |  |          * <div child #foo="child" #bar="child"></div> | 
					
						
							|  |  |  |          * class Cmpt { | 
					
						
							|  |  |  |          *  @ViewChildren('foo') fooQuery; | 
					
						
							|  |  |  |          *  @ViewChildren('bar') barQuery; | 
					
						
							|  |  |  |          * } | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         const Cmpt = createComponent( | 
					
						
							|  |  |  |             'cmpt', | 
					
						
							|  |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |                 ɵɵelement(0, 'div', 0, ['foo', 'child', 'bar', 'child']); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                 childInstance = getDirectiveOnNode(0); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |             3, 0, [Child], [], | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-07-20 12:32:29 +02:00
										 |  |  |                 ɵɵviewQuery(['foo'], true); | 
					
						
							|  |  |  |                 ɵɵviewQuery(['bar'], true); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                 let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |                     (ctx.fooQuery = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |                     (ctx.barQuery = tmp as QueryList<any>); | 
					
						
							|  |  |  |               } | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |             }, | 
					
						
							|  |  |  |             [], [], undefined, [['child', '']]); | 
					
						
							| 
									
										
										
										
											2018-03-15 12:18:31 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         const cmptInstance = renderComponent(Cmpt); | 
					
						
							| 
									
										
										
										
											2018-03-15 12:18:31 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         const fooList = cmptInstance.fooQuery as QueryList<any>; | 
					
						
							|  |  |  |         expect(fooList.length).toBe(1); | 
					
						
							|  |  |  |         expect(fooList.first).toBe(childInstance); | 
					
						
							| 
									
										
										
										
											2018-03-15 12:18:31 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         const barList = cmptInstance.barQuery as QueryList<any>; | 
					
						
							|  |  |  |         expect(barList.length).toBe(1); | 
					
						
							|  |  |  |         expect(barList.first).toBe(childInstance); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2018-03-15 12:18:31 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |       it('should match on exported directive name and read a requested token', () => { | 
					
						
							| 
									
										
										
										
											2019-01-10 22:24:32 +01:00
										 |  |  |         const Child = createDirective('child', {exportAs: ['child']}); | 
					
						
							| 
									
										
										
										
											2017-12-19 16:51:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         let div; | 
					
						
							|  |  |  |         /** | 
					
						
							|  |  |  |          * <div #foo="child" child></div> | 
					
						
							|  |  |  |          * class Cmpt { | 
					
						
							|  |  |  |          *  @ViewChildren('foo', {read: ElementRef}) query; | 
					
						
							|  |  |  |          * } | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         const Cmpt = createComponent( | 
					
						
							|  |  |  |             'cmpt', | 
					
						
							|  |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |                 ɵɵelement(0, 'div', 0, ['foo', 'child']); | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                 div = getNativeByIndex(0, getLView()); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |             2, 0, [Child], [], | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵviewQuery(['foo'], false, ElementRef); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                 let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                     (ctx.query = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |             }, | 
					
						
							|  |  |  |             [], [], undefined, [['child', '']]); | 
					
						
							| 
									
										
										
										
											2017-12-19 16:51:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         const cmptInstance = renderComponent(Cmpt); | 
					
						
							|  |  |  |         const qList = (cmptInstance.query as QueryList<any>); | 
					
						
							|  |  |  |         expect(qList.length).toBe(1); | 
					
						
							|  |  |  |         expect(qList.first.nativeElement).toBe(div); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2017-12-19 16:51:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |       it('should support reading a mix of ElementRef and directive instances', () => { | 
					
						
							| 
									
										
										
										
											2019-01-10 22:24:32 +01:00
										 |  |  |         const Child = createDirective('child', {exportAs: ['child']}); | 
					
						
							| 
									
										
										
										
											2017-12-19 16:51:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         let childInstance, div; | 
					
						
							|  |  |  |         /** | 
					
						
							|  |  |  |          * <div #foo #bar="child" child></div> | 
					
						
							|  |  |  |          * class Cmpt { | 
					
						
							|  |  |  |          *  @ViewChildren('foo, bar') query; | 
					
						
							|  |  |  |          * } | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         const Cmpt = createComponent( | 
					
						
							|  |  |  |             'cmpt', | 
					
						
							|  |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |                 ɵɵelement(0, 'div', 0, ['foo', '', 'bar', 'child']); | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                 div = getNativeByIndex(0, getLView()); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                 childInstance = getDirectiveOnNode(0); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |             3, 0, [Child], [], | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-07-20 12:32:29 +02:00
										 |  |  |                 ɵɵviewQuery(['foo', 'bar'], false); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                 let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                     (ctx.query = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |             }, | 
					
						
							|  |  |  |             [], [], undefined, [['child', '']]); | 
					
						
							| 
									
										
										
										
											2017-12-19 16:51:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         const cmptInstance = renderComponent(Cmpt); | 
					
						
							|  |  |  |         const qList = (cmptInstance.query as QueryList<any>); | 
					
						
							|  |  |  |         expect(qList.length).toBe(2); | 
					
						
							|  |  |  |         expect(qList.first.nativeElement).toBe(div); | 
					
						
							|  |  |  |         expect(qList.last).toBe(childInstance); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2017-12-19 16:51:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  |       it('should not add results to selector-based query if a requested token cant be read', () => { | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         const Child = createDirective('child'); | 
					
						
							| 
									
										
										
										
											2017-12-20 17:35:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         /** | 
					
						
							|  |  |  |          * <div #foo></div> | 
					
						
							|  |  |  |          * class Cmpt { | 
					
						
							|  |  |  |          *  @ViewChildren('foo', {read: Child}) query; | 
					
						
							|  |  |  |          * } | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         const Cmpt = createComponent( | 
					
						
							|  |  |  |             'cmpt', | 
					
						
							|  |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |                 ɵɵelement(0, 'div', 0); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |             2, 0, [Child], [], | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵviewQuery(['foo'], false, Child); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                 let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                     (ctx.query = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |             }, | 
					
						
							|  |  |  |             [], [], undefined, [['foo', '']]); | 
					
						
							| 
									
										
										
										
											2017-12-20 17:35:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  |         const {component} = new ComponentFixture(Cmpt); | 
					
						
							|  |  |  |         const qList = component.query; | 
					
						
							|  |  |  |         expect(qList.length).toBe(0); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should not add results to directive-based query if requested token cant be read', () => { | 
					
						
							|  |  |  |         const Child = createDirective('child'); | 
					
						
							|  |  |  |         const OtherChild = createDirective('otherchild'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /** | 
					
						
							|  |  |  |          * <div child></div> | 
					
						
							|  |  |  |          * class Cmpt { | 
					
						
							|  |  |  |          *  @ViewChildren(Child, {read: OtherChild}) query; | 
					
						
							|  |  |  |          * } | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         const Cmpt = createComponent( | 
					
						
							|  |  |  |             'cmpt', | 
					
						
							|  |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |                 ɵɵelement(0, 'div', 0); | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |             1, 0, [Child, OtherChild], [], | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵviewQuery(Child, false, OtherChild); | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                 let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                     (ctx.query = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |             }, | 
					
						
							|  |  |  |             [], [], undefined, [['child', '']]); | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         const {component} = new ComponentFixture(Cmpt); | 
					
						
							|  |  |  |         const qList = component.query; | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |         expect(qList.length).toBe(0); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2017-12-20 17:35:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  |       it('should not add results to directive-based query if only read token matches', () => { | 
					
						
							|  |  |  |         const Child = createDirective('child'); | 
					
						
							|  |  |  |         const OtherChild = createDirective('otherchild'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /** | 
					
						
							|  |  |  |          * <div child></div> | 
					
						
							|  |  |  |          * class Cmpt { | 
					
						
							|  |  |  |          *  @ViewChildren(OtherChild, {read: Child}) query; | 
					
						
							|  |  |  |          * } | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         const Cmpt = createComponent( | 
					
						
							|  |  |  |             'cmpt', | 
					
						
							|  |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |                 ɵɵelement(0, 'div', 0); | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |             1, 0, [Child, OtherChild], [], | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵviewQuery(OtherChild, false, Child); | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                 let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                     (ctx.query = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |             }, | 
					
						
							|  |  |  |             [], [], undefined, [['child', '']]); | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         const {component} = new ComponentFixture(Cmpt); | 
					
						
							|  |  |  |         const qList = component.query; | 
					
						
							|  |  |  |         expect(qList.length).toBe(0); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should not add results to TemplateRef-based query if only read token matches', () => { | 
					
						
							|  |  |  |         /** | 
					
						
							|  |  |  |          * <div></div> | 
					
						
							|  |  |  |          * class Cmpt { | 
					
						
							|  |  |  |          *  @ViewChildren(TemplateRef, {read: ElementRef}) query; | 
					
						
							|  |  |  |          * } | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         const Cmpt = createComponent( | 
					
						
							|  |  |  |             'cmpt', | 
					
						
							|  |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵelement(0, 'div'); | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |             1, 0, [], [], | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵviewQuery(TemplateRef as any, false, ElementRef); | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                 let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                     (ctx.query = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  |               } | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const {component} = new ComponentFixture(Cmpt); | 
					
						
							|  |  |  |         const qList = component.query; | 
					
						
							|  |  |  |         expect(qList.length).toBe(0); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should match using string selector and directive as a read argument', () => { | 
					
						
							|  |  |  |         const Child = createDirective('child'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /** | 
					
						
							|  |  |  |          * <div child #foo></div> | 
					
						
							|  |  |  |          * class Cmpt { | 
					
						
							|  |  |  |          *  @ViewChildren('foo', {read: Child}) query; | 
					
						
							|  |  |  |          * } | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         const Cmpt = createComponent( | 
					
						
							|  |  |  |             'cmpt', | 
					
						
							|  |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |                 ɵɵelement(0, 'div', 0, ['foo', '']); | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |             2, 0, [Child], [], | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵviewQuery(['foo'], false, Child); | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                 let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                     (ctx.query = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |             }, | 
					
						
							|  |  |  |             [], [], undefined, [['child', '']]); | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         const {component} = new ComponentFixture(Cmpt); | 
					
						
							|  |  |  |         const qList = component.query; | 
					
						
							|  |  |  |         expect(qList.length).toBe(1); | 
					
						
							|  |  |  |         expect(qList.first instanceof Child).toBeTruthy(); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should not add results to the query in case no match found (via TemplateRef)', () => { | 
					
						
							|  |  |  |         const Child = createDirective('child'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /** | 
					
						
							|  |  |  |          * <div child></div> | 
					
						
							|  |  |  |          * class Cmpt { | 
					
						
							|  |  |  |          *  @ViewChildren(TemplateRef) query; | 
					
						
							|  |  |  |          * } | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         const Cmpt = createComponent( | 
					
						
							|  |  |  |             'cmpt', | 
					
						
							|  |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |                 ɵɵelement(0, 'div', 0); | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |             1, 0, [Child], [], | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-07-20 12:32:29 +02:00
										 |  |  |                 ɵɵviewQuery(TemplateRef as any, false); | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                 let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                     (ctx.query = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |             }, | 
					
						
							|  |  |  |             [], [], undefined, [['child', '']]); | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         const {component} = new ComponentFixture(Cmpt); | 
					
						
							|  |  |  |         const qList = component.query; | 
					
						
							|  |  |  |         expect(qList.length).toBe(0); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should query templates if the type is TemplateRef (and respect "read" option)', () => { | 
					
						
							|  |  |  |         function Cmpt_Template_1(rf: RenderFlags, ctx1: any) { | 
					
						
							|  |  |  |           if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |             ɵɵelementStart(0, 'div'); | 
					
						
							|  |  |  |             ɵɵtext(1, 'Test'); | 
					
						
							|  |  |  |             ɵɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         /** | 
					
						
							|  |  |  |          * <ng-template #foo><div>Test</div></ng-template> | 
					
						
							|  |  |  |          * <ng-template #bar><div>Test</div></ng-template> | 
					
						
							|  |  |  |          * <ng-template #baz><div>Test</div></ng-template> | 
					
						
							|  |  |  |          * class Cmpt { | 
					
						
							|  |  |  |          *   @ViewChildren(TemplateRef) tmplQuery; | 
					
						
							|  |  |  |          *   @ViewChildren(TemplateRef, {read: ElementRef}) elemQuery; | 
					
						
							|  |  |  |          * } | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         const Cmpt = createComponent( | 
					
						
							|  |  |  |             'cmpt', | 
					
						
							|  |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵtemplate( | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                     0, Cmpt_Template_1, 2, 0, 'ng-template', null, ['foo', ''], | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                     ɵɵtemplateRefExtractor); | 
					
						
							|  |  |  |                 ɵɵtemplate( | 
					
						
							| 
									
										
										
										
											2019-01-23 21:11:13 -08:00
										 |  |  |                     2, Cmpt_Template_1, 2, 0, 'ng-template', null, ['bar', ''], | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                     ɵɵtemplateRefExtractor); | 
					
						
							|  |  |  |                 ɵɵtemplate( | 
					
						
							| 
									
										
										
										
											2019-01-23 21:11:13 -08:00
										 |  |  |                     4, Cmpt_Template_1, 2, 0, 'ng-template', null, ['baz', ''], | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                     ɵɵtemplateRefExtractor); | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  |               } | 
					
						
							|  |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-01-23 21:11:13 -08:00
										 |  |  |             6, 0, [], [], | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  |             function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |               if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-07-20 12:32:29 +02:00
										 |  |  |                 ɵɵviewQuery(TemplateRef as any, false); | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵviewQuery(TemplateRef as any, false, ElementRef); | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  |               } | 
					
						
							|  |  |  |               if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                 let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  |                     (ctx.tmplQuery = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                 ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2018-10-29 21:55:58 -07:00
										 |  |  |                     (ctx.elemQuery = tmp as QueryList<any>); | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const {component} = new ComponentFixture(Cmpt); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // check template-based query set
 | 
					
						
							|  |  |  |         const tmplQList = component.tmplQuery; | 
					
						
							|  |  |  |         expect(tmplQList.length).toBe(3); | 
					
						
							|  |  |  |         expect(isTemplateRef(tmplQList.first)).toBeTruthy(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // check element-based query set
 | 
					
						
							|  |  |  |         const elemQList = component.elemQuery; | 
					
						
							|  |  |  |         expect(elemQList.length).toBe(3); | 
					
						
							|  |  |  |         expect(isElementRef(elemQList.first)).toBeTruthy(); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2017-12-12 14:42:28 +01:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2018-01-17 17:55:55 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-31 15:45:46 +02:00
										 |  |  |   describe('queryList', () => { | 
					
						
							|  |  |  |     it('should be destroyed when the containing view is destroyed', () => { | 
					
						
							|  |  |  |       let queryInstance: QueryList<any>; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |       const SimpleComponentWithQuery = createComponent( | 
					
						
							|  |  |  |           'some-component-with-query', | 
					
						
							|  |  |  |           function(rf: RenderFlags, ctx: any) { | 
					
						
							| 
									
										
										
										
											2018-05-31 15:45:46 +02:00
										 |  |  |             if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |               ɵɵelement(0, 'div', null, ['foo', '']); | 
					
						
							| 
									
										
										
										
											2018-05-31 15:45:46 +02:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |           }, | 
					
						
							| 
									
										
										
										
											2019-01-23 21:11:13 -08:00
										 |  |  |           2, 0, [], [], | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |           function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |             if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-07-20 12:32:29 +02:00
										 |  |  |               ɵɵviewQuery(['foo'], false); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-05-31 15:45:46 +02:00
										 |  |  |             if (rf & RenderFlags.Update) { | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |               let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |               ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2018-05-31 15:45:46 +02:00
										 |  |  |                   (ctx.query = queryInstance = tmp as QueryList<any>); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |       function createTemplate() { ɵɵcontainer(0); } | 
					
						
							| 
									
										
										
										
											2018-05-31 15:45:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       function updateTemplate() { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |         ɵɵcontainerRefreshStart(0); | 
					
						
							| 
									
										
										
										
											2018-05-31 15:45:46 +02:00
										 |  |  |         { | 
					
						
							|  |  |  |           if (condition) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |             let rf1 = ɵɵembeddedViewStart(1, 1, 0); | 
					
						
							| 
									
										
										
										
											2018-05-31 15:45:46 +02:00
										 |  |  |             { | 
					
						
							|  |  |  |               if (rf1 & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵelement(0, 'some-component-with-query'); | 
					
						
							| 
									
										
										
										
											2018-05-31 15:45:46 +02:00
										 |  |  |               } | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |             ɵɵembeddedViewEnd(); | 
					
						
							| 
									
										
										
										
											2018-05-31 15:45:46 +02:00
										 |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |         ɵɵcontainerRefreshEnd(); | 
					
						
							| 
									
										
										
										
											2018-05-31 15:45:46 +02:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        * % if (condition) { | 
					
						
							|  |  |  |        *   <some-component-with-query></some-component-with-query> | 
					
						
							|  |  |  |        * %} | 
					
						
							|  |  |  |        */ | 
					
						
							|  |  |  |       let condition = true; | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |       const t = | 
					
						
							|  |  |  |           new TemplateFixture(createTemplate, updateTemplate, 1, 0, [SimpleComponentWithQuery]); | 
					
						
							| 
									
										
										
										
											2018-05-31 15:45:46 +02:00
										 |  |  |       expect(t.html).toEqual('<some-component-with-query><div></div></some-component-with-query>'); | 
					
						
							|  |  |  |       expect((queryInstance !.changes as EventEmitter<any>).closed).toBeFalsy(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       condition = false; | 
					
						
							|  |  |  |       t.update(); | 
					
						
							|  |  |  |       expect(t.html).toEqual(''); | 
					
						
							|  |  |  |       expect((queryInstance !.changes as EventEmitter<any>).closed).toBeTruthy(); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2018-06-14 15:45:21 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-09 14:07:47 -07:00
										 |  |  |   it('should restore queries if view changes', () => { | 
					
						
							|  |  |  |     class SomeDir { | 
					
						
							|  |  |  |       constructor(public vcr: ViewContainerRef, public temp: TemplateRef<any>) { | 
					
						
							|  |  |  |         this.vcr.createEmbeddedView(this.temp); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-11 14:18:45 -07:00
										 |  |  |       static ɵfac = () => new SomeDir( | 
					
						
							| 
									
										
										
										
											2019-08-12 09:26:20 +03:00
										 |  |  |           ɵɵdirectiveInject(ViewContainerRef as any), ɵɵdirectiveInject(TemplateRef as any)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-11 12:28:12 -07:00
										 |  |  |           static ɵdir = ɵɵdefineDirective({ | 
					
						
							| 
									
										
										
										
											2019-08-12 09:26:20 +03:00
										 |  |  |             type: SomeDir, | 
					
						
							|  |  |  |             selectors: [['', 'someDir', '']], | 
					
						
							|  |  |  |           }); | 
					
						
							| 
									
										
										
										
											2018-08-09 14:07:47 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-15 18:37:03 -07:00
										 |  |  |     function AppComponent_Template_1(rf: RenderFlags, ctx: any) { | 
					
						
							| 
									
										
										
										
											2018-08-09 14:07:47 -07:00
										 |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |         ɵɵelement(0, 'div'); | 
					
						
							| 
									
										
										
										
											2018-08-09 14:07:47 -07:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * <div *someDir></div> | 
					
						
							|  |  |  |      * <div #foo></div> | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     const AppComponent = createComponent( | 
					
						
							|  |  |  |         'app', | 
					
						
							|  |  |  |         function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |           if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |             ɵɵtemplate(0, AppComponent_Template_1, 1, 0, 'div', 0); | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |             ɵɵelement(1, 'div', null, ['foo', '']); | 
					
						
							| 
									
										
										
										
											2018-08-09 14:07:47 -07:00
										 |  |  |           } | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |         3, 0, [SomeDir], [], | 
					
						
							| 
									
										
										
										
											2018-08-09 14:07:47 -07:00
										 |  |  |         function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |           if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-07-20 12:32:29 +02:00
										 |  |  |             ɵɵviewQuery(['foo'], true); | 
					
						
							| 
									
										
										
										
											2018-08-09 14:07:47 -07:00
										 |  |  |           } | 
					
						
							|  |  |  |           if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |             let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |             ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                 (ctx.query = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2018-08-09 14:07:47 -07:00
										 |  |  |           } | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |         }, | 
					
						
							|  |  |  |         [], [], undefined, [[AttributeMarker.Template, 'someDir']]); | 
					
						
							| 
									
										
										
										
											2018-08-09 14:07:47 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const fixture = new ComponentFixture(AppComponent); | 
					
						
							|  |  |  |     expect(fixture.component.query.length).toBe(1); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:45:21 +02:00
										 |  |  |   describe('content', () => { | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  |     let withContentInstance: WithContentDirective|null; | 
					
						
							| 
									
										
										
										
											2018-06-14 15:45:21 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-10 14:07:45 +02:00
										 |  |  |     beforeEach(() => { withContentInstance = null; }); | 
					
						
							| 
									
										
										
										
											2018-08-02 14:27:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  |     class WithContentDirective { | 
					
						
							|  |  |  |       // @ContentChildren('foo')
 | 
					
						
							|  |  |  |       foos !: QueryList<ElementRef>; | 
					
						
							|  |  |  |       contentInitQuerySnapshot = 0; | 
					
						
							|  |  |  |       contentCheckedQuerySnapshot = 0; | 
					
						
							| 
									
										
										
										
											2018-08-02 14:27:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  |       ngAfterContentInit() { this.contentInitQuerySnapshot = this.foos ? this.foos.length : 0; } | 
					
						
							| 
									
										
										
										
											2018-07-10 10:43:07 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  |       ngAfterContentChecked() { | 
					
						
							|  |  |  |         this.contentCheckedQuerySnapshot = this.foos ? this.foos.length : 0; | 
					
						
							| 
									
										
										
										
											2018-07-10 10:43:07 +02:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-11 14:18:45 -07:00
										 |  |  |       static ɵfac = () => withContentInstance = new WithContentDirective(); | 
					
						
							| 
									
										
										
										
											2019-10-11 12:28:12 -07:00
										 |  |  |       static ɵdir = ɵɵdefineDirective({ | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  |         type: WithContentDirective, | 
					
						
							|  |  |  |         selectors: [['', 'with-content', '']], | 
					
						
							| 
									
										
										
										
											2019-02-02 11:20:33 -08:00
										 |  |  |         contentQueries: (rf: RenderFlags, ctx: any, dirIndex: number) => { | 
					
						
							|  |  |  |           if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-07-20 12:32:29 +02:00
										 |  |  |             ɵɵcontentQuery(dirIndex, ['foo'], true); | 
					
						
							| 
									
										
										
										
											2019-02-02 11:20:33 -08:00
										 |  |  |           } | 
					
						
							|  |  |  |           if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |             let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |             ɵɵqueryRefresh(tmp = ɵɵloadQuery<ElementRef>()) && (ctx.foos = tmp); | 
					
						
							| 
									
										
										
										
											2019-02-02 11:20:33 -08:00
										 |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  |         } | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should support content queries for directives', () => { | 
					
						
							| 
									
										
										
										
											2018-07-10 10:43:07 +02:00
										 |  |  |       /** | 
					
						
							|  |  |  |        * <div with-content> | 
					
						
							|  |  |  |        *   <span #foo></span> | 
					
						
							|  |  |  |        * </div> | 
					
						
							|  |  |  |        */ | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |       const AppComponent = createComponent( | 
					
						
							|  |  |  |           'app-component', | 
					
						
							|  |  |  |           function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |             if (rf & RenderFlags.Create) { | 
					
						
							|  |  |  |               ɵɵelementStart(0, 'div', 0); | 
					
						
							|  |  |  |               { ɵɵelement(1, 'span', null, ['foo', '']); } | 
					
						
							|  |  |  |               ɵɵelementEnd(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           3, 0, [WithContentDirective], [], null, [], [], undefined, | 
					
						
							|  |  |  |           [[AttributeMarker.Bindings, 'with-content']]); | 
					
						
							| 
									
										
										
										
											2018-07-10 10:43:07 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       const fixture = new ComponentFixture(AppComponent); | 
					
						
							| 
									
										
										
										
											2018-08-02 14:27:36 -07:00
										 |  |  |       expect(withContentInstance !.foos.length) | 
					
						
							|  |  |  |           .toBe(1, `Expected content query to match <span #foo>.`); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(withContentInstance !.contentInitQuerySnapshot) | 
					
						
							|  |  |  |           .toBe( | 
					
						
							|  |  |  |               1, | 
					
						
							|  |  |  |               `Expected content query results to be available when ngAfterContentInit was called.`); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(withContentInstance !.contentCheckedQuerySnapshot) | 
					
						
							|  |  |  |           .toBe( | 
					
						
							|  |  |  |               1, | 
					
						
							|  |  |  |               `Expected content query results to be available when ngAfterContentChecked was called.`); | 
					
						
							| 
									
										
										
										
											2018-07-10 10:43:07 +02:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-18 09:23:18 +02:00
										 |  |  |     it('should support content queries for directives within repeated embedded views', () => { | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        * % for (let i = 0; i < 3; i++) { | 
					
						
							|  |  |  |        *   <div with-content> | 
					
						
							|  |  |  |        *     <span #foo></span> | 
					
						
							|  |  |  |        *   </div> | 
					
						
							|  |  |  |        * % } | 
					
						
							|  |  |  |        */ | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |       const AppComponent = createComponent( | 
					
						
							|  |  |  |           'app-component', | 
					
						
							|  |  |  |           function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |             if (rf & RenderFlags.Create) { | 
					
						
							|  |  |  |               ɵɵcontainer(0); | 
					
						
							| 
									
										
										
										
											2018-10-18 09:23:18 +02:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |             if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |               ɵɵcontainerRefreshStart(0); | 
					
						
							|  |  |  |               { | 
					
						
							|  |  |  |                 for (let i = 0; i < 3; i++) { | 
					
						
							|  |  |  |                   let rf = ɵɵembeddedViewStart(1, 3, 0); | 
					
						
							|  |  |  |                   if (rf & RenderFlags.Create) { | 
					
						
							|  |  |  |                     ɵɵelementStart(0, 'div', 0); | 
					
						
							|  |  |  |                     { ɵɵelement(1, 'span', null, ['foo', '']); } | 
					
						
							|  |  |  |                     ɵɵelementEnd(); | 
					
						
							|  |  |  |                   } | 
					
						
							|  |  |  |                   ɵɵembeddedViewEnd(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |               } | 
					
						
							| 
									
										
										
										
											2018-10-18 09:23:18 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |               ɵɵcontainerRefreshEnd(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           1, 0, [WithContentDirective], [], null, [], [], undefined, | 
					
						
							|  |  |  |           [[AttributeMarker.Bindings, 'with-content']]); | 
					
						
							| 
									
										
										
										
											2018-10-18 09:23:18 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       const fixture = new ComponentFixture(AppComponent); | 
					
						
							|  |  |  |       expect(withContentInstance !.foos.length) | 
					
						
							|  |  |  |           .toBe(1, `Expected content query to match <span #foo>.`); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(withContentInstance !.contentInitQuerySnapshot) | 
					
						
							|  |  |  |           .toBe( | 
					
						
							|  |  |  |               1, | 
					
						
							|  |  |  |               `Expected content query results to be available when ngAfterContentInit was called.`); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(withContentInstance !.contentCheckedQuerySnapshot) | 
					
						
							|  |  |  |           .toBe( | 
					
						
							|  |  |  |               1, | 
					
						
							|  |  |  |               `Expected content query results to be available when ngAfterContentChecked was called.`); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-06 11:56:57 +01:00
										 |  |  |     it('should not match directive host with content queries', () => { | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  |       /** | 
					
						
							|  |  |  |        * <div with-content #foo> | 
					
						
							|  |  |  |        * </div> | 
					
						
							|  |  |  |        */ | 
					
						
							|  |  |  |       const AppComponent = createComponent('app-component', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |         if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |           ɵɵelement(0, 'div', 0, ['foo', '']); | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |       }, 2, 0, [WithContentDirective], [], null, [], [], undefined, [['with-content', '']]); | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       const fixture = new ComponentFixture(AppComponent); | 
					
						
							|  |  |  |       expect(withContentInstance !.foos.length) | 
					
						
							| 
									
										
										
										
											2019-02-06 11:56:57 +01:00
										 |  |  |           .toBe(0, `Expected content query not to match <div with-content #foo>.`); | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // https://stackblitz.com/edit/angular-wlenwd?file=src%2Fapp%2Fapp.component.ts
 | 
					
						
							|  |  |  |     it('should support view and content queries matching the same element', () => { | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        * <div with-content> | 
					
						
							| 
									
										
										
										
											2018-06-14 15:45:21 +02:00
										 |  |  |        *   <div #foo></div> | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  |        * </div> | 
					
						
							| 
									
										
										
										
											2018-06-14 15:45:21 +02:00
										 |  |  |        * <div id="after" #bar></div> | 
					
						
							|  |  |  |        * class Cmpt { | 
					
						
							|  |  |  |        *  @ViewChildren('foo, bar') foos; | 
					
						
							|  |  |  |        * } | 
					
						
							|  |  |  |        */ | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |       const AppComponent = createComponent( | 
					
						
							|  |  |  |           'app-component', | 
					
						
							|  |  |  |           function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |             if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |               ɵɵelementStart(0, 'div', 0); | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |               { ɵɵelement(1, 'div', null, ['foo', '']); } | 
					
						
							|  |  |  |               ɵɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |               ɵɵelement(3, 'div', 1, ['bar', '']); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |           }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |           5, 0, [WithContentDirective], [], | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |           function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |             if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-07-20 12:32:29 +02:00
										 |  |  |               ɵɵviewQuery(['foo', 'bar'], true); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |             if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |               let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |               ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                   (ctx.foos = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2018-06-19 17:58:42 +02:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |           }, | 
					
						
							|  |  |  |           [], [], undefined, [['with-content', ''], ['id', 'after']]); | 
					
						
							| 
									
										
										
										
											2018-06-14 15:45:21 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       const fixture = new ComponentFixture(AppComponent); | 
					
						
							|  |  |  |       const viewQList = fixture.component.foos; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(viewQList.length).toBe(2); | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  |       expect(withContentInstance !.foos.length).toBe(1); | 
					
						
							|  |  |  |       expect(viewQList.first.nativeElement).toBe(withContentInstance !.foos.first.nativeElement); | 
					
						
							| 
									
										
										
										
											2018-06-14 15:45:21 +02:00
										 |  |  |       expect(viewQList.last.nativeElement.id).toBe('after'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  |     it('should not report deep content query matches found above content children', () => { | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        * <div with-content> | 
					
						
							|  |  |  |        *   <div #foo id="yes"></div>    <-- should match content query | 
					
						
							|  |  |  |        * </div> | 
					
						
							|  |  |  |        * <div #foo></div>              <-- should not match content query | 
					
						
							|  |  |  |        * class AppComponent { | 
					
						
							|  |  |  |        *  @ViewChildren('bar') bars: QueryList<ElementRef>; | 
					
						
							|  |  |  |        * } | 
					
						
							|  |  |  |        */ | 
					
						
							|  |  |  |       const AppComponent = createComponent( | 
					
						
							|  |  |  |           'app-component', | 
					
						
							|  |  |  |           function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |             if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |               ɵɵelementStart(0, 'div', 0); | 
					
						
							|  |  |  |               { ɵɵelement(1, 'div', 1, ['foo', '']); } | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |               ɵɵelementEnd(); | 
					
						
							|  |  |  |               ɵɵelement(3, 'div', null, ['foo', '']); | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  |             } | 
					
						
							|  |  |  |           }, | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |           5, 0, [WithContentDirective], [], | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  |           function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |             if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-07-20 12:32:29 +02:00
										 |  |  |               ɵɵviewQuery(['bar'], true); | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  |             } | 
					
						
							|  |  |  |             if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |               let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |               ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<any>>()) && | 
					
						
							| 
									
										
										
										
											2019-01-18 18:02:32 -08:00
										 |  |  |                   (ctx.bars = tmp as QueryList<any>); | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |           }, | 
					
						
							|  |  |  |           [], [], undefined, [['with-content', ''], ['id', 'yes']]); | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       const fixture = new ComponentFixture(AppComponent); | 
					
						
							|  |  |  |       expect(withContentInstance !.foos.length).toBe(1); | 
					
						
							|  |  |  |       expect(withContentInstance !.foos.first.nativeElement.id).toEqual('yes'); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2018-06-26 14:19:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  |     it('should report results to appropriate queries where deep content queries are nested', () => { | 
					
						
							| 
									
										
										
										
											2018-06-26 14:19:00 +02:00
										 |  |  |       class QueryDirective { | 
					
						
							|  |  |  |         fooBars: any; | 
					
						
							| 
									
										
										
										
											2019-10-11 14:18:45 -07:00
										 |  |  |         static ɵfac = () => new QueryDirective(); | 
					
						
							| 
									
										
										
										
											2019-10-11 12:28:12 -07:00
										 |  |  |         static ɵdir = ɵɵdefineDirective({ | 
					
						
							| 
									
										
										
										
											2018-06-26 14:19:00 +02:00
										 |  |  |           type: QueryDirective, | 
					
						
							|  |  |  |           selectors: [['', 'query', '']], | 
					
						
							| 
									
										
										
										
											2019-01-10 22:24:32 +01:00
										 |  |  |           exportAs: ['query'], | 
					
						
							| 
									
										
										
										
											2019-02-02 11:20:33 -08:00
										 |  |  |           contentQueries: (rf: RenderFlags, ctx: any, dirIndex: number) => { | 
					
						
							|  |  |  |             // @ContentChildren('foo, bar, baz', {descendants: true})
 | 
					
						
							|  |  |  |             // fooBars: QueryList<ElementRef>;
 | 
					
						
							|  |  |  |             if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-07-20 12:32:29 +02:00
										 |  |  |               ɵɵcontentQuery(dirIndex, ['foo', 'bar', 'baz'], true); | 
					
						
							| 
									
										
										
										
											2019-02-02 11:20:33 -08:00
										 |  |  |             } | 
					
						
							|  |  |  |             if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |               let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |               ɵɵqueryRefresh(tmp = ɵɵloadQuery<ElementRef>()) && (ctx.fooBars = tmp); | 
					
						
							| 
									
										
										
										
											2019-02-02 11:20:33 -08:00
										 |  |  |             } | 
					
						
							|  |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-06-26 14:19:00 +02:00
										 |  |  |         }); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       let outInstance: QueryDirective; | 
					
						
							|  |  |  |       let inInstance: QueryDirective; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const AppComponent = createComponent( | 
					
						
							|  |  |  |           'app-component', | 
					
						
							|  |  |  |           /** | 
					
						
							|  |  |  |            * <div query #out="query"> | 
					
						
							|  |  |  |            *   <span #foo></span> | 
					
						
							|  |  |  |            *   <div query #in="query"> | 
					
						
							|  |  |  |            *     <span #bar></span> | 
					
						
							|  |  |  |            *   </div> | 
					
						
							|  |  |  |            *   <span #baz></span> | 
					
						
							|  |  |  |            * </div> | 
					
						
							|  |  |  |            */ | 
					
						
							|  |  |  |           function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |             if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |               ɵɵelementStart(0, 'div', 0, ['out', 'query']); | 
					
						
							| 
									
										
										
										
											2018-06-26 14:19:00 +02:00
										 |  |  |               { | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |                 ɵɵelement(2, 'span', 1, ['foo', '']); | 
					
						
							|  |  |  |                 ɵɵelementStart(4, 'div', 0, ['in', 'query']); | 
					
						
							|  |  |  |                 { ɵɵelement(6, 'span', 2, ['bar', '']); } | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |                 ɵɵelement(8, 'span', 3, ['baz', '']); | 
					
						
							| 
									
										
										
										
											2018-06-26 14:19:00 +02:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |               ɵɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-06-26 14:19:00 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |             if (rf & RenderFlags.Update) { | 
					
						
							| 
									
										
										
										
											2019-08-12 08:11:32 +03:00
										 |  |  |               const lView = getLView(); | 
					
						
							|  |  |  |               outInstance = load<QueryDirective>(lView, 1); | 
					
						
							|  |  |  |               inInstance = load<QueryDirective>(lView, 5); | 
					
						
							| 
									
										
										
										
											2018-06-26 14:19:00 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |           }, | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |           10, 0, [QueryDirective], [], null, [], [], undefined, | 
					
						
							|  |  |  |           [[AttributeMarker.Bindings, 'query'], ['id', 'foo'], ['id', 'bar'], ['id', 'baz']]); | 
					
						
							| 
									
										
										
										
											2018-06-26 14:19:00 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       const fixture = new ComponentFixture(AppComponent); | 
					
						
							|  |  |  |       expect(outInstance !.fooBars.length).toBe(3); | 
					
						
							|  |  |  |       expect(inInstance !.fooBars.length).toBe(1); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     it('should support nested shallow content queries ', () => { | 
					
						
							|  |  |  |       let outInstance: QueryDirective; | 
					
						
							|  |  |  |       let inInstance: QueryDirective; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class QueryDirective { | 
					
						
							|  |  |  |         fooBars: any; | 
					
						
							| 
									
										
										
										
											2019-10-11 14:18:45 -07:00
										 |  |  |         static ɵfac = () => new QueryDirective(); | 
					
						
							| 
									
										
										
										
											2019-10-11 12:28:12 -07:00
										 |  |  |         static ɵdir = ɵɵdefineDirective({ | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  |           type: QueryDirective, | 
					
						
							|  |  |  |           selectors: [['', 'query', '']], | 
					
						
							| 
									
										
										
										
											2019-01-10 22:24:32 +01:00
										 |  |  |           exportAs: ['query'], | 
					
						
							| 
									
										
										
										
											2019-02-02 11:20:33 -08:00
										 |  |  |           contentQueries: (rf: RenderFlags, ctx: any, dirIndex: number) => { | 
					
						
							|  |  |  |             // @ContentChildren('foo', {descendants: true})
 | 
					
						
							|  |  |  |             // fooBars: QueryList<ElementRef>;
 | 
					
						
							|  |  |  |             if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-07-20 12:32:29 +02:00
										 |  |  |               ɵɵcontentQuery(dirIndex, ['foo'], false); | 
					
						
							| 
									
										
										
										
											2019-02-02 11:20:33 -08:00
										 |  |  |             } | 
					
						
							|  |  |  |             if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |               let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |               ɵɵqueryRefresh(tmp = ɵɵloadQuery<ElementRef>()) && (ctx.fooBars = tmp); | 
					
						
							| 
									
										
										
										
											2019-02-02 11:20:33 -08:00
										 |  |  |             } | 
					
						
							|  |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  |         }); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const AppComponent = createComponent( | 
					
						
							|  |  |  |           'app-component', | 
					
						
							|  |  |  |           /** | 
					
						
							|  |  |  |            * <div query #out="query"> | 
					
						
							|  |  |  |            *   <div query #in="query" #foo> | 
					
						
							|  |  |  |            *     <span #foo></span> | 
					
						
							|  |  |  |            *   </div> | 
					
						
							|  |  |  |            * </div> | 
					
						
							|  |  |  |            */ | 
					
						
							|  |  |  |           function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |             if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |               ɵɵelementStart(0, 'div', 0, ['out', 'query']); | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  |               { | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |                 ɵɵelementStart(2, 'div', 0, ['in', 'query', 'foo', '']); | 
					
						
							|  |  |  |                 { ɵɵelement(5, 'span', 1, ['foo', '']); } | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |               ɵɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  |             } | 
					
						
							|  |  |  |             if (rf & RenderFlags.Update) { | 
					
						
							| 
									
										
										
										
											2019-08-12 08:11:32 +03:00
										 |  |  |               const lView = getLView(); | 
					
						
							|  |  |  |               outInstance = load<QueryDirective>(lView, 1); | 
					
						
							|  |  |  |               inInstance = load<QueryDirective>(lView, 3); | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  |             } | 
					
						
							|  |  |  |           }, | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |           7, 0, [QueryDirective], [], null, [], [], undefined, [['query', ''], ['id', 'bar']]); | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       const fixture = new ComponentFixture(AppComponent); | 
					
						
							|  |  |  |       expect(outInstance !.fooBars.length).toBe(1); | 
					
						
							| 
									
										
										
										
											2019-02-06 11:56:57 +01:00
										 |  |  |       expect(inInstance !.fooBars.length).toBe(1); | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-02 19:29:08 +01:00
										 |  |  |     it('should support nested shallow content queries across multiple component instances', () => { | 
					
						
							|  |  |  |       let outInstance: QueryDirective; | 
					
						
							|  |  |  |       let inInstance: QueryDirective; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class QueryDirective { | 
					
						
							|  |  |  |         fooBars: any; | 
					
						
							| 
									
										
										
										
											2019-10-11 14:18:45 -07:00
										 |  |  |         static ɵfac = () => new QueryDirective(); | 
					
						
							| 
									
										
										
										
											2019-10-11 12:28:12 -07:00
										 |  |  |         static ɵdir = ɵɵdefineDirective({ | 
					
						
							| 
									
										
										
										
											2019-01-02 19:29:08 +01:00
										 |  |  |           type: QueryDirective, | 
					
						
							|  |  |  |           selectors: [['', 'query', '']], | 
					
						
							|  |  |  |           exportAs: ['query'], | 
					
						
							| 
									
										
										
										
											2019-02-02 11:20:33 -08:00
										 |  |  |           contentQueries: (rf: RenderFlags, ctx: any, dirIndex: number) => { | 
					
						
							|  |  |  |             // @ContentChildren('foo', {descendants: true})
 | 
					
						
							|  |  |  |             // fooBars: QueryList<ElementRef>;
 | 
					
						
							|  |  |  |             if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-07-20 12:32:29 +02:00
										 |  |  |               ɵɵcontentQuery(dirIndex, ['foo'], false); | 
					
						
							| 
									
										
										
										
											2019-02-02 11:20:33 -08:00
										 |  |  |             } | 
					
						
							|  |  |  |             if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |               let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |               ɵɵqueryRefresh(tmp = ɵɵloadQuery<ElementRef>()) && (ctx.fooBars = tmp); | 
					
						
							| 
									
										
										
										
											2019-02-02 11:20:33 -08:00
										 |  |  |             } | 
					
						
							|  |  |  |           } | 
					
						
							| 
									
										
										
										
											2019-01-02 19:29:08 +01:00
										 |  |  |         }); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const AppComponent = createComponent( | 
					
						
							|  |  |  |           'app-component', | 
					
						
							|  |  |  |           /** | 
					
						
							|  |  |  |            * <div query #out="query"> | 
					
						
							|  |  |  |            *   <div query #in="query" #foo> | 
					
						
							|  |  |  |            *     <span #foo></span> | 
					
						
							|  |  |  |            *   </div> | 
					
						
							|  |  |  |            * </div> | 
					
						
							|  |  |  |            */ | 
					
						
							|  |  |  |           function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |             if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |               ɵɵelementStart(0, 'div', 0, ['out', 'query']); | 
					
						
							| 
									
										
										
										
											2019-02-06 11:56:57 +01:00
										 |  |  |               { | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |                 ɵɵelementStart(2, 'div', 0, ['in', 'query', 'foo', '']); | 
					
						
							|  |  |  |                 { ɵɵelement(5, 'span', 1, ['foo', '']); } | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2019-02-06 11:56:57 +01:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |               ɵɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2019-01-02 19:29:08 +01:00
										 |  |  |             } | 
					
						
							|  |  |  |             if (rf & RenderFlags.Update) { | 
					
						
							| 
									
										
										
										
											2019-08-12 08:11:32 +03:00
										 |  |  |               const lView = getLView(); | 
					
						
							|  |  |  |               outInstance = load<QueryDirective>(lView, 1); | 
					
						
							|  |  |  |               inInstance = load<QueryDirective>(lView, 3); | 
					
						
							| 
									
										
										
										
											2019-01-02 19:29:08 +01:00
										 |  |  |             } | 
					
						
							|  |  |  |           }, | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |           7, 0, [QueryDirective], [], null, [], [], undefined, [['query', ''], ['id', 'bar']]); | 
					
						
							| 
									
										
										
										
											2019-01-02 19:29:08 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       const fixture1 = new ComponentFixture(AppComponent); | 
					
						
							|  |  |  |       expect(outInstance !.fooBars.length).toBe(1); | 
					
						
							|  |  |  |       expect(inInstance !.fooBars.length).toBe(1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       outInstance = inInstance = null !; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const fixture2 = new ComponentFixture(AppComponent); | 
					
						
							|  |  |  |       expect(outInstance !.fooBars.length).toBe(1); | 
					
						
							|  |  |  |       expect(inInstance !.fooBars.length).toBe(1); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-26 14:19:00 +02:00
										 |  |  |     it('should respect shallow flag on content queries when mixing deep and shallow queries', | 
					
						
							|  |  |  |        () => { | 
					
						
							|  |  |  |          class ShallowQueryDirective { | 
					
						
							|  |  |  |            foos: any; | 
					
						
							| 
									
										
										
										
											2019-10-11 14:18:45 -07:00
										 |  |  |            static ɵfac = () => new ShallowQueryDirective(); | 
					
						
							| 
									
										
										
										
											2019-10-11 12:28:12 -07:00
										 |  |  |            static ɵdir = ɵɵdefineDirective({ | 
					
						
							| 
									
										
										
										
											2018-06-26 14:19:00 +02:00
										 |  |  |              type: ShallowQueryDirective, | 
					
						
							|  |  |  |              selectors: [['', 'shallow-query', '']], | 
					
						
							| 
									
										
										
										
											2019-01-10 22:24:32 +01:00
										 |  |  |              exportAs: ['shallow-query'], | 
					
						
							| 
									
										
										
										
											2019-02-02 11:20:33 -08:00
										 |  |  |              contentQueries: (rf: RenderFlags, ctx: any, dirIndex: number) => { | 
					
						
							|  |  |  |                // @ContentChildren('foo', {descendants: false})
 | 
					
						
							|  |  |  |                // foos: QueryList<ElementRef>;
 | 
					
						
							|  |  |  |                if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-07-20 12:32:29 +02:00
										 |  |  |                  ɵɵcontentQuery(dirIndex, ['foo'], false); | 
					
						
							| 
									
										
										
										
											2019-02-02 11:20:33 -08:00
										 |  |  |                } | 
					
						
							|  |  |  |                if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                  let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                  ɵɵqueryRefresh(tmp = ɵɵloadQuery<ElementRef>()) && (ctx.foos = tmp); | 
					
						
							| 
									
										
										
										
											2019-02-02 11:20:33 -08:00
										 |  |  |                } | 
					
						
							|  |  |  |              } | 
					
						
							| 
									
										
										
										
											2018-06-26 14:19:00 +02:00
										 |  |  |            }); | 
					
						
							|  |  |  |          } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          class DeepQueryDirective { | 
					
						
							|  |  |  |            foos: any; | 
					
						
							| 
									
										
										
										
											2019-10-11 14:18:45 -07:00
										 |  |  |            static ɵfac = () => new DeepQueryDirective(); | 
					
						
							| 
									
										
										
										
											2019-10-11 12:28:12 -07:00
										 |  |  |            static ɵdir = ɵɵdefineDirective({ | 
					
						
							| 
									
										
										
										
											2018-06-26 14:19:00 +02:00
										 |  |  |              type: DeepQueryDirective, | 
					
						
							|  |  |  |              selectors: [['', 'deep-query', '']], | 
					
						
							| 
									
										
										
										
											2019-01-10 22:24:32 +01:00
										 |  |  |              exportAs: ['deep-query'], | 
					
						
							| 
									
										
										
										
											2019-02-02 11:20:33 -08:00
										 |  |  |              contentQueries: (rf: RenderFlags, ctx: any, dirIndex: number) => { | 
					
						
							|  |  |  |                // @ContentChildren('foo', {descendants: true})
 | 
					
						
							|  |  |  |                // foos: QueryList<ElementRef>;
 | 
					
						
							|  |  |  |                if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-07-20 12:32:29 +02:00
										 |  |  |                  ɵɵcontentQuery(dirIndex, ['foo'], true); | 
					
						
							| 
									
										
										
										
											2019-02-02 11:20:33 -08:00
										 |  |  |                } | 
					
						
							|  |  |  |                if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |                  let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |                  ɵɵqueryRefresh(tmp = ɵɵloadQuery<ElementRef>()) && (ctx.foos = tmp); | 
					
						
							| 
									
										
										
										
											2019-02-02 11:20:33 -08:00
										 |  |  |                } | 
					
						
							|  |  |  |              } | 
					
						
							| 
									
										
										
										
											2018-06-26 14:19:00 +02:00
										 |  |  |            }); | 
					
						
							|  |  |  |          } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          let shallowInstance: ShallowQueryDirective; | 
					
						
							|  |  |  |          let deepInstance: DeepQueryDirective; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          const AppComponent = createComponent( | 
					
						
							|  |  |  |              'app-component', | 
					
						
							|  |  |  |              /** | 
					
						
							|  |  |  |               * <div shallow-query #shallow="shallow-query" deep-query #deep="deep-query"> | 
					
						
							|  |  |  |                *   <span #foo></span> | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  |               *    <div> | 
					
						
							|  |  |  |               *        <span #foo></span> | 
					
						
							|  |  |  |               *    </div> | 
					
						
							| 
									
										
										
										
											2018-06-26 14:19:00 +02:00
										 |  |  |               * </div> | 
					
						
							|  |  |  |               */ | 
					
						
							|  |  |  |              function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |                if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |                  ɵɵelementStart(0, 'div', 0, ['shallow', 'shallow-query', 'deep', 'deep-query']); | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  |                  { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                    ɵɵelement(3, 'span', null, ['foo', '']); | 
					
						
							|  |  |  |                    ɵɵelementStart(5, 'div'); | 
					
						
							|  |  |  |                    { ɵɵelement(6, 'span', null, ['foo', '']); } | 
					
						
							|  |  |  |                    ɵɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  |                  } | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                  ɵɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-06-26 14:19:00 +02:00
										 |  |  |                } | 
					
						
							|  |  |  |                if (rf & RenderFlags.Update) { | 
					
						
							| 
									
										
										
										
											2019-08-12 08:11:32 +03:00
										 |  |  |                  const lView = getLView(); | 
					
						
							|  |  |  |                  shallowInstance = load<ShallowQueryDirective>(lView, 1); | 
					
						
							|  |  |  |                  deepInstance = load<DeepQueryDirective>(lView, 2); | 
					
						
							| 
									
										
										
										
											2018-06-26 14:19:00 +02:00
										 |  |  |                } | 
					
						
							|  |  |  |              }, | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |              8, 0, [ShallowQueryDirective, DeepQueryDirective], [], null, [], [], undefined, | 
					
						
							|  |  |  |              [[AttributeMarker.Bindings, 'shallow-query', 'deep-query']]); | 
					
						
							| 
									
										
										
										
											2018-06-26 14:19:00 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |          const fixture = new ComponentFixture(AppComponent); | 
					
						
							|  |  |  |          expect(shallowInstance !.foos.length).toBe(1); | 
					
						
							| 
									
										
										
										
											2018-08-09 10:00:07 -07:00
										 |  |  |          expect(deepInstance !.foos.length).toBe(2); | 
					
						
							| 
									
										
										
										
											2018-06-26 14:19:00 +02:00
										 |  |  |        }); | 
					
						
							| 
									
										
										
										
											2018-06-14 15:45:21 +02:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2019-01-23 16:58:52 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   describe('order', () => { | 
					
						
							|  |  |  |     class TextDirective { | 
					
						
							|  |  |  |       value !: string; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-11 14:18:45 -07:00
										 |  |  |       static ɵfac = () => new TextDirective(); | 
					
						
							| 
									
										
										
										
											2019-10-11 12:28:12 -07:00
										 |  |  |       static ɵdir = ɵɵdefineDirective( | 
					
						
							| 
									
										
										
										
											2019-08-12 09:26:20 +03:00
										 |  |  |           {type: TextDirective, selectors: [['', 'text', '']], inputs: {value: 'text'}}); | 
					
						
							| 
									
										
										
										
											2019-01-23 16:58:52 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should register content matches from top to bottom', () => { | 
					
						
							|  |  |  |       let contentQueryDirective: ContentQueryDirective; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       class ContentQueryDirective { | 
					
						
							|  |  |  |         // @ContentChildren(TextDirective)
 | 
					
						
							|  |  |  |         texts !: QueryList<TextDirective>; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-11 14:18:45 -07:00
										 |  |  |         static ɵfac = () => contentQueryDirective = new ContentQueryDirective(); | 
					
						
							| 
									
										
										
										
											2019-10-10 14:57:15 -07:00
										 |  |  |         static ɵcmp = ɵɵdefineDirective({ | 
					
						
							| 
									
										
										
										
											2019-01-23 16:58:52 +01:00
										 |  |  |           type: ContentQueryDirective, | 
					
						
							|  |  |  |           selectors: [['', 'content-query', '']], | 
					
						
							| 
									
										
										
										
											2019-02-02 11:20:33 -08:00
										 |  |  |           contentQueries: (rf: RenderFlags, ctx: any, dirIndex: number) => { | 
					
						
							|  |  |  |             // @ContentChildren(TextDirective, {descendants: true})
 | 
					
						
							|  |  |  |             // texts: QueryList<TextDirective>;
 | 
					
						
							|  |  |  |             if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-07-20 12:32:29 +02:00
										 |  |  |               ɵɵcontentQuery(dirIndex, TextDirective, true); | 
					
						
							| 
									
										
										
										
											2019-02-02 11:20:33 -08:00
										 |  |  |             } | 
					
						
							|  |  |  |             if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |               let tmp: any; | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |               ɵɵqueryRefresh(tmp = ɵɵloadQuery<TextDirective>()) && (ctx.texts = tmp); | 
					
						
							| 
									
										
										
										
											2019-02-02 11:20:33 -08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2019-01-23 16:58:52 +01:00
										 |  |  |           } | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const AppComponent = createComponent( | 
					
						
							|  |  |  |           'app-component', | 
					
						
							|  |  |  |           /** | 
					
						
							|  |  |  |           * <div content-query> | 
					
						
							|  |  |  |           *    <span text="A"></span> | 
					
						
							|  |  |  |           *    <div text="B"> | 
					
						
							|  |  |  |           *       <span text="C"> | 
					
						
							|  |  |  |           *         <span text="D"></span> | 
					
						
							|  |  |  |           *       </span> | 
					
						
							|  |  |  |           *    </div> | 
					
						
							|  |  |  |           *    <span text="E"></span> | 
					
						
							|  |  |  |           * </div> | 
					
						
							|  |  |  |           */ | 
					
						
							|  |  |  |           function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |             if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |               ɵɵelementStart(0, 'div', 0); | 
					
						
							| 
									
										
										
										
											2019-01-23 16:58:52 +01:00
										 |  |  |               { | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |                 ɵɵelement(1, 'span', 1); | 
					
						
							|  |  |  |                 ɵɵelementStart(2, 'div', 2); | 
					
						
							|  |  |  |                 ɵɵelementStart(3, 'span', 3); | 
					
						
							|  |  |  |                 { ɵɵelement(4, 'span', 4); } | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |                 ɵɵelementEnd(); | 
					
						
							|  |  |  |                 ɵɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |                 ɵɵelement(5, 'span', 5); | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |               } | 
					
						
							|  |  |  |               ɵɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2019-01-23 16:58:52 +01:00
										 |  |  |             } | 
					
						
							|  |  |  |           }, | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |           6, 0, [TextDirective, ContentQueryDirective], [], null, [], [], undefined, [ | 
					
						
							|  |  |  |             ['content-query'], ['text', 'A'], ['text', 'B'], ['text', 'C'], ['text', 'D'], | 
					
						
							|  |  |  |             ['text', 'E'] | 
					
						
							|  |  |  |           ]); | 
					
						
							| 
									
										
										
										
											2019-01-23 16:58:52 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       new ComponentFixture(AppComponent); | 
					
						
							|  |  |  |       expect(contentQueryDirective !.texts.map(item => item.value)).toEqual([ | 
					
						
							|  |  |  |         'A', 'B', 'C', 'D', 'E' | 
					
						
							|  |  |  |       ]); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should register view matches from top to bottom', () => { | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |         *    <span text="A"></span> | 
					
						
							|  |  |  |         *    <div text="B"> | 
					
						
							|  |  |  |         *       <span text="C"> | 
					
						
							|  |  |  |         *         <span text="D"></span> | 
					
						
							|  |  |  |         *       </span> | 
					
						
							|  |  |  |         *    </div> | 
					
						
							|  |  |  |         *    <span text="E"></span> | 
					
						
							|  |  |  |         */ | 
					
						
							|  |  |  |       class ViewQueryComponent { | 
					
						
							|  |  |  |         // @ViewChildren(TextDirective)
 | 
					
						
							|  |  |  |         texts !: QueryList<TextDirective>; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-11 14:18:45 -07:00
										 |  |  |         static ɵfac = () => new ViewQueryComponent(); | 
					
						
							| 
									
										
										
										
											2019-10-10 14:57:15 -07:00
										 |  |  |         static ɵcmp = ɵɵdefineComponent({ | 
					
						
							| 
									
										
										
										
											2019-01-23 16:58:52 +01:00
										 |  |  |           type: ViewQueryComponent, | 
					
						
							|  |  |  |           selectors: [['view-query']], | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |           consts: [['text', 'A'], ['text', 'B'], ['text', 'C'], ['text', 'D'], ['text', 'E']], | 
					
						
							| 
									
										
										
										
											2019-01-23 16:58:52 +01:00
										 |  |  |           template: function(rf: RenderFlags, ctx: ViewQueryComponent) { | 
					
						
							|  |  |  |             if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |               ɵɵelement(0, 'span', 0); | 
					
						
							|  |  |  |               ɵɵelementStart(1, 'div', 1); | 
					
						
							|  |  |  |               ɵɵelementStart(2, 'span', 2); | 
					
						
							|  |  |  |               { ɵɵelement(3, 'span', 3); } | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |               ɵɵelementEnd(); | 
					
						
							|  |  |  |               ɵɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |               ɵɵelement(4, 'span', 4); | 
					
						
							| 
									
										
										
										
											2019-01-23 16:58:52 +01:00
										 |  |  |             } | 
					
						
							|  |  |  |           }, | 
					
						
							| 
									
										
										
										
											2019-09-23 20:08:51 +02:00
										 |  |  |           decls: 5, | 
					
						
							| 
									
										
										
										
											2019-01-23 16:58:52 +01:00
										 |  |  |           vars: 0, | 
					
						
							|  |  |  |           viewQuery: function(rf: RenderFlags, ctx: ViewQueryComponent) { | 
					
						
							|  |  |  |             let tmp: any; | 
					
						
							|  |  |  |             if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2019-07-20 12:32:29 +02:00
										 |  |  |               ɵɵviewQuery(TextDirective, true); | 
					
						
							| 
									
										
										
										
											2019-01-23 16:58:52 +01:00
										 |  |  |             } | 
					
						
							|  |  |  |             if (rf & RenderFlags.Update) { | 
					
						
							| 
									
										
										
										
											2019-08-12 11:27:18 +03:00
										 |  |  |               ɵɵqueryRefresh(tmp = ɵɵloadQuery<QueryList<TextDirective>>()) && | 
					
						
							| 
									
										
										
										
											2019-01-23 16:58:52 +01:00
										 |  |  |                   (ctx.texts = tmp as QueryList<TextDirective>); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           directives: [TextDirective] | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const fixture = new ComponentFixture(ViewQueryComponent); | 
					
						
							|  |  |  |       expect(fixture.component.texts.map(item => item.value)).toEqual(['A', 'B', 'C', 'D', 'E']); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | }); |