129 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import {beforeEach, ddescribe, describe, expect, iit, it} from '@angular/core/testing/testing_internal';
 | |
| import * as ts from 'typescript';
 | |
| 
 | |
| import {ReflectorHost} from '../src/reflector_host';
 | |
| 
 | |
| import {Directory, Entry, MockCompilerHost, MockContext} from './mocks';
 | |
| 
 | |
| describe('reflector_host', () => {
 | |
|   var context: MockContext;
 | |
|   var host: ts.CompilerHost;
 | |
|   var program: ts.Program;
 | |
|   var reflectorHost: ReflectorHost;
 | |
| 
 | |
|   beforeEach(() => {
 | |
|     context = new MockContext('/tmp/src', clone(FILES));
 | |
|     host = new MockCompilerHost(context)
 | |
|     program = ts.createProgram(
 | |
|         ['main.ts'], {
 | |
|           module: ts.ModuleKind.CommonJS,
 | |
|         },
 | |
|         host);
 | |
|     // Force a typecheck
 | |
|     let errors = program.getSemanticDiagnostics();
 | |
|     if (errors && errors.length) {
 | |
|       throw new Error('Expected no errors');
 | |
|     }
 | |
|     reflectorHost = new ReflectorHost(
 | |
|         program, host, {
 | |
|           genDir: '/tmp/dist',
 | |
|           basePath: '/tmp/src',
 | |
|           skipMetadataEmit: false,
 | |
|           skipTemplateCodegen: false,
 | |
|           trace: false
 | |
|         },
 | |
|         context);
 | |
|   });
 | |
| 
 | |
|   it('should provide the import locations for angular', () => {
 | |
|     let {coreDecorators, diDecorators, diMetadata, animationMetadata, provider} =
 | |
|         reflectorHost.angularImportLocations();
 | |
|     expect(coreDecorators).toEqual('@angular/core/src/metadata');
 | |
|     expect(diDecorators).toEqual('@angular/core/src/di/decorators');
 | |
|     expect(diMetadata).toEqual('@angular/core/src/di/metadata');
 | |
|     expect(animationMetadata).toEqual('@angular/core/src/animation/metadata');
 | |
|     expect(provider).toEqual('@angular/core/src/di/provider');
 | |
|   });
 | |
| 
 | |
|   it('should be able to produce an import from main @angular/core', () => {
 | |
|     expect(reflectorHost.getImportPath('main.ts', 'node_modules/@angular/core.d.ts'))
 | |
|         .toEqual('@angular/core');
 | |
|   });
 | |
| 
 | |
|   it('should be ble to produce an import from main to a sub-directory', () => {
 | |
|     expect(reflectorHost.getImportPath('main.ts', 'lib/utils.ts')).toEqual('./lib/utils');
 | |
|   });
 | |
| 
 | |
|   it('should be able to produce an import from to a peer file', () => {
 | |
|     expect(reflectorHost.getImportPath('lib/utils.ts', 'lib/collections.ts'))
 | |
|         .toEqual('./collections');
 | |
|   });
 | |
| 
 | |
|   it('should be able to produce an import from to a sibling directory', () => {
 | |
|     expect(reflectorHost.getImportPath('lib2/utils2.ts', 'lib/utils.ts')).toEqual('../lib/utils');
 | |
|   });
 | |
| 
 | |
|   it('should be able to produce a symbol for an exported symbol', () => {
 | |
|     expect(reflectorHost.findDeclaration('@angular/router-deprecated', 'foo', 'main.ts'))
 | |
|         .toBeDefined();
 | |
|   });
 | |
| 
 | |
|   it('should be able to produce a symbol for values space only reference', () => {
 | |
|     expect(
 | |
|         reflectorHost.findDeclaration('@angular/router-deprecated/src/providers', 'foo', 'main.ts'))
 | |
|         .toBeDefined();
 | |
|   });
 | |
| 
 | |
|   it('should be produce the same symbol if asked twice', () => {
 | |
|     let foo1 = reflectorHost.getStaticSymbol('main.ts', 'foo');
 | |
|     let foo2 = reflectorHost.getStaticSymbol('main.ts', 'foo');
 | |
|     expect(foo1).toBe(foo2);
 | |
|   });
 | |
| 
 | |
|   it('should be able to read a metadata file',
 | |
|      () => {
 | |
|          expect(reflectorHost.getMetadataFor('node_modules/@angular/core.d.ts'))
 | |
|              .toEqual({__symbolic: 'module', version: 1, metadata: {foo: {__symbolic: 'class'}}})});
 | |
| });
 | |
| 
 | |
| const dummyModule = 'export let foo: any[];'
 | |
| const FILES: Entry = {
 | |
|   'tmp': {
 | |
|     'src': {
 | |
|       'main.ts': `
 | |
|         import * as c from '@angular/core';
 | |
|         import * as r from '@angular/router-deprecated';
 | |
|         import * as u from './lib/utils';
 | |
|         import * as cs from './lib/collections';
 | |
|         import * as u2 from './lib2/utils2';
 | |
|       `,
 | |
|       'lib': {
 | |
|         'utils.ts': dummyModule,
 | |
|         'collections.ts': dummyModule,
 | |
|       },
 | |
|       'lib2': {'utils2.ts': dummyModule},
 | |
|       'node_modules': {
 | |
|         '@angular': {
 | |
|           'core.d.ts': dummyModule,
 | |
|           'core.metadata.json':
 | |
|               `{"__symbolic":"module", "version": 1, "metadata": {"foo": {"__symbolic": "class"}}}`,
 | |
|           'router-deprecated':
 | |
|               {'index.d.ts': dummyModule, 'src': {'providers.d.ts': dummyModule}}
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| function clone(entry: Entry): Entry {
 | |
|   if (typeof entry === 'string') {
 | |
|     return entry;
 | |
|   } else {
 | |
|     let result: Directory = {};
 | |
|     for (let name in entry) {
 | |
|       result[name] = clone(entry[name]);
 | |
|     }
 | |
|     return result;
 | |
|   }
 | |
| }
 |