mirror of
https://github.com/Microsoft/vscode
synced 2024-10-02 17:32:41 +00:00
adding tests which generate random text and random edits
This commit is contained in:
parent
5477394987
commit
37b900d226
|
@ -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() ?? [];
|
||||
|
|
|
@ -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[] = [];
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue