From f3859ff2b9aa75068250aa1ce4b117c6adfccf3c Mon Sep 17 00:00:00 2001 From: Keen Yee Liau Date: Tue, 17 Sep 2019 14:33:41 -0700 Subject: [PATCH] test(language-service): remove MockData from MockTypescriptHost (#32752) Remove MockData from the constructor parameters of MockTypescriptHost since the entire Tour of Heroes (TOH) project is now loaded from disk. Added a new method `reset()` to MockTypescriptHost that is necessary to reset the state of the project before each spec if run to make sure previous overrides are cleared. PR Close #32752 --- .../language-service/test/completions_spec.ts | 67 +++-- .../language-service/test/definitions_spec.ts | 3 +- .../language-service/test/diagnostics_spec.ts | 3 +- packages/language-service/test/hover_spec.ts | 3 +- .../test/language_service_spec.ts | 5 +- .../test/reflector_host_spec.ts | 6 +- .../test/template_references_spec.ts | 3 +- .../language-service/test/template_spec.ts | 3 +- packages/language-service/test/test_data.ts | 242 ------------------ packages/language-service/test/test_utils.ts | 42 +-- .../language-service/test/ts_plugin_spec.ts | 3 +- .../test/typescript_host_spec.ts | 23 +- 12 files changed, 62 insertions(+), 341 deletions(-) delete mode 100644 packages/language-service/test/test_data.ts diff --git a/packages/language-service/test/completions_spec.ts b/packages/language-service/test/completions_spec.ts index ccb0386df82db..1eafdfd1cbbac 100644 --- a/packages/language-service/test/completions_spec.ts +++ b/packages/language-service/test/completions_spec.ts @@ -11,15 +11,16 @@ import * as ts from 'typescript'; import {createLanguageService} from '../src/language_service'; import {TypeScriptServiceHost} from '../src/typescript_host'; -import {toh} from './test_data'; import {MockTypescriptHost} from './test_utils'; describe('completions', () => { - let mockHost = new MockTypescriptHost(['/app/main.ts', '/app/parsing-cases.ts'], toh); + let mockHost = new MockTypescriptHost(['/app/main.ts', '/app/parsing-cases.ts']); let service = ts.createLanguageService(mockHost); let ngHost = new TypeScriptServiceHost(mockHost, service); let ngService = createLanguageService(ngHost); + beforeEach(() => { mockHost.reset(); }); + it('should be able to get entity completions', () => { expectContains('/app/test.ng', 'entity-amp', '&', '>', '<', 'ι'); }); @@ -44,7 +45,6 @@ describe('completions', () => { const fileName = '/app/test.ng'; mockHost.override(fileName, ' > {{tle<\n {{retl >\n la ngService.getCompletionsAt(fileName, 31)).not.toThrow(); - mockHost.override(fileName, undefined !); }); it('should be able to infer the type of a ngForOf', () => { @@ -68,7 +68,7 @@ describe('completions', () => { street: string } - @Component({template: '
{{person.~{name}name}}{{person.~{name}name}}
'}) export class MyComponent { people: Promise; }`); @@ -92,41 +92,38 @@ describe('completions', () => { throw e; } } - try { - const originalContent = mockHost.getFileContent(fileName) !; - - // For each character in the file, add it to the file and request a completion after it. - for (let index = 0, len = originalContent.length; index < len; index++) { - const content = originalContent.substr(0, index); - mockHost.override(fileName, content); - tryCompletionsAt(index); - } - // For the complete file, try to get a completion at every character. - mockHost.override(fileName, originalContent); - for (let index = 0, len = originalContent.length; index < len; index++) { - tryCompletionsAt(index); - } + const originalContent = mockHost.getFileContent(fileName) !; - // Delete random characters in the file until we get an empty file. - let content = originalContent; - while (content.length > 0) { - const deleteIndex = Math.floor(Math.random() * content.length); - content = content.slice(0, deleteIndex - 1) + content.slice(deleteIndex + 1); - mockHost.override(fileName, content); + // For each character in the file, add it to the file and request a completion after it. + for (let index = 0, len = originalContent.length; index < len; index++) { + const content = originalContent.substr(0, index); + mockHost.override(fileName, content); + tryCompletionsAt(index); + } - const requestIndex = Math.floor(Math.random() * content.length); - tryCompletionsAt(requestIndex); - } + // For the complete file, try to get a completion at every character. + mockHost.override(fileName, originalContent); + for (let index = 0, len = originalContent.length; index < len; index++) { + tryCompletionsAt(index); + } + + // Delete random characters in the file until we get an empty file. + let content = originalContent; + while (content.length > 0) { + const deleteIndex = Math.floor(Math.random() * content.length); + content = content.slice(0, deleteIndex - 1) + content.slice(deleteIndex + 1); + mockHost.override(fileName, content); - // Build up the string from zero asking for a completion after every char - buildUp(originalContent, (text, position) => { - mockHost.override(fileName, text); - tryCompletionsAt(position); - }); - } finally { - mockHost.override(fileName, undefined !); + const requestIndex = Math.floor(Math.random() * content.length); + tryCompletionsAt(requestIndex); } + + // Build up the string from zero asking for a completion after every char + buildUp(originalContent, (text, position) => { + mockHost.override(fileName, text); + tryCompletionsAt(position); + }); }).not.toThrow(); }); @@ -138,7 +135,7 @@ describe('completions', () => { template: '~{inside-template}' }) export class MyComponent { - + }`); expectContains(fileName, 'inside-template', 'h1'); diff --git a/packages/language-service/test/definitions_spec.ts b/packages/language-service/test/definitions_spec.ts index f9b9a00ee1cda..ebd54465d482c 100644 --- a/packages/language-service/test/definitions_spec.ts +++ b/packages/language-service/test/definitions_spec.ts @@ -12,7 +12,6 @@ import {createLanguageService} from '../src/language_service'; import {LanguageService} from '../src/types'; import {TypeScriptServiceHost} from '../src/typescript_host'; -import {toh} from './test_data'; import {MockTypescriptHost} from './test_utils'; describe('definitions', () => { @@ -23,7 +22,7 @@ describe('definitions', () => { beforeEach(() => { // Create a new mockHost every time to reset any files that are overridden. - mockHost = new MockTypescriptHost(['/app/main.ts', '/app/parsing-cases.ts'], toh); + mockHost = new MockTypescriptHost(['/app/main.ts', '/app/parsing-cases.ts']); service = ts.createLanguageService(mockHost); ngHost = new TypeScriptServiceHost(mockHost, service); ngService = createLanguageService(ngHost); diff --git a/packages/language-service/test/diagnostics_spec.ts b/packages/language-service/test/diagnostics_spec.ts index d7847c559f3c9..fbd44e6860597 100644 --- a/packages/language-service/test/diagnostics_spec.ts +++ b/packages/language-service/test/diagnostics_spec.ts @@ -10,7 +10,6 @@ import * as ts from 'typescript'; import {createLanguageService} from '../src/language_service'; import * as ng from '../src/types'; import {TypeScriptServiceHost} from '../src/typescript_host'; -import {toh} from './test_data'; import {MockTypescriptHost} from './test_utils'; /** @@ -32,7 +31,7 @@ describe('diagnostics', () => { let ngLS: ng.LanguageService; beforeEach(() => { - mockHost = new MockTypescriptHost(['/app/main.ts', '/app/parsing-cases.ts'], toh); + mockHost = new MockTypescriptHost(['/app/main.ts', '/app/parsing-cases.ts']); tsLS = ts.createLanguageService(mockHost); ngHost = new TypeScriptServiceHost(mockHost, tsLS); ngLS = createLanguageService(ngHost); diff --git a/packages/language-service/test/hover_spec.ts b/packages/language-service/test/hover_spec.ts index 29f06808afd8b..17309044e04ba 100644 --- a/packages/language-service/test/hover_spec.ts +++ b/packages/language-service/test/hover_spec.ts @@ -12,7 +12,6 @@ import {createLanguageService} from '../src/language_service'; import {LanguageService} from '../src/types'; import {TypeScriptServiceHost} from '../src/typescript_host'; -import {toh} from './test_data'; import {MockTypescriptHost} from './test_utils'; describe('hover', () => { @@ -22,7 +21,7 @@ describe('hover', () => { let ngLS: LanguageService; beforeEach(() => { - mockHost = new MockTypescriptHost(['/app/main.ts', '/app/parsing-cases.ts'], toh); + mockHost = new MockTypescriptHost(['/app/main.ts', '/app/parsing-cases.ts']); tsLS = ts.createLanguageService(mockHost); ngLSHost = new TypeScriptServiceHost(mockHost, tsLS); ngLS = createLanguageService(ngLSHost); diff --git a/packages/language-service/test/language_service_spec.ts b/packages/language-service/test/language_service_spec.ts index 43a5fc45ca5f5..96e01dfee0079 100644 --- a/packages/language-service/test/language_service_spec.ts +++ b/packages/language-service/test/language_service_spec.ts @@ -11,11 +11,10 @@ import * as ts from 'typescript'; import {createLanguageService} from '../src/language_service'; import {TypeScriptServiceHost} from '../src/typescript_host'; -import {toh} from './test_data'; import {MockTypescriptHost} from './test_utils'; describe('service without angular', () => { - let mockHost = new MockTypescriptHost(['/app/main.ts', '/app/parsing-cases.ts'], toh); + let mockHost = new MockTypescriptHost(['/app/main.ts', '/app/parsing-cases.ts']); mockHost.forgetAngular(); let service = ts.createLanguageService(mockHost); let ngHost = new TypeScriptServiceHost(mockHost, service); @@ -32,4 +31,4 @@ describe('service without angular', () => { it('should not crash a get definition', () => expect(() => ngService.getDefinitionAt(fileName, position)).not.toThrow()); it('should not crash a hover', () => expect(() => ngService.getHoverAt(fileName, position))); -}); \ No newline at end of file +}); diff --git a/packages/language-service/test/reflector_host_spec.ts b/packages/language-service/test/reflector_host_spec.ts index e395a010f2664..717c91e5368cd 100644 --- a/packages/language-service/test/reflector_host_spec.ts +++ b/packages/language-service/test/reflector_host_spec.ts @@ -9,11 +9,9 @@ import * as path from 'path'; import * as ts from 'typescript'; -import {createLanguageService} from '../src/language_service'; import {ReflectorHost} from '../src/reflector_host'; import {TypeScriptServiceHost} from '../src/typescript_host'; -import {toh} from './test_data'; import {MockTypescriptHost} from './test_utils'; describe('reflector_host_spec', () => { @@ -23,7 +21,7 @@ describe('reflector_host_spec', () => { const originalJoin = path.join; const originalPosixJoin = path.posix.join; const mockHost = - new MockTypescriptHost(['/app/main.ts', '/app/parsing-cases.ts'], toh, 'node_modules', { + new MockTypescriptHost(['/app/main.ts', '/app/parsing-cases.ts'], 'node_modules', { ...path, join: (...args: string[]) => originalJoin.apply(path, args), posix: @@ -42,7 +40,7 @@ describe('reflector_host_spec', () => { }); it('should use module resolution cache', () => { - const mockHost = new MockTypescriptHost(['/app/main.ts'], toh); + const mockHost = new MockTypescriptHost(['/app/main.ts']); // TypeScript relies on `ModuleResolutionHost.fileExists()` to perform // module resolution, so spy on this method to determine how many times // it's called. diff --git a/packages/language-service/test/template_references_spec.ts b/packages/language-service/test/template_references_spec.ts index 952dadb549eca..0614fd9ad7ab6 100644 --- a/packages/language-service/test/template_references_spec.ts +++ b/packages/language-service/test/template_references_spec.ts @@ -12,7 +12,6 @@ import {createLanguageService} from '../src/language_service'; import {LanguageService} from '../src/types'; import {TypeScriptServiceHost} from '../src/typescript_host'; -import {toh} from './test_data'; import {MockTypescriptHost} from './test_utils'; describe('references', () => { @@ -23,7 +22,7 @@ describe('references', () => { let ngService: LanguageService = createLanguageService(undefined !); beforeEach(() => { - mockHost = new MockTypescriptHost(['/app/main.ts', '/app/parsing-cases.ts'], toh); + mockHost = new MockTypescriptHost(['/app/main.ts', '/app/parsing-cases.ts']); service = ts.createLanguageService(mockHost, documentRegistry); ngHost = new TypeScriptServiceHost(mockHost, service); ngService = createLanguageService(ngHost); diff --git a/packages/language-service/test/template_spec.ts b/packages/language-service/test/template_spec.ts index 24ba382d5147a..7617e2779baa4 100644 --- a/packages/language-service/test/template_spec.ts +++ b/packages/language-service/test/template_spec.ts @@ -8,7 +8,6 @@ import * as ts from 'typescript'; import {getClassDeclFromDecoratorProp} from '../src/template'; -import {toh} from './test_data'; import {MockTypescriptHost} from './test_utils'; describe('getClassDeclFromTemplateNode', () => { @@ -35,7 +34,7 @@ describe('getClassDeclFromTemplateNode', () => { it('should return class declaration for AppComponent', () => { - const host = new MockTypescriptHost(['/app/app.component.ts'], toh); + const host = new MockTypescriptHost(['/app/app.component.ts']); const tsLS = ts.createLanguageService(host); const sourceFile = tsLS.getProgram() !.getSourceFile('/app/app.component.ts'); expect(sourceFile).toBeTruthy(); diff --git a/packages/language-service/test/test_data.ts b/packages/language-service/test/test_data.ts deleted file mode 100644 index 6b65ed9159008..0000000000000 --- a/packages/language-service/test/test_data.ts +++ /dev/null @@ -1,242 +0,0 @@ -/** - * @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 - */ - -export const toh = { - 'foo.ts': `export * from './app/app.component.ts';`, - app: { - 'app.component.ts': `import { Component, NgModule } from '@angular/core'; - -export class Hero { - id: number; - name: string; -} - -@Component({ - selector: 'my-app', - template: \`~{empty} - <~{start-tag}h~{start-tag-after-h}1~{start-tag-h1} ~{h1-after-space}>~{h1-content} {{~{sub-start}title~{sub-end}}} - ~{after-h1}

{{~{h2-hero}hero.~{h2-name}name}} details!

-
{{~{label-hero}hero.~{label-id}id}}
-
- -
- &~{entity-amp}amp; - \` -}) -export class AppComponent { - title = 'Tour of Heroes'; - hero: Hero = { - id: 1, - name: 'Windstorm' - }; - private internal: string; -}`, - 'main.ts': ` -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; -import { AppComponent } from './app.component'; -import { CaseIncompleteOpen, CaseMissingClosing, CaseUnknown, Pipes, TemplateReference, NoValueAttribute, - AttributeBinding, StringModel, NumberModel, PropertyBinding, EventBinding, TwoWayBinding, EmptyInterpolation, - ForOfEmpty, ForLetIEqual, ForOfLetEmpty, ForUsingComponent, References, TestComponent} from './parsing-cases'; -import { WrongFieldReference, WrongSubFieldReference, PrivateReference, ExpectNumericType, LowercasePipe } from './expression-cases'; -import { UnknownPeople, UnknownEven, UnknownTrackBy } from './ng-for-cases'; -import { ShowIf } from './ng-if-cases'; - -@NgModule({ - imports: [CommonModule, FormsModule], - declarations: [AppComponent, CaseIncompleteOpen, CaseMissingClosing, CaseUnknown, Pipes, TemplateReference, NoValueAttribute, - AttributeBinding, StringModel, NumberModel, PropertyBinding, EventBinding, TwoWayBinding, EmptyInterpolation, ForOfEmpty, ForOfLetEmpty, - ForLetIEqual, ForUsingComponent, References, TestComponent, WrongFieldReference, WrongSubFieldReference, PrivateReference, - ExpectNumericType, UnknownPeople, UnknownEven, UnknownTrackBy, ShowIf, LowercasePipe] -}) -export class AppModule {} - -declare function bootstrap(v: any): void; - -bootstrap(AppComponent); -`, - 'parsing-cases.ts': ` -import {Component, Directive, Input, Output, EventEmitter} from '@angular/core'; -import {Hero} from './app.component'; - -@Component({template: '

Some <~{incomplete-open-lt}a~{incomplete-open-a} ~{incomplete-open-attr} text

'}) -export class CaseIncompleteOpen {} - -@Component({template: '

Some ~{missing-closing} text

'}) -export class CaseMissingClosing {} - -@Component({template: '

Some text

'}) -export class CaseUnknown {} - -@Component({template: '

{{data | ~{before-pipe}lowe~{in-pipe}rcase~{after-pipe} }}'}) -export class Pipes { - data = 'Some string'; -} - -@Component({template: '

'}) -export class NoValueAttribute {} - - -@Component({template: '

'}) -export class AttributeBinding { - test: string; -} - -@Component({template: '

'}) -export class PropertyBinding { - test: string; -} - -@Component({template: '

'}) -export class EventBinding { - test: string; - - modelChanged() {} -} - -@Component({template: '

'}) -export class TwoWayBinding { - test: string; -} - -@Directive({selector: '[string-model]'}) -export class StringModel { - @Input() model: string; - @Output() modelChanged: EventEmitter; -} - -@Directive({selector: '[number-model]'}) -export class NumberModel { - @Input('inputAlias') model: number; - @Output('outputAlias') modelChanged: EventEmitter; -} - -interface Person { - name: string; - age: number -} - -@Component({template: '
'}) -export class ForOfEmpty {} - -@Component({template: '
'}) -export class ForOfLetEmpty {} - -@Component({template: '
'}) -export class ForLetIEqual {} - -@Component({template: '
Name: {{~{for-interp-person}person.~{for-interp-name}name}}Age: {{person.~{for-interp-age}age}}
'}) -export class ForUsingComponent { - people: Person[]; -} - -@Component({template: '
{{~{test-comp-content}}} {{test1.~{test-comp-after-test}name}} {{div.~{test-comp-after-div}.innerText}}
'}) -export class References {} - -~{start-test-comp}@Component({selector: 'test-comp', template: '
Testing: {{name}}
'}) -export class TestComponent { - «@Input('ᐱtcNameᐱ') name = 'test';» - «@Output('ᐱtestᐱ') testEvent = new EventEmitter();» -}~{end-test-comp} - -@Component({templateUrl: 'test.ng'}) -export class TemplateReference { - title = 'Some title'; - hero: Hero = { - id: 1, - name: 'Windstorm' - }; - anyValue: any; - myClick(event: any) { - - } -} - -@Component({template: '{{~{empty-interpolation}}}'}) -export class EmptyInterpolation { - title = 'Some title'; - subTitle = 'Some sub title'; -} -`, - 'expression-cases.ts': ` -import {Component} from '@angular/core'; - -export interface Person { - name: string; - age: number; -} - -@Component({template: '{{~{foo}foo~{foo-end}}}'}) -export class WrongFieldReference { - bar = 'bar'; -} - -@Component({template: '{{~{nam}person.nam~{nam-end}}}'}) -export class WrongSubFieldReference { - person: Person = { name: 'Bob', age: 23 }; -} - -@Component({template: '{{~{myField}myField~{myField-end}}}'}) -export class PrivateReference { - private myField = 'My Field'; -} - -@Component({template: '{{~{mod}"a" ~{mod-end}% 2}}'}) -export class ExpectNumericType {} - -@Component({template: '{{ (name | lowercase).~{string-pipe}substring }}'}) -export class LowercasePipe { - name: string; -} -`, - 'ng-for-cases.ts': ` -import {Component} from '@angular/core'; - -export interface Person { - name: string; - age: number; -} - -@Component({template: '
{{person.name}}
'}) -export class UnknownPeople {} - -@Component({template: '
{{person.name}}
'}) -export class UnknownEven { - people: Person[]; -} - -@Component({template: '
{{person.name}}
'}) -export class UnknownTrackBy { - people: Person[]; -} -`, - 'ng-if-cases.ts': ` -import {Component} from '@angular/core'; - -@Component({template: '
Showing now!
'}) -export class ShowIf { - show = false; -} -`, - 'test.ng': `~{empty} - <~{start-tag}h~{start-tag-after-h}1~{start-tag-h1} ~{h1-after-space}>~{h1-content} {{~{sub-start}title~{sub-end}}} - ~{after-h1}

{{~{h2-hero}hero.~{h2-name}name}} details!

-
{{~{label-hero}hero.~{label-id}id}}
-
- -
- &~{entity-amp}amp; -`, - 'test.css': ` -body, html { - width: 100%; -} -`, - } -}; diff --git a/packages/language-service/test/test_utils.ts b/packages/language-service/test/test_utils.ts index 5542f3642df24..c01c1c1e54896 100644 --- a/packages/language-service/test/test_utils.ts +++ b/packages/language-service/test/test_utils.ts @@ -14,12 +14,6 @@ import * as ts from 'typescript'; import {Span} from '../src/types'; -export type MockData = string | MockDirectory; - -export type MockDirectory = { - [name: string]: MockData | undefined; -}; - const angularts = /@angular\/(\w|\/|-)+\.tsx?$/; const rxjsts = /rxjs\/(\w|\/)+\.tsx?$/; const rxjsmetadata = /rxjs\/(\w|\/)+\.metadata\.json?$/; @@ -41,29 +35,6 @@ const missingCache = new Set([ '/node_modules/@angular/core/src/reflection/platform_reflection_capabilities.metadata.json', '/node_modules/@angular/forms/src/directives/form_interface.metadata.json', ]); -const cacheUsed = new Set(); -const reportedMissing = new Set(); - -/** - * The cache is valid if all the returned entries are empty. - */ -export function validateCache(): {exists: string[], unused: string[], reported: string[]} { - const exists: string[] = []; - const unused: string[] = []; - for (const fileName of missingCache) { - if (fs.existsSync(fileName)) { - exists.push(fileName); - } - if (!cacheUsed.has(fileName)) { - unused.push(fileName); - } - } - return { - exists, - unused, - reported: Array.from(reportedMissing), - }; -} function isFile(path: string) { return fs.statSync(path).isFile(); @@ -121,7 +92,7 @@ export class MockTypescriptHost implements ts.LanguageServiceHost { private readonly fileCache = new Map(); constructor( - private readonly scriptNames: string[], _: MockData, + private readonly scriptNames: string[], private readonly node_modules: string = 'node_modules', private readonly myPath: typeof path = path) { const support = setup(); @@ -222,6 +193,14 @@ export class MockTypescriptHost implements ts.LanguageServiceHost { if (content) return removeReferenceMarkers(removeLocationMarkers(content)); } + /** + * Reset the project to its original state, effectively removing all overrides. + */ + reset() { + this.overrides.clear(); + this.overrideDirectory.clear(); + } + private getRawFileContent(fileName: string): string|undefined { if (this.overrides.has(fileName)) { return this.overrides.get(fileName); @@ -232,7 +211,6 @@ export class MockTypescriptHost implements ts.LanguageServiceHost { return fs.readFileSync(this.myPath.join(path.dirname(libPath), basename), 'utf8'); } if (missingCache.has(fileName)) { - cacheUsed.add(fileName); return undefined; } @@ -250,8 +228,6 @@ export class MockTypescriptHost implements ts.LanguageServiceHost { return content; } else { missingCache.add(fileName); - reportedMissing.add(fileName); - cacheUsed.add(fileName); } } } diff --git a/packages/language-service/test/ts_plugin_spec.ts b/packages/language-service/test/ts_plugin_spec.ts index c3c8b7f803526..b7a49bea79fbf 100644 --- a/packages/language-service/test/ts_plugin_spec.ts +++ b/packages/language-service/test/ts_plugin_spec.ts @@ -9,11 +9,10 @@ import 'reflect-metadata'; import * as ts from 'typescript'; import {create} from '../src/ts_plugin'; -import {toh} from './test_data'; import {MockTypescriptHost} from './test_utils'; describe('plugin', () => { - const mockHost = new MockTypescriptHost(['/app/main.ts', '/app/parsing-cases.ts'], toh); + const mockHost = new MockTypescriptHost(['/app/main.ts', '/app/parsing-cases.ts']); const service = ts.createLanguageService(mockHost); const program = service.getProgram(); const plugin = createPlugin(service, mockHost); diff --git a/packages/language-service/test/typescript_host_spec.ts b/packages/language-service/test/typescript_host_spec.ts index 2827fae668126..92e9824fd813c 100644 --- a/packages/language-service/test/typescript_host_spec.ts +++ b/packages/language-service/test/typescript_host_spec.ts @@ -11,13 +11,12 @@ import * as ts from 'typescript'; import {TypeScriptServiceHost} from '../src/typescript_host'; -import {toh} from './test_data'; import {MockTypescriptHost, findDirectiveMetadataByName} from './test_utils'; describe('TypeScriptServiceHost', () => { it('should be able to create a typescript host and analyze modules', () => { - const tsLSHost = new MockTypescriptHost(['/app/main.ts'], toh); + const tsLSHost = new MockTypescriptHost(['/app/main.ts']); const tsLS = ts.createLanguageService(tsLSHost); const ngLSHost = new TypeScriptServiceHost(tsLSHost, tsLS); const analyzedModules = ngLSHost.getAnalyzedModules(); @@ -34,7 +33,7 @@ describe('TypeScriptServiceHost', () => { }); it('should be able to analyze modules without a tsconfig.json file', () => { - const tsLSHost = new MockTypescriptHost(['foo.ts'], toh); + const tsLSHost = new MockTypescriptHost(['foo.ts']); const tsLS = ts.createLanguageService(tsLSHost); const ngLSHost = new TypeScriptServiceHost(tsLSHost, tsLS); const analyzedModules = ngLSHost.getAnalyzedModules(); @@ -45,7 +44,7 @@ describe('TypeScriptServiceHost', () => { }); it('should not throw if there is no script names', () => { - const tsLSHost = new MockTypescriptHost([], toh); + const tsLSHost = new MockTypescriptHost([]); const tsLS = ts.createLanguageService(tsLSHost); const ngLSHost = new TypeScriptServiceHost(tsLSHost, tsLS); const analyzedModules = ngLSHost.getAnalyzedModules(); @@ -57,7 +56,7 @@ describe('TypeScriptServiceHost', () => { it('should clear the caches if program changes', () => { // First create a TypescriptHost with empty script names - const tsLSHost = new MockTypescriptHost([], toh); + const tsLSHost = new MockTypescriptHost([]); const tsLS = ts.createLanguageService(tsLSHost); const ngLSHost = new TypeScriptServiceHost(tsLSHost, tsLS); expect(ngLSHost.getAnalyzedModules().ngModules).toEqual([]); @@ -71,7 +70,7 @@ describe('TypeScriptServiceHost', () => { }); it('should throw if getSourceFile is called on non-TS file', () => { - const tsLSHost = new MockTypescriptHost([], toh); + const tsLSHost = new MockTypescriptHost([]); const tsLS = ts.createLanguageService(tsLSHost); const ngLSHost = new TypeScriptServiceHost(tsLSHost, tsLS); expect(() => { @@ -80,7 +79,7 @@ describe('TypeScriptServiceHost', () => { }); it('should be able to find a single inline template', () => { - const tsLSHost = new MockTypescriptHost(['/app/app.component.ts'], toh); + const tsLSHost = new MockTypescriptHost(['/app/app.component.ts']); const tsLS = ts.createLanguageService(tsLSHost); const ngLSHost = new TypeScriptServiceHost(tsLSHost, tsLS); const templates = ngLSHost.getTemplates('/app/app.component.ts'); @@ -90,7 +89,7 @@ describe('TypeScriptServiceHost', () => { }); it('should be able to find multiple inline templates', () => { - const tsLSHost = new MockTypescriptHost(['/app/parsing-cases.ts'], toh); + const tsLSHost = new MockTypescriptHost(['/app/parsing-cases.ts']); const tsLS = ts.createLanguageService(tsLSHost); const ngLSHost = new TypeScriptServiceHost(tsLSHost, tsLS); const templates = ngLSHost.getTemplates('/app/parsing-cases.ts'); @@ -98,7 +97,7 @@ describe('TypeScriptServiceHost', () => { }); it('should be able to find external template', () => { - const tsLSHost = new MockTypescriptHost(['/app/main.ts'], toh); + const tsLSHost = new MockTypescriptHost(['/app/main.ts']); const tsLS = ts.createLanguageService(tsLSHost); const ngLSHost = new TypeScriptServiceHost(tsLSHost, tsLS); ngLSHost.getAnalyzedModules(); @@ -110,7 +109,7 @@ describe('TypeScriptServiceHost', () => { // https://github.com/angular/angular/issues/32301 it('should clear caches when program changes', () => { - const tsLSHost = new MockTypescriptHost(['/app/main.ts'], toh); + const tsLSHost = new MockTypescriptHost(['/app/main.ts']); const tsLS = ts.createLanguageService(tsLSHost); const ngLSHost = new TypeScriptServiceHost(tsLSHost, tsLS); const fileName = '/app/app.component.ts'; @@ -162,7 +161,7 @@ describe('TypeScriptServiceHost', () => { }); it('should not clear caches when external template changes', () => { - const tsLSHost = new MockTypescriptHost(['/app/main.ts'], toh); + const tsLSHost = new MockTypescriptHost(['/app/main.ts']); const tsLS = ts.createLanguageService(tsLSHost); const ngLSHost = new TypeScriptServiceHost(tsLSHost, tsLS); const oldModules = ngLSHost.getAnalyzedModules(); @@ -172,7 +171,7 @@ describe('TypeScriptServiceHost', () => { }); it('should get the correct StaticSymbol for a Directive', () => { - const tsLSHost = new MockTypescriptHost(['/app/app.component.ts', '/app/main.ts'], toh); + const tsLSHost = new MockTypescriptHost(['/app/app.component.ts', '/app/main.ts']); const tsLS = ts.createLanguageService(tsLSHost); const ngLSHost = new TypeScriptServiceHost(tsLSHost, tsLS); ngLSHost.getAnalyzedModules(); // modules are analyzed lazily