Path: blob/main/src/vs/editor/contrib/suggest/test/browser/suggestInlineCompletions.test.ts
4798 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import assert from 'assert';6import { CancellationToken } from '../../../../../base/common/cancellation.js';7import { DisposableStore } from '../../../../../base/common/lifecycle.js';8import { URI } from '../../../../../base/common/uri.js';9import { mock } from '../../../../../base/test/common/mock.js';10import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';11import { Position } from '../../../../common/core/position.js';12import { Range } from '../../../../common/core/range.js';13import { CompletionContext, CompletionItem, CompletionItemKind, CompletionItemProvider, CompletionList, InlineCompletionContext, InlineCompletionTriggerKind, ProviderResult } from '../../../../common/languages.js';14import { ITextModel } from '../../../../common/model.js';15import { TextModel } from '../../../../common/model/textModel.js';16import { ILanguageFeaturesService } from '../../../../common/services/languageFeatures.js';17import { SuggestInlineCompletions } from '../../browser/suggestInlineCompletions.js';18import { ISuggestMemoryService } from '../../browser/suggestMemory.js';19import { createCodeEditorServices, instantiateTestCodeEditor, ITestCodeEditor } from '../../../../test/browser/testCodeEditor.js';20import { createTextModel } from '../../../../test/common/testTextModel.js';21import { ServiceCollection } from '../../../../../platform/instantiation/common/serviceCollection.js';22import { TestInstantiationService } from '../../../../../platform/instantiation/test/common/instantiationServiceMock.js';23import { generateUuid } from '../../../../../base/common/uuid.js';242526suite('Suggest Inline Completions', function () {2728const disposables = new DisposableStore();29const services = new ServiceCollection([ISuggestMemoryService, new class extends mock<ISuggestMemoryService>() {30override select(): number {31return 0;32}33}]);3435let insta: TestInstantiationService;36let model: TextModel;37let editor: ITestCodeEditor;3839setup(function () {4041insta = createCodeEditorServices(disposables, services);42model = createTextModel('he', undefined, undefined, URI.from({ scheme: 'foo', path: 'foo.bar' }));43editor = instantiateTestCodeEditor(insta, model);44editor.updateOptions({ quickSuggestions: { comments: 'inline', strings: 'inline', other: 'inline' } });4546insta.invokeFunction(accessor => {47disposables.add(accessor.get(ILanguageFeaturesService).completionProvider.register({ pattern: '*.bar', scheme: 'foo' }, new class implements CompletionItemProvider {48_debugDisplayName = 'test';4950triggerCharacters?: string[] | undefined;5152provideCompletionItems(model: ITextModel, position: Position, context: CompletionContext, token: CancellationToken): ProviderResult<CompletionList> {5354const word = model.getWordUntilPosition(position);55const range = new Range(position.lineNumber, word.startColumn, position.lineNumber, word.endColumn);5657const suggestions: CompletionItem[] = [];58suggestions.push({ insertText: 'hello', label: 'hello', range, kind: CompletionItemKind.Class });59suggestions.push({ insertText: 'hell', label: 'hell', range, kind: CompletionItemKind.Class });60suggestions.push({ insertText: 'hey', label: 'hey', range, kind: CompletionItemKind.Snippet });61return { suggestions };62}6364}));65});66});6768teardown(function () {69disposables.clear();70model.dispose();71editor.dispose();72});737475ensureNoDisposablesAreLeakedInTestSuite();7677const context: InlineCompletionContext = { triggerKind: InlineCompletionTriggerKind.Explicit, selectedSuggestionInfo: undefined, includeInlineCompletions: true, includeInlineEdits: false, requestUuid: generateUuid(), requestIssuedDateTime: 0, earliestShownDateTime: 0 };7879test('Aggressive inline completions when typing within line #146948', async function () {8081const completions: SuggestInlineCompletions = disposables.add(insta.createInstance(SuggestInlineCompletions));8283{84// (1,3), end of word -> suggestions85const result = await completions.provideInlineCompletions(model, new Position(1, 3), context, CancellationToken.None);86assert.strictEqual(result?.items.length, 3);87completions.disposeInlineCompletions(result);88}89{90// (1,2), middle of word -> NO suggestions91const result = await completions.provideInlineCompletions(model, new Position(1, 2), context, CancellationToken.None);92assert.ok(result === undefined);93}94});9596test('Snippets show in inline suggestions even though they are turned off #175190', async function () {97const completions: SuggestInlineCompletions = disposables.add(insta.createInstance(SuggestInlineCompletions));9899{100// unfiltered101const result = await completions.provideInlineCompletions(model, new Position(1, 3), context, CancellationToken.None);102assert.strictEqual(result?.items.length, 3);103completions.disposeInlineCompletions(result);104}105106{107// filtered108editor.updateOptions({ suggest: { showSnippets: false } });109const result = await completions.provideInlineCompletions(model, new Position(1, 3), context, CancellationToken.None);110assert.strictEqual(result?.items.length, 2);111completions.disposeInlineCompletions(result);112}113114});115});116117118