Path: blob/main/src/vs/workbench/contrib/editTelemetry/test/node/arcTracker.test.ts
4784 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 { StringText } from '../../../../../editor/common/core/text/abstractText.js';8import { ArcTracker } from '../../common/arcTracker.js';9import { FileAccess } from '../../../../../base/common/network.js';10import { readFileSync } from 'fs';11import { join, resolve } from '../../../../../base/common/path.js';12import { StringEdit, StringReplacement } from '../../../../../editor/common/core/edits/stringEdit.js';13import { OffsetRange } from '../../../../../editor/common/core/ranges/offsetRange.js';14import { ensureDependenciesAreSet } from '../../../../../editor/common/core/text/positionToOffset.js';1516suite('ArcTracker', () => {17ensureNoDisposablesAreLeakedInTestSuite();18ensureDependenciesAreSet();1920const fixturesOutDir = FileAccess.asFileUri('vs/workbench/contrib/editTelemetry/test/node/data').fsPath;21const fixturesSrcDir = resolve(fixturesOutDir).replaceAll('\\', '/').replace('/out/vs/workbench/', '/src/vs/workbench/');2223function getData(name: string): IEdits {24const path = join(fixturesSrcDir, name + '.edits.w.json');25const src = readFileSync(path, 'utf8');26return JSON.parse(src);27}2829test('issue-264048', () => {30const stats = runTestWithData(getData('issue-264048'));31assert.deepStrictEqual(stats, ([32{33arc: 8,34deletedLineCounts: 1,35insertedLineCounts: 136},37{38arc: 8,39deletedLineCounts: 0,40insertedLineCounts: 141},42{43arc: 8,44deletedLineCounts: 0,45insertedLineCounts: 146}47]));48});4950test('line-insert', () => {51const stats = runTestWithData(getData('line-insert'));52assert.deepStrictEqual(stats, ([53{54arc: 7,55deletedLineCounts: 0,56insertedLineCounts: 157},58{59arc: 5,60deletedLineCounts: 0,61insertedLineCounts: 162}63]));64});6566test('line-modification', () => {67const stats = runTestWithData(getData('line-modification'));68assert.deepStrictEqual(stats, ([69{70arc: 6,71deletedLineCounts: 1,72insertedLineCounts: 173},74{75arc: 6,76deletedLineCounts: 1,77insertedLineCounts: 178},79{80arc: 0,81deletedLineCounts: 0,82insertedLineCounts: 083}84]));85});8687test('multiline-insert', () => {88const stats = runTestWithData(getData('multiline-insert'));89assert.deepStrictEqual(stats, ([90{91arc: 24,92deletedLineCounts: 0,93insertedLineCounts: 394},95{96arc: 23,97deletedLineCounts: 0,98insertedLineCounts: 299}100]));101});102});103104interface IEdits {105initialText: string;106edits: Array<{107replacements: Array<{108start: number;109endEx: number;110text: string;111}>;112}>;113}114115function createStringEditFromJson(editData: IEdits['edits'][0]): StringEdit {116const replacements = editData.replacements.map(replacement =>117new StringReplacement(118OffsetRange.ofStartAndLength(replacement.start, replacement.endEx - replacement.start),119replacement.text120)121);122return new StringEdit(replacements);123}124125function runTestWithData(data: IEdits): unknown {126const edits = data.edits.map(editData => createStringEditFromJson(editData));127128const t = new ArcTracker(129new StringText(data.initialText),130edits[0]131);132133const stats: unknown[] = [];134stats.push(t.getValues());135let lastLineNumbers = t.getLineCountInfo().insertedLineCounts;136let lastArc = t.getAcceptedRestrainedCharactersCount();137138for (let i = 1; i < edits.length; i++) {139t.handleEdits(edits[i]);140stats.push(t.getValues());141142const newLineNumbers = t.getLineCountInfo().insertedLineCounts;143assert.ok(newLineNumbers <= lastLineNumbers, `Line numbers must not increase. Last: ${lastLineNumbers}, new: ${newLineNumbers}`);144lastLineNumbers = newLineNumbers;145146const newArc = t.getAcceptedRestrainedCharactersCount();147assert.ok(newArc <= lastArc, `ARC must not increase. Last: ${lastArc}, new: ${newArc}`);148lastArc = newArc;149}150return stats;151}152153154