Path: blob/main/src/vs/editor/test/common/model/modelEditOperation.test.ts
3296 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 { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';6import { ISingleEditOperation } from '../../../common/core/editOperation.js';7import { Range } from '../../../common/core/range.js';8import { TextModel } from '../../../common/model/textModel.js';9import { createTextModel } from '../testTextModel.js';1011suite('Editor Model - Model Edit Operation', () => {12const LINE1 = 'My First Line';13const LINE2 = '\t\tMy Second Line';14const LINE3 = ' Third Line';15const LINE4 = '';16const LINE5 = '1';1718let model: TextModel;1920setup(() => {21const text =22LINE1 + '\r\n' +23LINE2 + '\n' +24LINE3 + '\n' +25LINE4 + '\r\n' +26LINE5;27model = createTextModel(text);28});2930teardown(() => {31model.dispose();32});3334ensureNoDisposablesAreLeakedInTestSuite();3536function createSingleEditOp(text: string, positionLineNumber: number, positionColumn: number, selectionLineNumber: number = positionLineNumber, selectionColumn: number = positionColumn): ISingleEditOperation {37const range = new Range(38selectionLineNumber,39selectionColumn,40positionLineNumber,41positionColumn42);4344return {45range: range,46text: text,47forceMoveMarkers: false48};49}5051function assertSingleEditOp(singleEditOp: ISingleEditOperation, editedLines: string[]) {52const editOp = [singleEditOp];5354const inverseEditOp = model.applyEdits(editOp, true);5556assert.strictEqual(model.getLineCount(), editedLines.length);57for (let i = 0; i < editedLines.length; i++) {58assert.strictEqual(model.getLineContent(i + 1), editedLines[i]);59}6061const originalOp = model.applyEdits(inverseEditOp, true);6263assert.strictEqual(model.getLineCount(), 5);64assert.strictEqual(model.getLineContent(1), LINE1);65assert.strictEqual(model.getLineContent(2), LINE2);66assert.strictEqual(model.getLineContent(3), LINE3);67assert.strictEqual(model.getLineContent(4), LINE4);68assert.strictEqual(model.getLineContent(5), LINE5);6970const simplifyEdit = (edit: ISingleEditOperation) => {71return {72range: edit.range,73text: edit.text,74forceMoveMarkers: edit.forceMoveMarkers || false75};76};77assert.deepStrictEqual(originalOp.map(simplifyEdit), editOp.map(simplifyEdit));78}7980test('Insert inline', () => {81assertSingleEditOp(82createSingleEditOp('a', 1, 1),83[84'aMy First Line',85LINE2,86LINE3,87LINE4,88LINE589]90);91});9293test('Replace inline/inline 1', () => {94assertSingleEditOp(95createSingleEditOp(' incredibly awesome', 1, 3),96[97'My incredibly awesome First Line',98LINE2,99LINE3,100LINE4,101LINE5102]103);104});105106test('Replace inline/inline 2', () => {107assertSingleEditOp(108createSingleEditOp(' with text at the end.', 1, 14),109[110'My First Line with text at the end.',111LINE2,112LINE3,113LINE4,114LINE5115]116);117});118119test('Replace inline/inline 3', () => {120assertSingleEditOp(121createSingleEditOp('My new First Line.', 1, 1, 1, 14),122[123'My new First Line.',124LINE2,125LINE3,126LINE4,127LINE5128]129);130});131132test('Replace inline/multi line 1', () => {133assertSingleEditOp(134createSingleEditOp('My new First Line.', 1, 1, 3, 15),135[136'My new First Line.',137LINE4,138LINE5139]140);141});142143test('Replace inline/multi line 2', () => {144assertSingleEditOp(145createSingleEditOp('My new First Line.', 1, 2, 3, 15),146[147'MMy new First Line.',148LINE4,149LINE5150]151);152});153154test('Replace inline/multi line 3', () => {155assertSingleEditOp(156createSingleEditOp('My new First Line.', 1, 2, 3, 2),157[158'MMy new First Line. Third Line',159LINE4,160LINE5161]162);163});164165test('Replace muli line/multi line', () => {166assertSingleEditOp(167createSingleEditOp('1\n2\n3\n4\n', 1, 1),168[169'1',170'2',171'3',172'4',173LINE1,174LINE2,175LINE3,176LINE4,177LINE5178]179);180});181});182183184