Path: blob/main/src/vs/editor/test/browser/testCommand.ts
3294 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 { IRange } from '../../common/core/range.js';7import { Selection, ISelection } from '../../common/core/selection.js';8import { ICommand, IEditOperationBuilder } from '../../common/editorCommon.js';9import { ITextModel } from '../../common/model.js';10import { instantiateTestCodeEditor, createCodeEditorServices } from './testCodeEditor.js';11import { instantiateTextModel } from '../common/testTextModel.js';12import { ServicesAccessor } from '../../../platform/instantiation/common/instantiation.js';13import { DisposableStore } from '../../../base/common/lifecycle.js';14import { ISingleEditOperation } from '../../common/core/editOperation.js';1516export function testCommand(17lines: string[],18languageId: string | null,19selection: Selection,20commandFactory: (accessor: ServicesAccessor, selection: Selection) => ICommand,21expectedLines: string[],22expectedSelection: Selection,23forceTokenization?: boolean,24prepare?: (accessor: ServicesAccessor, disposables: DisposableStore) => void25): void {26const disposables = new DisposableStore();27const instantiationService = createCodeEditorServices(disposables);28if (prepare) {29instantiationService.invokeFunction(prepare, disposables);30}31const model = disposables.add(instantiateTextModel(instantiationService, lines.join('\n'), languageId));32const editor = disposables.add(instantiateTestCodeEditor(instantiationService, model));33const viewModel = editor.getViewModel()!;3435if (forceTokenization) {36model.tokenization.forceTokenization(model.getLineCount());37}3839viewModel.setSelections('tests', [selection]);4041const command = instantiationService.invokeFunction((accessor) => commandFactory(accessor, viewModel.getSelection()));42viewModel.executeCommand(command, 'tests');4344assert.deepStrictEqual(model.getLinesContent(), expectedLines);4546const actualSelection = viewModel.getSelection();47assert.deepStrictEqual(actualSelection.toString(), expectedSelection.toString());4849disposables.dispose();50}5152/**53* Extract edit operations if command `command` were to execute on model `model`54*/55export function getEditOperation(model: ITextModel, command: ICommand): ISingleEditOperation[] {56const operations: ISingleEditOperation[] = [];57const editOperationBuilder: IEditOperationBuilder = {58addEditOperation: (range: IRange, text: string, forceMoveMarkers: boolean = false) => {59operations.push({60range: range,61text: text,62forceMoveMarkers: forceMoveMarkers63});64},6566addTrackedEditOperation: (range: IRange, text: string, forceMoveMarkers: boolean = false) => {67operations.push({68range: range,69text: text,70forceMoveMarkers: forceMoveMarkers71});72},737475trackSelection: (selection: ISelection) => {76return '';77}78};79command.getEditOperations(model, editOperationBuilder);80return operations;81}828384