Path: blob/main/src/vs/editor/test/browser/view/viewLayer.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 { ILine, RenderedLinesCollection } from '../../../browser/view/viewLayer.js';89class TestLine implements ILine {1011_pinged = false;12constructor(public id: string) {13}1415onContentChanged(): void {16this._pinged = true;17}18onTokensChanged(): void {19this._pinged = true;20}21}2223interface ILinesCollectionState {24startLineNumber: number;25lines: string[];26pinged: boolean[];27}2829function assertState(col: RenderedLinesCollection<TestLine>, state: ILinesCollectionState): void {30const actualState: ILinesCollectionState = {31startLineNumber: col.getStartLineNumber(),32lines: [],33pinged: []34};35for (let lineNumber = col.getStartLineNumber(); lineNumber <= col.getEndLineNumber(); lineNumber++) {36actualState.lines.push(col.getLine(lineNumber).id);37actualState.pinged.push(col.getLine(lineNumber)._pinged);38}39assert.deepStrictEqual(actualState, state);40}4142suite('RenderedLinesCollection onLinesDeleted', () => {4344ensureNoDisposablesAreLeakedInTestSuite();4546function testOnModelLinesDeleted(deleteFromLineNumber: number, deleteToLineNumber: number, expectedDeleted: string[], expectedState: ILinesCollectionState): void {47const col = new RenderedLinesCollection<TestLine>({ createLine: () => new TestLine('new') });48col._set(6, [49new TestLine('old6'),50new TestLine('old7'),51new TestLine('old8'),52new TestLine('old9')53]);54const actualDeleted1 = col.onLinesDeleted(deleteFromLineNumber, deleteToLineNumber);55let actualDeleted: string[] = [];56if (actualDeleted1) {57actualDeleted = actualDeleted1.map(line => line.id);58}59assert.deepStrictEqual(actualDeleted, expectedDeleted);60assertState(col, expectedState);61}6263test('A1', () => {64testOnModelLinesDeleted(3, 3, [], {65startLineNumber: 5,66lines: ['old6', 'old7', 'old8', 'old9'],67pinged: [false, false, false, false]68});69});7071test('A2', () => {72testOnModelLinesDeleted(3, 4, [], {73startLineNumber: 4,74lines: ['old6', 'old7', 'old8', 'old9'],75pinged: [false, false, false, false]76});77});7879test('A3', () => {80testOnModelLinesDeleted(3, 5, [], {81startLineNumber: 3,82lines: ['old6', 'old7', 'old8', 'old9'],83pinged: [false, false, false, false]84});85});8687test('A4', () => {88testOnModelLinesDeleted(3, 6, ['old6'], {89startLineNumber: 3,90lines: ['old7', 'old8', 'old9'],91pinged: [false, false, false]92});93});9495test('A5', () => {96testOnModelLinesDeleted(3, 7, ['old6', 'old7'], {97startLineNumber: 3,98lines: ['old8', 'old9'],99pinged: [false, false]100});101});102103test('A6', () => {104testOnModelLinesDeleted(3, 8, ['old6', 'old7', 'old8'], {105startLineNumber: 3,106lines: ['old9'],107pinged: [false]108});109});110111test('A7', () => {112testOnModelLinesDeleted(3, 9, ['old6', 'old7', 'old8', 'old9'], {113startLineNumber: 3,114lines: [],115pinged: []116});117});118119test('A8', () => {120testOnModelLinesDeleted(3, 10, ['old6', 'old7', 'old8', 'old9'], {121startLineNumber: 3,122lines: [],123pinged: []124});125});126127128test('B1', () => {129testOnModelLinesDeleted(5, 5, [], {130startLineNumber: 5,131lines: ['old6', 'old7', 'old8', 'old9'],132pinged: [false, false, false, false]133});134});135136test('B2', () => {137testOnModelLinesDeleted(5, 6, ['old6'], {138startLineNumber: 5,139lines: ['old7', 'old8', 'old9'],140pinged: [false, false, false]141});142});143144test('B3', () => {145testOnModelLinesDeleted(5, 7, ['old6', 'old7'], {146startLineNumber: 5,147lines: ['old8', 'old9'],148pinged: [false, false]149});150});151152test('B4', () => {153testOnModelLinesDeleted(5, 8, ['old6', 'old7', 'old8'], {154startLineNumber: 5,155lines: ['old9'],156pinged: [false]157});158});159160test('B5', () => {161testOnModelLinesDeleted(5, 9, ['old6', 'old7', 'old8', 'old9'], {162startLineNumber: 5,163lines: [],164pinged: []165});166});167168test('B6', () => {169testOnModelLinesDeleted(5, 10, ['old6', 'old7', 'old8', 'old9'], {170startLineNumber: 5,171lines: [],172pinged: []173});174});175176177test('C1', () => {178testOnModelLinesDeleted(6, 6, ['old6'], {179startLineNumber: 6,180lines: ['old7', 'old8', 'old9'],181pinged: [false, false, false]182});183});184185test('C2', () => {186testOnModelLinesDeleted(6, 7, ['old6', 'old7'], {187startLineNumber: 6,188lines: ['old8', 'old9'],189pinged: [false, false]190});191});192193test('C3', () => {194testOnModelLinesDeleted(6, 8, ['old6', 'old7', 'old8'], {195startLineNumber: 6,196lines: ['old9'],197pinged: [false]198});199});200201test('C4', () => {202testOnModelLinesDeleted(6, 9, ['old6', 'old7', 'old8', 'old9'], {203startLineNumber: 6,204lines: [],205pinged: []206});207});208209test('C5', () => {210testOnModelLinesDeleted(6, 10, ['old6', 'old7', 'old8', 'old9'], {211startLineNumber: 6,212lines: [],213pinged: []214});215});216217218test('D1', () => {219testOnModelLinesDeleted(7, 7, ['old7'], {220startLineNumber: 6,221lines: ['old6', 'old8', 'old9'],222pinged: [false, false, false]223});224});225226test('D2', () => {227testOnModelLinesDeleted(7, 8, ['old7', 'old8'], {228startLineNumber: 6,229lines: ['old6', 'old9'],230pinged: [false, false]231});232});233234test('D3', () => {235testOnModelLinesDeleted(7, 9, ['old7', 'old8', 'old9'], {236startLineNumber: 6,237lines: ['old6'],238pinged: [false]239});240});241242test('D4', () => {243testOnModelLinesDeleted(7, 10, ['old7', 'old8', 'old9'], {244startLineNumber: 6,245lines: ['old6'],246pinged: [false]247});248});249250251test('E1', () => {252testOnModelLinesDeleted(8, 8, ['old8'], {253startLineNumber: 6,254lines: ['old6', 'old7', 'old9'],255pinged: [false, false, false]256});257});258259test('E2', () => {260testOnModelLinesDeleted(8, 9, ['old8', 'old9'], {261startLineNumber: 6,262lines: ['old6', 'old7'],263pinged: [false, false]264});265});266267test('E3', () => {268testOnModelLinesDeleted(8, 10, ['old8', 'old9'], {269startLineNumber: 6,270lines: ['old6', 'old7'],271pinged: [false, false]272});273});274275276test('F1', () => {277testOnModelLinesDeleted(9, 9, ['old9'], {278startLineNumber: 6,279lines: ['old6', 'old7', 'old8'],280pinged: [false, false, false]281});282});283284test('F2', () => {285testOnModelLinesDeleted(9, 10, ['old9'], {286startLineNumber: 6,287lines: ['old6', 'old7', 'old8'],288pinged: [false, false, false]289});290});291292293test('G1', () => {294testOnModelLinesDeleted(10, 10, [], {295startLineNumber: 6,296lines: ['old6', 'old7', 'old8', 'old9'],297pinged: [false, false, false, false]298});299});300301test('G2', () => {302testOnModelLinesDeleted(10, 11, [], {303startLineNumber: 6,304lines: ['old6', 'old7', 'old8', 'old9'],305pinged: [false, false, false, false]306});307});308309310test('H1', () => {311testOnModelLinesDeleted(11, 13, [], {312startLineNumber: 6,313lines: ['old6', 'old7', 'old8', 'old9'],314pinged: [false, false, false, false]315});316});317});318319suite('RenderedLinesCollection onLineChanged', () => {320321ensureNoDisposablesAreLeakedInTestSuite();322323function testOnModelLineChanged(changedLineNumber: number, expectedPinged: boolean, expectedState: ILinesCollectionState): void {324const col = new RenderedLinesCollection<TestLine>({ createLine: () => new TestLine('new') });325col._set(6, [326new TestLine('old6'),327new TestLine('old7'),328new TestLine('old8'),329new TestLine('old9')330]);331const actualPinged = col.onLinesChanged(changedLineNumber, 1);332assert.deepStrictEqual(actualPinged, expectedPinged);333assertState(col, expectedState);334}335336test('3', () => {337testOnModelLineChanged(3, false, {338startLineNumber: 6,339lines: ['old6', 'old7', 'old8', 'old9'],340pinged: [false, false, false, false]341});342});343test('4', () => {344testOnModelLineChanged(4, false, {345startLineNumber: 6,346lines: ['old6', 'old7', 'old8', 'old9'],347pinged: [false, false, false, false]348});349});350test('5', () => {351testOnModelLineChanged(5, false, {352startLineNumber: 6,353lines: ['old6', 'old7', 'old8', 'old9'],354pinged: [false, false, false, false]355});356});357test('6', () => {358testOnModelLineChanged(6, true, {359startLineNumber: 6,360lines: ['old6', 'old7', 'old8', 'old9'],361pinged: [true, false, false, false]362});363});364test('7', () => {365testOnModelLineChanged(7, true, {366startLineNumber: 6,367lines: ['old6', 'old7', 'old8', 'old9'],368pinged: [false, true, false, false]369});370});371test('8', () => {372testOnModelLineChanged(8, true, {373startLineNumber: 6,374lines: ['old6', 'old7', 'old8', 'old9'],375pinged: [false, false, true, false]376});377});378test('9', () => {379testOnModelLineChanged(9, true, {380startLineNumber: 6,381lines: ['old6', 'old7', 'old8', 'old9'],382pinged: [false, false, false, true]383});384});385test('10', () => {386testOnModelLineChanged(10, false, {387startLineNumber: 6,388lines: ['old6', 'old7', 'old8', 'old9'],389pinged: [false, false, false, false]390});391});392test('11', () => {393testOnModelLineChanged(11, false, {394startLineNumber: 6,395lines: ['old6', 'old7', 'old8', 'old9'],396pinged: [false, false, false, false]397});398});399400});401402suite('RenderedLinesCollection onLinesInserted', () => {403404ensureNoDisposablesAreLeakedInTestSuite();405406function testOnModelLinesInserted(insertFromLineNumber: number, insertToLineNumber: number, expectedDeleted: string[], expectedState: ILinesCollectionState): void {407const col = new RenderedLinesCollection<TestLine>({ createLine: () => new TestLine('new') });408col._set(6, [409new TestLine('old6'),410new TestLine('old7'),411new TestLine('old8'),412new TestLine('old9')413]);414const actualDeleted1 = col.onLinesInserted(insertFromLineNumber, insertToLineNumber);415let actualDeleted: string[] = [];416if (actualDeleted1) {417actualDeleted = actualDeleted1.map(line => line.id);418}419assert.deepStrictEqual(actualDeleted, expectedDeleted);420assertState(col, expectedState);421}422423test('A1', () => {424testOnModelLinesInserted(3, 3, [], {425startLineNumber: 7,426lines: ['old6', 'old7', 'old8', 'old9'],427pinged: [false, false, false, false]428});429});430431test('A2', () => {432testOnModelLinesInserted(3, 4, [], {433startLineNumber: 8,434lines: ['old6', 'old7', 'old8', 'old9'],435pinged: [false, false, false, false]436});437});438439test('A3', () => {440testOnModelLinesInserted(3, 5, [], {441startLineNumber: 9,442lines: ['old6', 'old7', 'old8', 'old9'],443pinged: [false, false, false, false]444});445});446447test('A4', () => {448testOnModelLinesInserted(3, 6, [], {449startLineNumber: 10,450lines: ['old6', 'old7', 'old8', 'old9'],451pinged: [false, false, false, false]452});453});454455test('A5', () => {456testOnModelLinesInserted(3, 7, [], {457startLineNumber: 11,458lines: ['old6', 'old7', 'old8', 'old9'],459pinged: [false, false, false, false]460});461});462463test('A6', () => {464testOnModelLinesInserted(3, 8, [], {465startLineNumber: 12,466lines: ['old6', 'old7', 'old8', 'old9'],467pinged: [false, false, false, false]468});469});470471test('A7', () => {472testOnModelLinesInserted(3, 9, [], {473startLineNumber: 13,474lines: ['old6', 'old7', 'old8', 'old9'],475pinged: [false, false, false, false]476});477});478479test('A8', () => {480testOnModelLinesInserted(3, 10, [], {481startLineNumber: 14,482lines: ['old6', 'old7', 'old8', 'old9'],483pinged: [false, false, false, false]484});485});486487488test('B1', () => {489testOnModelLinesInserted(5, 5, [], {490startLineNumber: 7,491lines: ['old6', 'old7', 'old8', 'old9'],492pinged: [false, false, false, false]493});494});495496test('B2', () => {497testOnModelLinesInserted(5, 6, [], {498startLineNumber: 8,499lines: ['old6', 'old7', 'old8', 'old9'],500pinged: [false, false, false, false]501});502});503504test('B3', () => {505testOnModelLinesInserted(5, 7, [], {506startLineNumber: 9,507lines: ['old6', 'old7', 'old8', 'old9'],508pinged: [false, false, false, false]509});510});511512test('B4', () => {513testOnModelLinesInserted(5, 8, [], {514startLineNumber: 10,515lines: ['old6', 'old7', 'old8', 'old9'],516pinged: [false, false, false, false]517});518});519520test('B5', () => {521testOnModelLinesInserted(5, 9, [], {522startLineNumber: 11,523lines: ['old6', 'old7', 'old8', 'old9'],524pinged: [false, false, false, false]525});526});527528test('B6', () => {529testOnModelLinesInserted(5, 10, [], {530startLineNumber: 12,531lines: ['old6', 'old7', 'old8', 'old9'],532pinged: [false, false, false, false]533});534});535536537test('C1', () => {538testOnModelLinesInserted(6, 6, [], {539startLineNumber: 7,540lines: ['old6', 'old7', 'old8', 'old9'],541pinged: [false, false, false, false]542});543});544545test('C2', () => {546testOnModelLinesInserted(6, 7, [], {547startLineNumber: 8,548lines: ['old6', 'old7', 'old8', 'old9'],549pinged: [false, false, false, false]550});551});552553test('C3', () => {554testOnModelLinesInserted(6, 8, [], {555startLineNumber: 9,556lines: ['old6', 'old7', 'old8', 'old9'],557pinged: [false, false, false, false]558});559});560561test('C4', () => {562testOnModelLinesInserted(6, 9, [], {563startLineNumber: 10,564lines: ['old6', 'old7', 'old8', 'old9'],565pinged: [false, false, false, false]566});567});568569test('C5', () => {570testOnModelLinesInserted(6, 10, [], {571startLineNumber: 11,572lines: ['old6', 'old7', 'old8', 'old9'],573pinged: [false, false, false, false]574});575});576577578test('D1', () => {579testOnModelLinesInserted(7, 7, ['old9'], {580startLineNumber: 6,581lines: ['old6', 'new', 'old7', 'old8'],582pinged: [false, false, false, false]583});584});585586test('D2', () => {587testOnModelLinesInserted(7, 8, ['old8', 'old9'], {588startLineNumber: 6,589lines: ['old6', 'new', 'new', 'old7'],590pinged: [false, false, false, false]591});592});593594test('D3', () => {595testOnModelLinesInserted(7, 9, ['old7', 'old8', 'old9'], {596startLineNumber: 6,597lines: ['old6'],598pinged: [false]599});600});601602test('D4', () => {603testOnModelLinesInserted(7, 10, ['old7', 'old8', 'old9'], {604startLineNumber: 6,605lines: ['old6'],606pinged: [false]607});608});609610611test('E1', () => {612testOnModelLinesInserted(8, 8, ['old9'], {613startLineNumber: 6,614lines: ['old6', 'old7', 'new', 'old8'],615pinged: [false, false, false, false]616});617});618619test('E2', () => {620testOnModelLinesInserted(8, 9, ['old8', 'old9'], {621startLineNumber: 6,622lines: ['old6', 'old7'],623pinged: [false, false]624});625});626627test('E3', () => {628testOnModelLinesInserted(8, 10, ['old8', 'old9'], {629startLineNumber: 6,630lines: ['old6', 'old7'],631pinged: [false, false]632});633});634635636test('F1', () => {637testOnModelLinesInserted(9, 9, ['old9'], {638startLineNumber: 6,639lines: ['old6', 'old7', 'old8'],640pinged: [false, false, false]641});642});643644test('F2', () => {645testOnModelLinesInserted(9, 10, ['old9'], {646startLineNumber: 6,647lines: ['old6', 'old7', 'old8'],648pinged: [false, false, false]649});650});651652653test('G1', () => {654testOnModelLinesInserted(10, 10, [], {655startLineNumber: 6,656lines: ['old6', 'old7', 'old8', 'old9'],657pinged: [false, false, false, false]658});659});660661test('G2', () => {662testOnModelLinesInserted(10, 11, [], {663startLineNumber: 6,664lines: ['old6', 'old7', 'old8', 'old9'],665pinged: [false, false, false, false]666});667});668669670test('H1', () => {671testOnModelLinesInserted(11, 13, [], {672startLineNumber: 6,673lines: ['old6', 'old7', 'old8', 'old9'],674pinged: [false, false, false, false]675});676});677});678679680suite('RenderedLinesCollection onTokensChanged', () => {681682ensureNoDisposablesAreLeakedInTestSuite();683684function testOnModelTokensChanged(changedFromLineNumber: number, changedToLineNumber: number, expectedPinged: boolean, expectedState: ILinesCollectionState): void {685const col = new RenderedLinesCollection<TestLine>({ createLine: () => new TestLine('new') });686col._set(6, [687new TestLine('old6'),688new TestLine('old7'),689new TestLine('old8'),690new TestLine('old9')691]);692const actualPinged = col.onTokensChanged([{ fromLineNumber: changedFromLineNumber, toLineNumber: changedToLineNumber }]);693assert.deepStrictEqual(actualPinged, expectedPinged);694assertState(col, expectedState);695}696697test('A', () => {698testOnModelTokensChanged(3, 3, false, {699startLineNumber: 6,700lines: ['old6', 'old7', 'old8', 'old9'],701pinged: [false, false, false, false]702});703});704test('B', () => {705testOnModelTokensChanged(3, 5, false, {706startLineNumber: 6,707lines: ['old6', 'old7', 'old8', 'old9'],708pinged: [false, false, false, false]709});710});711test('C', () => {712testOnModelTokensChanged(3, 6, true, {713startLineNumber: 6,714lines: ['old6', 'old7', 'old8', 'old9'],715pinged: [true, false, false, false]716});717});718test('D', () => {719testOnModelTokensChanged(6, 6, true, {720startLineNumber: 6,721lines: ['old6', 'old7', 'old8', 'old9'],722pinged: [true, false, false, false]723});724});725test('E', () => {726testOnModelTokensChanged(5, 10, true, {727startLineNumber: 6,728lines: ['old6', 'old7', 'old8', 'old9'],729pinged: [true, true, true, true]730});731});732test('F', () => {733testOnModelTokensChanged(8, 9, true, {734startLineNumber: 6,735lines: ['old6', 'old7', 'old8', 'old9'],736pinged: [false, false, true, true]737});738});739test('G', () => {740testOnModelTokensChanged(8, 11, true, {741startLineNumber: 6,742lines: ['old6', 'old7', 'old8', 'old9'],743pinged: [false, false, true, true]744});745});746test('H', () => {747testOnModelTokensChanged(10, 10, false, {748startLineNumber: 6,749lines: ['old6', 'old7', 'old8', 'old9'],750pinged: [false, false, false, false]751});752});753test('I', () => {754testOnModelTokensChanged(10, 11, false, {755startLineNumber: 6,756lines: ['old6', 'old7', 'old8', 'old9'],757pinged: [false, false, false, false]758});759});760});761762763