| 
									
										
										
										
											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-03-29 16:41:45 -07:00
										 |  |  | import {SelectorFlags} from '@angular/core/src/render3/interfaces/projection'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  | import {Input, TemplateRef, ViewContainerRef, ViewRef} from '../../src/core'; | 
					
						
							|  |  |  | import {defineDirective} from '../../src/render3/definition'; | 
					
						
							|  |  |  | import {injectTemplateRef, injectViewContainerRef} from '../../src/render3/di'; | 
					
						
							| 
									
										
										
										
											2018-05-04 15:58:42 +02:00
										 |  |  | import {AttributeMarker, detectChanges} from '../../src/render3/index'; | 
					
						
							| 
									
										
										
										
											2018-08-15 18:37:03 -07:00
										 |  |  | import {bind, container, containerRefreshEnd, containerRefreshStart, element, elementContainerEnd, elementContainerStart, elementEnd, elementProperty, elementStart, embeddedViewEnd, embeddedViewStart, loadDirective, projection, projectionDef, template, text} from '../../src/render3/instructions'; | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  | import {RenderFlags} from '../../src/render3/interfaces/definition'; | 
					
						
							| 
									
										
										
										
											2018-05-04 15:58:42 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-17 11:45:49 -07:00
										 |  |  | import {NgIf} from './common_with_def'; | 
					
						
							| 
									
										
										
										
											2018-05-04 15:58:42 +02:00
										 |  |  | import {ComponentFixture, createComponent, renderComponent, toHtml} from './render_util'; | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | describe('content projection', () => { | 
					
						
							|  |  |  |   it('should project content', () => { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * <div><ng-content></ng-content></div> | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |     const Child = createComponent('child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         projectionDef(); | 
					
						
							|  |  |  |         elementStart(0, 'div'); | 
					
						
							|  |  |  |         { projection(1); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |         elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |     }, 2); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * <child>content</child> | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |     const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  |         elementStart(0, 'child'); | 
					
						
							| 
									
										
										
										
											2018-03-21 15:10:34 -07:00
										 |  |  |         { text(1, 'content'); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |         elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |     }, 2, 0, [Child]); | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |     const parent = renderComponent(Parent); | 
					
						
							|  |  |  |     expect(toHtml(parent)).toEqual('<child><div>content</div></child>'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should project content when root.', () => { | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |     /** <ng-content></ng-content> */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |     const Child = createComponent('child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         projectionDef(); | 
					
						
							|  |  |  |         projection(0); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |     }, 1); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** <child>content</child> */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |     const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  |         elementStart(0, 'child'); | 
					
						
							| 
									
										
										
										
											2018-03-21 15:10:34 -07:00
										 |  |  |         { text(1, 'content'); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |         elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |     }, 2, 0, [Child]); | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |     const parent = renderComponent(Parent); | 
					
						
							|  |  |  |     expect(toHtml(parent)).toEqual('<child>content</child>'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |   it('should project content with siblings', () => { | 
					
						
							|  |  |  |     /** <ng-content></ng-content> */ | 
					
						
							|  |  |  |     const Child = createComponent('child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							|  |  |  |         projectionDef(); | 
					
						
							|  |  |  |         projection(0); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |     }, 1); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * <child> | 
					
						
							|  |  |  |      *  before | 
					
						
							|  |  |  |      *  <div>content</div> | 
					
						
							|  |  |  |      *  after | 
					
						
							|  |  |  |      * </child> | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							|  |  |  |         elementStart(0, 'child'); | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           text(1, 'before'); | 
					
						
							|  |  |  |           elementStart(2, 'div'); | 
					
						
							|  |  |  |           { text(3, 'content'); } | 
					
						
							|  |  |  |           elementEnd(); | 
					
						
							|  |  |  |           text(4, 'after'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         elementEnd(); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |     }, 5, 0, [Child]); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const parent = renderComponent(Parent); | 
					
						
							|  |  |  |     expect(toHtml(parent)).toEqual('<child>before<div>content</div>after</child>'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |   it('should re-project content when root.', () => { | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |     /** <div><ng-content></ng-content></div> */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |     const GrandChild = createComponent('grand-child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         projectionDef(); | 
					
						
							|  |  |  |         elementStart(0, 'div'); | 
					
						
							|  |  |  |         { projection(1); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |         elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |     }, 2); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** <grand-child><ng-content></ng-content></grand-child> */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |     const Child = createComponent('child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         projectionDef(); | 
					
						
							|  |  |  |         elementStart(0, 'grand-child'); | 
					
						
							|  |  |  |         { projection(1); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |         elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |     }, 2, 0, [GrandChild]); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** <child><b>Hello</b>World!</child> */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |     const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  |         elementStart(0, 'child'); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2018-03-21 15:10:34 -07:00
										 |  |  |           elementStart(1, 'b'); | 
					
						
							|  |  |  |           text(2, 'Hello'); | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |           elementEnd(); | 
					
						
							| 
									
										
										
										
											2018-03-21 15:10:34 -07:00
										 |  |  |           text(3, 'World!'); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |         elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |     }, 4, 0, [Child]); | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |     const parent = renderComponent(Parent); | 
					
						
							|  |  |  |     expect(toHtml(parent)) | 
					
						
							|  |  |  |         .toEqual('<child><grand-child><div><b>Hello</b>World!</div></grand-child></child>'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-18 14:13:23 -08:00
										 |  |  |   it('should project components', () => { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** <div><ng-content></ng-content></div> */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |     const Child = createComponent('child', (rf: RenderFlags, ctx: any) => { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         projectionDef(); | 
					
						
							|  |  |  |         elementStart(0, 'div'); | 
					
						
							|  |  |  |         { projection(1); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |         elementEnd(); | 
					
						
							| 
									
										
										
										
											2018-01-18 14:13:23 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |     }, 2); | 
					
						
							| 
									
										
										
										
											2018-01-18 14:13:23 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |     const ProjectedComp = createComponent('projected-comp', (rf: RenderFlags, ctx: any) => { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |         text(0, 'content'); | 
					
						
							| 
									
										
										
										
											2018-01-18 14:13:23 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |     }, 1); | 
					
						
							| 
									
										
										
										
											2018-01-18 14:13:23 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * <child> | 
					
						
							|  |  |  |      *   <projected-comp></projected-comp> | 
					
						
							|  |  |  |      * </child> | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |     const Parent = createComponent('parent', (rf: RenderFlags, ctx: any) => { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  |         elementStart(0, 'child'); | 
					
						
							| 
									
										
										
										
											2018-07-27 14:28:22 -07:00
										 |  |  |         { element(1, 'projected-comp'); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |         elementEnd(); | 
					
						
							| 
									
										
										
										
											2018-01-18 14:13:23 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |     }, 2, 0, [Child, ProjectedComp]); | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-18 14:13:23 -08:00
										 |  |  |     const parent = renderComponent(Parent); | 
					
						
							|  |  |  |     expect(toHtml(parent)) | 
					
						
							| 
									
										
										
										
											2018-01-18 14:22:52 -08:00
										 |  |  |         .toEqual('<child><div><projected-comp>content</projected-comp></div></child>'); | 
					
						
							| 
									
										
										
										
											2018-01-18 14:13:23 -08:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |   it('should project components that have their own projection', () => { | 
					
						
							|  |  |  |     /** <div><ng-content></ng-content></div> */ | 
					
						
							|  |  |  |     const Child = createComponent('child', (rf: RenderFlags, ctx: any) => { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         projectionDef(); | 
					
						
							|  |  |  |         elementStart(0, 'div'); | 
					
						
							|  |  |  |         { projection(1); } | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |         elementEnd(); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |     }, 2); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** <p><ng-content></ng-content></p> */ | 
					
						
							|  |  |  |     const ProjectedComp = createComponent('projected-comp', (rf: RenderFlags, ctx: any) => { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         projectionDef(); | 
					
						
							|  |  |  |         elementStart(0, 'p'); | 
					
						
							|  |  |  |         projection(1); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |         elementEnd(); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |     }, 2); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * <child> | 
					
						
							|  |  |  |      *   <projected-comp> | 
					
						
							|  |  |  |      *       <div> Some content </div> | 
					
						
							|  |  |  |      *       Other content | 
					
						
							|  |  |  |      *   </projected-comp> | 
					
						
							|  |  |  |      * </child> | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     const Parent = createComponent('parent', (rf: RenderFlags, ctx: any) => { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							|  |  |  |         elementStart(0, 'child'); | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           elementStart(1, 'projected-comp'); | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             elementStart(2, 'div'); | 
					
						
							|  |  |  |             text(3, 'Some content'); | 
					
						
							|  |  |  |             elementEnd(); | 
					
						
							|  |  |  |             text(4, 'Other content'); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           elementEnd(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         elementEnd(); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |     }, 5, 0, [Child, ProjectedComp]); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const parent = renderComponent(Parent); | 
					
						
							|  |  |  |     expect(toHtml(parent)) | 
					
						
							|  |  |  |         .toEqual( | 
					
						
							|  |  |  |             '<child><div><projected-comp><p><div>Some content</div>Other content</p></projected-comp></div></child>'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |   it('should project containers', () => { | 
					
						
							| 
									
										
										
										
											2018-06-27 16:05:23 -07:00
										 |  |  |     /** <div> <ng-content></ng-content></div> */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |     const Child = createComponent('child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         projectionDef(); | 
					
						
							|  |  |  |         elementStart(0, 'div'); | 
					
						
							|  |  |  |         { projection(1); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |         elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |     }, 2); | 
					
						
							| 
									
										
										
										
											2018-06-27 16:05:23 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * <child> | 
					
						
							|  |  |  |      *     ( | 
					
						
							|  |  |  |      *      % if (value) { | 
					
						
							|  |  |  |      *        content | 
					
						
							|  |  |  |      *      % } | 
					
						
							|  |  |  |      *     ) | 
					
						
							|  |  |  |      * </child> | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |     const Parent = createComponent('parent', function(rf: RenderFlags, ctx: {value: any}) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  |         elementStart(0, 'child'); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2018-03-21 15:10:34 -07:00
										 |  |  |           text(1, '('); | 
					
						
							|  |  |  |           container(2); | 
					
						
							|  |  |  |           text(3, ')'); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |         elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |       if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |         containerRefreshStart(2); | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           if (ctx.value) { | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |             let rf0 = embeddedViewStart(0, 1, 0); | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |             if (rf0 & RenderFlags.Create) { | 
					
						
							|  |  |  |               text(0, 'content'); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             embeddedViewEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |         containerRefreshEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |     }, 4, 0, [Child]); | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |     const parent = renderComponent(Parent); | 
					
						
							|  |  |  |     expect(toHtml(parent)).toEqual('<child><div>()</div></child>'); | 
					
						
							|  |  |  |     parent.value = true; | 
					
						
							|  |  |  |     detectChanges(parent); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |     expect(toHtml(parent)).toEqual('<child><div>(content)</div></child>'); | 
					
						
							|  |  |  |     parent.value = false; | 
					
						
							|  |  |  |     detectChanges(parent); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |     expect(toHtml(parent)).toEqual('<child><div>()</div></child>'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |   it('should project containers into root', () => { | 
					
						
							| 
									
										
										
										
											2018-06-27 16:05:23 -07:00
										 |  |  |     /** <ng-content></ng-content> */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |     const Child = createComponent('child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         projectionDef(); | 
					
						
							|  |  |  |         projection(0); | 
					
						
							| 
									
										
										
										
											2017-12-08 11:48:54 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |     }, 1); | 
					
						
							| 
									
										
										
										
											2018-06-27 16:05:23 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * <child> | 
					
						
							|  |  |  |      *    % if (value) { | 
					
						
							|  |  |  |      *      content | 
					
						
							|  |  |  |      *    % } | 
					
						
							|  |  |  |      * </child> | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |     const Parent = createComponent('parent', function(rf: RenderFlags, ctx: {value: any}) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  |         elementStart(0, 'child'); | 
					
						
							| 
									
										
										
										
											2018-03-21 15:10:34 -07:00
										 |  |  |         { container(1); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |         elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-08 11:48:54 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |       if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |         containerRefreshStart(1); | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           if (ctx.value) { | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |             let rf0 = embeddedViewStart(0, 1, 0); | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |             if (rf0 & RenderFlags.Create) { | 
					
						
							|  |  |  |               text(0, 'content'); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             embeddedViewEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-08 11:48:54 -08:00
										 |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |         containerRefreshEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-08 11:48:54 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |     }, 2, 0, [Child]); | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-08 11:48:54 -08:00
										 |  |  |     const parent = renderComponent(Parent); | 
					
						
							|  |  |  |     expect(toHtml(parent)).toEqual('<child></child>'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     parent.value = true; | 
					
						
							|  |  |  |     detectChanges(parent); | 
					
						
							|  |  |  |     expect(toHtml(parent)).toEqual('<child>content</child>'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     parent.value = false; | 
					
						
							|  |  |  |     detectChanges(parent); | 
					
						
							|  |  |  |     expect(toHtml(parent)).toEqual('<child></child>'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |   it('should project containers with if-else.', () => { | 
					
						
							| 
									
										
										
										
											2018-06-27 16:05:23 -07:00
										 |  |  |     /** <div><ng-content></ng-content></div> */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |     const Child = createComponent('child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         projectionDef(); | 
					
						
							|  |  |  |         elementStart(0, 'div'); | 
					
						
							|  |  |  |         { projection(1); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |         elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |     }, 2); | 
					
						
							| 
									
										
										
										
											2018-06-27 16:05:23 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * <child> | 
					
						
							|  |  |  |      *     ( | 
					
						
							|  |  |  |      *       % if (value) { | 
					
						
							|  |  |  |      *         content | 
					
						
							|  |  |  |      *       % } else { | 
					
						
							|  |  |  |      *         else | 
					
						
							|  |  |  |      *       % } | 
					
						
							|  |  |  |      *     ) | 
					
						
							|  |  |  |      * </child> | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |     const Parent = createComponent('parent', function(rf: RenderFlags, ctx: {value: any}) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  |         elementStart(0, 'child'); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2018-03-21 15:10:34 -07:00
										 |  |  |           text(1, '('); | 
					
						
							|  |  |  |           container(2); | 
					
						
							|  |  |  |           text(3, ')'); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |         elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |       if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |         containerRefreshStart(2); | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           if (ctx.value) { | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |             let rf0 = embeddedViewStart(0, 1, 0); | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |             if (rf0 & RenderFlags.Create) { | 
					
						
							|  |  |  |               text(0, 'content'); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             embeddedViewEnd(); | 
					
						
							|  |  |  |           } else { | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |             if (embeddedViewStart(1, 1, 0)) { | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |               text(0, 'else'); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             embeddedViewEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |         containerRefreshEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |     }, 4, 0, [Child]); | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |     const parent = renderComponent(Parent); | 
					
						
							|  |  |  |     expect(toHtml(parent)).toEqual('<child><div>(else)</div></child>'); | 
					
						
							|  |  |  |     parent.value = true; | 
					
						
							|  |  |  |     detectChanges(parent); | 
					
						
							|  |  |  |     expect(toHtml(parent)).toEqual('<child><div>(content)</div></child>'); | 
					
						
							|  |  |  |     parent.value = false; | 
					
						
							|  |  |  |     detectChanges(parent); | 
					
						
							|  |  |  |     expect(toHtml(parent)).toEqual('<child><div>(else)</div></child>'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-27 16:05:23 -07:00
										 |  |  |   it('should support projection into embedded views', () => { | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |     let childCmptInstance: any; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * <div> | 
					
						
							|  |  |  |      *  % if (!skipContent) { | 
					
						
							|  |  |  |      *    <span> | 
					
						
							|  |  |  |      *      <ng-content></ng-content> | 
					
						
							|  |  |  |      *    </span> | 
					
						
							|  |  |  |      *  % } | 
					
						
							|  |  |  |      * </div> | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |     const Child = createComponent('child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         projectionDef(); | 
					
						
							|  |  |  |         elementStart(0, 'div'); | 
					
						
							|  |  |  |         { container(1); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |         elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |       if (rf & RenderFlags.Update) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         containerRefreshStart(1); | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |         { | 
					
						
							|  |  |  |           if (!ctx.skipContent) { | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |             let rf0 = embeddedViewStart(0, 2, 0); | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |             if (rf0 & RenderFlags.Create) { | 
					
						
							|  |  |  |               elementStart(0, 'span'); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |               projection(1); | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |               elementEnd(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             embeddedViewEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |         containerRefreshEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |     }, 2, 0); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * <child> | 
					
						
							|  |  |  |      *   <div>text</div> | 
					
						
							|  |  |  |      *   content | 
					
						
							|  |  |  |      * </child> | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |     const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  |         elementStart(0, 'child'); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |           elementStart(1, 'div'); | 
					
						
							|  |  |  |           { text(2, 'text'); } | 
					
						
							|  |  |  |           elementEnd(); | 
					
						
							|  |  |  |           text(3, 'content'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         elementEnd(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // testing
 | 
					
						
							|  |  |  |         childCmptInstance = loadDirective(0); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |     }, 4, 0, [Child]); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const parent = renderComponent(Parent); | 
					
						
							|  |  |  |     expect(toHtml(parent)).toEqual('<child><div><span><div>text</div>content</span></div></child>'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     childCmptInstance.skipContent = true; | 
					
						
							|  |  |  |     detectChanges(parent); | 
					
						
							|  |  |  |     expect(toHtml(parent)).toEqual('<child><div></div></child>'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should support projection into embedded views when no projected nodes', () => { | 
					
						
							|  |  |  |     let childCmptInstance: any; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * <div> | 
					
						
							|  |  |  |      *  % if (!skipContent) { | 
					
						
							|  |  |  |      *      <ng-content></ng-content> | 
					
						
							|  |  |  |      *      text | 
					
						
							|  |  |  |      *  % } | 
					
						
							|  |  |  |      * </div> | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     const Child = createComponent('child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							|  |  |  |         projectionDef(); | 
					
						
							|  |  |  |         elementStart(0, 'div'); | 
					
						
							|  |  |  |         { container(1); } | 
					
						
							|  |  |  |         elementEnd(); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |         containerRefreshStart(1); | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           if (!ctx.skipContent) { | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |             let rf0 = embeddedViewStart(0, 2, 0); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |             if (rf0 & RenderFlags.Create) { | 
					
						
							|  |  |  |               projection(0); | 
					
						
							|  |  |  |               text(1, 'text'); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             embeddedViewEnd(); | 
					
						
							|  |  |  |           } | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         containerRefreshEnd(); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |     }, 2); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** <child></child> */ | 
					
						
							|  |  |  |     const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-27 14:28:22 -07:00
										 |  |  |         element(0, 'child'); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // testing
 | 
					
						
							|  |  |  |         childCmptInstance = loadDirective(0); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |     }, 1, 0, [Child]); | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |     const parent = renderComponent(Parent); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |     expect(toHtml(parent)).toEqual('<child><div>text</div></child>'); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     childCmptInstance.skipContent = true; | 
					
						
							|  |  |  |     detectChanges(parent); | 
					
						
							|  |  |  |     expect(toHtml(parent)).toEqual('<child><div></div></child>'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |   it('should support projection into embedded views when ng-content is a root node of an embedded view', | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |      () => { | 
					
						
							|  |  |  |        let childCmptInstance: any; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        /** | 
					
						
							|  |  |  |         * <div> | 
					
						
							|  |  |  |         *  % if (!skipContent) { | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |          *    <ng-content></ng-content> | 
					
						
							|  |  |  |          *  % } | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |         * </div> | 
					
						
							|  |  |  |         */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |        const Child = createComponent('child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |          if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |            projectionDef(); | 
					
						
							|  |  |  |            elementStart(0, 'div'); | 
					
						
							|  |  |  |            { container(1); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |            elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |          } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |          if (rf & RenderFlags.Update) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |            containerRefreshStart(1); | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |            { | 
					
						
							|  |  |  |              if (!ctx.skipContent) { | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |                let rf0 = embeddedViewStart(0, 1, 0); | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |                if (rf0 & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |                  projection(0); | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |                } | 
					
						
							|  |  |  |                embeddedViewEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |              } | 
					
						
							|  |  |  |            } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |            containerRefreshEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |          } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |        }, 2); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |        /** | 
					
						
							|  |  |  |         * <child>content</child> | 
					
						
							|  |  |  |         */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |        const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |          if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  |            elementStart(0, 'child'); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |            { | 
					
						
							| 
									
										
										
										
											2018-03-21 15:10:34 -07:00
										 |  |  |              childCmptInstance = loadDirective(0); | 
					
						
							|  |  |  |              text(1, 'content'); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |            } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |            elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |          } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |        }, 2, 0, [Child]); | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |        const parent = renderComponent(Parent); | 
					
						
							|  |  |  |        expect(toHtml(parent)).toEqual('<child><div>content</div></child>'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        childCmptInstance.skipContent = true; | 
					
						
							|  |  |  |        detectChanges(parent); | 
					
						
							|  |  |  |        expect(toHtml(parent)).toEqual('<child><div></div></child>'); | 
					
						
							|  |  |  |      }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |   it('should project containers into containers', () => { | 
					
						
							| 
									
										
										
										
											2018-06-27 16:05:23 -07:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * <div> | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |      *  Before (inside) | 
					
						
							| 
									
										
										
										
											2018-06-27 16:05:23 -07:00
										 |  |  |      *  % if (!skipContent) { | 
					
						
							|  |  |  |      *    <ng-content></ng-content> | 
					
						
							|  |  |  |      *  % } | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |      *  After (inside) | 
					
						
							| 
									
										
										
										
											2018-06-27 16:05:23 -07:00
										 |  |  |      * </div> | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     const Child = createComponent('child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         projectionDef(); | 
					
						
							|  |  |  |         elementStart(0, 'div'); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |           text(1, 'Before (inside)-'); | 
					
						
							|  |  |  |           container(2); | 
					
						
							|  |  |  |           text(3, '-After (inside)'); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-06-27 16:05:23 -07:00
										 |  |  |         elementEnd(); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       if (rf & RenderFlags.Update) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         containerRefreshStart(2); | 
					
						
							| 
									
										
										
										
											2018-06-27 16:05:23 -07:00
										 |  |  |         { | 
					
						
							|  |  |  |           if (!ctx.skipContent) { | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |             let rf0 = embeddedViewStart(0, 1, 0); | 
					
						
							| 
									
										
										
										
											2018-06-27 16:05:23 -07:00
										 |  |  |             if (rf0 & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |               projection(0); | 
					
						
							| 
									
										
										
										
											2018-06-27 16:05:23 -07:00
										 |  |  |             } | 
					
						
							|  |  |  |             embeddedViewEnd(); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         containerRefreshEnd(); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |     }, 4); | 
					
						
							| 
									
										
										
										
											2018-06-27 16:05:23 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * <child> | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |      *     Before text- | 
					
						
							| 
									
										
										
										
											2018-06-27 16:05:23 -07:00
										 |  |  |      *     % if (!skipContent) { | 
					
						
							|  |  |  |      *       content | 
					
						
							|  |  |  |      *     % } | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |      *     -After text | 
					
						
							| 
									
										
										
										
											2018-06-27 16:05:23 -07:00
										 |  |  |      * </child> | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							|  |  |  |         elementStart(0, 'child'); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |         { | 
					
						
							|  |  |  |           text(1, 'Before text-'); | 
					
						
							|  |  |  |           container(2); | 
					
						
							|  |  |  |           text(3, '-After text'); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-06-27 16:05:23 -07:00
										 |  |  |         elementEnd(); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       if (rf & RenderFlags.Update) { | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |         containerRefreshStart(2); | 
					
						
							| 
									
										
										
										
											2018-06-27 16:05:23 -07:00
										 |  |  |         { | 
					
						
							|  |  |  |           if (!ctx.skipContent) { | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |             let rf0 = embeddedViewStart(0, 1, 0); | 
					
						
							| 
									
										
										
										
											2018-06-27 16:05:23 -07:00
										 |  |  |             if (rf0 & RenderFlags.Create) { | 
					
						
							|  |  |  |               text(0, 'content'); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             embeddedViewEnd(); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         containerRefreshEnd(); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |     }, 4, 0, [Child]); | 
					
						
							| 
									
										
										
										
											2018-06-27 16:05:23 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const fixture = new ComponentFixture(Parent); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |     expect(fixture.html) | 
					
						
							|  |  |  |         .toEqual( | 
					
						
							|  |  |  |             '<child><div>Before (inside)-Before text-content-After text-After (inside)</div></child>'); | 
					
						
							| 
									
										
										
										
											2018-06-27 16:05:23 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     fixture.component.skipContent = true; | 
					
						
							|  |  |  |     fixture.update(); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |     expect(fixture.html) | 
					
						
							|  |  |  |         .toEqual( | 
					
						
							|  |  |  |             '<child><div>Before (inside)-Before text--After text-After (inside)</div></child>'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should re-project containers into containers', () => { | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * <div> | 
					
						
							|  |  |  |      *  % if (!skipContent) { | 
					
						
							|  |  |  |      *    <ng-content></ng-content> | 
					
						
							|  |  |  |      *  % } | 
					
						
							|  |  |  |      * </div> | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     const Child = createComponent('child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         projectionDef(); | 
					
						
							|  |  |  |         elementStart(0, 'div'); | 
					
						
							|  |  |  |         { container(1); } | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |         elementEnd(); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       if (rf & RenderFlags.Update) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         containerRefreshStart(1); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |         { | 
					
						
							|  |  |  |           if (!ctx.skipContent) { | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |             let rf0 = embeddedViewStart(0, 1, 0); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |             if (rf0 & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |               projection(0); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |             } | 
					
						
							|  |  |  |             embeddedViewEnd(); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         containerRefreshEnd(); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |     }, 2); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * <child> | 
					
						
							|  |  |  |      *     Before text | 
					
						
							|  |  |  |      *     % if (!skipContent) { | 
					
						
							|  |  |  |      *       <ng-content></ng-content> | 
					
						
							|  |  |  |      *     % } | 
					
						
							|  |  |  |      *     -After text | 
					
						
							|  |  |  |      * </child> | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         projectionDef(); | 
					
						
							|  |  |  |         elementStart(0, 'child'); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |           text(1, 'Before text'); | 
					
						
							|  |  |  |           container(2); | 
					
						
							|  |  |  |           text(3, '-After text'); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |         } | 
					
						
							|  |  |  |         elementEnd(); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       if (rf & RenderFlags.Update) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         containerRefreshStart(2); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |         { | 
					
						
							|  |  |  |           if (!ctx.skipContent) { | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |             let rf0 = embeddedViewStart(0, 1, 0); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |             if (rf0 & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |               projection(0); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |             } | 
					
						
							|  |  |  |             embeddedViewEnd(); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         containerRefreshEnd(); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |     }, 4, 0, [Child]); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     let parent: any; | 
					
						
							|  |  |  |     /** <parent><p>text</p></parent> */ | 
					
						
							|  |  |  |     const App = createComponent('app', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							|  |  |  |         elementStart(0, 'parent'); | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           elementStart(1, 'p'); | 
					
						
							|  |  |  |           { text(2, 'text'); } | 
					
						
							|  |  |  |           elementEnd(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         elementEnd(); | 
					
						
							|  |  |  |         // testing
 | 
					
						
							|  |  |  |         parent = loadDirective(0); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |     }, 3, 0, [Parent]); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const fixture = new ComponentFixture(App); | 
					
						
							|  |  |  |     expect(fixture.html) | 
					
						
							|  |  |  |         .toEqual('<parent><child><div>Before text<p>text</p>-After text</div></child></parent>'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     parent.skipContent = true; | 
					
						
							|  |  |  |     fixture.update(); | 
					
						
							|  |  |  |     expect(fixture.html) | 
					
						
							|  |  |  |         .toEqual('<parent><child><div>Before text-After text</div></child></parent>'); | 
					
						
							| 
									
										
										
										
											2018-06-27 16:05:23 -07:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |   it('should support projection into embedded views when ng-content is a root node of an embedded view, with other nodes after', | 
					
						
							| 
									
										
										
										
											2018-01-25 15:32:21 +01:00
										 |  |  |      () => { | 
					
						
							|  |  |  |        let childCmptInstance: any; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        /** | 
					
						
							|  |  |  |         * <div> | 
					
						
							|  |  |  |         *  % if (!skipContent) { | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |          *    before-<ng-content></ng-content>-after | 
					
						
							|  |  |  |          *  % } | 
					
						
							| 
									
										
										
										
											2018-01-25 15:32:21 +01:00
										 |  |  |         * </div> | 
					
						
							|  |  |  |         */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |        const Child = createComponent('child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |          if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |            projectionDef(); | 
					
						
							|  |  |  |            elementStart(0, 'div'); | 
					
						
							|  |  |  |            { container(1); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |            elementEnd(); | 
					
						
							| 
									
										
										
										
											2018-01-25 15:32:21 +01:00
										 |  |  |          } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |          if (rf & RenderFlags.Update) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |            containerRefreshStart(1); | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |            { | 
					
						
							|  |  |  |              if (!ctx.skipContent) { | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |                let rf0 = embeddedViewStart(0, 3, 0); | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |                if (rf0 & RenderFlags.Create) { | 
					
						
							|  |  |  |                  text(0, 'before-'); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |                  projection(1); | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |                  text(2, '-after'); | 
					
						
							|  |  |  |                } | 
					
						
							|  |  |  |                embeddedViewEnd(); | 
					
						
							| 
									
										
										
										
											2018-01-25 15:32:21 +01:00
										 |  |  |              } | 
					
						
							|  |  |  |            } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |            containerRefreshEnd(); | 
					
						
							| 
									
										
										
										
											2018-01-25 15:32:21 +01:00
										 |  |  |          } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |        }, 2); | 
					
						
							| 
									
										
										
										
											2018-01-25 15:32:21 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |        /** | 
					
						
							|  |  |  |         * <child>content</child> | 
					
						
							|  |  |  |         */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |        const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |          if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  |            elementStart(0, 'child'); | 
					
						
							| 
									
										
										
										
											2018-01-25 15:32:21 +01:00
										 |  |  |            { | 
					
						
							| 
									
										
										
										
											2018-03-21 15:10:34 -07:00
										 |  |  |              childCmptInstance = loadDirective(0); | 
					
						
							|  |  |  |              text(1, 'content'); | 
					
						
							| 
									
										
										
										
											2018-01-25 15:32:21 +01:00
										 |  |  |            } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |            elementEnd(); | 
					
						
							| 
									
										
										
										
											2018-01-25 15:32:21 +01:00
										 |  |  |          } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |        }, 2, 0, [Child]); | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-25 15:32:21 +01:00
										 |  |  |        const parent = renderComponent(Parent); | 
					
						
							|  |  |  |        expect(toHtml(parent)).toEqual('<child><div>before-content-after</div></child>'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        childCmptInstance.skipContent = true; | 
					
						
							|  |  |  |        detectChanges(parent); | 
					
						
							|  |  |  |        expect(toHtml(parent)).toEqual('<child><div></div></child>'); | 
					
						
							|  |  |  |      }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-03 10:03:48 -07:00
										 |  |  |   it('should project into dynamic views (with createEmbeddedView)', () => { | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Before- | 
					
						
							|  |  |  |      * <ng-template [ngIf]="showing"> | 
					
						
							|  |  |  |      *     <ng-content></ng-content> | 
					
						
							|  |  |  |      * </ng-template> | 
					
						
							|  |  |  |      * -After | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     const Child = createComponent('child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         projectionDef(); | 
					
						
							|  |  |  |         text(0, 'Before-'); | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |         template(1, IfTemplate, 1, 0, '', [AttributeMarker.SelectOnly, 'ngIf']); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         text(2, '-After'); | 
					
						
							| 
									
										
										
										
											2018-07-03 10:03:48 -07:00
										 |  |  |       } | 
					
						
							|  |  |  |       if (rf & RenderFlags.Update) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         elementProperty(1, 'ngIf', bind(ctx.showing)); | 
					
						
							| 
									
										
										
										
											2018-07-03 10:03:48 -07:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |     }, 3, 1, [NgIf]); | 
					
						
							| 
									
										
										
										
											2018-07-03 10:03:48 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-25 17:25:22 -07:00
										 |  |  |     function IfTemplate(rf1: RenderFlags, ctx: any) { | 
					
						
							| 
									
										
										
										
											2018-07-18 01:59:49 +00:00
										 |  |  |       if (rf1 & RenderFlags.Create) { | 
					
						
							|  |  |  |         projectionDef(); | 
					
						
							|  |  |  |         projection(0); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-03 10:03:48 -07:00
										 |  |  |     let child: {showing: boolean}; | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * <child> | 
					
						
							|  |  |  |      *     <div>A</div> | 
					
						
							|  |  |  |      *     Some text | 
					
						
							|  |  |  |      * </child> | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     const App = createComponent('app', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							|  |  |  |         elementStart(0, 'child'); | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           elementStart(1, 'div'); | 
					
						
							|  |  |  |           { text(2, 'A'); } | 
					
						
							|  |  |  |           elementEnd(); | 
					
						
							|  |  |  |           text(3, 'Some text'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         elementEnd(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // testing
 | 
					
						
							|  |  |  |         child = loadDirective(0); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |     }, 4, 0, [Child]); | 
					
						
							| 
									
										
										
										
											2018-07-03 10:03:48 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const fixture = new ComponentFixture(App); | 
					
						
							|  |  |  |     child !.showing = true; | 
					
						
							|  |  |  |     fixture.update(); | 
					
						
							|  |  |  |     expect(fixture.html).toEqual('<child>Before-<div>A</div>Some text-After</child>'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     child !.showing = false; | 
					
						
							|  |  |  |     fixture.update(); | 
					
						
							|  |  |  |     expect(fixture.html).toEqual('<child>Before--After</child>'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     child !.showing = true; | 
					
						
							|  |  |  |     fixture.update(); | 
					
						
							|  |  |  |     expect(fixture.html).toEqual('<child>Before-<div>A</div>Some text-After</child>'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should project into dynamic views (with insertion)', () => { | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Before- | 
					
						
							|  |  |  |      * <ng-template [ngIf]="showing"> | 
					
						
							|  |  |  |      *     <ng-content></ng-content> | 
					
						
							|  |  |  |      * </ng-template> | 
					
						
							|  |  |  |      * -After | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     const Child = createComponent('child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         projectionDef(); | 
					
						
							|  |  |  |         text(0, 'Before-'); | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |         template(1, IfTemplate, 1, 0, '', [AttributeMarker.SelectOnly, 'ngIf']); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         text(2, '-After'); | 
					
						
							| 
									
										
										
										
											2018-07-03 10:03:48 -07:00
										 |  |  |       } | 
					
						
							|  |  |  |       if (rf & RenderFlags.Update) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         elementProperty(1, 'ngIf', bind(ctx.showing)); | 
					
						
							| 
									
										
										
										
											2018-07-03 10:03:48 -07:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |     }, 3, 1, [NgIf]); | 
					
						
							| 
									
										
										
										
											2018-07-03 10:03:48 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-25 17:25:22 -07:00
										 |  |  |     function IfTemplate(rf: RenderFlags, ctx: any) { | 
					
						
							| 
									
										
										
										
											2018-07-18 01:59:49 +00:00
										 |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							|  |  |  |         projectionDef(); | 
					
						
							|  |  |  |         projection(0); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-03 10:03:48 -07:00
										 |  |  |     let child: {showing: boolean}; | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * <child> | 
					
						
							|  |  |  |      *     <div>A</div> | 
					
						
							|  |  |  |      *     Some text | 
					
						
							|  |  |  |      * </child> | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     const App = createComponent('app', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							|  |  |  |         elementStart(0, 'child'); | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           elementStart(1, 'div'); | 
					
						
							|  |  |  |           { text(2, 'A'); } | 
					
						
							|  |  |  |           elementEnd(); | 
					
						
							|  |  |  |           text(3, 'Some text'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         elementEnd(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // testing
 | 
					
						
							|  |  |  |         child = loadDirective(0); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |     }, 4, 0, [Child]); | 
					
						
							| 
									
										
										
										
											2018-07-03 10:03:48 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const fixture = new ComponentFixture(App); | 
					
						
							|  |  |  |     child !.showing = true; | 
					
						
							|  |  |  |     fixture.update(); | 
					
						
							|  |  |  |     expect(fixture.html).toEqual('<child>Before-<div>A</div>Some text-After</child>'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     child !.showing = false; | 
					
						
							|  |  |  |     fixture.update(); | 
					
						
							|  |  |  |     expect(fixture.html).toEqual('<child>Before--After</child>'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     child !.showing = true; | 
					
						
							|  |  |  |     fixture.update(); | 
					
						
							|  |  |  |     expect(fixture.html).toEqual('<child>Before-<div>A</div>Some text-After</child>'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |   it('should project nodes into the last ng-content', () => { | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * <div><ng-content></ng-content></div> | 
					
						
							|  |  |  |      * <span><ng-content></ng-content></span> | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |     const Child = createComponent('child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         projectionDef(); | 
					
						
							|  |  |  |         elementStart(0, 'div'); | 
					
						
							|  |  |  |         { projection(1); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |         elementEnd(); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         elementStart(2, 'span'); | 
					
						
							|  |  |  |         { projection(3); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |         elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |     }, 4); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * <child>content</child> | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |     const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  |         elementStart(0, 'child'); | 
					
						
							| 
									
										
										
										
											2018-03-21 15:10:34 -07:00
										 |  |  |         { text(1, 'content'); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |         elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |     }, 2, 0, [Child]); | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |     const parent = renderComponent(Parent); | 
					
						
							|  |  |  |     expect(toHtml(parent)).toEqual('<child><div></div><span>content</span></child>'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /** | 
					
						
							|  |  |  |    * Warning: this test is _not_ in-line with what Angular does atm. | 
					
						
							|  |  |  |    * Moreover the current implementation logic will result in DOM nodes | 
					
						
							|  |  |  |    * being re-assigned from one parent to another. Proposal: have compiler | 
					
						
							|  |  |  |    * to remove all but the latest occurrence of <ng-content> so we generate | 
					
						
							|  |  |  |    * only one P(n, m, 0) instruction. It would make it consistent with the | 
					
						
							|  |  |  |    * current Angular behaviour: | 
					
						
							|  |  |  |    * http://plnkr.co/edit/OAYkNawTDPkYBFTqovTP?p=preview
 | 
					
						
							|  |  |  |    */ | 
					
						
							|  |  |  |   it('should project nodes into the last available ng-content', () => { | 
					
						
							|  |  |  |     let childCmptInstance: any; | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      *  <ng-content></ng-content> | 
					
						
							|  |  |  |      *  <div> | 
					
						
							|  |  |  |      *  % if (show) { | 
					
						
							|  |  |  |      *    <ng-content></ng-content> | 
					
						
							|  |  |  |      *  % } | 
					
						
							|  |  |  |      *  </div> | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |     const Child = createComponent('child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         projectionDef(); | 
					
						
							|  |  |  |         projection(0); | 
					
						
							|  |  |  |         elementStart(1, 'div'); | 
					
						
							|  |  |  |         { container(2); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |         elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |       if (rf & RenderFlags.Update) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         containerRefreshStart(2); | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |         { | 
					
						
							|  |  |  |           if (ctx.show) { | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |             let rf0 = embeddedViewStart(0, 1, 0); | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |             if (rf0 & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |               projection(0); | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |             } | 
					
						
							|  |  |  |             embeddedViewEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |         containerRefreshEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |     }, 3); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * <child>content</child> | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |     const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  |         elementStart(0, 'child'); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2018-03-21 15:10:34 -07:00
										 |  |  |           childCmptInstance = loadDirective(0); | 
					
						
							|  |  |  |           text(1, 'content'); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |         elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |     }, 2, 0, [Child]); | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |     const parent = renderComponent(Parent); | 
					
						
							|  |  |  |     expect(toHtml(parent)).toEqual('<child>content<div></div></child>'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     childCmptInstance.show = true; | 
					
						
							|  |  |  |     detectChanges(parent); | 
					
						
							|  |  |  |     expect(toHtml(parent)).toEqual('<child><div>content</div></child>'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |   it('should project with multiple instances of a component with projection', () => { | 
					
						
							|  |  |  |     const ProjectionComp = createComponent('projection-comp', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         projectionDef(); | 
					
						
							|  |  |  |         text(0, 'Before'); | 
					
						
							|  |  |  |         projection(1); | 
					
						
							|  |  |  |         text(2, 'After'); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |     }, 3); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * <projection-comp> | 
					
						
							|  |  |  |      *     <div>A</div> | 
					
						
							|  |  |  |      *     <p>123</p> | 
					
						
							|  |  |  |      * </projection-comp> | 
					
						
							|  |  |  |      * <projection-comp> | 
					
						
							|  |  |  |      *     <div>B</div> | 
					
						
							|  |  |  |      *     <p>456</p> | 
					
						
							|  |  |  |      * </projection-comp> | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     const AppComp = createComponent('app-comp', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							|  |  |  |         elementStart(0, 'projection-comp'); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         { | 
					
						
							|  |  |  |           elementStart(1, 'div'); | 
					
						
							|  |  |  |           { text(2, 'A'); } | 
					
						
							|  |  |  |           elementEnd(); | 
					
						
							|  |  |  |           elementStart(3, 'p'); | 
					
						
							|  |  |  |           { text(4, '123'); } | 
					
						
							|  |  |  |           elementEnd(); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |         elementEnd(); | 
					
						
							|  |  |  |         elementStart(5, 'projection-comp'); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         { | 
					
						
							|  |  |  |           elementStart(6, 'div'); | 
					
						
							|  |  |  |           { text(7, 'B'); } | 
					
						
							|  |  |  |           elementEnd(); | 
					
						
							|  |  |  |           elementStart(8, 'p'); | 
					
						
							|  |  |  |           { text(9, '456'); } | 
					
						
							|  |  |  |           elementEnd(); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |         elementEnd(); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |     }, 10, 0, [ProjectionComp]); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const fixture = new ComponentFixture(AppComp); | 
					
						
							|  |  |  |     fixture.update(); | 
					
						
							|  |  |  |     expect(fixture.html) | 
					
						
							|  |  |  |         .toEqual( | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |             '<projection-comp>Before<div>A</div><p>123</p>After</projection-comp>' + | 
					
						
							|  |  |  |             '<projection-comp>Before<div>B</div><p>456</p>After</projection-comp>'); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should re-project with multiple instances of a component with projection', () => { | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Before | 
					
						
							|  |  |  |      * <ng-content></ng-content> | 
					
						
							|  |  |  |      * After | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     const ProjectionComp = createComponent('projection-comp', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         projectionDef(); | 
					
						
							|  |  |  |         text(0, 'Before'); | 
					
						
							|  |  |  |         projection(1); | 
					
						
							|  |  |  |         text(2, 'After'); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |     }, 3); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * <projection-comp> | 
					
						
							|  |  |  |      *     <div>A</div> | 
					
						
							|  |  |  |      *     <ng-content></ng-content> | 
					
						
							|  |  |  |      *     <p>123</p> | 
					
						
							|  |  |  |      * </projection-comp> | 
					
						
							|  |  |  |      * <projection-comp> | 
					
						
							|  |  |  |      *     <div>B</div> | 
					
						
							|  |  |  |      *     <p>456</p> | 
					
						
							|  |  |  |      * </projection-comp> | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     const ProjectionParent = createComponent('parent-comp', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         projectionDef(); | 
					
						
							|  |  |  |         elementStart(0, 'projection-comp'); | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           elementStart(1, 'div'); | 
					
						
							|  |  |  |           { text(2, 'A'); } | 
					
						
							|  |  |  |           elementEnd(); | 
					
						
							|  |  |  |           projection(3, 0); | 
					
						
							|  |  |  |           elementStart(4, 'p'); | 
					
						
							|  |  |  |           { text(5, '123'); } | 
					
						
							|  |  |  |           elementEnd(); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |         elementEnd(); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         elementStart(6, 'projection-comp'); | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           elementStart(7, 'div'); | 
					
						
							|  |  |  |           { text(8, 'B'); } | 
					
						
							|  |  |  |           elementEnd(); | 
					
						
							|  |  |  |           elementStart(9, 'p'); | 
					
						
							|  |  |  |           { text(10, '456'); } | 
					
						
							|  |  |  |           elementEnd(); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |         elementEnd(); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |     }, 11, 0, [ProjectionComp]); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * <parent-comp> | 
					
						
							|  |  |  |      *    **ABC** | 
					
						
							|  |  |  |      * </parent-comp> | 
					
						
							|  |  |  |      * <parent-comp> | 
					
						
							|  |  |  |      *    **DEF** | 
					
						
							|  |  |  |      * </parent-comp> | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     const AppComp = createComponent('app-comp', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							|  |  |  |         elementStart(0, 'parent-comp'); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         { text(1, '**ABC**'); } | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |         elementEnd(); | 
					
						
							|  |  |  |         elementStart(2, 'parent-comp'); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |         { text(3, '**DEF**'); } | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |         elementEnd(); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |     }, 4, 0, [ProjectionParent]); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const fixture = new ComponentFixture(AppComp); | 
					
						
							|  |  |  |     fixture.update(); | 
					
						
							|  |  |  |     expect(fixture.html) | 
					
						
							|  |  |  |         .toEqual( | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |             '<parent-comp>' + | 
					
						
							|  |  |  |             '<projection-comp>Before<div>A</div>**ABC**<p>123</p>After</projection-comp>' + | 
					
						
							|  |  |  |             '<projection-comp>Before<div>B</div><p>456</p>After</projection-comp></parent-comp>' + | 
					
						
							|  |  |  |             '<parent-comp>' + | 
					
						
							|  |  |  |             '<projection-comp>Before<div>A</div>**DEF**<p>123</p>After</projection-comp>' + | 
					
						
							|  |  |  |             '<projection-comp>Before<div>B</div><p>456</p>After</projection-comp></parent-comp>'); | 
					
						
							| 
									
										
										
										
											2018-06-29 16:44:54 -07:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-07 14:42:40 +02:00
										 |  |  |   it('should project ng-container at the content root', () => { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     `<ng-content></ng-content>`; | 
					
						
							|  |  |  |     const Child = createComponent('child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							|  |  |  |         projectionDef(); | 
					
						
							|  |  |  |         projection(0); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |     }, 1); | 
					
						
							| 
									
										
										
										
											2018-08-07 14:42:40 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     `<child>
 | 
					
						
							|  |  |  |       <ng-container> | 
					
						
							|  |  |  |         <ng-container> | 
					
						
							|  |  |  |           content | 
					
						
							|  |  |  |         </ng-container> | 
					
						
							|  |  |  |       </ng-container>   | 
					
						
							|  |  |  |     </child>`;
 | 
					
						
							|  |  |  |     const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							|  |  |  |         elementStart(0, 'child'); | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           elementContainerStart(1); | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             elementContainerStart(2); | 
					
						
							|  |  |  |             { text(3, 'content'); } | 
					
						
							|  |  |  |             elementContainerEnd(); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           elementContainerEnd(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         elementEnd(); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |     }, 4, 0, [Child]); | 
					
						
							| 
									
										
										
										
											2018-08-07 14:42:40 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const parent = renderComponent(Parent); | 
					
						
							|  |  |  |     expect(toHtml(parent)).toEqual('<child>content</child>'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should re-project ng-container at the content root', () => { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     `<ng-content></ng-content>`; | 
					
						
							|  |  |  |     const GrandChild = createComponent('grand-child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							|  |  |  |         projectionDef(); | 
					
						
							|  |  |  |         projection(0); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |     }, 1); | 
					
						
							| 
									
										
										
										
											2018-08-07 14:42:40 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     `<grand-child>
 | 
					
						
							|  |  |  |       <ng-content></ng-content> | 
					
						
							|  |  |  |     </grand-child>`; | 
					
						
							|  |  |  |     const Child = createComponent('child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							|  |  |  |         projectionDef(); | 
					
						
							|  |  |  |         elementStart(0, 'grand-child'); | 
					
						
							|  |  |  |         { projection(1); } | 
					
						
							|  |  |  |         elementEnd(); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |     }, 2, 0, [GrandChild]); | 
					
						
							| 
									
										
										
										
											2018-08-07 14:42:40 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     `<child>
 | 
					
						
							|  |  |  |       <ng-container> | 
					
						
							|  |  |  |         <ng-container> | 
					
						
							|  |  |  |           content | 
					
						
							|  |  |  |         </ng-container> | 
					
						
							|  |  |  |       </ng-container>   | 
					
						
							|  |  |  |     </child>`;
 | 
					
						
							|  |  |  |     const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |       if (rf & RenderFlags.Create) { | 
					
						
							|  |  |  |         elementStart(0, 'child'); | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           elementContainerStart(1); | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             elementContainerStart(2); | 
					
						
							|  |  |  |             { text(3, 'content'); } | 
					
						
							|  |  |  |             elementContainerEnd(); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           elementContainerEnd(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         elementEnd(); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |     }, 4, 0, [Child]); | 
					
						
							| 
									
										
										
										
											2018-08-07 14:42:40 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const parent = renderComponent(Parent); | 
					
						
							|  |  |  |     expect(toHtml(parent)).toEqual('<child><grand-child>content</grand-child></child>'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |   describe('with selectors', () => { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should project nodes using attribute selectors', () => { | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        *  <div id="first"><ng-content select="span[title=toFirst]"></ng-content></div> | 
					
						
							|  |  |  |        *  <div id="second"><ng-content select="span[title=toSecond]"></ng-content></div> | 
					
						
							|  |  |  |        */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |       const Child = createComponent('child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |         if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |           projectionDef( | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |               [[['span', 'title', 'toFirst']], [['span', 'title', 'toSecond']]], | 
					
						
							| 
									
										
										
										
											2018-02-28 15:00:58 +01:00
										 |  |  |               ['span[title=toFirst]', 'span[title=toSecond]']); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |           elementStart(0, 'div', ['id', 'first']); | 
					
						
							|  |  |  |           { projection(1, 1); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |           elementEnd(); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |           elementStart(2, 'div', ['id', 'second']); | 
					
						
							|  |  |  |           { projection(3, 2); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |           elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |       }, 4); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        * <child> | 
					
						
							|  |  |  |        *  <span title="toFirst">1</span> | 
					
						
							|  |  |  |        *  <span title="toSecond">2</span> | 
					
						
							|  |  |  |        * </child> | 
					
						
							|  |  |  |        */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |       const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |         if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  |           elementStart(0, 'child'); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |           { | 
					
						
							| 
									
										
										
										
											2018-03-21 15:10:34 -07:00
										 |  |  |             elementStart(1, 'span', ['title', 'toFirst']); | 
					
						
							|  |  |  |             { text(2, '1'); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |             elementEnd(); | 
					
						
							| 
									
										
										
										
											2018-03-21 15:10:34 -07:00
										 |  |  |             elementStart(3, 'span', ['title', 'toSecond']); | 
					
						
							|  |  |  |             { text(4, '2'); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |             elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |           elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |       }, 5, 0, [Child]); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       const parent = renderComponent(Parent); | 
					
						
							|  |  |  |       expect(toHtml(parent)) | 
					
						
							|  |  |  |           .toEqual( | 
					
						
							|  |  |  |               '<child><div id="first"><span title="toFirst">1</span></div><div id="second"><span title="toSecond">2</span></div></child>'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-04 15:58:42 +02:00
										 |  |  |     // https://stackblitz.com/edit/angular-psokum?file=src%2Fapp%2Fapp.module.ts
 | 
					
						
							|  |  |  |     it('should project nodes where attribute selector matches a binding', () => { | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        *  <ng-content select="[title]"></ng-content> | 
					
						
							|  |  |  |        */ | 
					
						
							|  |  |  |       const Child = createComponent('child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |         if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |           projectionDef([[['', 'title', '']]], ['[title]']); | 
					
						
							|  |  |  |           { projection(0, 1); } | 
					
						
							| 
									
										
										
										
											2018-05-04 15:58:42 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |       }, 1); | 
					
						
							| 
									
										
										
										
											2018-05-04 15:58:42 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        * <child> | 
					
						
							|  |  |  |        *  <span [title]="'Some title'">Has title</span> | 
					
						
							|  |  |  |        * </child> | 
					
						
							|  |  |  |        */ | 
					
						
							|  |  |  |       const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |         if (rf & RenderFlags.Create) { | 
					
						
							|  |  |  |           elementStart(0, 'child'); | 
					
						
							|  |  |  |           { | 
					
						
							| 
									
										
										
										
											2018-06-08 15:25:39 -07:00
										 |  |  |             elementStart(1, 'span', [AttributeMarker.SelectOnly, 'title']); | 
					
						
							| 
									
										
										
										
											2018-05-04 15:58:42 +02:00
										 |  |  |             { text(2, 'Has title'); } | 
					
						
							|  |  |  |             elementEnd(); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           elementEnd(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if (rf & RenderFlags.Update) { | 
					
						
							|  |  |  |           elementProperty(1, 'title', bind('Some title')); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |       }, 3, 1, [Child]); | 
					
						
							| 
									
										
										
										
											2018-05-04 15:58:42 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       const fixture = new ComponentFixture(Parent); | 
					
						
							|  |  |  |       expect(fixture.html).toEqual('<child><span title="Some title">Has title</span></child>'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |     it('should project nodes using class selectors', () => { | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        *  <div id="first"><ng-content select="span.toFirst"></ng-content></div> | 
					
						
							|  |  |  |        *  <div id="second"><ng-content select="span.toSecond"></ng-content></div> | 
					
						
							|  |  |  |        */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |       const Child = createComponent('child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |         if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |           projectionDef( | 
					
						
							| 
									
										
										
										
											2018-03-29 16:41:45 -07:00
										 |  |  |               [ | 
					
						
							|  |  |  |                 [['span', SelectorFlags.CLASS, 'toFirst']], | 
					
						
							|  |  |  |                 [['span', SelectorFlags.CLASS, 'toSecond']] | 
					
						
							|  |  |  |               ], | 
					
						
							| 
									
										
										
										
											2018-02-28 15:00:58 +01:00
										 |  |  |               ['span.toFirst', 'span.toSecond']); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |           elementStart(0, 'div', ['id', 'first']); | 
					
						
							|  |  |  |           { projection(1, 1); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |           elementEnd(); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |           elementStart(2, 'div', ['id', 'second']); | 
					
						
							|  |  |  |           { projection(3, 2); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |           elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |       }, 4); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        * <child> | 
					
						
							|  |  |  |        *  <span class="toFirst">1</span> | 
					
						
							|  |  |  |        *  <span class="toSecond">2</span> | 
					
						
							|  |  |  |        * </child> | 
					
						
							|  |  |  |        */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |       const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |         if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  |           elementStart(0, 'child'); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |           { | 
					
						
							| 
									
										
										
										
											2018-03-21 15:10:34 -07:00
										 |  |  |             elementStart(1, 'span', ['class', 'toFirst']); | 
					
						
							|  |  |  |             { text(2, '1'); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |             elementEnd(); | 
					
						
							| 
									
										
										
										
											2018-03-21 15:10:34 -07:00
										 |  |  |             elementStart(3, 'span', ['class', 'toSecond']); | 
					
						
							|  |  |  |             { text(4, '2'); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |             elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |           elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |       }, 5, 0, [Child]); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       const parent = renderComponent(Parent); | 
					
						
							|  |  |  |       expect(toHtml(parent)) | 
					
						
							|  |  |  |           .toEqual( | 
					
						
							|  |  |  |               '<child><div id="first"><span class="toFirst">1</span></div><div id="second"><span class="toSecond">2</span></div></child>'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should project nodes using class selectors when element has multiple classes', () => { | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        *  <div id="first"><ng-content select="span.toFirst"></ng-content></div> | 
					
						
							|  |  |  |        *  <div id="second"><ng-content select="span.toSecond"></ng-content></div> | 
					
						
							|  |  |  |        */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |       const Child = createComponent('child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |         if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |           projectionDef( | 
					
						
							| 
									
										
										
										
											2018-03-29 16:41:45 -07:00
										 |  |  |               [ | 
					
						
							|  |  |  |                 [['span', SelectorFlags.CLASS, 'toFirst']], | 
					
						
							|  |  |  |                 [['span', SelectorFlags.CLASS, 'toSecond']] | 
					
						
							|  |  |  |               ], | 
					
						
							| 
									
										
										
										
											2018-02-28 15:00:58 +01:00
										 |  |  |               ['span.toFirst', 'span.toSecond']); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |           elementStart(0, 'div', ['id', 'first']); | 
					
						
							|  |  |  |           { projection(1, 1); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |           elementEnd(); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |           elementStart(2, 'div', ['id', 'second']); | 
					
						
							|  |  |  |           { projection(3, 2); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |           elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |       }, 4); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        * <child> | 
					
						
							|  |  |  |        *  <span class="other toFirst">1</span> | 
					
						
							|  |  |  |        *  <span class="toSecond noise">2</span> | 
					
						
							|  |  |  |        * </child> | 
					
						
							|  |  |  |        */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |       const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |         if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  |           elementStart(0, 'child'); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |           { | 
					
						
							| 
									
										
										
										
											2018-03-21 15:10:34 -07:00
										 |  |  |             elementStart(1, 'span', ['class', 'other toFirst']); | 
					
						
							|  |  |  |             { text(2, '1'); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |             elementEnd(); | 
					
						
							| 
									
										
										
										
											2018-03-21 15:10:34 -07:00
										 |  |  |             elementStart(3, 'span', ['class', 'toSecond noise']); | 
					
						
							|  |  |  |             { text(4, '2'); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |             elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |           elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |       }, 5, 0, [Child]); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       const parent = renderComponent(Parent); | 
					
						
							|  |  |  |       expect(toHtml(parent)) | 
					
						
							|  |  |  |           .toEqual( | 
					
						
							|  |  |  |               '<child><div id="first"><span class="other toFirst">1</span></div><div id="second"><span class="toSecond noise">2</span></div></child>'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should project nodes into the first matching selector', () => { | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        *  <div id="first"><ng-content select="span"></ng-content></div> | 
					
						
							|  |  |  |        *  <div id="second"><ng-content select="span.toSecond"></ng-content></div> | 
					
						
							|  |  |  |        */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |       const Child = createComponent('child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |         if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-02-28 15:00:58 +01:00
										 |  |  |           projectionDef( | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |               [[['span']], [['span', SelectorFlags.CLASS, 'toSecond']]], ['span', 'span.toSecond']); | 
					
						
							|  |  |  |           elementStart(0, 'div', ['id', 'first']); | 
					
						
							|  |  |  |           { projection(1, 1); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |           elementEnd(); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |           elementStart(2, 'div', ['id', 'second']); | 
					
						
							|  |  |  |           { projection(3, 2); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |           elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |       }, 4); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        * <child> | 
					
						
							|  |  |  |        *  <span class="toFirst">1</span> | 
					
						
							|  |  |  |        *  <span class="toSecond">2</span> | 
					
						
							|  |  |  |        * </child> | 
					
						
							|  |  |  |        */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |       const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |         if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  |           elementStart(0, 'child'); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |           { | 
					
						
							| 
									
										
										
										
											2018-03-21 15:10:34 -07:00
										 |  |  |             elementStart(1, 'span', ['class', 'toFirst']); | 
					
						
							|  |  |  |             { text(2, '1'); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |             elementEnd(); | 
					
						
							| 
									
										
										
										
											2018-03-21 15:10:34 -07:00
										 |  |  |             elementStart(3, 'span', ['class', 'toSecond']); | 
					
						
							|  |  |  |             { text(4, '2'); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |             elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |           elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |       }, 5, 0, [Child]); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       const parent = renderComponent(Parent); | 
					
						
							|  |  |  |       expect(toHtml(parent)) | 
					
						
							|  |  |  |           .toEqual( | 
					
						
							|  |  |  |               '<child><div id="first"><span class="toFirst">1</span><span class="toSecond">2</span></div><div id="second"></div></child>'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should allow mixing ng-content with and without selectors', () => { | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        *  <div id="first"><ng-content select="span.toFirst"></ng-content></div> | 
					
						
							|  |  |  |        *  <div id="second"><ng-content></ng-content></div> | 
					
						
							|  |  |  |        */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |       const Child = createComponent('child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |         if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |           projectionDef([[['span', SelectorFlags.CLASS, 'toFirst']]], ['span.toFirst']); | 
					
						
							|  |  |  |           elementStart(0, 'div', ['id', 'first']); | 
					
						
							|  |  |  |           { projection(1, 1); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |           elementEnd(); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |           elementStart(2, 'div', ['id', 'second']); | 
					
						
							|  |  |  |           { projection(3); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |           elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |       }, 4); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        * <child> | 
					
						
							|  |  |  |        *  <span class="other toFirst">1</span> | 
					
						
							|  |  |  |        *  <span class="toSecond noise">2</span> | 
					
						
							|  |  |  |        * </child> | 
					
						
							|  |  |  |        */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |       const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |         if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  |           elementStart(0, 'child'); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |           { | 
					
						
							| 
									
										
										
										
											2018-03-21 15:10:34 -07:00
										 |  |  |             elementStart(1, 'span', ['class', 'toFirst']); | 
					
						
							|  |  |  |             { text(2, '1'); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |             elementEnd(); | 
					
						
							| 
									
										
										
										
											2018-03-21 15:10:34 -07:00
										 |  |  |             elementStart(3, 'span'); | 
					
						
							|  |  |  |             { text(4, 'remaining'); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |             elementEnd(); | 
					
						
							| 
									
										
										
										
											2018-03-21 15:10:34 -07:00
										 |  |  |             text(5, 'more remaining'); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |           elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |       }, 6, 0, [Child]); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       const parent = renderComponent(Parent); | 
					
						
							|  |  |  |       expect(toHtml(parent)) | 
					
						
							|  |  |  |           .toEqual( | 
					
						
							|  |  |  |               '<child><div id="first"><span class="toFirst">1</span></div><div id="second"><span>remaining</span>more remaining</div></child>'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should allow mixing ng-content with and without selectors - ng-content first', () => { | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        *  <div id="first"><ng-content></ng-content></div> | 
					
						
							|  |  |  |        *  <div id="second"><ng-content select="span.toSecond"></ng-content></div> | 
					
						
							|  |  |  |        */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |       const Child = createComponent('child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |         if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |           projectionDef([[['span', SelectorFlags.CLASS, 'toSecond']]], ['span.toSecond']); | 
					
						
							|  |  |  |           elementStart(0, 'div', ['id', 'first']); | 
					
						
							|  |  |  |           { projection(1); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |           elementEnd(); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |           elementStart(2, 'div', ['id', 'second']); | 
					
						
							|  |  |  |           { projection(3, 1); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |           elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |       }, 4); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        * <child> | 
					
						
							|  |  |  |        *  <span>1</span> | 
					
						
							|  |  |  |        *  <span class="toSecond">2</span> | 
					
						
							|  |  |  |        *  remaining | 
					
						
							|  |  |  |        * </child> | 
					
						
							|  |  |  |        */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |       const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |         if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  |           elementStart(0, 'child'); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |           { | 
					
						
							| 
									
										
										
										
											2018-03-21 15:10:34 -07:00
										 |  |  |             elementStart(1, 'span'); | 
					
						
							|  |  |  |             { text(2, '1'); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |             elementEnd(); | 
					
						
							| 
									
										
										
										
											2018-03-21 15:10:34 -07:00
										 |  |  |             elementStart(3, 'span', ['class', 'toSecond']); | 
					
						
							|  |  |  |             { text(4, '2'); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |             elementEnd(); | 
					
						
							| 
									
										
										
										
											2018-03-21 15:10:34 -07:00
										 |  |  |             text(5, 'remaining'); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |           elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |       }, 6, 0, [Child]); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       const parent = renderComponent(Parent); | 
					
						
							|  |  |  |       expect(toHtml(parent)) | 
					
						
							|  |  |  |           .toEqual( | 
					
						
							|  |  |  |               '<child><div id="first"><span>1</span>remaining</div><div id="second"><span class="toSecond">2</span></div></child>'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Descending into projected content for selector-matching purposes is not supported | 
					
						
							|  |  |  |      * today: http://plnkr.co/edit/MYQcNfHSTKp9KvbzJWVQ?p=preview
 | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2018-01-31 15:50:24 +01:00
										 |  |  |     it('should not descend into re-projected content', () => { | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        *  <ng-content select="span"></ng-content> | 
					
						
							|  |  |  |        *  <hr> | 
					
						
							|  |  |  |        *  <ng-content></ng-content> | 
					
						
							|  |  |  |        */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |       const GrandChild = createComponent('grand-child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |         if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |           projectionDef([[['span']]], ['span']); | 
					
						
							|  |  |  |           projection(0, 1); | 
					
						
							| 
									
										
										
										
											2018-07-27 14:28:22 -07:00
										 |  |  |           element(1, 'hr'); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |           projection(2); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |       }, 3); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        *  <grand-child> | 
					
						
							|  |  |  |        *    <ng-content></ng-content> | 
					
						
							|  |  |  |        *    <span>in child template</span> | 
					
						
							|  |  |  |        *  </grand-child> | 
					
						
							|  |  |  |        */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |       const Child = createComponent('child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |         if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |           projectionDef(); | 
					
						
							|  |  |  |           elementStart(0, 'grand-child'); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |           { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |             projection(1); | 
					
						
							|  |  |  |             elementStart(2, 'span'); | 
					
						
							|  |  |  |             { text(3, 'in child template'); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |             elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |           elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |       }, 4, 0, [GrandChild]); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        * <child> | 
					
						
							|  |  |  |        *  <div> | 
					
						
							|  |  |  |        *    parent content | 
					
						
							|  |  |  |        *  </div> | 
					
						
							|  |  |  |        * </child> | 
					
						
							|  |  |  |        */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |       const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |         if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  |           elementStart(0, 'child'); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |           { | 
					
						
							| 
									
										
										
										
											2018-03-21 15:10:34 -07:00
										 |  |  |             elementStart(1, 'span'); | 
					
						
							|  |  |  |             { text(2, 'parent content'); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |             elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |           elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |       }, 3, 0, [Child]); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       const parent = renderComponent(Parent); | 
					
						
							|  |  |  |       expect(toHtml(parent)) | 
					
						
							|  |  |  |           .toEqual( | 
					
						
							|  |  |  |               '<child><grand-child><span>in child template</span><hr><span>parent content</span></grand-child></child>'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-31 15:50:24 +01:00
										 |  |  |     it('should match selectors on ng-content nodes with attributes', () => { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        * <ng-content select="[card-title]"></ng-content> | 
					
						
							|  |  |  |        * <hr> | 
					
						
							|  |  |  |        * <ng-content select="[card-content]"></ng-content> | 
					
						
							|  |  |  |        */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |       const Card = createComponent('card', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |         if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-02-28 15:00:58 +01:00
										 |  |  |           projectionDef( | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |               [[['', 'card-title', '']], [['', 'card-content', '']]], | 
					
						
							| 
									
										
										
										
											2018-02-28 15:00:58 +01:00
										 |  |  |               ['[card-title]', '[card-content]']); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |           projection(0, 1); | 
					
						
							| 
									
										
										
										
											2018-07-27 14:28:22 -07:00
										 |  |  |           element(1, 'hr'); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |           projection(2, 2); | 
					
						
							| 
									
										
										
										
											2018-01-31 15:50:24 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |       }, 3); | 
					
						
							| 
									
										
										
										
											2018-01-31 15:50:24 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        * <card> | 
					
						
							|  |  |  |        *  <h1 card-title>Title</h1> | 
					
						
							|  |  |  |        *  <ng-content card-content></ng-content> | 
					
						
							|  |  |  |        * </card> | 
					
						
							|  |  |  |        */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |       const CardWithTitle = createComponent('card-with-title', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |         if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |           projectionDef(); | 
					
						
							|  |  |  |           elementStart(0, 'card'); | 
					
						
							| 
									
										
										
										
											2018-01-31 15:50:24 +01:00
										 |  |  |           { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |             elementStart(1, 'h1', ['card-title', '']); | 
					
						
							|  |  |  |             { text(2, 'Title'); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |             elementEnd(); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |             projection(3, 0, ['card-content', '']); | 
					
						
							| 
									
										
										
										
											2018-01-31 15:50:24 +01:00
										 |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |           elementEnd(); | 
					
						
							| 
									
										
										
										
											2018-01-31 15:50:24 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |       }, 4, 0, [Card]); | 
					
						
							| 
									
										
										
										
											2018-01-31 15:50:24 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        * <card-with-title> | 
					
						
							|  |  |  |        *  content | 
					
						
							|  |  |  |        * </card-with-title> | 
					
						
							|  |  |  |        */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |       const App = createComponent('app', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |         if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  |           elementStart(0, 'card-with-title'); | 
					
						
							| 
									
										
										
										
											2018-03-21 15:10:34 -07:00
										 |  |  |           { text(1, 'content'); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |           elementEnd(); | 
					
						
							| 
									
										
										
										
											2018-01-31 15:50:24 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |       }, 2, 0, [CardWithTitle]); | 
					
						
							| 
									
										
										
										
											2018-01-31 15:50:24 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       const app = renderComponent(App); | 
					
						
							|  |  |  |       expect(toHtml(app)) | 
					
						
							|  |  |  |           .toEqual( | 
					
						
							|  |  |  |               '<card-with-title><card><h1 card-title="">Title</h1><hr>content</card></card-with-title>'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-28 15:00:58 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     it('should support ngProjectAs on elements (including <ng-content>)', () => { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        * <ng-content select="[card-title]"></ng-content> | 
					
						
							|  |  |  |        * <hr> | 
					
						
							|  |  |  |        * <ng-content select="[card-content]"></ng-content> | 
					
						
							|  |  |  |        */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |       const Card = createComponent('card', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |         if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-02-28 15:00:58 +01:00
										 |  |  |           projectionDef( | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |               [[['', 'card-title', '']], [['', 'card-content', '']]], | 
					
						
							| 
									
										
										
										
											2018-02-28 15:00:58 +01:00
										 |  |  |               ['[card-title]', '[card-content]']); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |           projection(0, 1); | 
					
						
							| 
									
										
										
										
											2018-07-27 14:28:22 -07:00
										 |  |  |           element(1, 'hr'); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |           projection(2, 2); | 
					
						
							| 
									
										
										
										
											2018-02-28 15:00:58 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |       }, 3); | 
					
						
							| 
									
										
										
										
											2018-02-28 15:00:58 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        * <card> | 
					
						
							|  |  |  |        *  <h1 ngProjectAs="[card-title]>Title</h1> | 
					
						
							|  |  |  |        *  <ng-content ngProjectAs="[card-content]"></ng-content> | 
					
						
							|  |  |  |        * </card> | 
					
						
							|  |  |  |        */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |       const CardWithTitle = createComponent('card-with-title', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |         if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |           projectionDef(); | 
					
						
							|  |  |  |           elementStart(0, 'card'); | 
					
						
							| 
									
										
										
										
											2018-02-28 15:00:58 +01:00
										 |  |  |           { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |             elementStart(1, 'h1', ['ngProjectAs', '[card-title]']); | 
					
						
							|  |  |  |             { text(2, 'Title'); } | 
					
						
							| 
									
										
										
										
											2018-02-28 15:00:58 +01:00
										 |  |  |             elementEnd(); | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |             projection(3, 0, ['ngProjectAs', '[card-content]']); | 
					
						
							| 
									
										
										
										
											2018-02-28 15:00:58 +01:00
										 |  |  |           } | 
					
						
							|  |  |  |           elementEnd(); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |       }, 4, 0, [Card]); | 
					
						
							| 
									
										
										
										
											2018-02-28 15:00:58 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        * <card-with-title> | 
					
						
							|  |  |  |        *  content | 
					
						
							|  |  |  |        * </card-with-title> | 
					
						
							|  |  |  |        */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |       const App = createComponent('app', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |         if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  |           elementStart(0, 'card-with-title'); | 
					
						
							| 
									
										
										
										
											2018-03-21 15:10:34 -07:00
										 |  |  |           { text(1, 'content'); } | 
					
						
							| 
									
										
										
										
											2018-02-28 15:00:58 +01:00
										 |  |  |           elementEnd(); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |       }, 2, 0, [CardWithTitle]); | 
					
						
							| 
									
										
										
										
											2018-02-28 15:00:58 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       const app = renderComponent(App); | 
					
						
							|  |  |  |       expect(toHtml(app)) | 
					
						
							|  |  |  |           .toEqual('<card-with-title><card><h1>Title</h1><hr>content</card></card-with-title>'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should not match selectors against node having ngProjectAs attribute', function() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        *  <ng-content select="div"></ng-content> | 
					
						
							|  |  |  |        */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |       const Child = createComponent('child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |         if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |           projectionDef([[['div']]], ['div']); | 
					
						
							|  |  |  |           projection(0, 1); | 
					
						
							| 
									
										
										
										
											2018-02-28 15:00:58 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |       }, 1); | 
					
						
							| 
									
										
										
										
											2018-02-28 15:00:58 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        * <child> | 
					
						
							|  |  |  |        *  <div ngProjectAs="span">should not project</div> | 
					
						
							|  |  |  |        *  <div>should project</div> | 
					
						
							|  |  |  |        * </child> | 
					
						
							|  |  |  |        */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |       const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |         if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  |           elementStart(0, 'child'); | 
					
						
							| 
									
										
										
										
											2018-02-28 15:00:58 +01:00
										 |  |  |           { | 
					
						
							| 
									
										
										
										
											2018-03-21 15:10:34 -07:00
										 |  |  |             elementStart(1, 'div', ['ngProjectAs', 'span']); | 
					
						
							|  |  |  |             { text(2, 'should not project'); } | 
					
						
							| 
									
										
										
										
											2018-02-28 15:00:58 +01:00
										 |  |  |             elementEnd(); | 
					
						
							| 
									
										
										
										
											2018-03-21 15:10:34 -07:00
										 |  |  |             elementStart(3, 'div'); | 
					
						
							|  |  |  |             { text(4, 'should project'); } | 
					
						
							| 
									
										
										
										
											2018-02-28 15:00:58 +01:00
										 |  |  |             elementEnd(); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           elementEnd(); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |       }, 5, 0, [Child]); | 
					
						
							| 
									
										
										
										
											2018-02-28 15:00:58 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       const parent = renderComponent(Parent); | 
					
						
							|  |  |  |       expect(toHtml(parent)).toEqual('<child><div>should project</div></child>'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |     it('should match selectors against projected containers', () => { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       /** | 
					
						
							|  |  |  |        * <span> | 
					
						
							|  |  |  |        *  <ng-content select="div"></ng-content> | 
					
						
							|  |  |  |        * </span> | 
					
						
							|  |  |  |        */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |       const Child = createComponent('child', function(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |         if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-07-03 20:04:36 -07:00
										 |  |  |           projectionDef([[['div']]], ['div']); | 
					
						
							|  |  |  |           elementStart(0, 'span'); | 
					
						
							|  |  |  |           { projection(1, 1); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |           elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-08-16 18:53:21 -07:00
										 |  |  |       }, 2); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-15 18:37:03 -07:00
										 |  |  |       function IfTemplate(rf: RenderFlags, ctx: any) { | 
					
						
							|  |  |  |         if (rf & RenderFlags.Create) { | 
					
						
							|  |  |  |           elementStart(0, 'div'); | 
					
						
							|  |  |  |           { text(1, 'content'); } | 
					
						
							|  |  |  |           elementEnd(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |       /** | 
					
						
							|  |  |  |        * <child> | 
					
						
							| 
									
										
										
										
											2018-08-15 18:37:03 -07:00
										 |  |  |        *    <div *ngIf="value">content</div> | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |        * </child> | 
					
						
							|  |  |  |        */ | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |       const Parent = createComponent('parent', function(rf: RenderFlags, ctx: {value: any}) { | 
					
						
							|  |  |  |         if (rf & RenderFlags.Create) { | 
					
						
							| 
									
										
										
										
											2018-03-25 21:32:39 -07:00
										 |  |  |           elementStart(0, 'child'); | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |           { template(1, IfTemplate, 2, 0, 'div', [AttributeMarker.SelectOnly, 'ngIf']); } | 
					
						
							| 
									
										
										
										
											2018-02-06 16:11:20 -08:00
										 |  |  |           elementEnd(); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:09 -07:00
										 |  |  |         if (rf & RenderFlags.Update) { | 
					
						
							| 
									
										
										
										
											2018-08-15 18:37:03 -07:00
										 |  |  |           elementProperty(1, 'ngIf', bind(ctx.value)); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-08-18 11:14:50 -07:00
										 |  |  |       }, 2, 1, [Child, NgIf]); | 
					
						
							| 
									
										
										
										
											2018-08-15 18:37:03 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const fixture = new ComponentFixture(Parent); | 
					
						
							|  |  |  |       fixture.component.value = true; | 
					
						
							|  |  |  |       fixture.update(); | 
					
						
							|  |  |  |       expect(fixture.html).toEqual('<child><span><div>content</div></span></child>'); | 
					
						
							| 
									
										
										
										
											2017-12-01 14:23:03 -08:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }); |