Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/test/browser/testCommand.ts
3294 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 { IRange } from '../../common/core/range.js';
8
import { Selection, ISelection } from '../../common/core/selection.js';
9
import { ICommand, IEditOperationBuilder } from '../../common/editorCommon.js';
10
import { ITextModel } from '../../common/model.js';
11
import { instantiateTestCodeEditor, createCodeEditorServices } from './testCodeEditor.js';
12
import { instantiateTextModel } from '../common/testTextModel.js';
13
import { ServicesAccessor } from '../../../platform/instantiation/common/instantiation.js';
14
import { DisposableStore } from '../../../base/common/lifecycle.js';
15
import { ISingleEditOperation } from '../../common/core/editOperation.js';
16
17
export function testCommand(
18
lines: string[],
19
languageId: string | null,
20
selection: Selection,
21
commandFactory: (accessor: ServicesAccessor, selection: Selection) => ICommand,
22
expectedLines: string[],
23
expectedSelection: Selection,
24
forceTokenization?: boolean,
25
prepare?: (accessor: ServicesAccessor, disposables: DisposableStore) => void
26
): void {
27
const disposables = new DisposableStore();
28
const instantiationService = createCodeEditorServices(disposables);
29
if (prepare) {
30
instantiationService.invokeFunction(prepare, disposables);
31
}
32
const model = disposables.add(instantiateTextModel(instantiationService, lines.join('\n'), languageId));
33
const editor = disposables.add(instantiateTestCodeEditor(instantiationService, model));
34
const viewModel = editor.getViewModel()!;
35
36
if (forceTokenization) {
37
model.tokenization.forceTokenization(model.getLineCount());
38
}
39
40
viewModel.setSelections('tests', [selection]);
41
42
const command = instantiationService.invokeFunction((accessor) => commandFactory(accessor, viewModel.getSelection()));
43
viewModel.executeCommand(command, 'tests');
44
45
assert.deepStrictEqual(model.getLinesContent(), expectedLines);
46
47
const actualSelection = viewModel.getSelection();
48
assert.deepStrictEqual(actualSelection.toString(), expectedSelection.toString());
49
50
disposables.dispose();
51
}
52
53
/**
54
* Extract edit operations if command `command` were to execute on model `model`
55
*/
56
export function getEditOperation(model: ITextModel, command: ICommand): ISingleEditOperation[] {
57
const operations: ISingleEditOperation[] = [];
58
const editOperationBuilder: IEditOperationBuilder = {
59
addEditOperation: (range: IRange, text: string, forceMoveMarkers: boolean = false) => {
60
operations.push({
61
range: range,
62
text: text,
63
forceMoveMarkers: forceMoveMarkers
64
});
65
},
66
67
addTrackedEditOperation: (range: IRange, text: string, forceMoveMarkers: boolean = false) => {
68
operations.push({
69
range: range,
70
text: text,
71
forceMoveMarkers: forceMoveMarkers
72
});
73
},
74
75
76
trackSelection: (selection: ISelection) => {
77
return '';
78
}
79
};
80
command.getEditOperations(model, editOperationBuilder);
81
return operations;
82
}
83
84