Path: blob/main/src/vs/editor/test/common/viewLayout/linesLayout.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 { EditorWhitespace, LinesLayout } from '../../../common/viewLayout/linesLayout.js';78suite('Editor ViewLayout - LinesLayout', () => {910ensureNoDisposablesAreLeakedInTestSuite();1112function insertWhitespace(linesLayout: LinesLayout, afterLineNumber: number, ordinal: number, heightInPx: number, minWidth: number): string {13let id: string;14linesLayout.changeWhitespace((accessor) => {15id = accessor.insertWhitespace(afterLineNumber, ordinal, heightInPx, minWidth);16});17return id!;18}1920function changeOneWhitespace(linesLayout: LinesLayout, id: string, newAfterLineNumber: number, newHeight: number): void {21linesLayout.changeWhitespace((accessor) => {22accessor.changeOneWhitespace(id, newAfterLineNumber, newHeight);23});24}2526function removeWhitespace(linesLayout: LinesLayout, id: string): void {27linesLayout.changeWhitespace((accessor) => {28accessor.removeWhitespace(id);29});30}3132test('LinesLayout 1', () => {3334// Start off with 10 lines35const linesLayout = new LinesLayout(10, 10, 0, 0, []);3637// lines: [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]38// whitespace: -39assert.strictEqual(linesLayout.getLinesTotalHeight(), 100);40assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(1), 0);41assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(2), 10);42assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(3), 20);43assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(4), 30);44assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(5), 40);45assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(6), 50);46assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(7), 60);47assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(8), 70);48assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(9), 80);49assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(10), 90);5051assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(0), 1);52assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(1), 1);53assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(5), 1);54assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(9), 1);55assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(10), 2);56assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(11), 2);57assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(15), 2);58assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(19), 2);59assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(20), 3);60assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(21), 3);61assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(29), 3);6263// Add whitespace of height 5px after 2nd line64insertWhitespace(linesLayout, 2, 0, 5, 0);65// lines: [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]66// whitespace: a(2,5)67assert.strictEqual(linesLayout.getLinesTotalHeight(), 105);68assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(1), 0);69assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(2), 10);70assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(3), 25);71assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(4), 35);72assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(5), 45);7374assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(0), 1);75assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(1), 1);76assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(9), 1);77assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(10), 2);78assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(20), 3);79assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(21), 3);80assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(24), 3);81assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(25), 3);82assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(35), 4);83assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(45), 5);84assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(104), 10);85assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(105), 10);8687// Add two more whitespaces of height 5px88insertWhitespace(linesLayout, 3, 0, 5, 0);89insertWhitespace(linesLayout, 4, 0, 5, 0);90// lines: [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]91// whitespace: a(2,5), b(3, 5), c(4, 5)92assert.strictEqual(linesLayout.getLinesTotalHeight(), 115);93assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(1), 0);94assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(2), 10);95assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(3), 25);96assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(4), 40);97assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(5), 55);98assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(6), 65);99100assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(0), 1);101assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(1), 1);102assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(9), 1);103assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(10), 2);104assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(19), 2);105assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(20), 3);106assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(34), 3);107assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(35), 4);108assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(49), 4);109assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(50), 5);110assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(64), 5);111assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(65), 6);112113assert.strictEqual(linesLayout.getVerticalOffsetForWhitespaceIndex(0), 20); // 20 -> 25114assert.strictEqual(linesLayout.getVerticalOffsetForWhitespaceIndex(1), 35); // 35 -> 40115assert.strictEqual(linesLayout.getVerticalOffsetForWhitespaceIndex(2), 50);116117assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(0), 0);118assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(19), 0);119assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(20), 0);120assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(21), 0);121assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(22), 0);122assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(23), 0);123assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(24), 0);124assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(25), 1);125assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(26), 1);126assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(34), 1);127assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(35), 1);128assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(36), 1);129assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(39), 1);130assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(40), 2);131assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(41), 2);132assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(49), 2);133assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(50), 2);134assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(51), 2);135assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(54), 2);136assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(55), -1);137assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(1000), -1);138139});140141test('LinesLayout 2', () => {142143// Start off with 10 lines and one whitespace after line 2, of height 5144const linesLayout = new LinesLayout(10, 1, 0, 0, []);145const a = insertWhitespace(linesLayout, 2, 0, 5, 0);146147// 10 lines148// whitespace: - a(2,5)149assert.strictEqual(linesLayout.getLinesTotalHeight(), 15);150assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(1), 0);151assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(2), 1);152assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(3), 7);153assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(4), 8);154assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(5), 9);155assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(6), 10);156assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(7), 11);157assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(8), 12);158assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(9), 13);159assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(10), 14);160161// Change whitespace height162// 10 lines163// whitespace: - a(2,10)164changeOneWhitespace(linesLayout, a, 2, 10);165assert.strictEqual(linesLayout.getLinesTotalHeight(), 20);166assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(1), 0);167assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(2), 1);168assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(3), 12);169assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(4), 13);170assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(5), 14);171assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(6), 15);172assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(7), 16);173assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(8), 17);174assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(9), 18);175assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(10), 19);176177// Change whitespace position178// 10 lines179// whitespace: - a(5,10)180changeOneWhitespace(linesLayout, a, 5, 10);181assert.strictEqual(linesLayout.getLinesTotalHeight(), 20);182assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(1), 0);183assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(2), 1);184assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(3), 2);185assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(4), 3);186assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(5), 4);187assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(6), 15);188assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(7), 16);189assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(8), 17);190assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(9), 18);191assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(10), 19);192193// Pretend that lines 5 and 6 were deleted194// 8 lines195// whitespace: - a(4,10)196linesLayout.onLinesDeleted(5, 6);197assert.strictEqual(linesLayout.getLinesTotalHeight(), 18);198assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(1), 0);199assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(2), 1);200assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(3), 2);201assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(4), 3);202assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(5), 14);203assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(6), 15);204assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(7), 16);205assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(8), 17);206207// Insert two lines at the beginning208// 10 lines209// whitespace: - a(6,10)210linesLayout.onLinesInserted(1, 2);211assert.strictEqual(linesLayout.getLinesTotalHeight(), 20);212assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(1), 0);213assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(2), 1);214assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(3), 2);215assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(4), 3);216assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(5), 4);217assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(6), 5);218assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(7), 16);219assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(8), 17);220assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(9), 18);221assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(10), 19);222223// Remove whitespace224// 10 lines225removeWhitespace(linesLayout, a);226assert.strictEqual(linesLayout.getLinesTotalHeight(), 10);227assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(1), 0);228assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(2), 1);229assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(3), 2);230assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(4), 3);231assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(5), 4);232assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(6), 5);233assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(7), 6);234assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(8), 7);235assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(9), 8);236assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(10), 9);237});238239test('LinesLayout Padding', () => {240// Start off with 10 lines241const linesLayout = new LinesLayout(10, 10, 15, 20, []);242243// lines: [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]244// whitespace: -245assert.strictEqual(linesLayout.getLinesTotalHeight(), 135);246assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(1), 15);247assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(2), 25);248assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(3), 35);249assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(4), 45);250assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(5), 55);251assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(6), 65);252assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(7), 75);253assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(8), 85);254assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(9), 95);255assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(10), 105);256257assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(0), 1);258assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(10), 1);259assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(15), 1);260assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(24), 1);261assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(25), 2);262assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(34), 2);263assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(35), 3);264265// Add whitespace of height 5px after 2nd line266insertWhitespace(linesLayout, 2, 0, 5, 0);267// lines: [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]268// whitespace: a(2,5)269assert.strictEqual(linesLayout.getLinesTotalHeight(), 140);270assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(1), 15);271assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(2), 25);272assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(3), 40);273assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(4), 50);274275assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(0), 1);276assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(10), 1);277assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(25), 2);278assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(34), 2);279assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(35), 3);280assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(39), 3);281assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(40), 3);282assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(41), 3);283assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(49), 3);284assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(50), 4);285286// Add two more whitespaces of height 5px287insertWhitespace(linesLayout, 3, 0, 5, 0);288insertWhitespace(linesLayout, 4, 0, 5, 0);289// lines: [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]290// whitespace: a(2,5), b(3, 5), c(4, 5)291assert.strictEqual(linesLayout.getLinesTotalHeight(), 150);292assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(1), 15);293assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(2), 25);294assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(3), 40);295assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(4), 55);296assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(5), 70);297assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(6), 80);298299assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(0), 1);300assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(15), 1);301assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(24), 1);302assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(30), 2);303assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(35), 3);304assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(39), 3);305assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(40), 3);306assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(49), 3);307assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(50), 4);308assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(54), 4);309assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(55), 4);310assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(64), 4);311assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(65), 5);312assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(69), 5);313assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(70), 5);314assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(80), 6);315316assert.strictEqual(linesLayout.getVerticalOffsetForWhitespaceIndex(0), 35); // 35 -> 40317assert.strictEqual(linesLayout.getVerticalOffsetForWhitespaceIndex(1), 50); // 50 -> 55318assert.strictEqual(linesLayout.getVerticalOffsetForWhitespaceIndex(2), 65);319320assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(0), 0);321assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(34), 0);322assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(35), 0);323assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(39), 0);324assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(40), 1);325assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(49), 1);326assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(50), 1);327assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(54), 1);328assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(55), 2);329assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(64), 2);330assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(65), 2);331assert.strictEqual(linesLayout.getWhitespaceIndexAtOrAfterVerticallOffset(70), -1);332});333334test('LinesLayout getLineNumberAtOrAfterVerticalOffset', () => {335const linesLayout = new LinesLayout(10, 1, 0, 0, []);336insertWhitespace(linesLayout, 6, 0, 10, 0);337338// 10 lines339// whitespace: - a(6,10)340assert.strictEqual(linesLayout.getLinesTotalHeight(), 20);341assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(1), 0);342assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(2), 1);343assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(3), 2);344assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(4), 3);345assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(5), 4);346assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(6), 5);347assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(7), 16);348assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(8), 17);349assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(9), 18);350assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(10), 19);351352// Do some hit testing353// line [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]354// vertical: [0, 1, 2, 3, 4, 5, 16, 17, 18, 19]355assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(-100), 1);356assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(-1), 1);357assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(0), 1);358assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(1), 2);359assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(2), 3);360assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(3), 4);361assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(4), 5);362assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(5), 6);363assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(6), 7);364assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(7), 7);365assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(8), 7);366assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(9), 7);367assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(10), 7);368assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(11), 7);369assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(12), 7);370assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(13), 7);371assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(14), 7);372assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(15), 7);373assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(16), 7);374assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(17), 8);375assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(18), 9);376assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(19), 10);377assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(20), 10);378assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(21), 10);379assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(22), 10);380assert.strictEqual(linesLayout.getLineNumberAtOrAfterVerticalOffset(23), 10);381});382383test('LinesLayout getCenteredLineInViewport', () => {384const linesLayout = new LinesLayout(10, 1, 0, 0, []);385insertWhitespace(linesLayout, 6, 0, 10, 0);386387// 10 lines388// whitespace: - a(6,10)389assert.strictEqual(linesLayout.getLinesTotalHeight(), 20);390assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(1), 0);391assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(2), 1);392assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(3), 2);393assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(4), 3);394assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(5), 4);395assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(6), 5);396assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(7), 16);397assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(8), 17);398assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(9), 18);399assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(10), 19);400401// Find centered line in viewport 1402// line [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]403// vertical: [0, 1, 2, 3, 4, 5, 16, 17, 18, 19]404assert.strictEqual(linesLayout.getLinesViewportData(0, 1).centeredLineNumber, 1);405assert.strictEqual(linesLayout.getLinesViewportData(0, 2).centeredLineNumber, 2);406assert.strictEqual(linesLayout.getLinesViewportData(0, 3).centeredLineNumber, 2);407assert.strictEqual(linesLayout.getLinesViewportData(0, 4).centeredLineNumber, 3);408assert.strictEqual(linesLayout.getLinesViewportData(0, 5).centeredLineNumber, 3);409assert.strictEqual(linesLayout.getLinesViewportData(0, 6).centeredLineNumber, 4);410assert.strictEqual(linesLayout.getLinesViewportData(0, 7).centeredLineNumber, 4);411assert.strictEqual(linesLayout.getLinesViewportData(0, 8).centeredLineNumber, 5);412assert.strictEqual(linesLayout.getLinesViewportData(0, 9).centeredLineNumber, 5);413assert.strictEqual(linesLayout.getLinesViewportData(0, 10).centeredLineNumber, 6);414assert.strictEqual(linesLayout.getLinesViewportData(0, 11).centeredLineNumber, 6);415assert.strictEqual(linesLayout.getLinesViewportData(0, 12).centeredLineNumber, 6);416assert.strictEqual(linesLayout.getLinesViewportData(0, 13).centeredLineNumber, 6);417assert.strictEqual(linesLayout.getLinesViewportData(0, 14).centeredLineNumber, 6);418assert.strictEqual(linesLayout.getLinesViewportData(0, 15).centeredLineNumber, 6);419assert.strictEqual(linesLayout.getLinesViewportData(0, 16).centeredLineNumber, 6);420assert.strictEqual(linesLayout.getLinesViewportData(0, 17).centeredLineNumber, 7);421assert.strictEqual(linesLayout.getLinesViewportData(0, 18).centeredLineNumber, 7);422assert.strictEqual(linesLayout.getLinesViewportData(0, 19).centeredLineNumber, 7);423assert.strictEqual(linesLayout.getLinesViewportData(0, 20).centeredLineNumber, 7);424assert.strictEqual(linesLayout.getLinesViewportData(0, 21).centeredLineNumber, 7);425assert.strictEqual(linesLayout.getLinesViewportData(0, 22).centeredLineNumber, 7);426assert.strictEqual(linesLayout.getLinesViewportData(0, 23).centeredLineNumber, 7);427assert.strictEqual(linesLayout.getLinesViewportData(0, 24).centeredLineNumber, 7);428assert.strictEqual(linesLayout.getLinesViewportData(0, 25).centeredLineNumber, 7);429assert.strictEqual(linesLayout.getLinesViewportData(0, 26).centeredLineNumber, 7);430assert.strictEqual(linesLayout.getLinesViewportData(0, 27).centeredLineNumber, 7);431assert.strictEqual(linesLayout.getLinesViewportData(0, 28).centeredLineNumber, 7);432assert.strictEqual(linesLayout.getLinesViewportData(0, 29).centeredLineNumber, 7);433assert.strictEqual(linesLayout.getLinesViewportData(0, 30).centeredLineNumber, 7);434assert.strictEqual(linesLayout.getLinesViewportData(0, 31).centeredLineNumber, 7);435assert.strictEqual(linesLayout.getLinesViewportData(0, 32).centeredLineNumber, 7);436assert.strictEqual(linesLayout.getLinesViewportData(0, 33).centeredLineNumber, 7);437438// Find centered line in viewport 2439// line [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]440// vertical: [0, 1, 2, 3, 4, 5, 16, 17, 18, 19]441assert.strictEqual(linesLayout.getLinesViewportData(0, 20).centeredLineNumber, 7);442assert.strictEqual(linesLayout.getLinesViewportData(1, 20).centeredLineNumber, 7);443assert.strictEqual(linesLayout.getLinesViewportData(2, 20).centeredLineNumber, 7);444assert.strictEqual(linesLayout.getLinesViewportData(3, 20).centeredLineNumber, 7);445assert.strictEqual(linesLayout.getLinesViewportData(4, 20).centeredLineNumber, 7);446assert.strictEqual(linesLayout.getLinesViewportData(5, 20).centeredLineNumber, 7);447assert.strictEqual(linesLayout.getLinesViewportData(6, 20).centeredLineNumber, 7);448assert.strictEqual(linesLayout.getLinesViewportData(7, 20).centeredLineNumber, 7);449assert.strictEqual(linesLayout.getLinesViewportData(8, 20).centeredLineNumber, 7);450assert.strictEqual(linesLayout.getLinesViewportData(9, 20).centeredLineNumber, 7);451assert.strictEqual(linesLayout.getLinesViewportData(10, 20).centeredLineNumber, 7);452assert.strictEqual(linesLayout.getLinesViewportData(11, 20).centeredLineNumber, 7);453assert.strictEqual(linesLayout.getLinesViewportData(12, 20).centeredLineNumber, 7);454assert.strictEqual(linesLayout.getLinesViewportData(13, 20).centeredLineNumber, 7);455assert.strictEqual(linesLayout.getLinesViewportData(14, 20).centeredLineNumber, 8);456assert.strictEqual(linesLayout.getLinesViewportData(15, 20).centeredLineNumber, 8);457assert.strictEqual(linesLayout.getLinesViewportData(16, 20).centeredLineNumber, 9);458assert.strictEqual(linesLayout.getLinesViewportData(17, 20).centeredLineNumber, 9);459assert.strictEqual(linesLayout.getLinesViewportData(18, 20).centeredLineNumber, 10);460assert.strictEqual(linesLayout.getLinesViewportData(19, 20).centeredLineNumber, 10);461assert.strictEqual(linesLayout.getLinesViewportData(20, 23).centeredLineNumber, 10);462assert.strictEqual(linesLayout.getLinesViewportData(21, 23).centeredLineNumber, 10);463assert.strictEqual(linesLayout.getLinesViewportData(22, 23).centeredLineNumber, 10);464});465466test('LinesLayout getLinesViewportData 1', () => {467const linesLayout = new LinesLayout(10, 10, 0, 0, []);468insertWhitespace(linesLayout, 6, 0, 100, 0);469470// 10 lines471// whitespace: - a(6,100)472assert.strictEqual(linesLayout.getLinesTotalHeight(), 200);473assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(1), 0);474assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(2), 10);475assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(3), 20);476assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(4), 30);477assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(5), 40);478assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(6), 50);479assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(7), 160);480assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(8), 170);481assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(9), 180);482assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(10), 190);483484// viewport 0->50485let viewportData = linesLayout.getLinesViewportData(0, 50);486assert.strictEqual(viewportData.startLineNumber, 1);487assert.strictEqual(viewportData.endLineNumber, 5);488assert.strictEqual(viewportData.completelyVisibleStartLineNumber, 1);489assert.strictEqual(viewportData.completelyVisibleEndLineNumber, 5);490assert.deepStrictEqual(viewportData.relativeVerticalOffset, [0, 10, 20, 30, 40]);491492// viewport 1->51493viewportData = linesLayout.getLinesViewportData(1, 51);494assert.strictEqual(viewportData.startLineNumber, 1);495assert.strictEqual(viewportData.endLineNumber, 6);496assert.strictEqual(viewportData.completelyVisibleStartLineNumber, 2);497assert.strictEqual(viewportData.completelyVisibleEndLineNumber, 5);498assert.deepStrictEqual(viewportData.relativeVerticalOffset, [0, 10, 20, 30, 40, 50]);499500// viewport 5->55501viewportData = linesLayout.getLinesViewportData(5, 55);502assert.strictEqual(viewportData.startLineNumber, 1);503assert.strictEqual(viewportData.endLineNumber, 6);504assert.strictEqual(viewportData.completelyVisibleStartLineNumber, 2);505assert.strictEqual(viewportData.completelyVisibleEndLineNumber, 5);506assert.deepStrictEqual(viewportData.relativeVerticalOffset, [0, 10, 20, 30, 40, 50]);507508// viewport 10->60509viewportData = linesLayout.getLinesViewportData(10, 60);510assert.strictEqual(viewportData.startLineNumber, 2);511assert.strictEqual(viewportData.endLineNumber, 6);512assert.strictEqual(viewportData.completelyVisibleStartLineNumber, 2);513assert.strictEqual(viewportData.completelyVisibleEndLineNumber, 6);514assert.deepStrictEqual(viewportData.relativeVerticalOffset, [10, 20, 30, 40, 50]);515516// viewport 50->100517viewportData = linesLayout.getLinesViewportData(50, 100);518assert.strictEqual(viewportData.startLineNumber, 6);519assert.strictEqual(viewportData.endLineNumber, 6);520assert.strictEqual(viewportData.completelyVisibleStartLineNumber, 6);521assert.strictEqual(viewportData.completelyVisibleEndLineNumber, 6);522assert.deepStrictEqual(viewportData.relativeVerticalOffset, [50]);523524// viewport 60->110525viewportData = linesLayout.getLinesViewportData(60, 110);526assert.strictEqual(viewportData.startLineNumber, 7);527assert.strictEqual(viewportData.endLineNumber, 7);528assert.strictEqual(viewportData.completelyVisibleStartLineNumber, 7);529assert.strictEqual(viewportData.completelyVisibleEndLineNumber, 7);530assert.deepStrictEqual(viewportData.relativeVerticalOffset, [160]);531532// viewport 65->115533viewportData = linesLayout.getLinesViewportData(65, 115);534assert.strictEqual(viewportData.startLineNumber, 7);535assert.strictEqual(viewportData.endLineNumber, 7);536assert.strictEqual(viewportData.completelyVisibleStartLineNumber, 7);537assert.strictEqual(viewportData.completelyVisibleEndLineNumber, 7);538assert.deepStrictEqual(viewportData.relativeVerticalOffset, [160]);539540// viewport 50->159541viewportData = linesLayout.getLinesViewportData(50, 159);542assert.strictEqual(viewportData.startLineNumber, 6);543assert.strictEqual(viewportData.endLineNumber, 6);544assert.strictEqual(viewportData.completelyVisibleStartLineNumber, 6);545assert.strictEqual(viewportData.completelyVisibleEndLineNumber, 6);546assert.deepStrictEqual(viewportData.relativeVerticalOffset, [50]);547548// viewport 50->160549viewportData = linesLayout.getLinesViewportData(50, 160);550assert.strictEqual(viewportData.startLineNumber, 6);551assert.strictEqual(viewportData.endLineNumber, 6);552assert.strictEqual(viewportData.completelyVisibleStartLineNumber, 6);553assert.strictEqual(viewportData.completelyVisibleEndLineNumber, 6);554assert.deepStrictEqual(viewportData.relativeVerticalOffset, [50]);555556// viewport 51->161557viewportData = linesLayout.getLinesViewportData(51, 161);558assert.strictEqual(viewportData.startLineNumber, 6);559assert.strictEqual(viewportData.endLineNumber, 7);560assert.strictEqual(viewportData.completelyVisibleStartLineNumber, 7);561assert.strictEqual(viewportData.completelyVisibleEndLineNumber, 7);562assert.deepStrictEqual(viewportData.relativeVerticalOffset, [50, 160]);563564565// viewport 150->169566viewportData = linesLayout.getLinesViewportData(150, 169);567assert.strictEqual(viewportData.startLineNumber, 7);568assert.strictEqual(viewportData.endLineNumber, 7);569assert.strictEqual(viewportData.completelyVisibleStartLineNumber, 7);570assert.strictEqual(viewportData.completelyVisibleEndLineNumber, 7);571assert.deepStrictEqual(viewportData.relativeVerticalOffset, [160]);572573// viewport 159->169574viewportData = linesLayout.getLinesViewportData(159, 169);575assert.strictEqual(viewportData.startLineNumber, 7);576assert.strictEqual(viewportData.endLineNumber, 7);577assert.strictEqual(viewportData.completelyVisibleStartLineNumber, 7);578assert.strictEqual(viewportData.completelyVisibleEndLineNumber, 7);579assert.deepStrictEqual(viewportData.relativeVerticalOffset, [160]);580581// viewport 160->169582viewportData = linesLayout.getLinesViewportData(160, 169);583assert.strictEqual(viewportData.startLineNumber, 7);584assert.strictEqual(viewportData.endLineNumber, 7);585assert.strictEqual(viewportData.completelyVisibleStartLineNumber, 7);586assert.strictEqual(viewportData.completelyVisibleEndLineNumber, 7);587assert.deepStrictEqual(viewportData.relativeVerticalOffset, [160]);588589590// viewport 160->1000591viewportData = linesLayout.getLinesViewportData(160, 1000);592assert.strictEqual(viewportData.startLineNumber, 7);593assert.strictEqual(viewportData.endLineNumber, 10);594assert.strictEqual(viewportData.completelyVisibleStartLineNumber, 7);595assert.strictEqual(viewportData.completelyVisibleEndLineNumber, 10);596assert.deepStrictEqual(viewportData.relativeVerticalOffset, [160, 170, 180, 190]);597});598599test('LinesLayout getLinesViewportData 2 & getWhitespaceViewportData', () => {600const linesLayout = new LinesLayout(10, 10, 0, 0, []);601const a = insertWhitespace(linesLayout, 6, 0, 100, 0);602const b = insertWhitespace(linesLayout, 7, 0, 50, 0);603604// 10 lines605// whitespace: - a(6,100), b(7, 50)606assert.strictEqual(linesLayout.getLinesTotalHeight(), 250);607assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(1), 0);608assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(2), 10);609assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(3), 20);610assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(4), 30);611assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(5), 40);612assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(6), 50);613assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(7), 160);614assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(8), 220);615assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(9), 230);616assert.strictEqual(linesLayout.getVerticalOffsetForLineNumber(10), 240);617618// viewport 50->160619let viewportData = linesLayout.getLinesViewportData(50, 160);620assert.strictEqual(viewportData.startLineNumber, 6);621assert.strictEqual(viewportData.endLineNumber, 6);622assert.strictEqual(viewportData.completelyVisibleStartLineNumber, 6);623assert.strictEqual(viewportData.completelyVisibleEndLineNumber, 6);624assert.deepStrictEqual(viewportData.relativeVerticalOffset, [50]);625let whitespaceData = linesLayout.getWhitespaceViewportData(50, 160);626assert.deepStrictEqual(whitespaceData, [{627id: a,628afterLineNumber: 6,629verticalOffset: 60,630height: 100631}]);632633// viewport 50->219634viewportData = linesLayout.getLinesViewportData(50, 219);635assert.strictEqual(viewportData.startLineNumber, 6);636assert.strictEqual(viewportData.endLineNumber, 7);637assert.strictEqual(viewportData.completelyVisibleStartLineNumber, 6);638assert.strictEqual(viewportData.completelyVisibleEndLineNumber, 7);639assert.deepStrictEqual(viewportData.relativeVerticalOffset, [50, 160]);640whitespaceData = linesLayout.getWhitespaceViewportData(50, 219);641assert.deepStrictEqual(whitespaceData, [{642id: a,643afterLineNumber: 6,644verticalOffset: 60,645height: 100646}, {647id: b,648afterLineNumber: 7,649verticalOffset: 170,650height: 50651}]);652653// viewport 50->220654viewportData = linesLayout.getLinesViewportData(50, 220);655assert.strictEqual(viewportData.startLineNumber, 6);656assert.strictEqual(viewportData.endLineNumber, 7);657assert.strictEqual(viewportData.completelyVisibleStartLineNumber, 6);658assert.strictEqual(viewportData.completelyVisibleEndLineNumber, 7);659assert.deepStrictEqual(viewportData.relativeVerticalOffset, [50, 160]);660661// viewport 50->250662viewportData = linesLayout.getLinesViewportData(50, 250);663assert.strictEqual(viewportData.startLineNumber, 6);664assert.strictEqual(viewportData.endLineNumber, 10);665assert.strictEqual(viewportData.completelyVisibleStartLineNumber, 6);666assert.strictEqual(viewportData.completelyVisibleEndLineNumber, 10);667assert.deepStrictEqual(viewportData.relativeVerticalOffset, [50, 160, 220, 230, 240]);668});669670test('LinesLayout getWhitespaceAtVerticalOffset', () => {671const linesLayout = new LinesLayout(10, 10, 0, 0, []);672const a = insertWhitespace(linesLayout, 6, 0, 100, 0);673const b = insertWhitespace(linesLayout, 7, 0, 50, 0);674675let whitespace = linesLayout.getWhitespaceAtVerticalOffset(0);676assert.strictEqual(whitespace, null);677678whitespace = linesLayout.getWhitespaceAtVerticalOffset(59);679assert.strictEqual(whitespace, null);680681whitespace = linesLayout.getWhitespaceAtVerticalOffset(60);682assert.strictEqual(whitespace!.id, a);683684whitespace = linesLayout.getWhitespaceAtVerticalOffset(61);685assert.strictEqual(whitespace!.id, a);686687whitespace = linesLayout.getWhitespaceAtVerticalOffset(159);688assert.strictEqual(whitespace!.id, a);689690whitespace = linesLayout.getWhitespaceAtVerticalOffset(160);691assert.strictEqual(whitespace, null);692693whitespace = linesLayout.getWhitespaceAtVerticalOffset(161);694assert.strictEqual(whitespace, null);695696whitespace = linesLayout.getWhitespaceAtVerticalOffset(169);697assert.strictEqual(whitespace, null);698699whitespace = linesLayout.getWhitespaceAtVerticalOffset(170);700assert.strictEqual(whitespace!.id, b);701702whitespace = linesLayout.getWhitespaceAtVerticalOffset(171);703assert.strictEqual(whitespace!.id, b);704705whitespace = linesLayout.getWhitespaceAtVerticalOffset(219);706assert.strictEqual(whitespace!.id, b);707708whitespace = linesLayout.getWhitespaceAtVerticalOffset(220);709assert.strictEqual(whitespace, null);710});711712test('LinesLayout', () => {713714const linesLayout = new LinesLayout(100, 20, 0, 0, []);715716// Insert a whitespace after line number 2, of height 10717const a = insertWhitespace(linesLayout, 2, 0, 10, 0);718// whitespaces: a(2, 10)719assert.strictEqual(linesLayout.getWhitespacesCount(), 1);720assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 2);721assert.strictEqual(linesLayout.getHeightForWhitespaceIndex(0), 10);722assert.strictEqual(linesLayout.getWhitespacesAccumulatedHeight(0), 10);723assert.strictEqual(linesLayout.getWhitespacesTotalHeight(), 10);724assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(1), 0);725assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(2), 0);726assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(3), 10);727assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(4), 10);728729// Insert a whitespace again after line number 2, of height 20730let b = insertWhitespace(linesLayout, 2, 0, 20, 0);731// whitespaces: a(2, 10), b(2, 20)732assert.strictEqual(linesLayout.getWhitespacesCount(), 2);733assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 2);734assert.strictEqual(linesLayout.getHeightForWhitespaceIndex(0), 10);735assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 2);736assert.strictEqual(linesLayout.getHeightForWhitespaceIndex(1), 20);737assert.strictEqual(linesLayout.getWhitespacesAccumulatedHeight(0), 10);738assert.strictEqual(linesLayout.getWhitespacesAccumulatedHeight(1), 30);739assert.strictEqual(linesLayout.getWhitespacesTotalHeight(), 30);740assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(1), 0);741assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(2), 0);742assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(3), 30);743assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(4), 30);744745// Change last inserted whitespace height to 30746changeOneWhitespace(linesLayout, b, 2, 30);747// whitespaces: a(2, 10), b(2, 30)748assert.strictEqual(linesLayout.getWhitespacesCount(), 2);749assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 2);750assert.strictEqual(linesLayout.getHeightForWhitespaceIndex(0), 10);751assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 2);752assert.strictEqual(linesLayout.getHeightForWhitespaceIndex(1), 30);753assert.strictEqual(linesLayout.getWhitespacesAccumulatedHeight(0), 10);754assert.strictEqual(linesLayout.getWhitespacesAccumulatedHeight(1), 40);755assert.strictEqual(linesLayout.getWhitespacesTotalHeight(), 40);756assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(1), 0);757assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(2), 0);758assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(3), 40);759assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(4), 40);760761// Remove last inserted whitespace762removeWhitespace(linesLayout, b);763// whitespaces: a(2, 10)764assert.strictEqual(linesLayout.getWhitespacesCount(), 1);765assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 2);766assert.strictEqual(linesLayout.getHeightForWhitespaceIndex(0), 10);767assert.strictEqual(linesLayout.getWhitespacesAccumulatedHeight(0), 10);768assert.strictEqual(linesLayout.getWhitespacesTotalHeight(), 10);769assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(1), 0);770assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(2), 0);771assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(3), 10);772assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(4), 10);773774// Add a whitespace before the first line of height 50775b = insertWhitespace(linesLayout, 0, 0, 50, 0);776// whitespaces: b(0, 50), a(2, 10)777assert.strictEqual(linesLayout.getWhitespacesCount(), 2);778assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 0);779assert.strictEqual(linesLayout.getHeightForWhitespaceIndex(0), 50);780assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 2);781assert.strictEqual(linesLayout.getHeightForWhitespaceIndex(1), 10);782assert.strictEqual(linesLayout.getWhitespacesAccumulatedHeight(0), 50);783assert.strictEqual(linesLayout.getWhitespacesAccumulatedHeight(1), 60);784assert.strictEqual(linesLayout.getWhitespacesTotalHeight(), 60);785assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(1), 50);786assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(2), 50);787assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(3), 60);788assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(4), 60);789790// Add a whitespace after line 4 of height 20791insertWhitespace(linesLayout, 4, 0, 20, 0);792// whitespaces: b(0, 50), a(2, 10), c(4, 20)793assert.strictEqual(linesLayout.getWhitespacesCount(), 3);794assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 0);795assert.strictEqual(linesLayout.getHeightForWhitespaceIndex(0), 50);796assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 2);797assert.strictEqual(linesLayout.getHeightForWhitespaceIndex(1), 10);798assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(2), 4);799assert.strictEqual(linesLayout.getHeightForWhitespaceIndex(2), 20);800assert.strictEqual(linesLayout.getWhitespacesAccumulatedHeight(0), 50);801assert.strictEqual(linesLayout.getWhitespacesAccumulatedHeight(1), 60);802assert.strictEqual(linesLayout.getWhitespacesAccumulatedHeight(2), 80);803assert.strictEqual(linesLayout.getWhitespacesTotalHeight(), 80);804assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(1), 50);805assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(2), 50);806assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(3), 60);807assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(4), 60);808assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(5), 80);809810// Add a whitespace after line 3 of height 30811insertWhitespace(linesLayout, 3, 0, 30, 0);812// whitespaces: b(0, 50), a(2, 10), d(3, 30), c(4, 20)813assert.strictEqual(linesLayout.getWhitespacesCount(), 4);814assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 0);815assert.strictEqual(linesLayout.getHeightForWhitespaceIndex(0), 50);816assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 2);817assert.strictEqual(linesLayout.getHeightForWhitespaceIndex(1), 10);818assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(2), 3);819assert.strictEqual(linesLayout.getHeightForWhitespaceIndex(2), 30);820assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(3), 4);821assert.strictEqual(linesLayout.getHeightForWhitespaceIndex(3), 20);822assert.strictEqual(linesLayout.getWhitespacesAccumulatedHeight(0), 50);823assert.strictEqual(linesLayout.getWhitespacesAccumulatedHeight(1), 60);824assert.strictEqual(linesLayout.getWhitespacesAccumulatedHeight(2), 90);825assert.strictEqual(linesLayout.getWhitespacesAccumulatedHeight(3), 110);826assert.strictEqual(linesLayout.getWhitespacesTotalHeight(), 110);827assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(1), 50);828assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(2), 50);829assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(3), 60);830assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(4), 90);831assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(5), 110);832833// Change whitespace after line 2 to height of 100834changeOneWhitespace(linesLayout, a, 2, 100);835// whitespaces: b(0, 50), a(2, 100), d(3, 30), c(4, 20)836assert.strictEqual(linesLayout.getWhitespacesCount(), 4);837assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 0);838assert.strictEqual(linesLayout.getHeightForWhitespaceIndex(0), 50);839assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 2);840assert.strictEqual(linesLayout.getHeightForWhitespaceIndex(1), 100);841assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(2), 3);842assert.strictEqual(linesLayout.getHeightForWhitespaceIndex(2), 30);843assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(3), 4);844assert.strictEqual(linesLayout.getHeightForWhitespaceIndex(3), 20);845assert.strictEqual(linesLayout.getWhitespacesAccumulatedHeight(0), 50);846assert.strictEqual(linesLayout.getWhitespacesAccumulatedHeight(1), 150);847assert.strictEqual(linesLayout.getWhitespacesAccumulatedHeight(2), 180);848assert.strictEqual(linesLayout.getWhitespacesAccumulatedHeight(3), 200);849assert.strictEqual(linesLayout.getWhitespacesTotalHeight(), 200);850assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(1), 50);851assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(2), 50);852assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(3), 150);853assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(4), 180);854assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(5), 200);855856// Remove whitespace after line 2857removeWhitespace(linesLayout, a);858// whitespaces: b(0, 50), d(3, 30), c(4, 20)859assert.strictEqual(linesLayout.getWhitespacesCount(), 3);860assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 0);861assert.strictEqual(linesLayout.getHeightForWhitespaceIndex(0), 50);862assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 3);863assert.strictEqual(linesLayout.getHeightForWhitespaceIndex(1), 30);864assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(2), 4);865assert.strictEqual(linesLayout.getHeightForWhitespaceIndex(2), 20);866assert.strictEqual(linesLayout.getWhitespacesAccumulatedHeight(0), 50);867assert.strictEqual(linesLayout.getWhitespacesAccumulatedHeight(1), 80);868assert.strictEqual(linesLayout.getWhitespacesAccumulatedHeight(2), 100);869assert.strictEqual(linesLayout.getWhitespacesTotalHeight(), 100);870assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(1), 50);871assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(2), 50);872assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(3), 50);873assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(4), 80);874assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(5), 100);875876// Remove whitespace before line 1877removeWhitespace(linesLayout, b);878// whitespaces: d(3, 30), c(4, 20)879assert.strictEqual(linesLayout.getWhitespacesCount(), 2);880assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 3);881assert.strictEqual(linesLayout.getHeightForWhitespaceIndex(0), 30);882assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 4);883assert.strictEqual(linesLayout.getHeightForWhitespaceIndex(1), 20);884assert.strictEqual(linesLayout.getWhitespacesAccumulatedHeight(0), 30);885assert.strictEqual(linesLayout.getWhitespacesAccumulatedHeight(1), 50);886assert.strictEqual(linesLayout.getWhitespacesTotalHeight(), 50);887assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(1), 0);888assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(2), 0);889assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(3), 0);890assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(4), 30);891assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(5), 50);892893// Delete line 1894linesLayout.onLinesDeleted(1, 1);895// whitespaces: d(2, 30), c(3, 20)896assert.strictEqual(linesLayout.getWhitespacesCount(), 2);897assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 2);898assert.strictEqual(linesLayout.getHeightForWhitespaceIndex(0), 30);899assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 3);900assert.strictEqual(linesLayout.getHeightForWhitespaceIndex(1), 20);901assert.strictEqual(linesLayout.getWhitespacesAccumulatedHeight(0), 30);902assert.strictEqual(linesLayout.getWhitespacesAccumulatedHeight(1), 50);903assert.strictEqual(linesLayout.getWhitespacesTotalHeight(), 50);904assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(1), 0);905assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(2), 0);906assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(3), 30);907assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(4), 50);908assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(5), 50);909910// Insert a line before line 1911linesLayout.onLinesInserted(1, 1);912// whitespaces: d(3, 30), c(4, 20)913assert.strictEqual(linesLayout.getWhitespacesCount(), 2);914assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 3);915assert.strictEqual(linesLayout.getHeightForWhitespaceIndex(0), 30);916assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 4);917assert.strictEqual(linesLayout.getHeightForWhitespaceIndex(1), 20);918assert.strictEqual(linesLayout.getWhitespacesAccumulatedHeight(0), 30);919assert.strictEqual(linesLayout.getWhitespacesAccumulatedHeight(1), 50);920assert.strictEqual(linesLayout.getWhitespacesTotalHeight(), 50);921assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(1), 0);922assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(2), 0);923assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(3), 0);924assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(4), 30);925assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(5), 50);926927// Delete line 4928linesLayout.onLinesDeleted(4, 4);929// whitespaces: d(3, 30), c(3, 20)930assert.strictEqual(linesLayout.getWhitespacesCount(), 2);931assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 3);932assert.strictEqual(linesLayout.getHeightForWhitespaceIndex(0), 30);933assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 3);934assert.strictEqual(linesLayout.getHeightForWhitespaceIndex(1), 20);935assert.strictEqual(linesLayout.getWhitespacesAccumulatedHeight(0), 30);936assert.strictEqual(linesLayout.getWhitespacesAccumulatedHeight(1), 50);937assert.strictEqual(linesLayout.getWhitespacesTotalHeight(), 50);938assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(1), 0);939assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(2), 0);940assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(3), 0);941assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(4), 50);942assert.strictEqual(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(5), 50);943});944945test('LinesLayout findInsertionIndex', () => {946947const makeInternalWhitespace = (afterLineNumbers: number[], ordinal: number = 0) => {948return afterLineNumbers.map((afterLineNumber) => new EditorWhitespace('', afterLineNumber, ordinal, 0, 0));949};950951let arr: EditorWhitespace[];952953arr = makeInternalWhitespace([]);954assert.strictEqual(LinesLayout.findInsertionIndex(arr, 0, 0), 0);955assert.strictEqual(LinesLayout.findInsertionIndex(arr, 1, 0), 0);956assert.strictEqual(LinesLayout.findInsertionIndex(arr, 2, 0), 0);957958arr = makeInternalWhitespace([1]);959assert.strictEqual(LinesLayout.findInsertionIndex(arr, 0, 0), 0);960assert.strictEqual(LinesLayout.findInsertionIndex(arr, 1, 0), 1);961assert.strictEqual(LinesLayout.findInsertionIndex(arr, 2, 0), 1);962963arr = makeInternalWhitespace([1, 3]);964assert.strictEqual(LinesLayout.findInsertionIndex(arr, 0, 0), 0);965assert.strictEqual(LinesLayout.findInsertionIndex(arr, 1, 0), 1);966assert.strictEqual(LinesLayout.findInsertionIndex(arr, 2, 0), 1);967assert.strictEqual(LinesLayout.findInsertionIndex(arr, 3, 0), 2);968assert.strictEqual(LinesLayout.findInsertionIndex(arr, 4, 0), 2);969970arr = makeInternalWhitespace([1, 3, 5]);971assert.strictEqual(LinesLayout.findInsertionIndex(arr, 0, 0), 0);972assert.strictEqual(LinesLayout.findInsertionIndex(arr, 1, 0), 1);973assert.strictEqual(LinesLayout.findInsertionIndex(arr, 2, 0), 1);974assert.strictEqual(LinesLayout.findInsertionIndex(arr, 3, 0), 2);975assert.strictEqual(LinesLayout.findInsertionIndex(arr, 4, 0), 2);976assert.strictEqual(LinesLayout.findInsertionIndex(arr, 5, 0), 3);977assert.strictEqual(LinesLayout.findInsertionIndex(arr, 6, 0), 3);978979arr = makeInternalWhitespace([1, 3, 5], 3);980assert.strictEqual(LinesLayout.findInsertionIndex(arr, 0, 0), 0);981assert.strictEqual(LinesLayout.findInsertionIndex(arr, 1, 0), 0);982assert.strictEqual(LinesLayout.findInsertionIndex(arr, 2, 0), 1);983assert.strictEqual(LinesLayout.findInsertionIndex(arr, 3, 0), 1);984assert.strictEqual(LinesLayout.findInsertionIndex(arr, 4, 0), 2);985assert.strictEqual(LinesLayout.findInsertionIndex(arr, 5, 0), 2);986assert.strictEqual(LinesLayout.findInsertionIndex(arr, 6, 0), 3);987988arr = makeInternalWhitespace([1, 3, 5, 7]);989assert.strictEqual(LinesLayout.findInsertionIndex(arr, 0, 0), 0);990assert.strictEqual(LinesLayout.findInsertionIndex(arr, 1, 0), 1);991assert.strictEqual(LinesLayout.findInsertionIndex(arr, 2, 0), 1);992assert.strictEqual(LinesLayout.findInsertionIndex(arr, 3, 0), 2);993assert.strictEqual(LinesLayout.findInsertionIndex(arr, 4, 0), 2);994assert.strictEqual(LinesLayout.findInsertionIndex(arr, 5, 0), 3);995assert.strictEqual(LinesLayout.findInsertionIndex(arr, 6, 0), 3);996assert.strictEqual(LinesLayout.findInsertionIndex(arr, 7, 0), 4);997assert.strictEqual(LinesLayout.findInsertionIndex(arr, 8, 0), 4);998999arr = makeInternalWhitespace([1, 3, 5, 7, 9]);1000assert.strictEqual(LinesLayout.findInsertionIndex(arr, 0, 0), 0);1001assert.strictEqual(LinesLayout.findInsertionIndex(arr, 1, 0), 1);1002assert.strictEqual(LinesLayout.findInsertionIndex(arr, 2, 0), 1);1003assert.strictEqual(LinesLayout.findInsertionIndex(arr, 3, 0), 2);1004assert.strictEqual(LinesLayout.findInsertionIndex(arr, 4, 0), 2);1005assert.strictEqual(LinesLayout.findInsertionIndex(arr, 5, 0), 3);1006assert.strictEqual(LinesLayout.findInsertionIndex(arr, 6, 0), 3);1007assert.strictEqual(LinesLayout.findInsertionIndex(arr, 7, 0), 4);1008assert.strictEqual(LinesLayout.findInsertionIndex(arr, 8, 0), 4);1009assert.strictEqual(LinesLayout.findInsertionIndex(arr, 9, 0), 5);1010assert.strictEqual(LinesLayout.findInsertionIndex(arr, 10, 0), 5);10111012arr = makeInternalWhitespace([1, 3, 5, 7, 9, 11]);1013assert.strictEqual(LinesLayout.findInsertionIndex(arr, 0, 0), 0);1014assert.strictEqual(LinesLayout.findInsertionIndex(arr, 1, 0), 1);1015assert.strictEqual(LinesLayout.findInsertionIndex(arr, 2, 0), 1);1016assert.strictEqual(LinesLayout.findInsertionIndex(arr, 3, 0), 2);1017assert.strictEqual(LinesLayout.findInsertionIndex(arr, 4, 0), 2);1018assert.strictEqual(LinesLayout.findInsertionIndex(arr, 5, 0), 3);1019assert.strictEqual(LinesLayout.findInsertionIndex(arr, 6, 0), 3);1020assert.strictEqual(LinesLayout.findInsertionIndex(arr, 7, 0), 4);1021assert.strictEqual(LinesLayout.findInsertionIndex(arr, 8, 0), 4);1022assert.strictEqual(LinesLayout.findInsertionIndex(arr, 9, 0), 5);1023assert.strictEqual(LinesLayout.findInsertionIndex(arr, 10, 0), 5);1024assert.strictEqual(LinesLayout.findInsertionIndex(arr, 11, 0), 6);1025assert.strictEqual(LinesLayout.findInsertionIndex(arr, 12, 0), 6);10261027arr = makeInternalWhitespace([1, 3, 5, 7, 9, 11, 13]);1028assert.strictEqual(LinesLayout.findInsertionIndex(arr, 0, 0), 0);1029assert.strictEqual(LinesLayout.findInsertionIndex(arr, 1, 0), 1);1030assert.strictEqual(LinesLayout.findInsertionIndex(arr, 2, 0), 1);1031assert.strictEqual(LinesLayout.findInsertionIndex(arr, 3, 0), 2);1032assert.strictEqual(LinesLayout.findInsertionIndex(arr, 4, 0), 2);1033assert.strictEqual(LinesLayout.findInsertionIndex(arr, 5, 0), 3);1034assert.strictEqual(LinesLayout.findInsertionIndex(arr, 6, 0), 3);1035assert.strictEqual(LinesLayout.findInsertionIndex(arr, 7, 0), 4);1036assert.strictEqual(LinesLayout.findInsertionIndex(arr, 8, 0), 4);1037assert.strictEqual(LinesLayout.findInsertionIndex(arr, 9, 0), 5);1038assert.strictEqual(LinesLayout.findInsertionIndex(arr, 10, 0), 5);1039assert.strictEqual(LinesLayout.findInsertionIndex(arr, 11, 0), 6);1040assert.strictEqual(LinesLayout.findInsertionIndex(arr, 12, 0), 6);1041assert.strictEqual(LinesLayout.findInsertionIndex(arr, 13, 0), 7);1042assert.strictEqual(LinesLayout.findInsertionIndex(arr, 14, 0), 7);10431044arr = makeInternalWhitespace([1, 3, 5, 7, 9, 11, 13, 15]);1045assert.strictEqual(LinesLayout.findInsertionIndex(arr, 0, 0), 0);1046assert.strictEqual(LinesLayout.findInsertionIndex(arr, 1, 0), 1);1047assert.strictEqual(LinesLayout.findInsertionIndex(arr, 2, 0), 1);1048assert.strictEqual(LinesLayout.findInsertionIndex(arr, 3, 0), 2);1049assert.strictEqual(LinesLayout.findInsertionIndex(arr, 4, 0), 2);1050assert.strictEqual(LinesLayout.findInsertionIndex(arr, 5, 0), 3);1051assert.strictEqual(LinesLayout.findInsertionIndex(arr, 6, 0), 3);1052assert.strictEqual(LinesLayout.findInsertionIndex(arr, 7, 0), 4);1053assert.strictEqual(LinesLayout.findInsertionIndex(arr, 8, 0), 4);1054assert.strictEqual(LinesLayout.findInsertionIndex(arr, 9, 0), 5);1055assert.strictEqual(LinesLayout.findInsertionIndex(arr, 10, 0), 5);1056assert.strictEqual(LinesLayout.findInsertionIndex(arr, 11, 0), 6);1057assert.strictEqual(LinesLayout.findInsertionIndex(arr, 12, 0), 6);1058assert.strictEqual(LinesLayout.findInsertionIndex(arr, 13, 0), 7);1059assert.strictEqual(LinesLayout.findInsertionIndex(arr, 14, 0), 7);1060assert.strictEqual(LinesLayout.findInsertionIndex(arr, 15, 0), 8);1061assert.strictEqual(LinesLayout.findInsertionIndex(arr, 16, 0), 8);1062});10631064test('LinesLayout changeWhitespaceAfterLineNumber & getFirstWhitespaceIndexAfterLineNumber', () => {1065const linesLayout = new LinesLayout(100, 20, 0, 0, []);10661067const a = insertWhitespace(linesLayout, 0, 0, 1, 0);1068const b = insertWhitespace(linesLayout, 7, 0, 1, 0);1069const c = insertWhitespace(linesLayout, 3, 0, 1, 0);10701071assert.strictEqual(linesLayout.getIdForWhitespaceIndex(0), a); // 01072assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 0);1073assert.strictEqual(linesLayout.getIdForWhitespaceIndex(1), c); // 31074assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 3);1075assert.strictEqual(linesLayout.getIdForWhitespaceIndex(2), b); // 71076assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(2), 7);10771078assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(1), 1); // c1079assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(2), 1); // c1080assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(3), 1); // c1081assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(4), 2); // b1082assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(5), 2); // b1083assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(6), 2); // b1084assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(7), 2); // b1085assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(8), -1); // --10861087// Do not really move a1088changeOneWhitespace(linesLayout, a, 1, 1);10891090assert.strictEqual(linesLayout.getIdForWhitespaceIndex(0), a); // 11091assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 1);1092assert.strictEqual(linesLayout.getIdForWhitespaceIndex(1), c); // 31093assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 3);1094assert.strictEqual(linesLayout.getIdForWhitespaceIndex(2), b); // 71095assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(2), 7);10961097assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(1), 0); // a1098assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(2), 1); // c1099assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(3), 1); // c1100assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(4), 2); // b1101assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(5), 2); // b1102assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(6), 2); // b1103assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(7), 2); // b1104assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(8), -1); // --110511061107// Do not really move a1108changeOneWhitespace(linesLayout, a, 2, 1);11091110assert.strictEqual(linesLayout.getIdForWhitespaceIndex(0), a); // 21111assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 2);1112assert.strictEqual(linesLayout.getIdForWhitespaceIndex(1), c); // 31113assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 3);1114assert.strictEqual(linesLayout.getIdForWhitespaceIndex(2), b); // 71115assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(2), 7);11161117assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(1), 0); // a1118assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(2), 0); // a1119assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(3), 1); // c1120assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(4), 2); // b1121assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(5), 2); // b1122assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(6), 2); // b1123assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(7), 2); // b1124assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(8), -1); // --112511261127// Change a to conflict with c => a gets placed after c1128changeOneWhitespace(linesLayout, a, 3, 1);11291130assert.strictEqual(linesLayout.getIdForWhitespaceIndex(0), c); // 31131assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 3);1132assert.strictEqual(linesLayout.getIdForWhitespaceIndex(1), a); // 31133assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 3);1134assert.strictEqual(linesLayout.getIdForWhitespaceIndex(2), b); // 71135assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(2), 7);11361137assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(1), 0); // c1138assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(2), 0); // c1139assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(3), 0); // c1140assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(4), 2); // b1141assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(5), 2); // b1142assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(6), 2); // b1143assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(7), 2); // b1144assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(8), -1); // --114511461147// Make a no-op1148changeOneWhitespace(linesLayout, c, 3, 1);11491150assert.strictEqual(linesLayout.getIdForWhitespaceIndex(0), c); // 31151assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 3);1152assert.strictEqual(linesLayout.getIdForWhitespaceIndex(1), a); // 31153assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 3);1154assert.strictEqual(linesLayout.getIdForWhitespaceIndex(2), b); // 71155assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(2), 7);11561157assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(1), 0); // c1158assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(2), 0); // c1159assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(3), 0); // c1160assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(4), 2); // b1161assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(5), 2); // b1162assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(6), 2); // b1163assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(7), 2); // b1164assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(8), -1); // --1165116611671168// Conflict c with b => c gets placed after b1169changeOneWhitespace(linesLayout, c, 7, 1);11701171assert.strictEqual(linesLayout.getIdForWhitespaceIndex(0), a); // 31172assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 3);1173assert.strictEqual(linesLayout.getIdForWhitespaceIndex(1), b); // 71174assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 7);1175assert.strictEqual(linesLayout.getIdForWhitespaceIndex(2), c); // 71176assert.strictEqual(linesLayout.getAfterLineNumberForWhitespaceIndex(2), 7);11771178assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(1), 0); // a1179assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(2), 0); // a1180assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(3), 0); // a1181assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(4), 1); // b1182assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(5), 1); // b1183assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(6), 1); // b1184assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(7), 1); // b1185assert.strictEqual(linesLayout.getFirstWhitespaceIndexAfterLineNumber(8), -1); // --1186});11871188test('LinesLayout Bug', () => {1189const linesLayout = new LinesLayout(100, 20, 0, 0, []);11901191const a = insertWhitespace(linesLayout, 0, 0, 1, 0);1192const b = insertWhitespace(linesLayout, 7, 0, 1, 0);11931194assert.strictEqual(linesLayout.getIdForWhitespaceIndex(0), a); // 01195assert.strictEqual(linesLayout.getIdForWhitespaceIndex(1), b); // 711961197const c = insertWhitespace(linesLayout, 3, 0, 1, 0);11981199assert.strictEqual(linesLayout.getIdForWhitespaceIndex(0), a); // 01200assert.strictEqual(linesLayout.getIdForWhitespaceIndex(1), c); // 31201assert.strictEqual(linesLayout.getIdForWhitespaceIndex(2), b); // 712021203const d = insertWhitespace(linesLayout, 2, 0, 1, 0);1204assert.strictEqual(linesLayout.getIdForWhitespaceIndex(0), a); // 01205assert.strictEqual(linesLayout.getIdForWhitespaceIndex(1), d); // 21206assert.strictEqual(linesLayout.getIdForWhitespaceIndex(2), c); // 31207assert.strictEqual(linesLayout.getIdForWhitespaceIndex(3), b); // 712081209const e = insertWhitespace(linesLayout, 8, 0, 1, 0);1210assert.strictEqual(linesLayout.getIdForWhitespaceIndex(0), a); // 01211assert.strictEqual(linesLayout.getIdForWhitespaceIndex(1), d); // 21212assert.strictEqual(linesLayout.getIdForWhitespaceIndex(2), c); // 31213assert.strictEqual(linesLayout.getIdForWhitespaceIndex(3), b); // 71214assert.strictEqual(linesLayout.getIdForWhitespaceIndex(4), e); // 812151216const f = insertWhitespace(linesLayout, 11, 0, 1, 0);1217assert.strictEqual(linesLayout.getIdForWhitespaceIndex(0), a); // 01218assert.strictEqual(linesLayout.getIdForWhitespaceIndex(1), d); // 21219assert.strictEqual(linesLayout.getIdForWhitespaceIndex(2), c); // 31220assert.strictEqual(linesLayout.getIdForWhitespaceIndex(3), b); // 71221assert.strictEqual(linesLayout.getIdForWhitespaceIndex(4), e); // 81222assert.strictEqual(linesLayout.getIdForWhitespaceIndex(5), f); // 1112231224const g = insertWhitespace(linesLayout, 10, 0, 1, 0);1225assert.strictEqual(linesLayout.getIdForWhitespaceIndex(0), a); // 01226assert.strictEqual(linesLayout.getIdForWhitespaceIndex(1), d); // 21227assert.strictEqual(linesLayout.getIdForWhitespaceIndex(2), c); // 31228assert.strictEqual(linesLayout.getIdForWhitespaceIndex(3), b); // 71229assert.strictEqual(linesLayout.getIdForWhitespaceIndex(4), e); // 81230assert.strictEqual(linesLayout.getIdForWhitespaceIndex(5), g); // 101231assert.strictEqual(linesLayout.getIdForWhitespaceIndex(6), f); // 1112321233const h = insertWhitespace(linesLayout, 0, 0, 1, 0);1234assert.strictEqual(linesLayout.getIdForWhitespaceIndex(0), a); // 01235assert.strictEqual(linesLayout.getIdForWhitespaceIndex(1), h); // 01236assert.strictEqual(linesLayout.getIdForWhitespaceIndex(2), d); // 21237assert.strictEqual(linesLayout.getIdForWhitespaceIndex(3), c); // 31238assert.strictEqual(linesLayout.getIdForWhitespaceIndex(4), b); // 71239assert.strictEqual(linesLayout.getIdForWhitespaceIndex(5), e); // 81240assert.strictEqual(linesLayout.getIdForWhitespaceIndex(6), g); // 101241assert.strictEqual(linesLayout.getIdForWhitespaceIndex(7), f); // 111242});1243});124412451246