Path: blob/main/src/vs/editor/contrib/suggest/test/browser/suggest.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*--------------------------------------------------------------------------------------------*/4import assert from 'assert';5import { IDisposable } from '../../../../../base/common/lifecycle.js';6import { URI } from '../../../../../base/common/uri.js';7import { Position } from '../../../../common/core/position.js';8import { Range } from '../../../../common/core/range.js';9import { TextModel } from '../../../../common/model/textModel.js';10import { CompletionItemKind, CompletionItemProvider } from '../../../../common/languages.js';11import { CompletionOptions, provideSuggestionItems, SnippetSortOrder } from '../../browser/suggest.js';12import { createTextModel } from '../../../../test/common/testTextModel.js';13import { LanguageFeatureRegistry } from '../../../../common/languageFeatureRegistry.js';14import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';151617suite('Suggest', function () {18let model: TextModel;19let registration: IDisposable;20let registry: LanguageFeatureRegistry<CompletionItemProvider>;2122setup(function () {23registry = new LanguageFeatureRegistry();24model = createTextModel('FOO\nbar\BAR\nfoo', undefined, undefined, URI.parse('foo:bar/path'));25registration = registry.register({ pattern: 'bar/path', scheme: 'foo' }, {26_debugDisplayName: 'test',27provideCompletionItems(_doc, pos) {28return {29incomplete: false,30suggestions: [{31label: 'aaa',32kind: CompletionItemKind.Snippet,33insertText: 'aaa',34range: Range.fromPositions(pos)35}, {36label: 'zzz',37kind: CompletionItemKind.Snippet,38insertText: 'zzz',39range: Range.fromPositions(pos)40}, {41label: 'fff',42kind: CompletionItemKind.Property,43insertText: 'fff',44range: Range.fromPositions(pos)45}]46};47}48});49});5051teardown(() => {52registration.dispose();53model.dispose();54});5556ensureNoDisposablesAreLeakedInTestSuite();5758test('sort - snippet inline', async function () {59const { items, disposable } = await provideSuggestionItems(registry, model, new Position(1, 1), new CompletionOptions(SnippetSortOrder.Inline));60assert.strictEqual(items.length, 3);61assert.strictEqual(items[0].completion.label, 'aaa');62assert.strictEqual(items[1].completion.label, 'fff');63assert.strictEqual(items[2].completion.label, 'zzz');64disposable.dispose();65});6667test('sort - snippet top', async function () {68const { items, disposable } = await provideSuggestionItems(registry, model, new Position(1, 1), new CompletionOptions(SnippetSortOrder.Top));69assert.strictEqual(items.length, 3);70assert.strictEqual(items[0].completion.label, 'aaa');71assert.strictEqual(items[1].completion.label, 'zzz');72assert.strictEqual(items[2].completion.label, 'fff');73disposable.dispose();74});7576test('sort - snippet bottom', async function () {77const { items, disposable } = await provideSuggestionItems(registry, model, new Position(1, 1), new CompletionOptions(SnippetSortOrder.Bottom));78assert.strictEqual(items.length, 3);79assert.strictEqual(items[0].completion.label, 'fff');80assert.strictEqual(items[1].completion.label, 'aaa');81assert.strictEqual(items[2].completion.label, 'zzz');82disposable.dispose();83});8485test('sort - snippet none', async function () {86const { items, disposable } = await provideSuggestionItems(registry, model, new Position(1, 1), new CompletionOptions(undefined, new Set<CompletionItemKind>().add(CompletionItemKind.Snippet)));87assert.strictEqual(items.length, 1);88assert.strictEqual(items[0].completion.label, 'fff');89disposable.dispose();90});9192test('only from', function (callback) {9394const foo: any = {95triggerCharacters: [],96provideCompletionItems() {97return {98currentWord: '',99incomplete: false,100suggestions: [{101label: 'jjj',102type: 'property',103insertText: 'jjj'104}]105};106}107};108const registration = registry.register({ pattern: 'bar/path', scheme: 'foo' }, foo);109110provideSuggestionItems(registry, model, new Position(1, 1), new CompletionOptions(undefined, undefined, new Set<CompletionItemProvider>().add(foo))).then(({ items, disposable }) => {111registration.dispose();112113assert.strictEqual(items.length, 1);114assert.ok(items[0].provider === foo);115disposable.dispose();116callback();117});118});119120test('Ctrl+space completions stopped working with the latest Insiders, #97650', async function () {121122123const foo = new class implements CompletionItemProvider {124125_debugDisplayName = 'test';126triggerCharacters = [];127128provideCompletionItems() {129return {130suggestions: [{131label: 'one',132kind: CompletionItemKind.Class,133insertText: 'one',134range: {135insert: new Range(0, 0, 0, 0),136replace: new Range(0, 0, 0, 10)137}138}, {139label: 'two',140kind: CompletionItemKind.Class,141insertText: 'two',142range: {143insert: new Range(0, 0, 0, 0),144replace: new Range(0, 1, 0, 10)145}146}]147};148}149};150151const registration = registry.register({ pattern: 'bar/path', scheme: 'foo' }, foo);152const { items, disposable } = await provideSuggestionItems(registry, model, new Position(0, 0), new CompletionOptions(undefined, undefined, new Set<CompletionItemProvider>().add(foo)));153registration.dispose();154155assert.strictEqual(items.length, 2);156const [a, b] = items;157158assert.strictEqual(a.completion.label, 'one');159assert.strictEqual(a.isInvalid, false);160assert.strictEqual(b.completion.label, 'two');161assert.strictEqual(b.isInvalid, true);162disposable.dispose();163});164});165166167