| 
									
										
										
										
											2018-04-03 15:46:16 -07: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-07-12 15:10:55 -07:00
										 |  |  | import {MockDirectory, setup} from '@angular/compiler/test/aot/test_util'; | 
					
						
							| 
									
										
										
										
											2018-04-03 15:46:16 -07:00
										 |  |  | import {compile, expectEmit} from './mock_compile'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-05 11:38:06 -07:00
										 |  |  | describe('compiler compliance: template', () => { | 
					
						
							| 
									
										
										
										
											2018-04-03 15:46:16 -07:00
										 |  |  |   const angularFiles = setup({ | 
					
						
							|  |  |  |     compileAngular: true, | 
					
						
							|  |  |  |     compileAnimations: false, | 
					
						
							|  |  |  |     compileCommon: true, | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-16 15:29:42 -07:00
										 |  |  |   it('should correctly bind to context in nested template', () => { | 
					
						
							| 
									
										
										
										
											2018-04-03 15:46:16 -07:00
										 |  |  |     const files = { | 
					
						
							|  |  |  |       app: { | 
					
						
							|  |  |  |         'spec.ts': `
 | 
					
						
							|  |  |  |               import {Component, NgModule} from '@angular/core'; | 
					
						
							|  |  |  |               import {CommonModule} from '@angular/common'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @Component({ | 
					
						
							|  |  |  |                 selector: 'my-component', | 
					
						
							|  |  |  |                 template: \`
 | 
					
						
							|  |  |  |                   <ul *ngFor="let outer of items"> | 
					
						
							|  |  |  |                     <li *ngFor="let middle of outer.items"> | 
					
						
							| 
									
										
										
										
											2018-04-18 16:23:49 -07:00
										 |  |  |                       <div *ngFor="let inner of items" | 
					
						
							| 
									
										
										
										
											2018-04-05 11:38:06 -07:00
										 |  |  |                            (click)="onClick(outer, middle, inner)" | 
					
						
							|  |  |  |                            [title]="format(outer, middle, inner, component)" | 
					
						
							|  |  |  |                            > | 
					
						
							|  |  |  |                         {{format(outer, middle, inner, component)}} | 
					
						
							| 
									
										
										
										
											2018-04-03 15:46:16 -07:00
										 |  |  |                       </div> | 
					
						
							|  |  |  |                     </li> | 
					
						
							|  |  |  |                   </ul>\`
 | 
					
						
							|  |  |  |               }) | 
					
						
							|  |  |  |               export class MyComponent { | 
					
						
							| 
									
										
										
										
											2018-04-05 11:38:06 -07:00
										 |  |  |                 component = this; | 
					
						
							| 
									
										
										
										
											2018-04-03 15:46:16 -07:00
										 |  |  |                 format(outer: any, middle: any, inner: any) { } | 
					
						
							|  |  |  |                 onClick(outer: any, middle: any, inner: any) { } | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @NgModule({declarations: [MyComponent], imports: [CommonModule]}) | 
					
						
							|  |  |  |               export class MyModule {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // The template should look like this (where IDENT is a wild card for an identifier):
 | 
					
						
							|  |  |  |     const template = `
 | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |       const $c0$ = ["ngFor","","ngForOf",""]; | 
					
						
							| 
									
										
										
										
											2018-04-18 16:23:49 -07:00
										 |  |  |       // ...
 | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |       template:function MyComponent_Template(rf, $ctx$){ | 
					
						
							| 
									
										
										
										
											2018-04-18 16:23:49 -07:00
										 |  |  |         if (rf & 1) { | 
					
						
							|  |  |  |           $i0$.ɵC(0, MyComponent_ul_Template_0, null, _c0); | 
					
						
							| 
									
										
										
										
											2018-04-03 15:46:16 -07:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |         if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |           $i0$.ɵp(0, "ngForOf", $i0$.ɵb($ctx$.items)); | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-04-18 16:23:49 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |         function MyComponent_ul_Template_0(rf, $ctx0$) { | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |           if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |             $i0$.ɵE(0, "ul"); | 
					
						
							| 
									
										
										
										
											2018-04-18 16:23:49 -07:00
										 |  |  |             $i0$.ɵC(1, MyComponent_ul_li_Template_1, null, _c0); | 
					
						
							| 
									
										
										
										
											2018-04-05 11:38:06 -07:00
										 |  |  |             $i0$.ɵe(); | 
					
						
							| 
									
										
										
										
											2018-04-03 15:46:16 -07:00
										 |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |           if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2018-04-18 16:23:49 -07:00
										 |  |  |             const $outer$ = $ctx0$.$implicit; | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |             $i0$.ɵp(1, "ngForOf", $i0$.ɵb($outer$.items)); | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |           function MyComponent_ul_li_Template_1(rf, $ctx1$) { | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |             if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |               $i0$.ɵE(0, "li"); | 
					
						
							| 
									
										
										
										
											2018-04-18 16:23:49 -07:00
										 |  |  |               $i0$.ɵC(1, MyComponent_ul_li_div_Template_1, null, _c0); | 
					
						
							| 
									
										
										
										
											2018-04-05 11:38:06 -07:00
										 |  |  |               $i0$.ɵe(); | 
					
						
							| 
									
										
										
										
											2018-04-03 15:46:16 -07:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |             if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |               $i0$.ɵp(1, "ngForOf", $i0$.ɵb($ctx$.items)); | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |             function MyComponent_ul_li_div_Template_1(rf, $ctx2$) { | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |               if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |                 $i0$.ɵE(0, "div"); | 
					
						
							|  |  |  |                 $i0$.ɵL("click", function MyComponent_ul_li_div_Template_1_div_click_listener($event){ | 
					
						
							| 
									
										
										
										
											2018-04-18 16:23:49 -07:00
										 |  |  |                   const $outer$ = $ctx0$.$implicit; | 
					
						
							|  |  |  |                   const $middle$ = $ctx1$.$implicit; | 
					
						
							|  |  |  |                   const $inner$ = $ctx2$.$implicit; | 
					
						
							| 
									
										
										
										
											2018-04-05 11:38:06 -07:00
										 |  |  |                   return ctx.onClick($outer$, $middle$, $inner$); | 
					
						
							| 
									
										
										
										
											2018-04-03 15:46:16 -07:00
										 |  |  |                 }); | 
					
						
							| 
									
										
										
										
											2018-04-05 11:38:06 -07:00
										 |  |  |                 $i0$.ɵT(1); | 
					
						
							|  |  |  |                 $i0$.ɵe(); | 
					
						
							| 
									
										
										
										
											2018-04-03 15:46:16 -07:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |               if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2018-04-18 16:23:49 -07:00
										 |  |  |                 const $outer$ = $ctx0$.$implicit; | 
					
						
							|  |  |  |                 const $middle$ = $ctx1$.$implicit; | 
					
						
							|  |  |  |                 const $inner$ = $ctx2$.$implicit; | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |                 $i0$.ɵp(0, "title", $i0$.ɵb(ctx.format($outer$, $middle$, $inner$, $ctx$.component))); | 
					
						
							|  |  |  |                 $i0$.ɵt(1, $i0$.ɵi1(" ", ctx.format($outer$, $middle$, $inner$, $ctx$.component), " ")); | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |               } | 
					
						
							| 
									
										
										
										
											2018-04-03 15:46:16 -07:00
										 |  |  |             } | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const result = compile(files, angularFiles); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expectEmit(result.source, template, 'Incorrect template'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  | }); |