Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/contrib/suggest/test/browser/suggest.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
import assert from 'assert';
6
import { IDisposable } from '../../../../../base/common/lifecycle.js';
7
import { URI } from '../../../../../base/common/uri.js';
8
import { Position } from '../../../../common/core/position.js';
9
import { Range } from '../../../../common/core/range.js';
10
import { TextModel } from '../../../../common/model/textModel.js';
11
import { CompletionItemKind, CompletionItemProvider } from '../../../../common/languages.js';
12
import { CompletionOptions, provideSuggestionItems, SnippetSortOrder } from '../../browser/suggest.js';
13
import { createTextModel } from '../../../../test/common/testTextModel.js';
14
import { LanguageFeatureRegistry } from '../../../../common/languageFeatureRegistry.js';
15
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';
16
17
18
suite('Suggest', function () {
19
let model: TextModel;
20
let registration: IDisposable;
21
let registry: LanguageFeatureRegistry<CompletionItemProvider>;
22
23
setup(function () {
24
registry = new LanguageFeatureRegistry();
25
model = createTextModel('FOO\nbar\BAR\nfoo', undefined, undefined, URI.parse('foo:bar/path'));
26
registration = registry.register({ pattern: 'bar/path', scheme: 'foo' }, {
27
_debugDisplayName: 'test',
28
provideCompletionItems(_doc, pos) {
29
return {
30
incomplete: false,
31
suggestions: [{
32
label: 'aaa',
33
kind: CompletionItemKind.Snippet,
34
insertText: 'aaa',
35
range: Range.fromPositions(pos)
36
}, {
37
label: 'zzz',
38
kind: CompletionItemKind.Snippet,
39
insertText: 'zzz',
40
range: Range.fromPositions(pos)
41
}, {
42
label: 'fff',
43
kind: CompletionItemKind.Property,
44
insertText: 'fff',
45
range: Range.fromPositions(pos)
46
}]
47
};
48
}
49
});
50
});
51
52
teardown(() => {
53
registration.dispose();
54
model.dispose();
55
});
56
57
ensureNoDisposablesAreLeakedInTestSuite();
58
59
test('sort - snippet inline', async function () {
60
const { items, disposable } = await provideSuggestionItems(registry, model, new Position(1, 1), new CompletionOptions(SnippetSortOrder.Inline));
61
assert.strictEqual(items.length, 3);
62
assert.strictEqual(items[0].completion.label, 'aaa');
63
assert.strictEqual(items[1].completion.label, 'fff');
64
assert.strictEqual(items[2].completion.label, 'zzz');
65
disposable.dispose();
66
});
67
68
test('sort - snippet top', async function () {
69
const { items, disposable } = await provideSuggestionItems(registry, model, new Position(1, 1), new CompletionOptions(SnippetSortOrder.Top));
70
assert.strictEqual(items.length, 3);
71
assert.strictEqual(items[0].completion.label, 'aaa');
72
assert.strictEqual(items[1].completion.label, 'zzz');
73
assert.strictEqual(items[2].completion.label, 'fff');
74
disposable.dispose();
75
});
76
77
test('sort - snippet bottom', async function () {
78
const { items, disposable } = await provideSuggestionItems(registry, model, new Position(1, 1), new CompletionOptions(SnippetSortOrder.Bottom));
79
assert.strictEqual(items.length, 3);
80
assert.strictEqual(items[0].completion.label, 'fff');
81
assert.strictEqual(items[1].completion.label, 'aaa');
82
assert.strictEqual(items[2].completion.label, 'zzz');
83
disposable.dispose();
84
});
85
86
test('sort - snippet none', async function () {
87
const { items, disposable } = await provideSuggestionItems(registry, model, new Position(1, 1), new CompletionOptions(undefined, new Set<CompletionItemKind>().add(CompletionItemKind.Snippet)));
88
assert.strictEqual(items.length, 1);
89
assert.strictEqual(items[0].completion.label, 'fff');
90
disposable.dispose();
91
});
92
93
test('only from', function (callback) {
94
95
const foo: any = {
96
triggerCharacters: [],
97
provideCompletionItems() {
98
return {
99
currentWord: '',
100
incomplete: false,
101
suggestions: [{
102
label: 'jjj',
103
type: 'property',
104
insertText: 'jjj'
105
}]
106
};
107
}
108
};
109
const registration = registry.register({ pattern: 'bar/path', scheme: 'foo' }, foo);
110
111
provideSuggestionItems(registry, model, new Position(1, 1), new CompletionOptions(undefined, undefined, new Set<CompletionItemProvider>().add(foo))).then(({ items, disposable }) => {
112
registration.dispose();
113
114
assert.strictEqual(items.length, 1);
115
assert.ok(items[0].provider === foo);
116
disposable.dispose();
117
callback();
118
});
119
});
120
121
test('Ctrl+space completions stopped working with the latest Insiders, #97650', async function () {
122
123
124
const foo = new class implements CompletionItemProvider {
125
126
_debugDisplayName = 'test';
127
triggerCharacters = [];
128
129
provideCompletionItems() {
130
return {
131
suggestions: [{
132
label: 'one',
133
kind: CompletionItemKind.Class,
134
insertText: 'one',
135
range: {
136
insert: new Range(0, 0, 0, 0),
137
replace: new Range(0, 0, 0, 10)
138
}
139
}, {
140
label: 'two',
141
kind: CompletionItemKind.Class,
142
insertText: 'two',
143
range: {
144
insert: new Range(0, 0, 0, 0),
145
replace: new Range(0, 1, 0, 10)
146
}
147
}]
148
};
149
}
150
};
151
152
const registration = registry.register({ pattern: 'bar/path', scheme: 'foo' }, foo);
153
const { items, disposable } = await provideSuggestionItems(registry, model, new Position(0, 0), new CompletionOptions(undefined, undefined, new Set<CompletionItemProvider>().add(foo)));
154
registration.dispose();
155
156
assert.strictEqual(items.length, 2);
157
const [a, b] = items;
158
159
assert.strictEqual(a.completion.label, 'one');
160
assert.strictEqual(a.isInvalid, false);
161
assert.strictEqual(b.completion.label, 'two');
162
assert.strictEqual(b.isInvalid, true);
163
disposable.dispose();
164
});
165
});
166
167