adding tests which generate random text and random edits

This commit is contained in:
Aiday Marlen Kyzy 2024-01-31 16:22:56 +01:00
parent 5477394987
commit 37b900d226
No known key found for this signature in database
GPG key ID: 24A8B53DBD26FF4E
4 changed files with 25 additions and 21 deletions

View file

@ -435,8 +435,6 @@ export class InlineCompletionsModel extends Disposable {
}
}
// todo: extract this function into a separate place, write some tests for this function
// todo: investigate that bug, that we previously saw inside of test 21, there appears to be a logical error somewhere that needs to be resolved
private _getEdits(editor: ICodeEditor, completion: SingleTextEdit): { edits: SingleTextEdit[]; editorSelections: Selection[] } {
const selections = editor.getSelections() ?? [];

View file

@ -249,7 +249,7 @@ function smartDiff(originalValue: string, newValue: string, smartBracketMatching
}
/**
* Given some single text edits, this function finds the new ranges of the editted text post all edits.
* Given some text edits, this function finds the new ranges of the editted text post application of all edits.
* Assumes that the edit ranges are disjoint
* @param edits edits applied
* @returns new ranges post edits for every edit
@ -285,6 +285,12 @@ export function getNewRanges(edits: SingleTextEdit[]): Range[] {
return ranges.map((_, index) => ranges[sortIndices.indexOf(index)]);
}
/**
* Given a text model and edits, this function finds the inverse text edits
* @param model model on which to apply the edits
* @param edits edits applied
* @returns inverse edits
*/
export function inverseEdits(model: TextModel, edits: SingleTextEdit[]): SingleTextEdit[] {
const newRanges = getNewRanges(edits);
const inverseEdits: SingleTextEdit[] = [];

View file

@ -7,17 +7,17 @@ import * as assert from 'assert';
import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils';
import { inverseEdits } from 'vs/editor/contrib/inlineCompletions/browser/singleTextEdit';
import { createTextModel } from 'vs/editor/test/common/testTextModel';
import { generateRandomDisjointEdits, randomMultilineStringGenerator } from 'vs/editor/contrib/inlineCompletions/test/browser/utils';
import { generateRandomDisjointEdits, generateRandomMultilineString as randomMultilineString } from 'vs/editor/contrib/inlineCompletions/test/browser/utils';
suite('Single Text Edit', () => {
ensureNoDisposablesAreLeakedInTestSuite();
test('getNewRanges', () => {
test('testing getNewRanges', () => {
function testGetNewRanges() {
const randomText = randomMultilineStringGenerator(10);
const randomText = randomMultilineString(10);
const model = createTextModel(randomText);
const initialModel = createTextModel(randomText);
const edits = generateRandomDisjointEdits(3, model);
const edits = generateRandomDisjointEdits(model, 3);
model.applyEdits(edits);
const invEdits = inverseEdits(initialModel, edits);
model.applyEdits(invEdits);

View file

@ -135,7 +135,7 @@ export class GhostTextContext extends Disposable {
}
}
function randomSimpleStringGenerator(stringLength: number): string {
function generateRandomSimpleString(stringLength: number): string {
let randomText: string = '';
const possibleCharacters: string = ' abcdefghijklmnopqrstuvwxyz0123456789';
for (let i = 0; i < stringLength; i++) {
@ -145,13 +145,22 @@ function randomSimpleStringGenerator(stringLength: number): string {
return randomText;
}
export function generateRandomMultilineString(numberOfLines: number, maximumLengthOfLines: number = 20): string {
let randomText: string = '';
for (let i = 0; i < numberOfLines; i++) {
const lengthOfLine = Math.floor(Math.random() * maximumLengthOfLines);
randomText += generateRandomSimpleString(lengthOfLine) + '\n';
}
return randomText;
}
function generateUniqueRandomIntegers(numberOfIntegers: number, minimum: number, maximum: number): number[] {
if (maximum - minimum + 1 < numberOfIntegers) {
throw new Error('Too many integers to sample, specified');
throw new Error('Too many integers requested');
}
const integers = [];
while (integers.length < numberOfIntegers) {
const integer = Math.floor(Math.random() * maximum) + 1;
const integer = Math.floor(Math.random() * (maximum - minimum + 1)) + minimum;
if (integers.indexOf(integer) === -1) {
integers.push(integer);
}
@ -159,16 +168,7 @@ function generateUniqueRandomIntegers(numberOfIntegers: number, minimum: number,
return integers;
}
export function randomMultilineStringGenerator(numberOfLines: number, maximumLengthOfLines: number = 20): string {
let randomText: string = '';
for (let i = 0; i < numberOfLines; i++) {
const lengthOfLine = Math.floor(Math.random() * maximumLengthOfLines);
randomText += randomSimpleStringGenerator(Math.floor(Math.random() * lengthOfLine)) + '\n';
}
return randomText;
}
export function generateRandomDisjointEdits(numberOfEdits: number, model: TextModel) {
export function generateRandomDisjointEdits(model: TextModel, numberOfEdits: number) {
const numberOfLines = model.getLineCount();
if (2 * numberOfEdits > numberOfLines) {
throw new Error('Too many edits specified');
@ -181,7 +181,7 @@ export function generateRandomDisjointEdits(numberOfEdits: number, model: TextMo
const startColumn = model.getLineLength(startLine) ? generateUniqueRandomIntegers(1, 1, model.getLineLength(startLine))[0] : 1;
const endColumn = model.getLineLength(endLine) ? generateUniqueRandomIntegers(1, 1, model.getLineLength(endLine))[0] : 1;
const numberOfLinesEditText = generateUniqueRandomIntegers(1, 0, 3)[0];
edits.push(new SingleTextEdit(new Range(startLine, startColumn, endLine, endColumn), randomMultilineStringGenerator(numberOfLinesEditText, 10)));
edits.push(new SingleTextEdit(new Range(startLine, startColumn, endLine, endColumn), generateRandomMultilineString(numberOfLinesEditText, 10)));
}
return edits;
}