Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/contrib/suggest/test/browser/suggestInlineCompletions.test.ts
4798 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import assert from 'assert';
7
import { CancellationToken } from '../../../../../base/common/cancellation.js';
8
import { DisposableStore } from '../../../../../base/common/lifecycle.js';
9
import { URI } from '../../../../../base/common/uri.js';
10
import { mock } from '../../../../../base/test/common/mock.js';
11
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';
12
import { Position } from '../../../../common/core/position.js';
13
import { Range } from '../../../../common/core/range.js';
14
import { CompletionContext, CompletionItem, CompletionItemKind, CompletionItemProvider, CompletionList, InlineCompletionContext, InlineCompletionTriggerKind, ProviderResult } from '../../../../common/languages.js';
15
import { ITextModel } from '../../../../common/model.js';
16
import { TextModel } from '../../../../common/model/textModel.js';
17
import { ILanguageFeaturesService } from '../../../../common/services/languageFeatures.js';
18
import { SuggestInlineCompletions } from '../../browser/suggestInlineCompletions.js';
19
import { ISuggestMemoryService } from '../../browser/suggestMemory.js';
20
import { createCodeEditorServices, instantiateTestCodeEditor, ITestCodeEditor } from '../../../../test/browser/testCodeEditor.js';
21
import { createTextModel } from '../../../../test/common/testTextModel.js';
22
import { ServiceCollection } from '../../../../../platform/instantiation/common/serviceCollection.js';
23
import { TestInstantiationService } from '../../../../../platform/instantiation/test/common/instantiationServiceMock.js';
24
import { generateUuid } from '../../../../../base/common/uuid.js';
25
26
27
suite('Suggest Inline Completions', function () {
28
29
const disposables = new DisposableStore();
30
const services = new ServiceCollection([ISuggestMemoryService, new class extends mock<ISuggestMemoryService>() {
31
override select(): number {
32
return 0;
33
}
34
}]);
35
36
let insta: TestInstantiationService;
37
let model: TextModel;
38
let editor: ITestCodeEditor;
39
40
setup(function () {
41
42
insta = createCodeEditorServices(disposables, services);
43
model = createTextModel('he', undefined, undefined, URI.from({ scheme: 'foo', path: 'foo.bar' }));
44
editor = instantiateTestCodeEditor(insta, model);
45
editor.updateOptions({ quickSuggestions: { comments: 'inline', strings: 'inline', other: 'inline' } });
46
47
insta.invokeFunction(accessor => {
48
disposables.add(accessor.get(ILanguageFeaturesService).completionProvider.register({ pattern: '*.bar', scheme: 'foo' }, new class implements CompletionItemProvider {
49
_debugDisplayName = 'test';
50
51
triggerCharacters?: string[] | undefined;
52
53
provideCompletionItems(model: ITextModel, position: Position, context: CompletionContext, token: CancellationToken): ProviderResult<CompletionList> {
54
55
const word = model.getWordUntilPosition(position);
56
const range = new Range(position.lineNumber, word.startColumn, position.lineNumber, word.endColumn);
57
58
const suggestions: CompletionItem[] = [];
59
suggestions.push({ insertText: 'hello', label: 'hello', range, kind: CompletionItemKind.Class });
60
suggestions.push({ insertText: 'hell', label: 'hell', range, kind: CompletionItemKind.Class });
61
suggestions.push({ insertText: 'hey', label: 'hey', range, kind: CompletionItemKind.Snippet });
62
return { suggestions };
63
}
64
65
}));
66
});
67
});
68
69
teardown(function () {
70
disposables.clear();
71
model.dispose();
72
editor.dispose();
73
});
74
75
76
ensureNoDisposablesAreLeakedInTestSuite();
77
78
const context: InlineCompletionContext = { triggerKind: InlineCompletionTriggerKind.Explicit, selectedSuggestionInfo: undefined, includeInlineCompletions: true, includeInlineEdits: false, requestUuid: generateUuid(), requestIssuedDateTime: 0, earliestShownDateTime: 0 };
79
80
test('Aggressive inline completions when typing within line #146948', async function () {
81
82
const completions: SuggestInlineCompletions = disposables.add(insta.createInstance(SuggestInlineCompletions));
83
84
{
85
// (1,3), end of word -> suggestions
86
const result = await completions.provideInlineCompletions(model, new Position(1, 3), context, CancellationToken.None);
87
assert.strictEqual(result?.items.length, 3);
88
completions.disposeInlineCompletions(result);
89
}
90
{
91
// (1,2), middle of word -> NO suggestions
92
const result = await completions.provideInlineCompletions(model, new Position(1, 2), context, CancellationToken.None);
93
assert.ok(result === undefined);
94
}
95
});
96
97
test('Snippets show in inline suggestions even though they are turned off #175190', async function () {
98
const completions: SuggestInlineCompletions = disposables.add(insta.createInstance(SuggestInlineCompletions));
99
100
{
101
// unfiltered
102
const result = await completions.provideInlineCompletions(model, new Position(1, 3), context, CancellationToken.None);
103
assert.strictEqual(result?.items.length, 3);
104
completions.disposeInlineCompletions(result);
105
}
106
107
{
108
// filtered
109
editor.updateOptions({ suggest: { showSnippets: false } });
110
const result = await completions.provideInlineCompletions(model, new Position(1, 3), context, CancellationToken.None);
111
assert.strictEqual(result?.items.length, 2);
112
completions.disposeInlineCompletions(result);
113
}
114
115
});
116
});
117
118