| 
									
										
										
										
											2016-07-21 17:12:00 -07:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @license | 
					
						
							|  |  |  |  * Copyright Google Inc. All Rights Reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Use of this source code is governed by an MIT-style license that can be | 
					
						
							|  |  |  |  * found in the LICENSE file at https://angular.io/license
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-02 15:53:34 -07:00
										 |  |  | import {DirectiveResolver, XHR} from '@angular/compiler'; | 
					
						
							|  |  |  | import {MockDirectiveResolver} from '@angular/compiler/testing'; | 
					
						
							| 
									
										
										
										
											2016-08-10 18:21:28 -07:00
										 |  |  | import {Compiler, Component, ComponentFactory, Injectable, Injector, Input, NgModule, NgModuleFactory, Type, ViewMetadata} from '@angular/core'; | 
					
						
							| 
									
										
										
										
											2016-08-15 21:40:37 -07:00
										 |  |  | import {ComponentFixture, TestBed, fakeAsync, tick} from '@angular/core/testing'; | 
					
						
							|  |  |  | import {TestComponentBuilder, beforeEach, beforeEachProviders, ddescribe, describe, iit, inject, it, xdescribe, xit} from '@angular/core/testing/testing_internal'; | 
					
						
							| 
									
										
										
										
											2016-07-22 09:20:51 -07:00
										 |  |  | import {expect} from '@angular/platform-browser/testing/matchers'; | 
					
						
							| 
									
										
										
										
											2016-08-02 15:53:34 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-10 18:21:28 -07:00
										 |  |  | import {stringify} from '../src/facade/lang'; | 
					
						
							| 
									
										
										
										
											2016-06-24 08:46:43 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | import {SpyXHR} from './spies'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @Component({selector: 'child-cmp', template: 'childComp'}) | 
					
						
							|  |  |  | class ChildComp { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @Component({selector: 'some-cmp', template: 'someComp'}) | 
					
						
							|  |  |  | class SomeComp { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @Component({selector: 'some-cmp', templateUrl: './someTpl'}) | 
					
						
							|  |  |  | class SomeCompWithUrlTemplate { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export function main() { | 
					
						
							|  |  |  |   describe('RuntimeCompiler', () => { | 
					
						
							|  |  |  |     let compiler: Compiler; | 
					
						
							|  |  |  |     let xhr: SpyXHR; | 
					
						
							|  |  |  |     let tcb: TestComponentBuilder; | 
					
						
							| 
									
										
										
										
											2016-07-28 06:31:26 -07:00
										 |  |  |     let dirResolver: MockDirectiveResolver; | 
					
						
							| 
									
										
										
										
											2016-06-24 08:46:43 -07:00
										 |  |  |     let injector: Injector; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-28 04:54:49 -07:00
										 |  |  |     beforeEach( | 
					
						
							|  |  |  |         () => { TestBed.configureCompiler({providers: [{provide: XHR, useClass: SpyXHR}]}); }); | 
					
						
							| 
									
										
										
										
											2016-06-24 08:46:43 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-02 02:32:27 -07:00
										 |  |  |     beforeEach(fakeAsync(inject( | 
					
						
							| 
									
										
										
										
											2016-07-28 06:31:26 -07:00
										 |  |  |         [Compiler, TestComponentBuilder, XHR, DirectiveResolver, Injector], | 
					
						
							| 
									
										
										
										
											2016-06-24 08:46:43 -07:00
										 |  |  |         (_compiler: Compiler, _tcb: TestComponentBuilder, _xhr: SpyXHR, | 
					
						
							| 
									
										
										
										
											2016-07-28 06:31:26 -07:00
										 |  |  |          _dirResolver: MockDirectiveResolver, _injector: Injector) => { | 
					
						
							| 
									
										
										
										
											2016-06-24 08:46:43 -07:00
										 |  |  |           compiler = _compiler; | 
					
						
							|  |  |  |           tcb = _tcb; | 
					
						
							|  |  |  |           xhr = _xhr; | 
					
						
							| 
									
										
										
										
											2016-07-28 06:31:26 -07:00
										 |  |  |           dirResolver = _dirResolver; | 
					
						
							| 
									
										
										
										
											2016-06-24 08:46:43 -07:00
										 |  |  |           injector = _injector; | 
					
						
							| 
									
										
										
										
											2016-08-02 02:32:27 -07:00
										 |  |  |         }))); | 
					
						
							| 
									
										
										
										
											2016-06-24 08:46:43 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     describe('clearCacheFor', () => { | 
					
						
							|  |  |  |       it('should support changing the content of a template referenced via templateUrl', | 
					
						
							|  |  |  |          fakeAsync(() => { | 
					
						
							|  |  |  |            xhr.spy('get').andCallFake(() => Promise.resolve('init')); | 
					
						
							|  |  |  |            let compFixture = | 
					
						
							|  |  |  |                tcb.overrideView(SomeComp, new ViewMetadata({templateUrl: '/myComp.html'})) | 
					
						
							|  |  |  |                    .createFakeAsync(SomeComp); | 
					
						
							|  |  |  |            expect(compFixture.nativeElement).toHaveText('init'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            xhr.spy('get').andCallFake(() => Promise.resolve('new content')); | 
					
						
							|  |  |  |            // Note: overrideView is calling .clearCacheFor...
 | 
					
						
							|  |  |  |            compFixture = tcb.overrideView(SomeComp, new ViewMetadata({templateUrl: '/myComp.html'})) | 
					
						
							|  |  |  |                              .createFakeAsync(SomeComp); | 
					
						
							|  |  |  |            expect(compFixture.nativeElement).toHaveText('new content'); | 
					
						
							|  |  |  |          })); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should support overwriting inline templates', () => { | 
					
						
							|  |  |  |         let componentFixture = tcb.createSync(SomeComp); | 
					
						
							|  |  |  |         expect(componentFixture.nativeElement).toHaveText('someComp'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         componentFixture = tcb.overrideTemplate(SomeComp, 'test').createSync(SomeComp); | 
					
						
							|  |  |  |         expect(componentFixture.nativeElement).toHaveText('test'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should not update existing compilation results', () => { | 
					
						
							| 
									
										
										
										
											2016-07-28 06:31:26 -07:00
										 |  |  |         dirResolver.setView( | 
					
						
							| 
									
										
										
										
											2016-06-24 08:46:43 -07:00
										 |  |  |             SomeComp, | 
					
						
							|  |  |  |             new ViewMetadata({template: '<child-cmp></child-cmp>', directives: [ChildComp]})); | 
					
						
							| 
									
										
										
										
											2016-07-28 06:31:26 -07:00
										 |  |  |         dirResolver.setInlineTemplate(ChildComp, 'oldChild'); | 
					
						
							| 
									
										
										
										
											2016-06-24 08:46:43 -07:00
										 |  |  |         let compFactory = compiler.compileComponentSync(SomeComp); | 
					
						
							| 
									
										
										
										
											2016-07-28 06:31:26 -07:00
										 |  |  |         dirResolver.setInlineTemplate(ChildComp, 'newChild'); | 
					
						
							| 
									
										
										
										
											2016-06-24 08:46:43 -07:00
										 |  |  |         compiler.compileComponentSync(SomeComp); | 
					
						
							|  |  |  |         let compRef = compFactory.create(injector); | 
					
						
							|  |  |  |         expect(compRef.location.nativeElement).toHaveText('oldChild'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('compileComponentSync', () => { | 
					
						
							|  |  |  |       it('should throw when using a templateUrl that has not been compiled before', () => { | 
					
						
							|  |  |  |         xhr.spy('get').andCallFake(() => Promise.resolve('')); | 
					
						
							|  |  |  |         expect(() => tcb.createSync(SomeCompWithUrlTemplate)) | 
					
						
							|  |  |  |             .toThrowError( | 
					
						
							|  |  |  |                 `Can't compile synchronously as ${stringify(SomeCompWithUrlTemplate)} is still being loaded!`); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should throw when using a templateUrl in a nested component that has not been compiled before', | 
					
						
							|  |  |  |          () => { | 
					
						
							|  |  |  |            xhr.spy('get').andCallFake(() => Promise.resolve('')); | 
					
						
							|  |  |  |            let localTcb = | 
					
						
							|  |  |  |                tcb.overrideView(SomeComp, new ViewMetadata({template: '', directives: [ChildComp]})) | 
					
						
							|  |  |  |                    .overrideView(ChildComp, new ViewMetadata({templateUrl: '/someTpl.html'})); | 
					
						
							|  |  |  |            expect(() => localTcb.createSync(SomeComp)) | 
					
						
							|  |  |  |                .toThrowError( | 
					
						
							|  |  |  |                    `Can't compile synchronously as ${stringify(ChildComp)} is still being loaded!`); | 
					
						
							|  |  |  |          }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should allow to use templateUrl components that have been loaded before', | 
					
						
							|  |  |  |          fakeAsync(() => { | 
					
						
							|  |  |  |            xhr.spy('get').andCallFake(() => Promise.resolve('hello')); | 
					
						
							|  |  |  |            tcb.createFakeAsync(SomeCompWithUrlTemplate); | 
					
						
							|  |  |  |            let compFixture = tcb.createSync(SomeCompWithUrlTemplate); | 
					
						
							|  |  |  |            expect(compFixture.nativeElement).toHaveText('hello'); | 
					
						
							|  |  |  |          })); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2016-06-28 09:54:42 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-18 03:50:31 -07:00
										 |  |  |     describe('compileModuleAsync', () => { | 
					
						
							| 
									
										
										
										
											2016-06-28 09:54:42 -07:00
										 |  |  |       it('should allow to use templateUrl components', fakeAsync(() => { | 
					
						
							| 
									
										
										
										
											2016-07-25 00:36:30 -07:00
										 |  |  |            @NgModule({ | 
					
						
							|  |  |  |              declarations: [SomeCompWithUrlTemplate], | 
					
						
							|  |  |  |              entryComponents: [SomeCompWithUrlTemplate] | 
					
						
							|  |  |  |            }) | 
					
						
							| 
									
										
										
										
											2016-07-18 03:50:31 -07:00
										 |  |  |            class SomeModule { | 
					
						
							|  |  |  |            } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-28 09:54:42 -07:00
										 |  |  |            xhr.spy('get').andCallFake(() => Promise.resolve('hello')); | 
					
						
							| 
									
										
										
										
											2016-07-18 03:50:31 -07:00
										 |  |  |            let ngModuleFactory: NgModuleFactory<any>; | 
					
						
							|  |  |  |            compiler.compileModuleAsync(SomeModule).then((f) => ngModuleFactory = f); | 
					
						
							| 
									
										
										
										
											2016-06-28 09:54:42 -07:00
										 |  |  |            tick(); | 
					
						
							| 
									
										
										
										
											2016-07-18 03:50:31 -07:00
										 |  |  |            expect(ngModuleFactory.moduleType).toBe(SomeModule); | 
					
						
							| 
									
										
										
										
											2016-06-28 09:54:42 -07:00
										 |  |  |          })); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-18 03:50:31 -07:00
										 |  |  |     describe('compileModuleSync', () => { | 
					
						
							| 
									
										
										
										
											2016-06-28 09:54:42 -07:00
										 |  |  |       it('should throw when using a templateUrl that has not been compiled before', () => { | 
					
						
							| 
									
										
										
										
											2016-07-25 00:36:30 -07:00
										 |  |  |         @NgModule( | 
					
						
							|  |  |  |             {declarations: [SomeCompWithUrlTemplate], entryComponents: [SomeCompWithUrlTemplate]}) | 
					
						
							| 
									
										
										
										
											2016-07-18 03:50:31 -07:00
										 |  |  |         class SomeModule { | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-28 09:54:42 -07:00
										 |  |  |         xhr.spy('get').andCallFake(() => Promise.resolve('')); | 
					
						
							| 
									
										
										
										
											2016-07-18 03:50:31 -07:00
										 |  |  |         expect(() => compiler.compileModuleSync(SomeModule)) | 
					
						
							| 
									
										
										
										
											2016-06-28 09:54:42 -07:00
										 |  |  |             .toThrowError( | 
					
						
							|  |  |  |                 `Can't compile synchronously as ${stringify(SomeCompWithUrlTemplate)} is still being loaded!`); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should throw when using a templateUrl in a nested component that has not been compiled before', | 
					
						
							|  |  |  |          () => { | 
					
						
							| 
									
										
										
										
											2016-07-25 00:36:30 -07:00
										 |  |  |            @NgModule({declarations: [SomeComp], entryComponents: [SomeComp]}) | 
					
						
							| 
									
										
										
										
											2016-07-18 03:50:31 -07:00
										 |  |  |            class SomeModule { | 
					
						
							|  |  |  |            } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-28 09:54:42 -07:00
										 |  |  |            xhr.spy('get').andCallFake(() => Promise.resolve('')); | 
					
						
							| 
									
										
										
										
											2016-07-28 06:31:26 -07:00
										 |  |  |            dirResolver.setView(SomeComp, new ViewMetadata({template: '', directives: [ChildComp]})); | 
					
						
							|  |  |  |            dirResolver.setView(ChildComp, new ViewMetadata({templateUrl: '/someTpl.html'})); | 
					
						
							| 
									
										
										
										
											2016-07-18 03:50:31 -07:00
										 |  |  |            expect(() => compiler.compileModuleSync(SomeModule)) | 
					
						
							| 
									
										
										
										
											2016-06-28 09:54:42 -07:00
										 |  |  |                .toThrowError( | 
					
						
							|  |  |  |                    `Can't compile synchronously as ${stringify(ChildComp)} is still being loaded!`); | 
					
						
							|  |  |  |          }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should allow to use templateUrl components that have been loaded before', | 
					
						
							|  |  |  |          fakeAsync(() => { | 
					
						
							| 
									
										
										
										
											2016-07-25 00:36:30 -07:00
										 |  |  |            @NgModule({ | 
					
						
							|  |  |  |              declarations: [SomeCompWithUrlTemplate], | 
					
						
							|  |  |  |              entryComponents: [SomeCompWithUrlTemplate] | 
					
						
							|  |  |  |            }) | 
					
						
							| 
									
										
										
										
											2016-07-18 03:50:31 -07:00
										 |  |  |            class SomeModule { | 
					
						
							|  |  |  |            } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-28 09:54:42 -07:00
										 |  |  |            xhr.spy('get').andCallFake(() => Promise.resolve('hello')); | 
					
						
							| 
									
										
										
										
											2016-07-18 03:50:31 -07:00
										 |  |  |            compiler.compileModuleAsync(SomeModule); | 
					
						
							|  |  |  |            tick(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            let ngModuleFactory = compiler.compileModuleSync(SomeModule); | 
					
						
							|  |  |  |            expect(ngModuleFactory).toBeTruthy(); | 
					
						
							| 
									
										
										
										
											2016-06-28 09:54:42 -07:00
										 |  |  |          })); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2016-06-24 08:46:43 -07:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2016-07-22 09:20:51 -07:00
										 |  |  | } |