/** * @license * Copyright Google LLC 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 */ import {TmplAstNode} from '@angular/compiler'; import {absoluteFrom, AbsoluteFsPath} from '@angular/compiler-cli/src/ngtsc/file_system'; import {initMockFileSystem} from '@angular/compiler-cli/src/ngtsc/file_system/testing'; import * as ts from 'typescript'; import {DisplayInfoKind, unsafeCastDisplayInfoKindToScriptElementKind} from '../display_parts'; import {LanguageService} from '../language_service'; import {LanguageServiceTestEnvironment} from './env'; describe('completions', () => { beforeEach(() => { initMockFileSystem('Native'); }); describe('in the global scope', () => { it('should be able to complete an interpolation', () => { const {ngLS, fileName, cursor} = setup('{{ti¦}}', `title!: string; hero!: number;`); const completions = ngLS.getCompletionsAtPosition(fileName, cursor, /* options */ undefined); expectContain(completions, ts.ScriptElementKind.memberVariableElement, ['title', 'hero']); }); it('should be able to complete an empty interpolation', () => { const {ngLS, fileName, cursor} = setup('{{ ¦ }}', `title!: string; hero!: number;`); const completions = ngLS.getCompletionsAtPosition(fileName, cursor, /* options */ undefined); expectContain(completions, ts.ScriptElementKind.memberVariableElement, ['title', 'hero']); }); it('should be able to complete a property binding', () => { const {ngLS, fileName, cursor} = setup('
', `title!: string; hero!: number;`); const completions = ngLS.getCompletionsAtPosition(fileName, cursor, /* options */ undefined); expectContain(completions, ts.ScriptElementKind.memberVariableElement, ['title', 'hero']); }); it('should be able to complete an empty property binding', () => { const {ngLS, fileName, cursor} = setup('', `title!: string; hero!: number;`); const completions = ngLS.getCompletionsAtPosition(fileName, cursor, /* options */ undefined); expectContain(completions, ts.ScriptElementKind.memberVariableElement, ['title', 'hero']); }); it('should be able to retrieve details for completions', () => { const {ngLS, fileName, cursor} = setup('{{ti¦}}', ` /** This is the title of the 'AppCmp' Component. */ title!: string; /** This comment should not appear in the output of this test. */ hero!: number; `); const details = ngLS.getCompletionEntryDetails( fileName, cursor, 'title', /* formatOptions */ undefined, /* preferences */ undefined)!; expect(details).toBeDefined(); expect(toText(details.displayParts)).toEqual('(property) AppCmp.title: string'); expect(toText(details.documentation)) .toEqual('This is the title of the \'AppCmp\' Component.'); }); it('should return reference completions when available', () => { const {ngLS, fileName, cursor} = setup(`{{t¦}}`, `title!: string;`); const completions = ngLS.getCompletionsAtPosition(fileName, cursor, /* options */ undefined); expectContain(completions, ts.ScriptElementKind.memberVariableElement, ['title']); expectContain(completions, DisplayInfoKind.REFERENCE, ['todo']); }); it('should return variable completions when available', () => { const {ngLS, fileName, cursor} = setup( `