| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  | import { | 
					
						
							|  |  |  |   ddescribe, | 
					
						
							|  |  |  |   describe, | 
					
						
							|  |  |  |   xdescribe, | 
					
						
							|  |  |  |   it, | 
					
						
							|  |  |  |   iit, | 
					
						
							|  |  |  |   xit, | 
					
						
							|  |  |  |   expect, | 
					
						
							|  |  |  |   beforeEach, | 
					
						
							|  |  |  |   afterEach, | 
					
						
							|  |  |  |   AsyncTestCompleter, | 
					
						
							|  |  |  |   inject, | 
					
						
							| 
									
										
										
										
											2015-11-24 11:26:37 -08:00
										 |  |  |   beforeEachProviders | 
					
						
							| 
									
										
										
										
											2015-10-13 00:29:13 -07:00
										 |  |  | } from 'angular2/testing_internal'; | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-06 17:34:07 -08:00
										 |  |  | import {Promise, PromiseWrapper} from 'angular2/src/facade/async'; | 
					
						
							|  |  |  | import {Type, isPresent, isBlank, stringify, isString} from 'angular2/src/facade/lang'; | 
					
						
							|  |  |  | import {MapWrapper, SetWrapper, ListWrapper} from 'angular2/src/facade/collection'; | 
					
						
							| 
									
										
										
										
											2015-11-05 14:07:57 -08:00
										 |  |  | import {RuntimeMetadataResolver} from 'angular2/src/compiler/runtime_metadata'; | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  | import { | 
					
						
							|  |  |  |   TemplateCompiler, | 
					
						
							|  |  |  |   NormalizedComponentWithViewDirectives | 
					
						
							| 
									
										
										
										
											2015-11-05 14:07:57 -08:00
										 |  |  | } from 'angular2/src/compiler/template_compiler'; | 
					
						
							|  |  |  | import {CompileDirectiveMetadata} from 'angular2/src/compiler/directive_metadata'; | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  | import {evalModule} from './eval_module'; | 
					
						
							| 
									
										
										
										
											2015-11-05 14:07:57 -08:00
										 |  |  | import {SourceModule, moduleRef} from 'angular2/src/compiler/source_module'; | 
					
						
							|  |  |  | import {XHR} from 'angular2/src/compiler/xhr'; | 
					
						
							|  |  |  | import {MockXHR} from 'angular2/src/compiler/xhr_mock'; | 
					
						
							| 
									
										
										
										
											2015-10-05 10:10:07 -07:00
										 |  |  | import {ViewEncapsulation} from 'angular2/src/core/metadata/view'; | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | import {Locals} from 'angular2/src/core/change_detection/change_detection'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import { | 
					
						
							|  |  |  |   CommandVisitor, | 
					
						
							|  |  |  |   TextCmd, | 
					
						
							|  |  |  |   NgContentCmd, | 
					
						
							|  |  |  |   BeginElementCmd, | 
					
						
							|  |  |  |   BeginComponentCmd, | 
					
						
							|  |  |  |   EmbeddedTemplateCmd, | 
					
						
							|  |  |  |   TemplateCmd, | 
					
						
							|  |  |  |   visitAllCommands, | 
					
						
							| 
									
										
										
										
											2015-11-02 08:39:14 -08:00
										 |  |  |   CompiledComponentTemplate | 
					
						
							| 
									
										
										
										
											2015-10-02 07:37:23 -07:00
										 |  |  | } from 'angular2/src/core/linker/template_commands'; | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-10 22:11:13 -07:00
										 |  |  | import {Component, View, Directive, provide} from 'angular2/core'; | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-10 22:11:13 -07:00
										 |  |  | import {TEST_PROVIDERS} from './test_bindings'; | 
					
						
							| 
									
										
										
										
											2015-10-01 10:07:49 -07:00
										 |  |  | import {TestDispatcher, TestPipes} from './change_detector_mocks'; | 
					
						
							| 
									
										
										
										
											2015-11-05 14:07:57 -08:00
										 |  |  | import {codeGenValueFn, codeGenExportVariable, MODULE_SUFFIX} from 'angular2/src/compiler/util'; | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Attention: This path has to point to this test file!
 | 
					
						
							| 
									
										
										
										
											2015-11-05 14:07:57 -08:00
										 |  |  | const THIS_MODULE_ID = 'angular2/test/compiler/template_compiler_spec'; | 
					
						
							| 
									
										
										
										
											2015-10-01 10:07:49 -07:00
										 |  |  | var THIS_MODULE_REF = moduleRef(`package:${THIS_MODULE_ID}${MODULE_SUFFIX}`); | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | export function main() { | 
					
						
							|  |  |  |   describe('TemplateCompiler', () => { | 
					
						
							|  |  |  |     var compiler: TemplateCompiler; | 
					
						
							|  |  |  |     var runtimeMetadataResolver: RuntimeMetadataResolver; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-24 11:26:37 -08:00
										 |  |  |     beforeEachProviders(() => TEST_PROVIDERS); | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |     beforeEach(inject([TemplateCompiler, RuntimeMetadataResolver], | 
					
						
							|  |  |  |                       (_compiler, _runtimeMetadataResolver) => { | 
					
						
							|  |  |  |                         compiler = _compiler; | 
					
						
							|  |  |  |                         runtimeMetadataResolver = _runtimeMetadataResolver; | 
					
						
							|  |  |  |                       })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('compile templates', () => { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       function runTests(compile) { | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |         it('should throw for non components', inject([AsyncTestCompleter], (async) => { | 
					
						
							|  |  |  |              PromiseWrapper.catchError(PromiseWrapper.wrap(() => compile([NonComponent])), (error) => { | 
					
						
							|  |  |  |                expect(error.message) | 
					
						
							|  |  |  |                    .toEqual( | 
					
						
							|  |  |  |                        `Could not compile '${stringify(NonComponent)}' because it is not a component.`); | 
					
						
							|  |  |  |                async.done(); | 
					
						
							|  |  |  |              }); | 
					
						
							|  |  |  |            })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |         it('should compile host components', inject([AsyncTestCompleter], (async) => { | 
					
						
							|  |  |  |              compile([CompWithBindingsAndStyles]) | 
					
						
							|  |  |  |                  .then((humanizedTemplate) => { | 
					
						
							|  |  |  |                    expect(humanizedTemplate['styles']).toEqual([]); | 
					
						
							|  |  |  |                    expect(humanizedTemplate['commands'][0]).toEqual('<comp-a>'); | 
					
						
							|  |  |  |                    expect(humanizedTemplate['cd']).toEqual(['elementProperty(title)=someDirValue']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                    async.done(); | 
					
						
							|  |  |  |                  }); | 
					
						
							|  |  |  |            })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should compile nested components', inject([AsyncTestCompleter], (async) => { | 
					
						
							|  |  |  |              compile([CompWithBindingsAndStyles]) | 
					
						
							|  |  |  |                  .then((humanizedTemplate) => { | 
					
						
							|  |  |  |                    var nestedTemplate = humanizedTemplate['commands'][1]; | 
					
						
							|  |  |  |                    expect(nestedTemplate['styles']).toEqual(['div {color: red}']); | 
					
						
							|  |  |  |                    expect(nestedTemplate['commands'][0]).toEqual('<a>'); | 
					
						
							|  |  |  |                    expect(nestedTemplate['cd']).toEqual(['elementProperty(href)=someCtxValue']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                    async.done(); | 
					
						
							|  |  |  |                  }); | 
					
						
							|  |  |  |            })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should compile recursive components', inject([AsyncTestCompleter], (async) => { | 
					
						
							|  |  |  |              compile([TreeComp]) | 
					
						
							|  |  |  |                  .then((humanizedTemplate) => { | 
					
						
							|  |  |  |                    expect(humanizedTemplate['commands'][0]).toEqual('<tree>'); | 
					
						
							|  |  |  |                    expect(humanizedTemplate['commands'][1]['commands'][0]).toEqual('<tree>'); | 
					
						
							|  |  |  |                    expect(humanizedTemplate['commands'][1]['commands'][1]['commands'][0]) | 
					
						
							|  |  |  |                        .toEqual('<tree>'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                    async.done(); | 
					
						
							|  |  |  |                  }); | 
					
						
							|  |  |  |            })); | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         it('should pass the right change detector to embedded templates', | 
					
						
							|  |  |  |            inject([AsyncTestCompleter], (async) => { | 
					
						
							|  |  |  |              compile([CompWithEmbeddedTemplate]) | 
					
						
							|  |  |  |                  .then((humanizedTemplate) => { | 
					
						
							|  |  |  |                    expect(humanizedTemplate['commands'][1]['commands'][0]).toEqual('<template>'); | 
					
						
							|  |  |  |                    expect(humanizedTemplate['commands'][1]['commands'][1]['cd']) | 
					
						
							|  |  |  |                        .toEqual(['elementProperty(href)=someCtxValue']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                    async.done(); | 
					
						
							|  |  |  |                  }); | 
					
						
							|  |  |  |            })); | 
					
						
							| 
									
										
										
										
											2015-11-24 11:26:37 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         it('should dedup directives', inject([AsyncTestCompleter], (async) => { | 
					
						
							|  |  |  |              compile([CompWithDupDirectives, TreeComp]) | 
					
						
							|  |  |  |                  .then((humanizedTemplate) => { | 
					
						
							|  |  |  |                    expect(humanizedTemplate['commands'][1]['commands'][0]).toEqual("<tree>"); | 
					
						
							|  |  |  |                    async.done(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                  }); | 
					
						
							|  |  |  |            })); | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-24 11:26:37 -08:00
										 |  |  |       describe('compileHostComponentRuntime', () => { | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |         function compile(components: Type[]): Promise<any[]> { | 
					
						
							| 
									
										
										
										
											2015-09-28 10:30:33 -07:00
										 |  |  |           return compiler.compileHostComponentRuntime(components[0]) | 
					
						
							| 
									
										
										
										
											2015-11-02 08:39:14 -08:00
										 |  |  |               .then((compiledHostTemplate) => humanizeTemplate(compiledHostTemplate.template)); | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         runTests(compile); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |         it('should cache components for parallel requests', | 
					
						
							|  |  |  |            inject([AsyncTestCompleter, XHR], (async, xhr: MockXHR) => { | 
					
						
							| 
									
										
										
										
											2015-11-05 14:07:57 -08:00
										 |  |  |              xhr.expect('package:angular2/test/compiler/compUrl.html', 'a'); | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |              PromiseWrapper.all([compile([CompWithTemplateUrl]), compile([CompWithTemplateUrl])]) | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |                  .then((humanizedTemplates) => { | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |                    expect(humanizedTemplates[0]['commands'][1]['commands']).toEqual(['#text(a)']); | 
					
						
							|  |  |  |                    expect(humanizedTemplates[1]['commands'][1]['commands']).toEqual(['#text(a)']); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |                    async.done(); | 
					
						
							|  |  |  |                  }); | 
					
						
							|  |  |  |              xhr.flush(); | 
					
						
							|  |  |  |            })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |         it('should cache components for sequential requests', | 
					
						
							|  |  |  |            inject([AsyncTestCompleter, XHR], (async, xhr: MockXHR) => { | 
					
						
							| 
									
										
										
										
											2015-11-05 14:07:57 -08:00
										 |  |  |              xhr.expect('package:angular2/test/compiler/compUrl.html', 'a'); | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |              compile([CompWithTemplateUrl]) | 
					
						
							|  |  |  |                  .then((humanizedTemplate0) => { | 
					
						
							|  |  |  |                    return compile([CompWithTemplateUrl]) | 
					
						
							|  |  |  |                        .then((humanizedTemplate1) => { | 
					
						
							|  |  |  |                          expect(humanizedTemplate0['commands'][1]['commands']) | 
					
						
							|  |  |  |                              .toEqual(['#text(a)']); | 
					
						
							|  |  |  |                          expect(humanizedTemplate1['commands'][1]['commands']) | 
					
						
							|  |  |  |                              .toEqual(['#text(a)']); | 
					
						
							|  |  |  |                          async.done(); | 
					
						
							|  |  |  |                        }); | 
					
						
							|  |  |  |                  }); | 
					
						
							|  |  |  |              xhr.flush(); | 
					
						
							|  |  |  |            })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should allow to clear the cache', | 
					
						
							|  |  |  |            inject([AsyncTestCompleter, XHR], (async, xhr: MockXHR) => { | 
					
						
							| 
									
										
										
										
											2015-11-05 14:07:57 -08:00
										 |  |  |              xhr.expect('package:angular2/test/compiler/compUrl.html', 'a'); | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |              compile([CompWithTemplateUrl]) | 
					
						
							|  |  |  |                  .then((humanizedTemplate) => { | 
					
						
							|  |  |  |                    compiler.clearCache(); | 
					
						
							| 
									
										
										
										
											2015-11-05 14:07:57 -08:00
										 |  |  |                    xhr.expect('package:angular2/test/compiler/compUrl.html', 'b'); | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |                    var result = compile([CompWithTemplateUrl]); | 
					
						
							|  |  |  |                    xhr.flush(); | 
					
						
							|  |  |  |                    return result; | 
					
						
							|  |  |  |                  }) | 
					
						
							|  |  |  |                  .then((humanizedTemplate) => { | 
					
						
							|  |  |  |                    expect(humanizedTemplate['commands'][1]['commands']).toEqual(['#text(b)']); | 
					
						
							|  |  |  |                    async.done(); | 
					
						
							|  |  |  |                  }); | 
					
						
							|  |  |  |              xhr.flush(); | 
					
						
							|  |  |  |            })); | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       describe('compileTemplatesCodeGen', () => { | 
					
						
							| 
									
										
										
										
											2015-10-28 08:59:19 +01:00
										 |  |  |         function normalizeComponent( | 
					
						
							|  |  |  |             component: Type): Promise<NormalizedComponentWithViewDirectives> { | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |           var compAndViewDirMetas = [runtimeMetadataResolver.getMetadata(component)].concat( | 
					
						
							|  |  |  |               runtimeMetadataResolver.getViewDirectivesMetadata(component)); | 
					
						
							| 
									
										
										
										
											2015-09-17 09:58:18 -07:00
										 |  |  |           return PromiseWrapper.all(compAndViewDirMetas.map( | 
					
						
							|  |  |  |                                         meta => compiler.normalizeDirectiveMetadata(meta))) | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |               .then((normalizedCompAndViewDirMetas: CompileDirectiveMetadata[]) => | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |                         new NormalizedComponentWithViewDirectives( | 
					
						
							|  |  |  |                             normalizedCompAndViewDirMetas[0], | 
					
						
							|  |  |  |                             normalizedCompAndViewDirMetas.slice(1))); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         function compile(components: Type[]): Promise<any[]> { | 
					
						
							|  |  |  |           return PromiseWrapper.all(components.map(normalizeComponent)) | 
					
						
							|  |  |  |               .then((normalizedCompWithViewDirMetas: NormalizedComponentWithViewDirectives[]) => { | 
					
						
							| 
									
										
										
										
											2015-10-01 10:07:49 -07:00
										 |  |  |                 var sourceModule = compiler.compileTemplatesCodeGen(normalizedCompWithViewDirMetas); | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |                 var sourceWithImports = | 
					
						
							|  |  |  |                     testableTemplateModule(sourceModule, | 
					
						
							|  |  |  |                                            normalizedCompWithViewDirMetas[0].component) | 
					
						
							|  |  |  |                         .getSourceWithImports(); | 
					
						
							|  |  |  |                 return evalModule(sourceWithImports.source, sourceWithImports.imports, null); | 
					
						
							|  |  |  |               }); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         runTests(compile); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-17 09:58:18 -07:00
										 |  |  |     describe('normalizeDirectiveMetadata', () => { | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |       it('should return the given DirectiveMetadata for non components', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter], (async) => { | 
					
						
							|  |  |  |            var meta = runtimeMetadataResolver.getMetadata(NonComponent); | 
					
						
							|  |  |  |            compiler.normalizeDirectiveMetadata(meta).then(normMeta => { | 
					
						
							|  |  |  |              expect(normMeta).toBe(meta); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							|  |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |       it('should normalize the template', | 
					
						
							|  |  |  |          inject([AsyncTestCompleter, XHR], (async, xhr: MockXHR) => { | 
					
						
							| 
									
										
										
										
											2015-11-05 14:07:57 -08:00
										 |  |  |            xhr.expect('package:angular2/test/compiler/compUrl.html', 'loadedTemplate'); | 
					
						
							| 
									
										
										
										
											2015-09-17 09:58:18 -07:00
										 |  |  |            compiler.normalizeDirectiveMetadata( | 
					
						
							|  |  |  |                        runtimeMetadataResolver.getMetadata(CompWithTemplateUrl)) | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |                .then((meta: CompileDirectiveMetadata) => { | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |                  expect(meta.template.template).toEqual('loadedTemplate'); | 
					
						
							|  |  |  |                  async.done(); | 
					
						
							|  |  |  |                }); | 
					
						
							|  |  |  |            xhr.flush(); | 
					
						
							|  |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should copy all the other fields', inject([AsyncTestCompleter], (async) => { | 
					
						
							|  |  |  |            var meta = runtimeMetadataResolver.getMetadata(CompWithBindingsAndStyles); | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |            compiler.normalizeDirectiveMetadata(meta).then((normMeta: CompileDirectiveMetadata) => { | 
					
						
							|  |  |  |              expect(normMeta.type).toEqual(meta.type); | 
					
						
							|  |  |  |              expect(normMeta.isComponent).toEqual(meta.isComponent); | 
					
						
							|  |  |  |              expect(normMeta.dynamicLoadable).toEqual(meta.dynamicLoadable); | 
					
						
							|  |  |  |              expect(normMeta.selector).toEqual(meta.selector); | 
					
						
							|  |  |  |              expect(normMeta.exportAs).toEqual(meta.exportAs); | 
					
						
							|  |  |  |              expect(normMeta.changeDetection).toEqual(meta.changeDetection); | 
					
						
							| 
									
										
										
										
											2015-09-30 20:59:23 -07:00
										 |  |  |              expect(normMeta.inputs).toEqual(meta.inputs); | 
					
						
							|  |  |  |              expect(normMeta.outputs).toEqual(meta.outputs); | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |              expect(normMeta.hostListeners).toEqual(meta.hostListeners); | 
					
						
							|  |  |  |              expect(normMeta.hostProperties).toEqual(meta.hostProperties); | 
					
						
							|  |  |  |              expect(normMeta.hostAttributes).toEqual(meta.hostAttributes); | 
					
						
							|  |  |  |              expect(normMeta.lifecycleHooks).toEqual(meta.lifecycleHooks); | 
					
						
							|  |  |  |              async.done(); | 
					
						
							|  |  |  |            }); | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |          })); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('compileStylesheetCodeGen', () => { | 
					
						
							|  |  |  |       it('should compile stylesheets into code', inject([AsyncTestCompleter], (async) => { | 
					
						
							|  |  |  |            var cssText = 'div {color: red}'; | 
					
						
							| 
									
										
										
										
											2015-10-01 10:07:49 -07:00
										 |  |  |            var sourceModule = | 
					
						
							|  |  |  |                compiler.compileStylesheetCodeGen('package:someModuleUrl', cssText)[0]; | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |            var sourceWithImports = testableStylesModule(sourceModule).getSourceWithImports(); | 
					
						
							|  |  |  |            evalModule(sourceWithImports.source, sourceWithImports.imports, null) | 
					
						
							|  |  |  |                .then(loadedCssText => { | 
					
						
							|  |  |  |                  expect(loadedCssText).toEqual([cssText]); | 
					
						
							|  |  |  |                  async.done(); | 
					
						
							|  |  |  |                }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          })); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @Component({ | 
					
						
							|  |  |  |   selector: 'comp-a', | 
					
						
							|  |  |  |   host: {'[title]': 'someProp'}, | 
					
						
							| 
									
										
										
										
											2015-10-01 10:07:49 -07:00
										 |  |  |   moduleId: THIS_MODULE_ID, | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |   exportAs: 'someExportAs' | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  | }) | 
					
						
							| 
									
										
										
										
											2015-10-05 09:49:05 -07:00
										 |  |  | @View({ | 
					
						
							|  |  |  |   template: '<a [href]="someProp"></a>', | 
					
						
							|  |  |  |   styles: ['div {color: red}'], | 
					
						
							|  |  |  |   encapsulation: ViewEncapsulation.None | 
					
						
							|  |  |  | }) | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  | class CompWithBindingsAndStyles { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-01 10:07:49 -07:00
										 |  |  | @Component({selector: 'tree', moduleId: THIS_MODULE_ID}) | 
					
						
							| 
									
										
										
										
											2015-10-05 09:49:05 -07:00
										 |  |  | @View({template: '<tree></tree>', directives: [TreeComp], encapsulation: ViewEncapsulation.None}) | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  | class TreeComp { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-24 11:26:37 -08:00
										 |  |  | @Component({selector: 'comp-wit-dup-tpl', moduleId: THIS_MODULE_ID}) | 
					
						
							|  |  |  | @View({ | 
					
						
							|  |  |  |   template: '<tree></tree>', | 
					
						
							|  |  |  |   directives: [TreeComp, TreeComp], | 
					
						
							|  |  |  |   encapsulation: ViewEncapsulation.None | 
					
						
							|  |  |  | }) | 
					
						
							|  |  |  | class CompWithDupDirectives { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-01 10:07:49 -07:00
										 |  |  | @Component({selector: 'comp-url', moduleId: THIS_MODULE_ID}) | 
					
						
							| 
									
										
										
										
											2015-10-05 09:49:05 -07:00
										 |  |  | @View({templateUrl: 'compUrl.html', encapsulation: ViewEncapsulation.None}) | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  | class CompWithTemplateUrl { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-01 10:07:49 -07:00
										 |  |  | @Component({selector: 'comp-tpl', moduleId: THIS_MODULE_ID}) | 
					
						
							| 
									
										
										
										
											2015-10-05 09:49:05 -07:00
										 |  |  | @View({ | 
					
						
							|  |  |  |   template: '<template><a [href]="someProp"></a></template>', | 
					
						
							|  |  |  |   encapsulation: ViewEncapsulation.None | 
					
						
							|  |  |  | }) | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  | class CompWithEmbeddedTemplate { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-01 10:07:49 -07:00
										 |  |  | @Directive({selector: 'plain', moduleId: THIS_MODULE_ID}) | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  | @View({template: ''}) | 
					
						
							|  |  |  | class NonComponent { | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-28 08:59:19 +01:00
										 |  |  | function testableTemplateModule(sourceModule: SourceModule, | 
					
						
							|  |  |  |                                 normComp: CompileDirectiveMetadata): SourceModule { | 
					
						
							| 
									
										
										
										
											2015-09-28 10:30:33 -07:00
										 |  |  |   var resultExpression = | 
					
						
							| 
									
										
										
										
											2015-11-02 08:39:14 -08:00
										 |  |  |       `${THIS_MODULE_REF}humanizeTemplate(Host${normComp.type.name}Template.template)`; | 
					
						
							| 
									
										
										
										
											2015-09-17 09:58:18 -07:00
										 |  |  |   var testableSource = `${sourceModule.sourceWithModuleRefs}
 | 
					
						
							| 
									
										
										
										
											2015-11-02 08:39:14 -08:00
										 |  |  |   ${codeGenValueFn(['_'], resultExpression, '_run')}; | 
					
						
							|  |  |  |   ${codeGenExportVariable('run')}_run;`;
 | 
					
						
							| 
									
										
										
										
											2015-10-01 10:07:49 -07:00
										 |  |  |   return new SourceModule(sourceModule.moduleUrl, testableSource); | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function testableStylesModule(sourceModule: SourceModule): SourceModule { | 
					
						
							| 
									
										
										
										
											2015-09-17 09:58:18 -07:00
										 |  |  |   var testableSource = `${sourceModule.sourceWithModuleRefs}
 | 
					
						
							| 
									
										
										
										
											2015-11-02 08:39:14 -08:00
										 |  |  |   ${codeGenValueFn(['_'], 'STYLES', '_run')}; | 
					
						
							|  |  |  |   ${codeGenExportVariable('run')}_run;`;
 | 
					
						
							| 
									
										
										
										
											2015-10-01 10:07:49 -07:00
										 |  |  |   return new SourceModule(sourceModule.moduleUrl, testableSource); | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Attention: read by eval!
 | 
					
						
							| 
									
										
										
										
											2015-10-28 08:59:19 +01:00
										 |  |  | export function humanizeTemplate( | 
					
						
							| 
									
										
										
										
											2015-11-02 08:39:14 -08:00
										 |  |  |     template: CompiledComponentTemplate, | 
					
						
							|  |  |  |     humanizedTemplates: Map<string, {[key: string]: any}> = null): {[key: string]: any} { | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |   if (isBlank(humanizedTemplates)) { | 
					
						
							| 
									
										
										
										
											2015-11-02 08:39:14 -08:00
										 |  |  |     humanizedTemplates = new Map<string, {[key: string]: any}>(); | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |   } | 
					
						
							|  |  |  |   var result = humanizedTemplates.get(template.id); | 
					
						
							|  |  |  |   if (isPresent(result)) { | 
					
						
							|  |  |  |     return result; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   var commands = []; | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |   result = { | 
					
						
							| 
									
										
										
										
											2015-11-02 08:39:14 -08:00
										 |  |  |     'styles': template.styles, | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |     'commands': commands, | 
					
						
							| 
									
										
										
										
											2015-11-02 08:39:14 -08:00
										 |  |  |     'cd': testChangeDetector(template.changeDetectorFactory) | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |   }; | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |   humanizedTemplates.set(template.id, result); | 
					
						
							| 
									
										
										
										
											2015-11-02 08:39:14 -08:00
										 |  |  |   visitAllCommands(new CommandHumanizer(commands, humanizedTemplates), template.commands); | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |   return result; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-01 10:07:49 -07:00
										 |  |  | class TestContext implements CompWithBindingsAndStyles, TreeComp, CompWithTemplateUrl, | 
					
						
							| 
									
										
										
										
											2015-11-24 11:26:37 -08:00
										 |  |  |     CompWithEmbeddedTemplate, CompWithDupDirectives { | 
					
						
							| 
									
										
										
										
											2015-10-01 10:07:49 -07:00
										 |  |  |   someProp: string; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | function testChangeDetector(changeDetectorFactory: Function): string[] { | 
					
						
							|  |  |  |   var ctx = new TestContext(); | 
					
						
							|  |  |  |   ctx.someProp = 'someCtxValue'; | 
					
						
							|  |  |  |   var dir1 = new TestContext(); | 
					
						
							|  |  |  |   dir1.someProp = 'someDirValue'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var dispatcher = new TestDispatcher([dir1], []); | 
					
						
							|  |  |  |   var cd = changeDetectorFactory(dispatcher); | 
					
						
							|  |  |  |   var locals = new Locals(null, MapWrapper.createFromStringMap({'someVar': null})); | 
					
						
							|  |  |  |   cd.hydrate(ctx, locals, dispatcher, new TestPipes()); | 
					
						
							|  |  |  |   cd.detectChanges(); | 
					
						
							|  |  |  |   return dispatcher.log; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class CommandHumanizer implements CommandVisitor { | 
					
						
							|  |  |  |   constructor(private result: any[], | 
					
						
							| 
									
										
										
										
											2015-11-02 08:39:14 -08:00
										 |  |  |               private humanizedTemplates: Map<string, {[key: string]: any}>) {} | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |   visitText(cmd: TextCmd, context: any): any { | 
					
						
							|  |  |  |     this.result.push(`#text(${cmd.value})`); | 
					
						
							|  |  |  |     return null; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |   visitNgContent(cmd: NgContentCmd, context: any): any { return null; } | 
					
						
							|  |  |  |   visitBeginElement(cmd: BeginElementCmd, context: any): any { | 
					
						
							|  |  |  |     this.result.push(`<${cmd.name}>`); | 
					
						
							|  |  |  |     return null; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   visitEndElement(context: any): any { | 
					
						
							|  |  |  |     this.result.push('</>'); | 
					
						
							|  |  |  |     return null; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   visitBeginComponent(cmd: BeginComponentCmd, context: any): any { | 
					
						
							|  |  |  |     this.result.push(`<${cmd.name}>`); | 
					
						
							| 
									
										
										
										
											2015-11-02 08:39:14 -08:00
										 |  |  |     this.result.push(humanizeTemplate(cmd.templateGetter(), this.humanizedTemplates)); | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |     return null; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   visitEndComponent(context: any): any { return this.visitEndElement(context); } | 
					
						
							| 
									
										
										
										
											2015-09-18 10:33:23 -07:00
										 |  |  |   visitEmbeddedTemplate(cmd: EmbeddedTemplateCmd, context: any): any { | 
					
						
							|  |  |  |     this.result.push(`<template>`); | 
					
						
							|  |  |  |     this.result.push({'cd': testChangeDetector(cmd.changeDetectorFactory)}); | 
					
						
							|  |  |  |     this.result.push(`</template>`); | 
					
						
							|  |  |  |     return null; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  | } |