Path: blob/main/src/vs/editor/test/common/viewModel/lineBreakData.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 { PositionAffinity } from '../../../common/model.js';8import { ModelDecorationInjectedTextOptions } from '../../../common/model/textModel.js';9import { ModelLineProjectionData } from '../../../common/modelLineProjectionData.js';1011suite('Editor ViewModel - LineBreakData', () => {1213ensureNoDisposablesAreLeakedInTestSuite();1415test('Basic', () => {16const data = new ModelLineProjectionData([], [], [100], [0], 10);1718assert.strictEqual(data.translateToInputOffset(0, 50), 50);19assert.strictEqual(data.translateToInputOffset(1, 60), 150);20});2122function sequence(length: number, start = 0): number[] {23const result = new Array<number>();24for (let i = 0; i < length; i++) {25result.push(i + start);26}27return result;28}2930function testInverse(data: ModelLineProjectionData) {31for (let i = 0; i < 100; i++) {32const output = data.translateToOutputPosition(i);33assert.deepStrictEqual(data.translateToInputOffset(output.outputLineIndex, output.outputOffset), i);34}35}3637function getInputOffsets(data: ModelLineProjectionData, outputLineIdx: number): number[] {38return sequence(20).map(i => data.translateToInputOffset(outputLineIdx, i));39}4041function getOutputOffsets(data: ModelLineProjectionData, affinity: PositionAffinity): string[] {42return sequence(25).map(i => data.translateToOutputPosition(i, affinity).toString());43}4445function mapTextToInjectedTextOptions(arr: string[]): ModelDecorationInjectedTextOptions[] {46return arr.map(e => ModelDecorationInjectedTextOptions.from({ content: e }));47}4849suite('Injected Text 1', () => {50const data = new ModelLineProjectionData([2, 3, 10], mapTextToInjectedTextOptions(['1', '22', '333']), [10, 100], [], 10);5152test('getInputOffsetOfOutputPosition', () => {53// For every view model position, what is the model position?54assert.deepStrictEqual(getInputOffsets(data, 0), ([0, 1, 2, 2, 3, 3, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10, 11, 12, 13]));55assert.deepStrictEqual(getInputOffsets(data, 1), ([7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 9, 10, 10, 10, 10, 11, 12, 13]));56});5758test('getOutputPositionOfInputOffset', () => {59data.translateToOutputPosition(20);60assert.deepStrictEqual(getOutputOffsets(data, PositionAffinity.None), [61'0:0',62'0:1',63'0:2',64'0:4',65'0:7',66'0:8',67'0:9',68'1:10',69'1:11',70'1:12',71'1:13',72'1:17',73'1:18',74'1:19',75'1:20',76'1:21',77'1:22',78'1:23',79'1:24',80'1:25',81'1:26',82'1:27',83'1:28',84'1:29',85'1:30',86]);8788assert.deepStrictEqual(getOutputOffsets(data, PositionAffinity.Left), [89'0:0',90'0:1',91'0:2',92'0:4',93'0:7',94'0:8',95'0:9',96'0:10',97'1:11',98'1:12',99'1:13',100'1:17',101'1:18',102'1:19',103'1:20',104'1:21',105'1:22',106'1:23',107'1:24',108'1:25',109'1:26',110'1:27',111'1:28',112'1:29',113'1:30',114]);115116assert.deepStrictEqual(getOutputOffsets(data, PositionAffinity.Right), [117'0:0',118'0:1',119'0:3',120'0:6',121'0:7',122'0:8',123'0:9',124'1:10',125'1:11',126'1:12',127'1:16',128'1:17',129'1:18',130'1:19',131'1:20',132'1:21',133'1:22',134'1:23',135'1:24',136'1:25',137'1:26',138'1:27',139'1:28',140'1:29',141'1:30',142]);143});144145test('getInputOffsetOfOutputPosition is inverse of getOutputPositionOfInputOffset', () => {146testInverse(data);147});148149150test('normalization', () => {151assert.deepStrictEqual(152sequence(25)153.map((v) =>154data.normalizeOutputPosition(1, v, PositionAffinity.Right)155)156.map((s) => s.toString()),157[158'1:0',159'1:1',160'1:2',161'1:3',162'1:4',163'1:5',164'1:6',165'1:7',166'1:8',167'1:9',168'1:10',169'1:11',170'1:12',171'1:16',172'1:16',173'1:16',174'1:16',175'1:17',176'1:18',177'1:19',178'1:20',179'1:21',180'1:22',181'1:23',182'1:24',183]184);185});186});187188suite('Injected Text 2', () => {189const data = new ModelLineProjectionData([2, 2, 6], mapTextToInjectedTextOptions(['1', '22', '333']), [10, 100], [], 0);190191test('getInputOffsetOfOutputPosition', () => {192assert.deepStrictEqual(193getInputOffsets(data, 0),194[0, 1, 2, 2, 2, 2, 3, 4, 5, 6, 6, 6, 6, 7, 8, 9, 10, 11, 12, 13]195);196assert.deepStrictEqual(197getInputOffsets(data, 1),198[1996, 6, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,20023,201]202);203});204205test('getInputOffsetOfOutputPosition is inverse of getOutputPositionOfInputOffset', () => {206testInverse(data);207});208});209210suite('Injected Text 3', () => {211const data = new ModelLineProjectionData([2, 2, 7], mapTextToInjectedTextOptions(['1', '22', '333']), [10, 100], [], 0);212213test('getInputOffsetOfOutputPosition', () => {214assert.deepStrictEqual(215getInputOffsets(data, 0),216[0, 1, 2, 2, 2, 2, 3, 4, 5, 6, 7, 7, 7, 7, 8, 9, 10, 11, 12, 13]217);218assert.deepStrictEqual(219getInputOffsets(data, 1),220[2217, 7, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,22223,223]224);225});226227test('getInputOffsetOfOutputPosition is inverse of getOutputPositionOfInputOffset', () => {228testInverse(data);229});230});231});232233234