| 
									
										
										
										
											2016-11-29 15:36:33 -08: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-12-15 09:12:40 -08:00
										 |  |  | import {AotSummaryResolver, AotSummaryResolverHost, CompileSummaryKind, CompileTypeSummary, ResolvedStaticSymbol, StaticSymbol, StaticSymbolCache, StaticSymbolResolver} from '@angular/compiler'; | 
					
						
							| 
									
										
										
										
											2016-12-27 09:36:47 -08:00
										 |  |  | import {deserializeSummaries, serializeSummaries} from '@angular/compiler/src/aot/summary_serializer'; | 
					
						
							| 
									
										
										
										
											2017-11-20 10:21:17 -08:00
										 |  |  | import {ConstantPool} from '@angular/compiler/src/constant_pool'; | 
					
						
							| 
									
										
										
										
											2017-05-16 16:30:37 -07:00
										 |  |  | import * as o from '@angular/compiler/src/output/output_ast'; | 
					
						
							|  |  |  | import {OutputContext} from '@angular/compiler/src/util'; | 
					
						
							| 
									
										
										
										
											2016-11-29 15:36:33 -08:00
										 |  |  | import * as path from 'path'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-15 09:12:40 -08:00
										 |  |  | import {MockStaticSymbolResolverHost, MockSummaryResolver} from './static_symbol_resolver_spec'; | 
					
						
							| 
									
										
										
										
											2016-11-29 15:36:33 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-27 09:36:47 -08:00
										 |  |  | const EXT = /(\.d)?\.ts$/; | 
					
						
							| 
									
										
										
										
											2016-11-29 15:36:33 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-16 14:42:55 -08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-11-29 15:36:33 -08:00
										 |  |  |   describe('AotSummaryResolver', () => { | 
					
						
							| 
									
										
										
										
											2016-12-15 09:12:40 -08:00
										 |  |  |     let summaryResolver: AotSummaryResolver; | 
					
						
							|  |  |  |     let symbolCache: StaticSymbolCache; | 
					
						
							|  |  |  |     let host: MockAotSummaryResolverHost; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     beforeEach(() => { symbolCache = new StaticSymbolCache(); }); | 
					
						
							| 
									
										
										
										
											2016-11-29 15:36:33 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     function init(summaries: {[filePath: string]: string} = {}) { | 
					
						
							| 
									
										
										
										
											2016-12-15 09:12:40 -08:00
										 |  |  |       host = new MockAotSummaryResolverHost(summaries); | 
					
						
							|  |  |  |       summaryResolver = new AotSummaryResolver(host, symbolCache); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  |     function serialize(symbols: ResolvedStaticSymbol[]): string { | 
					
						
							| 
									
										
										
										
											2016-12-15 09:12:40 -08:00
										 |  |  |       // Note: Don't use the top level host / summaryResolver as they might not be created yet
 | 
					
						
							|  |  |  |       const mockSummaryResolver = new MockSummaryResolver([]); | 
					
						
							|  |  |  |       const symbolResolver = new StaticSymbolResolver( | 
					
						
							|  |  |  |           new MockStaticSymbolResolverHost({}), symbolCache, mockSummaryResolver); | 
					
						
							| 
									
										
										
										
											2017-05-16 16:30:37 -07:00
										 |  |  |       return serializeSummaries( | 
					
						
							| 
									
										
										
										
											2017-08-15 14:41:48 -07:00
										 |  |  |                  'someFile.ts', createMockOutputContext(), mockSummaryResolver, symbolResolver, | 
					
						
							|  |  |  |                  symbols, []) | 
					
						
							| 
									
										
										
										
											2017-05-16 16:30:37 -07:00
										 |  |  |           .json; | 
					
						
							| 
									
										
										
										
											2016-11-29 15:36:33 -08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-15 09:12:40 -08:00
										 |  |  |     it('should load serialized summary files', () => { | 
					
						
							|  |  |  |       const asymbol = symbolCache.get('/a.d.ts', 'a'); | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  |       init({'/a.ngsummary.json': serialize([{symbol: asymbol, metadata: 1}])}); | 
					
						
							| 
									
										
										
										
											2016-12-15 09:12:40 -08:00
										 |  |  |       expect(summaryResolver.resolveSummary(asymbol)).toEqual({symbol: asymbol, metadata: 1}); | 
					
						
							| 
									
										
										
										
											2016-11-29 15:36:33 -08:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-15 09:12:40 -08:00
										 |  |  |     it('should not load summaries for source files', () => { | 
					
						
							|  |  |  |       init({}); | 
					
						
							|  |  |  |       spyOn(host, 'loadSummary').and.callThrough(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(summaryResolver.resolveSummary(symbolCache.get('/a.ts', 'a'))).toBeFalsy(); | 
					
						
							|  |  |  |       expect(host.loadSummary).not.toHaveBeenCalled(); | 
					
						
							| 
									
										
										
										
											2016-12-02 10:08:46 -08:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-15 09:12:40 -08:00
										 |  |  |     it('should cache summaries', () => { | 
					
						
							|  |  |  |       const asymbol = symbolCache.get('/a.d.ts', 'a'); | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  |       init({'/a.ngsummary.json': serialize([{symbol: asymbol, metadata: 1}])}); | 
					
						
							| 
									
										
										
										
											2016-12-15 09:12:40 -08:00
										 |  |  |       expect(summaryResolver.resolveSummary(asymbol)).toBe(summaryResolver.resolveSummary(asymbol)); | 
					
						
							| 
									
										
										
										
											2016-11-29 15:36:33 -08:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-27 09:36:47 -08:00
										 |  |  |     it('should return all symbols in a summary', () => { | 
					
						
							| 
									
										
										
										
											2016-12-15 09:12:40 -08:00
										 |  |  |       const asymbol = symbolCache.get('/a.d.ts', 'a'); | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  |       init({'/a.ngsummary.json': serialize([{symbol: asymbol, metadata: 1}])}); | 
					
						
							| 
									
										
										
										
											2016-12-15 09:12:40 -08:00
										 |  |  |       expect(summaryResolver.getSymbolsOf('/a.d.ts')).toEqual([asymbol]); | 
					
						
							| 
									
										
										
										
											2016-12-27 09:36:47 -08:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should fill importAs for deep symbols', () => { | 
					
						
							|  |  |  |       const libSymbol = symbolCache.get('/lib.d.ts', 'Lib'); | 
					
						
							|  |  |  |       const srcSymbol = symbolCache.get('/src.ts', 'Src'); | 
					
						
							|  |  |  |       init({ | 
					
						
							|  |  |  |         '/src.ngsummary.json': | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  |             serialize([{symbol: srcSymbol, metadata: 1}, {symbol: libSymbol, metadata: 2}]) | 
					
						
							| 
									
										
										
										
											2016-12-27 09:36:47 -08:00
										 |  |  |       }); | 
					
						
							|  |  |  |       summaryResolver.getSymbolsOf('/src.d.ts'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(summaryResolver.getImportAs(symbolCache.get('/src.d.ts', 'Src'))).toBeFalsy(); | 
					
						
							|  |  |  |       expect(summaryResolver.getImportAs(libSymbol)) | 
					
						
							| 
									
										
										
										
											2017-04-26 09:24:42 -07:00
										 |  |  |           .toBe(symbolCache.get('/src.ngfactory.d.ts', 'Lib_1')); | 
					
						
							| 
									
										
										
										
											2016-12-27 09:36:47 -08:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2016-12-15 09:12:40 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-27 09:36:47 -08:00
										 |  |  |     describe('isLibraryFile', () => { | 
					
						
							|  |  |  |       it('should use host.isSourceFile to calculate the result', () => { | 
					
						
							|  |  |  |         init(); | 
					
						
							|  |  |  |         expect(summaryResolver.isLibraryFile('someFile.ts')).toBe(false); | 
					
						
							|  |  |  |         expect(summaryResolver.isLibraryFile('someFile.d.ts')).toBe(true); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should calculate the result for generated files based on the result for non generated files', | 
					
						
							|  |  |  |          () => { | 
					
						
							|  |  |  |            init(); | 
					
						
							|  |  |  |            spyOn(host, 'isSourceFile').and.callThrough(); | 
					
						
							|  |  |  |            expect(summaryResolver.isLibraryFile('someFile.ngfactory.ts')).toBe(false); | 
					
						
							|  |  |  |            expect(host.isSourceFile).toHaveBeenCalledWith('someFile.ts'); | 
					
						
							|  |  |  |          }); | 
					
						
							| 
									
										
										
										
											2016-12-15 09:12:40 -08:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2017-12-11 11:26:12 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     describe('regression', () => { | 
					
						
							|  |  |  |       // #18170
 | 
					
						
							|  |  |  |       it('should support resolving symbol with members ', () => { | 
					
						
							|  |  |  |         init(); | 
					
						
							|  |  |  |         expect(summaryResolver.resolveSummary(symbolCache.get('/src.d.ts', 'Src', ['One', 'Two']))) | 
					
						
							|  |  |  |             .toBeNull(); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2016-11-29 15:36:33 -08:00
										 |  |  |   }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-27 09:36:47 -08:00
										 |  |  | export class MockAotSummaryResolverHost implements AotSummaryResolverHost { | 
					
						
							|  |  |  |   constructor(private summaries: {[fileName: string]: string}) {} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-29 15:36:33 -08:00
										 |  |  |   fileNameToModuleName(fileName: string): string { | 
					
						
							|  |  |  |     return './' + path.basename(fileName).replace(EXT, ''); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-15 14:41:48 -07:00
										 |  |  |   toSummaryFileName(sourceFileName: string): string { | 
					
						
							| 
									
										
										
										
											2016-11-29 15:36:33 -08:00
										 |  |  |     return sourceFileName.replace(EXT, '') + '.d.ts'; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-12-15 09:12:40 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-15 14:41:48 -07:00
										 |  |  |   fromSummaryFileName(filePath: string): string { return filePath; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-15 09:12:40 -08:00
										 |  |  |   isSourceFile(filePath: string) { return !filePath.endsWith('.d.ts'); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   loadSummary(filePath: string): string { return this.summaries[filePath]; } | 
					
						
							| 
									
										
										
										
											2017-05-16 16:30:37 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export function createMockOutputContext(): OutputContext { | 
					
						
							| 
									
										
										
										
											2017-11-20 10:21:17 -08:00
										 |  |  |   return { | 
					
						
							|  |  |  |     statements: [], | 
					
						
							|  |  |  |     genFilePath: 'someGenFilePath', | 
					
						
							|  |  |  |     importExpr: () => o.NULL_EXPR, | 
					
						
							|  |  |  |     constantPool: new ConstantPool() | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2016-11-29 15:36:33 -08:00
										 |  |  | } |