| 
									
										
										
										
											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
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import {MockDirectory, setup} from '../aot/test_util'; | 
					
						
							|  |  |  | 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-05 11:38:06 -07:00
										 |  |  |                       <div *ngFor="let inner of items"  | 
					
						
							|  |  |  |                            (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-04-10 20:57:20 -07:00
										 |  |  |       template:function MyComponent_Template(rf: IDENT, ctx: IDENT){ | 
					
						
							|  |  |  |         if (rf & 1) {  | 
					
						
							| 
									
										
										
										
											2018-04-05 11:38:06 -07:00
										 |  |  |           $i0$.ɵC(0, MyComponent_NgForOf_Template_0, null, _c0);  | 
					
						
							| 
									
										
										
										
											2018-04-03 15:46:16 -07:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |         if (rf & 2) { | 
					
						
							|  |  |  |           $i0$.ɵp(0, 'ngForOf', $i0$.ɵb(ctx.items)); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         function MyComponent_NgForOf_Template_0(rf: IDENT, ctx0: IDENT) { | 
					
						
							|  |  |  |           if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-04-05 11:38:06 -07:00
										 |  |  |             $i0$.ɵE(0, 'ul'); | 
					
						
							|  |  |  |             $i0$.ɵC(1, MyComponent_NgForOf_NgForOf_Template_1, null, _c0); | 
					
						
							|  |  |  |             $i0$.ɵe(); | 
					
						
							| 
									
										
										
										
											2018-04-03 15:46:16 -07:00
										 |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |           if (rf & 2) { | 
					
						
							|  |  |  |             const $outer$ = ctx0.$implicit; | 
					
						
							|  |  |  |             $i0$.ɵp(1, 'ngForOf', $i0$.ɵb($outer$.items)); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           function MyComponent_NgForOf_NgForOf_Template_1(rf: IDENT, ctx1: IDENT) { | 
					
						
							|  |  |  |             if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-04-05 11:38:06 -07:00
										 |  |  |               $i0$.ɵE(0, 'li'); | 
					
						
							|  |  |  |               $i0$.ɵC(1, MyComponent_NgForOf_NgForOf_NgForOf_Template_1, null, _c0); | 
					
						
							|  |  |  |               $i0$.ɵe(); | 
					
						
							| 
									
										
										
										
											2018-04-03 15:46:16 -07:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |             if (rf & 2) { | 
					
						
							|  |  |  |               $i0$.ɵp(1, 'ngForOf', $i0$.ɵb(ctx.items)); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             function MyComponent_NgForOf_NgForOf_NgForOf_Template_1(rf: IDENT, ctx2: IDENT) { | 
					
						
							|  |  |  |               if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2018-04-05 11:38:06 -07:00
										 |  |  |                 $i0$.ɵE(0, 'div'); | 
					
						
							|  |  |  |                 $i0$.ɵL('click', function MyComponent_NgForOf_NgForOf_NgForOf_Template_1_div_click_listener($event:any){ | 
					
						
							|  |  |  |                   const $outer$ = ctx0.$implicit; | 
					
						
							|  |  |  |                   const $middle$ = ctx1.$implicit; | 
					
						
							|  |  |  |                   const $inner$ = ctx2.$implicit; | 
					
						
							|  |  |  |                   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) { | 
					
						
							|  |  |  |                 const $outer$ = ctx0.$implicit; | 
					
						
							|  |  |  |                 const $middle$ = ctx1.$implicit; | 
					
						
							|  |  |  |                 const $inner$ = ctx2.$implicit; | 
					
						
							| 
									
										
										
										
											2018-04-16 15:29:42 -07:00
										 |  |  |                 $i0$.ɵp(0, 'title', $i0$.ɵb(ctx.format($outer$, $middle$, $inner$, ctx.component))); | 
					
						
							| 
									
										
										
										
											2018-04-10 20:57:20 -07:00
										 |  |  |                 $i0$.ɵt(1, $i0$.ɵi1(' ', ctx.format($outer$, $middle$, $inner$, ctx.component), ' ')); | 
					
						
							|  |  |  |               } | 
					
						
							| 
									
										
										
										
											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
										 |  |  | }); |