Path: blob/main/src/vs/editor/test/common/model/linesTextBuffer/linesTextBuffer.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*--------------------------------------------------------------------------------------------*/45import assert from 'assert';6import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';7import { Range } from '../../../../common/core/range.js';8import { DefaultEndOfLine } from '../../../../common/model.js';9import { IValidatedEditOperation, PieceTreeTextBuffer } from '../../../../common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.js';10import { createTextBufferFactory } from '../../../../common/model/textModel.js';1112suite('PieceTreeTextBuffer._getInverseEdits', () => {1314ensureNoDisposablesAreLeakedInTestSuite();1516function editOp(startLineNumber: number, startColumn: number, endLineNumber: number, endColumn: number, text: string[] | null): IValidatedEditOperation {17return {18sortIndex: 0,19identifier: null,20range: new Range(startLineNumber, startColumn, endLineNumber, endColumn),21rangeOffset: 0,22rangeLength: 0,23text: text ? text.join('\n') : '',24eolCount: text ? text.length - 1 : 0,25firstLineLength: text ? text[0].length : 0,26lastLineLength: text ? text[text.length - 1].length : 0,27forceMoveMarkers: false,28isAutoWhitespaceEdit: false29};30}3132function inverseEditOp(startLineNumber: number, startColumn: number, endLineNumber: number, endColumn: number): Range {33return new Range(startLineNumber, startColumn, endLineNumber, endColumn);34}3536function assertInverseEdits(ops: IValidatedEditOperation[], expected: Range[]): void {37const actual = PieceTreeTextBuffer._getInverseEditRanges(ops);38assert.deepStrictEqual(actual, expected);39}4041test('single insert', () => {42assertInverseEdits(43[44editOp(1, 1, 1, 1, ['hello'])45],46[47inverseEditOp(1, 1, 1, 6)48]49);50});5152test('Bug 19872: Undo is funky', () => {53assertInverseEdits(54[55editOp(2, 1, 2, 2, ['']),56editOp(3, 1, 4, 2, [''])57],58[59inverseEditOp(2, 1, 2, 1),60inverseEditOp(3, 1, 3, 1)61]62);63});6465test('two single unrelated inserts', () => {66assertInverseEdits(67[68editOp(1, 1, 1, 1, ['hello']),69editOp(2, 1, 2, 1, ['world'])70],71[72inverseEditOp(1, 1, 1, 6),73inverseEditOp(2, 1, 2, 6)74]75);76});7778test('two single inserts 1', () => {79assertInverseEdits(80[81editOp(1, 1, 1, 1, ['hello']),82editOp(1, 2, 1, 2, ['world'])83],84[85inverseEditOp(1, 1, 1, 6),86inverseEditOp(1, 7, 1, 12)87]88);89});9091test('two single inserts 2', () => {92assertInverseEdits(93[94editOp(1, 1, 1, 1, ['hello']),95editOp(1, 4, 1, 4, ['world'])96],97[98inverseEditOp(1, 1, 1, 6),99inverseEditOp(1, 9, 1, 14)100]101);102});103104test('multiline insert', () => {105assertInverseEdits(106[107editOp(1, 1, 1, 1, ['hello', 'world'])108],109[110inverseEditOp(1, 1, 2, 6)111]112);113});114115test('two unrelated multiline inserts', () => {116assertInverseEdits(117[118editOp(1, 1, 1, 1, ['hello', 'world']),119editOp(2, 1, 2, 1, ['how', 'are', 'you?']),120],121[122inverseEditOp(1, 1, 2, 6),123inverseEditOp(3, 1, 5, 5),124]125);126});127128test('two multiline inserts 1', () => {129assertInverseEdits(130[131editOp(1, 1, 1, 1, ['hello', 'world']),132editOp(1, 2, 1, 2, ['how', 'are', 'you?']),133],134[135inverseEditOp(1, 1, 2, 6),136inverseEditOp(2, 7, 4, 5),137]138);139});140141test('single delete', () => {142assertInverseEdits(143[144editOp(1, 1, 1, 6, null)145],146[147inverseEditOp(1, 1, 1, 1)148]149);150});151152test('two single unrelated deletes', () => {153assertInverseEdits(154[155editOp(1, 1, 1, 6, null),156editOp(2, 1, 2, 6, null)157],158[159inverseEditOp(1, 1, 1, 1),160inverseEditOp(2, 1, 2, 1)161]162);163});164165test('two single deletes 1', () => {166assertInverseEdits(167[168editOp(1, 1, 1, 6, null),169editOp(1, 7, 1, 12, null)170],171[172inverseEditOp(1, 1, 1, 1),173inverseEditOp(1, 2, 1, 2)174]175);176});177178test('two single deletes 2', () => {179assertInverseEdits(180[181editOp(1, 1, 1, 6, null),182editOp(1, 9, 1, 14, null)183],184[185inverseEditOp(1, 1, 1, 1),186inverseEditOp(1, 4, 1, 4)187]188);189});190191test('multiline delete', () => {192assertInverseEdits(193[194editOp(1, 1, 2, 6, null)195],196[197inverseEditOp(1, 1, 1, 1)198]199);200});201202test('two unrelated multiline deletes', () => {203assertInverseEdits(204[205editOp(1, 1, 2, 6, null),206editOp(3, 1, 5, 5, null),207],208[209inverseEditOp(1, 1, 1, 1),210inverseEditOp(2, 1, 2, 1),211]212);213});214215test('two multiline deletes 1', () => {216assertInverseEdits(217[218editOp(1, 1, 2, 6, null),219editOp(2, 7, 4, 5, null),220],221[222inverseEditOp(1, 1, 1, 1),223inverseEditOp(1, 2, 1, 2),224]225);226});227228test('single replace', () => {229assertInverseEdits(230[231editOp(1, 1, 1, 6, ['Hello world'])232],233[234inverseEditOp(1, 1, 1, 12)235]236);237});238239test('two replaces', () => {240assertInverseEdits(241[242editOp(1, 1, 1, 6, ['Hello world']),243editOp(1, 7, 1, 8, ['How are you?']),244],245[246inverseEditOp(1, 1, 1, 12),247inverseEditOp(1, 13, 1, 25)248]249);250});251252test('many edits', () => {253assertInverseEdits(254[255editOp(1, 2, 1, 2, ['', ' ']),256editOp(1, 5, 1, 6, ['']),257editOp(1, 9, 1, 9, ['', ''])258],259[260inverseEditOp(1, 2, 2, 3),261inverseEditOp(2, 6, 2, 6),262inverseEditOp(2, 9, 3, 1)263]264);265});266});267268suite('PieceTreeTextBuffer._toSingleEditOperation', () => {269270ensureNoDisposablesAreLeakedInTestSuite();271272function editOp(startLineNumber: number, startColumn: number, endLineNumber: number, endColumn: number, rangeOffset: number, rangeLength: number, text: string[] | null): IValidatedEditOperation {273return {274sortIndex: 0,275identifier: null,276range: new Range(startLineNumber, startColumn, endLineNumber, endColumn),277rangeOffset: rangeOffset,278rangeLength: rangeLength,279text: text ? text.join('\n') : '',280eolCount: text ? text.length - 1 : 0,281firstLineLength: text ? text[0].length : 0,282lastLineLength: text ? text[text.length - 1].length : 0,283forceMoveMarkers: false,284isAutoWhitespaceEdit: false285};286}287288function testToSingleEditOperation(original: string[], edits: IValidatedEditOperation[], expected: IValidatedEditOperation): void {289const { disposable, textBuffer } = createTextBufferFactory(original.join('\n')).create(DefaultEndOfLine.LF);290291const actual = (<PieceTreeTextBuffer>textBuffer)._toSingleEditOperation(edits);292assert.deepStrictEqual(actual, expected);293disposable.dispose();294}295296test('one edit op is unchanged', () => {297testToSingleEditOperation(298[299'My First Line',300'\t\tMy Second Line',301' Third Line',302'',303'1'304],305[306editOp(1, 3, 1, 3, 2, 0, [' new line', 'No longer'])307],308editOp(1, 3, 1, 3, 2, 0, [' new line', 'No longer'])309);310});311312test('two edits on one line', () => {313testToSingleEditOperation([314'My First Line',315'\t\tMy Second Line',316' Third Line',317'',318'1'319], [320editOp(1, 1, 1, 3, 0, 2, ['Your']),321editOp(1, 4, 1, 4, 3, 0, ['Interesting ']),322editOp(2, 3, 2, 6, 16, 3, null)323],324editOp(1, 1, 2, 6, 0, 19, [325'Your Interesting First Line',326'\t\t'327]));328});329330test('insert multiple newlines', () => {331testToSingleEditOperation(332[333'My First Line',334'\t\tMy Second Line',335' Third Line',336'',337'1'338],339[340editOp(1, 3, 1, 3, 2, 0, ['', '', '', '', '']),341editOp(3, 15, 3, 15, 45, 0, ['a', 'b'])342],343editOp(1, 3, 3, 15, 2, 43, [344'',345'',346'',347'',348' First Line',349'\t\tMy Second Line',350' Third Linea',351'b'352])353);354});355356test('delete empty text', () => {357testToSingleEditOperation(358[359'My First Line',360'\t\tMy Second Line',361' Third Line',362'',363'1'364],365[366editOp(1, 1, 1, 1, 0, 0, [''])367],368editOp(1, 1, 1, 1, 0, 0, [''])369);370});371372test('two unrelated edits', () => {373testToSingleEditOperation(374[375'My First Line',376'\t\tMy Second Line',377' Third Line',378'',379'123'380],381[382editOp(2, 1, 2, 3, 14, 2, ['\t']),383editOp(3, 1, 3, 5, 31, 4, [''])384],385editOp(2, 1, 3, 5, 14, 21, ['\tMy Second Line', ''])386);387});388389test('many edits', () => {390testToSingleEditOperation(391[392'{"x" : 1}'393],394[395editOp(1, 2, 1, 2, 1, 0, ['\n ']),396editOp(1, 5, 1, 6, 4, 1, ['']),397editOp(1, 9, 1, 9, 8, 0, ['\n'])398],399editOp(1, 2, 1, 9, 1, 7, [400'',401' "x": 1',402''403])404);405});406407test('many edits reversed', () => {408testToSingleEditOperation(409[410'{',411' "x": 1',412'}'413],414[415editOp(1, 2, 2, 3, 1, 3, ['']),416editOp(2, 6, 2, 6, 7, 0, [' ']),417editOp(2, 9, 3, 1, 10, 1, [''])418],419editOp(1, 2, 3, 1, 1, 10, ['"x" : 1'])420);421});422423test('replacing newlines 1', () => {424testToSingleEditOperation(425[426'{',427'"a": true,',428'',429'"b": true',430'}'431],432[433editOp(1, 2, 2, 1, 1, 1, ['', '\t']),434editOp(2, 11, 4, 1, 12, 2, ['', '\t'])435],436editOp(1, 2, 4, 1, 1, 13, [437'',438'\t"a": true,',439'\t'440])441);442});443444test('replacing newlines 2', () => {445testToSingleEditOperation(446[447'some text',448'some more text',449'now comes an empty line',450'',451'after empty line',452'and the last line'453],454[455editOp(1, 5, 3, 1, 4, 21, [' text', 'some more text', 'some more text']),456editOp(3, 2, 4, 1, 26, 23, ['o more lines', 'asd', 'asd', 'asd']),457editOp(5, 1, 5, 6, 50, 5, ['zzzzzzzz']),458editOp(5, 11, 6, 16, 60, 22, ['1', '2', '3', '4'])459],460editOp(1, 5, 6, 16, 4, 78, [461' text',462'some more text',463'some more textno more lines',464'asd',465'asd',466'asd',467'zzzzzzzz empt1',468'2',469'3',470'4'471])472);473});474475test('advanced', () => {476testToSingleEditOperation(477[478' { "d": [',479' null',480' ] /*comment*/',481' ,"e": /*comment*/ [null] }',482],483[484editOp(1, 1, 1, 2, 0, 1, ['']),485editOp(1, 3, 1, 10, 2, 7, ['', ' ']),486editOp(1, 16, 2, 14, 15, 14, ['', ' ']),487editOp(2, 18, 3, 9, 33, 9, ['', ' ']),488editOp(3, 22, 4, 9, 55, 9, ['']),489editOp(4, 10, 4, 10, 65, 0, ['', ' ']),490editOp(4, 28, 4, 28, 83, 0, ['', ' ']),491editOp(4, 32, 4, 32, 87, 0, ['', ' ']),492editOp(4, 33, 4, 34, 88, 1, ['', ''])493],494editOp(1, 1, 4, 34, 0, 89, [495'{',496' "d": [',497' null',498' ] /*comment*/,',499' "e": /*comment*/ [',500' null',501' ]',502''503])504);505});506507test('advanced simplified', () => {508testToSingleEditOperation(509[510' abc',511' ,def'512],513[514editOp(1, 1, 1, 4, 0, 3, ['']),515editOp(1, 7, 2, 2, 6, 2, ['']),516editOp(2, 3, 2, 3, 9, 0, ['', ''])517],518editOp(1, 1, 2, 3, 0, 9, [519'abc,',520''521])522);523});524});525526527