| 
									
										
										
										
											2018-05-15 21:07:59 +02: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-08-20 15:20:12 +02:00
										 |  |  | import {AttributeMarker} from '@angular/compiler/src/core'; | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  | import {MockDirectory, setup} from '@angular/compiler/test/aot/test_util'; | 
					
						
							| 
									
										
										
										
											2018-05-15 21:07:59 +02:00
										 |  |  | import {compile, expectEmit} from './mock_compile'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | describe('compiler compliance: bindings', () => { | 
					
						
							|  |  |  |   const angularFiles = setup({ | 
					
						
							| 
									
										
										
										
											2018-08-01 09:52:34 +02:00
										 |  |  |     compileAngular: false, | 
					
						
							|  |  |  |     compileFakeCore: true, | 
					
						
							| 
									
										
										
										
											2018-05-15 21:07:59 +02:00
										 |  |  |     compileAnimations: false, | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('text bindings', () => { | 
					
						
							|  |  |  |     it('should generate interpolation instruction', () => { | 
					
						
							|  |  |  |       const files: MockDirectory = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'example.ts': `
 | 
					
						
							|  |  |  |           import {Component, NgModule} from '@angular/core'; | 
					
						
							|  |  |  |           @Component({ | 
					
						
							|  |  |  |             selector: 'my-component', | 
					
						
							|  |  |  |             template: \`
 | 
					
						
							|  |  |  |               <div>Hello {{ name }}</div>\`
 | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |           export class MyComponent { | 
					
						
							|  |  |  |             name = 'World'; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           @NgModule({declarations: [MyComponent]}) | 
					
						
							|  |  |  |           export class MyModule {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const template = `
 | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |       template:function MyComponent_Template(rf, $ctx$){ | 
					
						
							| 
									
										
										
										
											2018-05-15 21:07:59 +02:00
										 |  |  |         if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |           $i0$.ɵɵelementStart(0, "div"); | 
					
						
							|  |  |  |           $i0$.ɵɵtext(1); | 
					
						
							|  |  |  |           $i0$.ɵɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-05-15 21:07:59 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |         if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |           $r3$.ɵɵselect(1); | 
					
						
							| 
									
										
										
										
											2019-04-23 20:40:05 -07:00
										 |  |  |           $i0$.ɵɵtextInterpolate1("Hello ", $ctx$.name, ""); | 
					
						
							| 
									
										
										
										
											2018-05-15 21:07:59 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |       }`;
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  |       expectEmit(result.source, template, 'Incorrect interpolated text binding'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('property bindings', () => { | 
					
						
							|  |  |  |     it('should generate bind instruction', () => { | 
					
						
							|  |  |  |       const files: MockDirectory = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'example.ts': `
 | 
					
						
							|  |  |  |           import {Component, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           @Component({ | 
					
						
							|  |  |  |             selector: 'my-app', | 
					
						
							|  |  |  |             template: '<a [title]="title"></a>' | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |           export class MyComponent { | 
					
						
							|  |  |  |             title = 'Hello World'; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           @NgModule({declarations: [MyComponent]}) | 
					
						
							|  |  |  |           export class MyModule {}`
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const template = `
 | 
					
						
							| 
									
										
										
										
											2019-03-07 08:31:31 +00:00
										 |  |  |       const $e0_attrs$ = [${AttributeMarker.Bindings}, "title"]; | 
					
						
							| 
									
										
										
										
											2018-08-20 15:20:12 +02:00
										 |  |  |       … | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |       template:function MyComponent_Template(rf, $ctx$){ | 
					
						
							| 
									
										
										
										
											2018-05-15 21:07:59 +02:00
										 |  |  |         if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |           $i0$.ɵɵelement(0, "a", $e0_attrs$); | 
					
						
							| 
									
										
										
										
											2018-05-15 21:07:59 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |         if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |           $i0$.ɵɵproperty("title", $ctx$.title); | 
					
						
							| 
									
										
										
										
											2018-05-15 21:07:59 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |       }`;
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  |       expectEmit(result.source, template, 'Incorrect property binding'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should generate interpolation instruction for {{...}} bindings', () => { | 
					
						
							|  |  |  |       const files: MockDirectory = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'example.ts': `
 | 
					
						
							|  |  |  |           import {Component, NgModule} from '@angular/core'; | 
					
						
							|  |  |  |           @Component({ | 
					
						
							|  |  |  |             selector: 'my-component', | 
					
						
							|  |  |  |             template: \`
 | 
					
						
							|  |  |  |               <a title="Hello {{name}}"></a>\`
 | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |           export class MyComponent { | 
					
						
							|  |  |  |             name = 'World'; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           @NgModule({declarations: [MyComponent]}) | 
					
						
							|  |  |  |           export class MyModule {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const template = `
 | 
					
						
							| 
									
										
										
										
											2019-03-07 08:31:31 +00:00
										 |  |  |       const $e0_attrs$ = [${AttributeMarker.Bindings}, "title"]; | 
					
						
							| 
									
										
										
										
											2018-08-20 15:20:12 +02:00
										 |  |  |       … | 
					
						
							| 
									
										
										
										
											2018-07-12 15:10:55 -07:00
										 |  |  |       template:function MyComponent_Template(rf, $ctx$){ | 
					
						
							| 
									
										
										
										
											2018-05-15 21:07:59 +02:00
										 |  |  |         if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |           $i0$.ɵɵelement(0, "a", $e0_attrs$); | 
					
						
							| 
									
										
										
										
											2018-05-15 21:07:59 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |         if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |           $i0$.ɵɵpropertyInterpolate1("title", "Hello ", $ctx$.name, ""); | 
					
						
							| 
									
										
										
										
											2018-05-15 21:07:59 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |       }`;
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  |       expectEmit(result.source, template, 'Incorrect interpolated property binding'); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2019-01-10 15:54:48 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     it('should ignore empty bindings', () => { | 
					
						
							|  |  |  |       const files: MockDirectory = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'example.ts': `
 | 
					
						
							|  |  |  |             import {Component} from '@angular/core'; | 
					
						
							|  |  |  |             @Component({ | 
					
						
							|  |  |  |               selector: 'test', | 
					
						
							|  |  |  |               template: '<div [someProp]></div>' | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             class FooCmp {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							| 
									
										
										
										
											2019-05-24 14:20:41 -07:00
										 |  |  |       expect(result.source).not.toContain('i0.ɵɵproperty'); | 
					
						
							| 
									
										
										
										
											2019-01-10 15:54:48 -08:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2019-02-21 00:00:02 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     it('should not remap property names whose names do not correspond to their attribute names', | 
					
						
							|  |  |  |        () => { | 
					
						
							|  |  |  |          const files = { | 
					
						
							|  |  |  |            app: { | 
					
						
							|  |  |  |              'spec.ts': `
 | 
					
						
							|  |  |  |               import {Component, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @Component({ | 
					
						
							|  |  |  |                 selector: 'my-component', | 
					
						
							|  |  |  |                 template: \`
 | 
					
						
							|  |  |  |                   <label [for]="forValue"></label>\`
 | 
					
						
							|  |  |  |               }) | 
					
						
							|  |  |  |               export class MyComponent { | 
					
						
							|  |  |  |                 forValue = 'some-input'; | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               @NgModule({declarations: [MyComponent]}) | 
					
						
							|  |  |  |               export class MyModule {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |            } | 
					
						
							|  |  |  |          }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          const template = `
 | 
					
						
							| 
									
										
										
										
											2019-03-07 08:31:31 +00:00
										 |  |  |       const $c0$ = [${AttributeMarker.Bindings}, "for"]; | 
					
						
							| 
									
										
										
										
											2019-02-21 00:00:02 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       // ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       function MyComponent_Template(rf, ctx) { | 
					
						
							|  |  |  |         if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |             $i0$.ɵɵelement(0, "label", _c0); | 
					
						
							| 
									
										
										
										
											2019-02-21 00:00:02 +01:00
										 |  |  |         } | 
					
						
							|  |  |  |         if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |             $i0$.ɵɵproperty("for", ctx.forValue); | 
					
						
							| 
									
										
										
										
											2019-02-21 00:00:02 +01:00
										 |  |  |         } | 
					
						
							|  |  |  |       }`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          const result = compile(files, angularFiles); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          expectEmit(result.source, template, 'Incorrect template'); | 
					
						
							|  |  |  |        }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 21:07:59 +02:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-06 19:05:06 -08:00
										 |  |  |   describe('host bindings', () => { | 
					
						
							|  |  |  |     it('should support host bindings', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |             import {Directive, HostBinding, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Directive({selector: '[hostBindingDir]'}) | 
					
						
							|  |  |  |             export class HostBindingDir { | 
					
						
							|  |  |  |               @HostBinding('id') dirId = 'some id'; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @NgModule({declarations: [HostBindingDir]}) | 
					
						
							|  |  |  |             export class MyModule {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const HostBindingDirDeclaration = `
 | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |         HostBindingDir.ngDirectiveDef = $r3$.ɵɵdefineDirective({ | 
					
						
							| 
									
										
										
										
											2018-11-06 19:05:06 -08:00
										 |  |  |           type: HostBindingDir, | 
					
						
							|  |  |  |           selectors: [["", "hostBindingDir", ""]], | 
					
						
							|  |  |  |           factory: function HostBindingDir_Factory(t) { return new (t || HostBindingDir)(); }, | 
					
						
							| 
									
										
										
										
											2018-11-20 15:20:19 -08:00
										 |  |  |           hostBindings: function HostBindingDir_HostBindings(rf, ctx, elIndex) { | 
					
						
							| 
									
										
										
										
											2018-11-27 12:05:26 -08:00
										 |  |  |             if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |               $r3$.ɵɵallocHostVars(1); | 
					
						
							| 
									
										
										
										
											2018-11-27 12:05:26 -08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-11-20 15:20:19 -08:00
										 |  |  |             if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |               $r3$.ɵɵproperty("id", ctx.dirId, null, true); | 
					
						
							| 
									
										
										
										
											2018-11-20 15:20:19 -08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-11-27 12:05:26 -08:00
										 |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-11-06 19:05:06 -08:00
										 |  |  |         }); | 
					
						
							|  |  |  |       `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  |       const source = result.source; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expectEmit(source, HostBindingDirDeclaration, 'Invalid host binding code'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should support host bindings with pure functions', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |             import {Component, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Component({ | 
					
						
							|  |  |  |               selector: 'host-binding-comp', | 
					
						
							|  |  |  |               host: { | 
					
						
							|  |  |  |                 '[id]': '["red", id]' | 
					
						
							|  |  |  |               }, | 
					
						
							|  |  |  |               template: '' | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class HostBindingComp { | 
					
						
							|  |  |  |               id = 'some id'; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @NgModule({declarations: [HostBindingComp]}) | 
					
						
							|  |  |  |             export class MyModule {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const HostBindingCompDeclaration = `
 | 
					
						
							|  |  |  |         const $ff$ = function ($v$) { return ["red", $v$]; }; | 
					
						
							|  |  |  |         … | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |         HostBindingComp.ngComponentDef = $r3$.ɵɵdefineComponent({ | 
					
						
							| 
									
										
										
										
											2018-11-06 19:05:06 -08:00
										 |  |  |           type: HostBindingComp, | 
					
						
							|  |  |  |           selectors: [["host-binding-comp"]], | 
					
						
							|  |  |  |           factory: function HostBindingComp_Factory(t) { return new (t || HostBindingComp)(); }, | 
					
						
							| 
									
										
										
										
											2018-11-20 15:20:19 -08:00
										 |  |  |           hostBindings: function HostBindingComp_HostBindings(rf, ctx, elIndex) { | 
					
						
							| 
									
										
										
										
											2018-11-27 12:05:26 -08:00
										 |  |  |             if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |               $r3$.ɵɵallocHostVars(3); | 
					
						
							| 
									
										
										
										
											2018-11-27 12:05:26 -08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-11-20 15:20:19 -08:00
										 |  |  |             if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |               $r3$.ɵɵproperty("id", $r3$.ɵɵpureFunction1(1, $ff$, ctx.id), null, true); | 
					
						
							| 
									
										
										
										
											2018-11-20 15:20:19 -08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-11-06 19:05:06 -08:00
										 |  |  |           }, | 
					
						
							|  |  |  |           consts: 0, | 
					
						
							|  |  |  |           vars: 0, | 
					
						
							| 
									
										
										
										
											2018-11-19 18:48:14 +01:00
										 |  |  |           template: function HostBindingComp_Template(rf, ctx) {}, | 
					
						
							|  |  |  |           encapsulation: 2 | 
					
						
							| 
									
										
										
										
											2018-11-06 19:05:06 -08:00
										 |  |  |         }); | 
					
						
							|  |  |  |       `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  |       const source = result.source; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expectEmit(source, HostBindingCompDeclaration, 'Invalid host binding code'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should support host attribute bindings', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |             import {Directive, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Directive({ | 
					
						
							|  |  |  |               selector: '[hostAttributeDir]', | 
					
						
							|  |  |  |               host: { | 
					
						
							|  |  |  |                 '[attr.required]': 'required' | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class HostAttributeDir { | 
					
						
							|  |  |  |               required = true; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @NgModule({declarations: [HostAttributeDir]}) | 
					
						
							|  |  |  |             export class MyModule {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const HostAttributeDirDeclaration = `
 | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |         HostAttributeDir.ngDirectiveDef = $r3$.ɵɵdefineDirective({ | 
					
						
							| 
									
										
										
										
											2018-11-06 19:05:06 -08:00
										 |  |  |           type: HostAttributeDir, | 
					
						
							|  |  |  |           selectors: [["", "hostAttributeDir", ""]], | 
					
						
							|  |  |  |           factory: function HostAttributeDir_Factory(t) { return new (t || HostAttributeDir)(); }, | 
					
						
							| 
									
										
										
										
											2018-11-20 15:20:19 -08:00
										 |  |  |           hostBindings: function HostAttributeDir_HostBindings(rf, ctx, elIndex) { | 
					
						
							| 
									
										
										
										
											2018-11-27 12:05:26 -08:00
										 |  |  |             if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |               $r3$.ɵɵallocHostVars(1); | 
					
						
							| 
									
										
										
										
											2018-11-27 12:05:26 -08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-11-20 15:20:19 -08:00
										 |  |  |             if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2019-05-15 20:21:24 -07:00
										 |  |  |               $r3$.ɵɵattribute("required", ctx.required); | 
					
						
							| 
									
										
										
										
											2018-11-20 15:20:19 -08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-11-27 12:05:26 -08:00
										 |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-11-06 19:05:06 -08:00
										 |  |  |         }); | 
					
						
							|  |  |  |       `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  |       const source = result.source; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expectEmit(source, HostAttributeDirDeclaration, 'Invalid host attribute code'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should support host attributes', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |             import {Directive, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Directive({ | 
					
						
							|  |  |  |               selector: '[hostAttributeDir]', | 
					
						
							|  |  |  |               host: { | 
					
						
							|  |  |  |                 'aria-label': 'label' | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class HostAttributeDir { | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @NgModule({declarations: [HostAttributeDir]}) | 
					
						
							|  |  |  |             export class MyModule {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const HostAttributeDirDeclaration = `
 | 
					
						
							| 
									
										
										
										
											2019-01-11 14:03:37 -08:00
										 |  |  |         const $c0$ = ["aria-label", "label"]; | 
					
						
							|  |  |  |         … | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |         HostAttributeDir.ngDirectiveDef = $r3$.ɵɵdefineDirective({ | 
					
						
							| 
									
										
										
										
											2018-11-06 19:05:06 -08:00
										 |  |  |           type: HostAttributeDir, | 
					
						
							|  |  |  |           selectors: [["", "hostAttributeDir", ""]], | 
					
						
							|  |  |  |           factory: function HostAttributeDir_Factory(t) { return new (t || HostAttributeDir)(); }, | 
					
						
							| 
									
										
										
										
											2019-01-11 14:03:37 -08:00
										 |  |  |           hostBindings: function HostAttributeDir_HostBindings(rf, ctx, elIndex) { | 
					
						
							|  |  |  |             if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |               $r3$.ɵɵelementHostAttrs($c0$); | 
					
						
							| 
									
										
										
										
											2019-01-11 14:03:37 -08:00
										 |  |  |             } | 
					
						
							|  |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-11-06 19:05:06 -08:00
										 |  |  |         }); | 
					
						
							|  |  |  |       `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  |       const source = result.source; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expectEmit(source, HostAttributeDirDeclaration, 'Invalid host attribute code'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-11 14:03:37 -08:00
										 |  |  |     it('should support host attributes together with host classes and styles', () => { | 
					
						
							|  |  |  |       const files = { | 
					
						
							|  |  |  |         app: { | 
					
						
							|  |  |  |           'spec.ts': `
 | 
					
						
							|  |  |  |             import {Component, Directive, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Component({ | 
					
						
							|  |  |  |               selector: 'my-host-attribute-component', | 
					
						
							|  |  |  |               template: "...", | 
					
						
							|  |  |  |               host: { | 
					
						
							|  |  |  |                 'title': 'hello there from component', | 
					
						
							|  |  |  |                 'style': 'opacity:1' | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class HostAttributeComp { | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @Directive({ | 
					
						
							|  |  |  |               selector: '[hostAttributeDir]', | 
					
						
							|  |  |  |               host: { | 
					
						
							|  |  |  |                 'style': 'width: 200px; height: 500px', | 
					
						
							|  |  |  |                 '[style.opacity]': "true", | 
					
						
							|  |  |  |                 'class': 'one two', | 
					
						
							|  |  |  |                 '[class.three]': "true", | 
					
						
							|  |  |  |                 'title': 'hello there from directive', | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             export class HostAttributeDir { | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @NgModule({declarations: [HostAttributeComp, HostAttributeDir]}) | 
					
						
							|  |  |  |             export class MyModule {} | 
					
						
							|  |  |  |           `
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const CompAndDirDeclaration = `
 | 
					
						
							|  |  |  |         const $c0$ = ["title", "hello there from component", ${AttributeMarker.Styles}, "opacity", "1"]; | 
					
						
							|  |  |  |         const $c1$ = ["title", "hello there from directive", ${AttributeMarker.Classes}, "one", "two", ${AttributeMarker.Styles}, "width", "200px", "height", "500px"]; | 
					
						
							|  |  |  |         … | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |         HostAttributeComp.ngComponentDef = $r3$.ɵɵdefineComponent({ | 
					
						
							| 
									
										
										
										
											2019-01-11 14:03:37 -08:00
										 |  |  |           type: HostAttributeComp, | 
					
						
							|  |  |  |           selectors: [["my-host-attribute-component"]], | 
					
						
							|  |  |  |           factory: function HostAttributeComp_Factory(t) { return new (t || HostAttributeComp)(); }, | 
					
						
							|  |  |  |           hostBindings: function HostAttributeComp_HostBindings(rf, ctx, elIndex) { | 
					
						
							|  |  |  |             if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |               $r3$.ɵɵelementHostAttrs($c0$); | 
					
						
							| 
									
										
										
										
											2019-01-11 14:03:37 -08:00
										 |  |  |               … | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             … | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         … | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |         HostAttributeDir.ngDirectiveDef = $r3$.ɵɵdefineDirective({ | 
					
						
							| 
									
										
										
										
											2019-01-11 14:03:37 -08:00
										 |  |  |           type: HostAttributeDir, | 
					
						
							|  |  |  |           selectors: [["", "hostAttributeDir", ""]], | 
					
						
							|  |  |  |           factory: function HostAttributeDir_Factory(t) { return new (t || HostAttributeDir)(); }, | 
					
						
							|  |  |  |           hostBindings: function HostAttributeDir_HostBindings(rf, ctx, elIndex) { | 
					
						
							|  |  |  |             if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |               $r3$.ɵɵelementHostAttrs($c1$); | 
					
						
							| 
									
										
										
										
											2019-01-11 14:03:37 -08:00
										 |  |  |               … | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             … | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |       `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  |       const source = result.source; | 
					
						
							|  |  |  |       expectEmit(source, CompAndDirDeclaration, 'Invalid host attribute code'); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2018-11-06 19:05:06 -08:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-26 13:34:42 -07:00
										 |  |  |   describe('non bindable behavior', () => { | 
					
						
							| 
									
										
										
										
											2018-09-26 13:19:04 -07:00
										 |  |  |     const getAppFiles = (template: string = ''): MockDirectory => ({ | 
					
						
							|  |  |  |       app: { | 
					
						
							|  |  |  |         'example.ts': `
 | 
					
						
							|  |  |  |           import {Component, NgModule} from '@angular/core'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           @Component({ | 
					
						
							|  |  |  |             selector: 'my-app', | 
					
						
							|  |  |  |             template: \`${template}\`
 | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |           export class MyComponent { | 
					
						
							|  |  |  |             name = 'John Doe'; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           @NgModule({declarations: [MyComponent]}) | 
					
						
							|  |  |  |           export class MyModule {}`
 | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-20 18:05:46 -07:00
										 |  |  |     it('should generate the proper update instructions for interpolated properties', () => { | 
					
						
							|  |  |  |       const files: MockDirectory = getAppFiles(`
 | 
					
						
							|  |  |  |         <div title="a{{one}}b{{two}}c{{three}}d{{four}}e{{five}}f{{six}}g{{seven}}h{{eight}}i{{nine}}j"></div> | 
					
						
							|  |  |  |         <div title="a{{one}}b{{two}}c{{three}}d{{four}}e{{five}}f{{six}}g{{seven}}h{{eight}}i"></div> | 
					
						
							|  |  |  |         <div title="a{{one}}b{{two}}c{{three}}d{{four}}e{{five}}f{{six}}g{{seven}}h"></div> | 
					
						
							|  |  |  |         <div title="a{{one}}b{{two}}c{{three}}d{{four}}e{{five}}f{{six}}g"></div> | 
					
						
							|  |  |  |         <div title="a{{one}}b{{two}}c{{three}}d{{four}}e{{five}}f"></div> | 
					
						
							|  |  |  |         <div title="a{{one}}b{{two}}c{{three}}d{{four}}e"></div> | 
					
						
							|  |  |  |         <div title="a{{one}}b{{two}}c{{three}}d"></div> | 
					
						
							|  |  |  |         <div title="a{{one}}b{{two}}c"></div> | 
					
						
							|  |  |  |         <div title="a{{one}}b"></div> | 
					
						
							|  |  |  |         <div title="{{one}}"></div> | 
					
						
							|  |  |  |       `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const template = `
 | 
					
						
							|  |  |  |       … | 
					
						
							|  |  |  |         if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |           i0.ɵɵpropertyInterpolateV("title", ["a", ctx.one, "b", ctx.two, "c", ctx.three, "d", ctx.four, "e", ctx.five, "f", ctx.six, "g", ctx.seven, "h", ctx.eight, "i", ctx.nine, "j"]); | 
					
						
							|  |  |  |           i0.ɵɵselect(1); | 
					
						
							|  |  |  |           i0.ɵɵpropertyInterpolate8("title", "a", ctx.one, "b", ctx.two, "c", ctx.three, "d", ctx.four, "e", ctx.five, "f", ctx.six, "g", ctx.seven, "h", ctx.eight, "i"); | 
					
						
							|  |  |  |           i0.ɵɵselect(2); | 
					
						
							|  |  |  |           i0.ɵɵpropertyInterpolate7("title", "a", ctx.one, "b", ctx.two, "c", ctx.three, "d", ctx.four, "e", ctx.five, "f", ctx.six, "g", ctx.seven, "h"); | 
					
						
							|  |  |  |           i0.ɵɵselect(3); | 
					
						
							|  |  |  |           i0.ɵɵpropertyInterpolate6("title", "a", ctx.one, "b", ctx.two, "c", ctx.three, "d", ctx.four, "e", ctx.five, "f", ctx.six, "g"); | 
					
						
							|  |  |  |           i0.ɵɵselect(4); | 
					
						
							|  |  |  |           i0.ɵɵpropertyInterpolate5("title", "a", ctx.one, "b", ctx.two, "c", ctx.three, "d", ctx.four, "e", ctx.five, "f"); | 
					
						
							|  |  |  |           i0.ɵɵselect(5); | 
					
						
							|  |  |  |           i0.ɵɵpropertyInterpolate4("title", "a", ctx.one, "b", ctx.two, "c", ctx.three, "d", ctx.four, "e"); | 
					
						
							|  |  |  |           i0.ɵɵselect(6); | 
					
						
							|  |  |  |           i0.ɵɵpropertyInterpolate3("title", "a", ctx.one, "b", ctx.two, "c", ctx.three, "d"); | 
					
						
							|  |  |  |           i0.ɵɵselect(7); | 
					
						
							|  |  |  |           i0.ɵɵpropertyInterpolate2("title", "a", ctx.one, "b", ctx.two, "c"); | 
					
						
							|  |  |  |           i0.ɵɵselect(8); | 
					
						
							|  |  |  |           i0.ɵɵpropertyInterpolate1("title", "a", ctx.one, "b"); | 
					
						
							|  |  |  |           i0.ɵɵselect(9); | 
					
						
							|  |  |  |           i0.ɵɵpropertyInterpolate("title", ctx.one); | 
					
						
							| 
									
										
										
										
											2019-04-20 18:05:46 -07:00
										 |  |  |       } | 
					
						
							|  |  |  |       … | 
					
						
							|  |  |  |       `;
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  |       expectEmit(result.source, template, 'Incorrect handling of interpolated properties'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-15 19:53:13 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     it('should generate the proper update instructions for interpolated attributes', () => { | 
					
						
							|  |  |  |       const files: MockDirectory = getAppFiles(`
 | 
					
						
							|  |  |  |         <div attr.title="a{{one}}b{{two}}c{{three}}d{{four}}e{{five}}f{{six}}g{{seven}}h{{eight}}i{{nine}}j"></div> | 
					
						
							|  |  |  |         <div attr.title="a{{one}}b{{two}}c{{three}}d{{four}}e{{five}}f{{six}}g{{seven}}h{{eight}}i"></div> | 
					
						
							|  |  |  |         <div attr.title="a{{one}}b{{two}}c{{three}}d{{four}}e{{five}}f{{six}}g{{seven}}h"></div> | 
					
						
							|  |  |  |         <div attr.title="a{{one}}b{{two}}c{{three}}d{{four}}e{{five}}f{{six}}g"></div> | 
					
						
							|  |  |  |         <div attr.title="a{{one}}b{{two}}c{{three}}d{{four}}e{{five}}f"></div> | 
					
						
							|  |  |  |         <div attr.title="a{{one}}b{{two}}c{{three}}d{{four}}e"></div> | 
					
						
							|  |  |  |         <div attr.title="a{{one}}b{{two}}c{{three}}d"></div> | 
					
						
							|  |  |  |         <div attr.title="a{{one}}b{{two}}c"></div> | 
					
						
							|  |  |  |         <div attr.title="a{{one}}b"></div> | 
					
						
							|  |  |  |         <div attr.title="{{one}}"></div> | 
					
						
							|  |  |  |       `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const template = `
 | 
					
						
							|  |  |  |       … | 
					
						
							|  |  |  |         if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2019-05-15 20:21:24 -07:00
										 |  |  |           i0.ɵɵattributeInterpolateV("title", ["a", ctx.one, "b", ctx.two, "c", ctx.three, "d", ctx.four, "e", ctx.five, "f", ctx.six, "g", ctx.seven, "h", ctx.eight, "i", ctx.nine, "j"]); | 
					
						
							|  |  |  |           i0.ɵɵselect(1); | 
					
						
							|  |  |  |           i0.ɵɵattributeInterpolate8("title", "a", ctx.one, "b", ctx.two, "c", ctx.three, "d", ctx.four, "e", ctx.five, "f", ctx.six, "g", ctx.seven, "h", ctx.eight, "i"); | 
					
						
							|  |  |  |           i0.ɵɵselect(2); | 
					
						
							|  |  |  |           i0.ɵɵattributeInterpolate7("title", "a", ctx.one, "b", ctx.two, "c", ctx.three, "d", ctx.four, "e", ctx.five, "f", ctx.six, "g", ctx.seven, "h"); | 
					
						
							|  |  |  |           i0.ɵɵselect(3); | 
					
						
							|  |  |  |           i0.ɵɵattributeInterpolate6("title", "a", ctx.one, "b", ctx.two, "c", ctx.three, "d", ctx.four, "e", ctx.five, "f", ctx.six, "g"); | 
					
						
							|  |  |  |           i0.ɵɵselect(4); | 
					
						
							|  |  |  |           i0.ɵɵattributeInterpolate5("title", "a", ctx.one, "b", ctx.two, "c", ctx.three, "d", ctx.four, "e", ctx.five, "f"); | 
					
						
							|  |  |  |           i0.ɵɵselect(5); | 
					
						
							|  |  |  |           i0.ɵɵattributeInterpolate4("title", "a", ctx.one, "b", ctx.two, "c", ctx.three, "d", ctx.four, "e"); | 
					
						
							|  |  |  |           i0.ɵɵselect(6); | 
					
						
							|  |  |  |           i0.ɵɵattributeInterpolate3("title", "a", ctx.one, "b", ctx.two, "c", ctx.three, "d"); | 
					
						
							|  |  |  |           i0.ɵɵselect(7); | 
					
						
							|  |  |  |           i0.ɵɵattributeInterpolate2("title", "a", ctx.one, "b", ctx.two, "c"); | 
					
						
							|  |  |  |           i0.ɵɵselect(8); | 
					
						
							|  |  |  |           i0.ɵɵattributeInterpolate1("title", "a", ctx.one, "b"); | 
					
						
							|  |  |  |           i0.ɵɵselect(9); | 
					
						
							| 
									
										
										
										
											2019-05-15 20:24:29 -07:00
										 |  |  |           i0.ɵɵattribute("title", ctx.one); | 
					
						
							| 
									
										
										
										
											2019-05-15 19:53:13 -07:00
										 |  |  |       } | 
					
						
							|  |  |  |       … | 
					
						
							|  |  |  |       `;
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  |       expectEmit(result.source, template, 'Incorrect handling of interpolated properties'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-26 13:19:04 -07:00
										 |  |  |     it('should keep local ref for host element', () => { | 
					
						
							|  |  |  |       const files: MockDirectory = getAppFiles(`
 | 
					
						
							|  |  |  |         <b ngNonBindable #myRef id="my-id"> | 
					
						
							|  |  |  |           <i>Hello {{ name }}!</i> | 
					
						
							|  |  |  |         </b> | 
					
						
							|  |  |  |         {{ myRef.id }} | 
					
						
							|  |  |  |       `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const template = `
 | 
					
						
							|  |  |  |         const $_c0$ = ["id", "my-id"]; | 
					
						
							|  |  |  |         const $_c1$ = ["myRef", ""]; | 
					
						
							|  |  |  |         … | 
					
						
							|  |  |  |         template:function MyComponent_Template(rf, $ctx$){ | 
					
						
							|  |  |  |           if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |             $i0$.ɵɵelementStart(0, "b", $_c0$, $_c1$); | 
					
						
							|  |  |  |             $i0$.ɵɵdisableBindings(); | 
					
						
							|  |  |  |             $i0$.ɵɵelementStart(2, "i"); | 
					
						
							|  |  |  |             $i0$.ɵɵtext(3, "Hello {{ name }}!"); | 
					
						
							|  |  |  |             $i0$.ɵɵelementEnd(); | 
					
						
							|  |  |  |             $i0$.ɵɵenableBindings(); | 
					
						
							|  |  |  |             $i0$.ɵɵelementEnd(); | 
					
						
							|  |  |  |             $i0$.ɵɵtext(4); | 
					
						
							| 
									
										
										
										
											2018-09-26 13:19:04 -07:00
										 |  |  |           } | 
					
						
							|  |  |  |           if (rf & 2) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |             const $_r0$ = $i0$.ɵɵreference(1); | 
					
						
							|  |  |  |             $r3$.ɵɵselect(4); | 
					
						
							| 
									
										
										
										
											2019-04-23 20:40:05 -07:00
										 |  |  |             $i0$.ɵɵtextInterpolate1(" ", $_r0$.id, " "); | 
					
						
							| 
									
										
										
										
											2018-09-26 13:19:04 -07:00
										 |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       `;
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							| 
									
										
										
										
											2018-09-26 14:33:48 -07:00
										 |  |  |       expectEmit(result.source, template, 'Incorrect handling of local refs for host element'); | 
					
						
							| 
									
										
										
										
											2018-09-26 13:19:04 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should not have local refs for nested elements', () => { | 
					
						
							|  |  |  |       const files: MockDirectory = getAppFiles(`
 | 
					
						
							|  |  |  |        <div ngNonBindable> | 
					
						
							|  |  |  |          <input value="one" #myInput> {{ myInput.value }} | 
					
						
							|  |  |  |        </div> | 
					
						
							|  |  |  |       `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const template = `
 | 
					
						
							|  |  |  |         const $_c0$ = ["value", "one", "#myInput", ""]; | 
					
						
							|  |  |  |         … | 
					
						
							|  |  |  |         template:function MyComponent_Template(rf, $ctx$){ | 
					
						
							|  |  |  |           if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |             $i0$.ɵɵelementStart(0, "div"); | 
					
						
							|  |  |  |             $i0$.ɵɵdisableBindings(); | 
					
						
							|  |  |  |             $i0$.ɵɵelement(1, "input", $_c0$); | 
					
						
							|  |  |  |             $i0$.ɵɵtext(2, " {{ myInput.value }} "); | 
					
						
							|  |  |  |             $i0$.ɵɵenableBindings(); | 
					
						
							|  |  |  |             $i0$.ɵɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-09-26 13:19:04 -07:00
										 |  |  |         } | 
					
						
							|  |  |  |       `;
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							| 
									
										
										
										
											2018-09-26 14:33:48 -07:00
										 |  |  |       expectEmit(result.source, template, 'Incorrect handling of local refs for nested elements'); | 
					
						
							| 
									
										
										
										
											2018-09-26 13:19:04 -07:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2018-09-26 15:15:06 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     it('should not process property bindings and listeners', () => { | 
					
						
							|  |  |  |       const files: MockDirectory = getAppFiles(`
 | 
					
						
							|  |  |  |         <div ngNonBindable> | 
					
						
							|  |  |  |           <div [id]="my-id" (click)="onclick"></div> | 
					
						
							|  |  |  |         </div> | 
					
						
							|  |  |  |       `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const template = `
 | 
					
						
							|  |  |  |         const $_c0$ = ["[id]", "my-id", "(click)", "onclick"]; | 
					
						
							|  |  |  |         … | 
					
						
							|  |  |  |         template:function MyComponent_Template(rf, $ctx$){ | 
					
						
							|  |  |  |           if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |             $i0$.ɵɵelementStart(0, "div"); | 
					
						
							|  |  |  |             $i0$.ɵɵdisableBindings(); | 
					
						
							|  |  |  |             $i0$.ɵɵelement(1, "div", $_c0$); | 
					
						
							|  |  |  |             $i0$.ɵɵenableBindings(); | 
					
						
							|  |  |  |             $i0$.ɵɵelementEnd(); | 
					
						
							| 
									
										
										
										
											2018-09-26 15:15:06 -07:00
										 |  |  |         } | 
					
						
							|  |  |  |       `;
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							| 
									
										
										
										
											2018-09-26 16:02:40 -07:00
										 |  |  |       expectEmit(result.source, template, 'Incorrect handling of property bindings and listeners'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should not generate extra instructions for elements with no children', () => { | 
					
						
							|  |  |  |       const files: MockDirectory = getAppFiles(`
 | 
					
						
							|  |  |  |         <div ngNonBindable></div> | 
					
						
							|  |  |  |       `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const template = `
 | 
					
						
							|  |  |  |         template:function MyComponent_Template(rf, $ctx$){ | 
					
						
							|  |  |  |           if (rf & 1) { | 
					
						
							| 
									
										
										
										
											2019-05-17 18:49:21 -07:00
										 |  |  |             $i0$.ɵɵelement(0, "div"); | 
					
						
							| 
									
										
										
										
											2018-09-26 16:02:40 -07:00
										 |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       `;
 | 
					
						
							|  |  |  |       const result = compile(files, angularFiles); | 
					
						
							|  |  |  |       expectEmit(result.source, template, 'Incorrect handling of elements with no children'); | 
					
						
							| 
									
										
										
										
											2018-09-26 15:15:06 -07:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2018-09-26 16:02:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-26 13:19:04 -07:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 21:07:59 +02:00
										 |  |  | }); |