Merge from vscode a5cf1da01d5db3d2557132be8d30f89c38019f6c (#8525)

* Merge from vscode a5cf1da01d5db3d2557132be8d30f89c38019f6c

* remove files we don't want

* fix hygiene

* update distro

* update distro

* fix hygiene

* fix strict nulls

* distro

* distro

* fix tests

* fix tests

* add another edit

* fix viewlet icon

* fix azure dialog

* fix some padding

* fix more padding issues
This commit is contained in:
Anthony Dresser
2019-12-04 19:28:22 -08:00
committed by GitHub
parent a8818ab0df
commit f5ce7fb2a5
1507 changed files with 42813 additions and 27370 deletions

View File

@@ -14,6 +14,7 @@ import { getEditOperation, testCommand } from 'vs/editor/test/browser/testComman
import { withEditorModel } from 'vs/editor/test/common/editorTestUtils';
import { MockMode } from 'vs/editor/test/common/mocks/mockMode';
import { javascriptOnEnterRules } from 'vs/editor/test/common/modes/supports/javascriptOnEnterRules';
import { EditorAutoIndentStrategy } from 'vs/editor/common/config/editorOptions';
/**
* Create single edit operation
@@ -50,6 +51,7 @@ function testShiftCommand(lines: string[], languageIdentifier: LanguageIdentifie
indentSize: 4,
insertSpaces: false,
useTabStops: useTabStops,
autoIndent: EditorAutoIndentStrategy.Full,
}), expectedLines, expectedSelection);
}
@@ -60,6 +62,7 @@ function testUnshiftCommand(lines: string[], languageIdentifier: LanguageIdentif
indentSize: 4,
insertSpaces: false,
useTabStops: useTabStops,
autoIndent: EditorAutoIndentStrategy.Full,
}), expectedLines, expectedSelection);
}
@@ -672,7 +675,8 @@ suite('Editor Commands - ShiftCommand', () => {
tabSize: 4,
indentSize: 4,
insertSpaces: true,
useTabStops: false
useTabStops: false,
autoIndent: EditorAutoIndentStrategy.Full,
}),
[
' Written | Numeric',
@@ -717,7 +721,8 @@ suite('Editor Commands - ShiftCommand', () => {
tabSize: 4,
indentSize: 4,
insertSpaces: true,
useTabStops: false
useTabStops: false,
autoIndent: EditorAutoIndentStrategy.Full,
}),
[
' Written | Numeric',
@@ -762,7 +767,8 @@ suite('Editor Commands - ShiftCommand', () => {
tabSize: 4,
indentSize: 4,
insertSpaces: false,
useTabStops: false
useTabStops: false,
autoIndent: EditorAutoIndentStrategy.Full,
}),
[
' Written | Numeric',
@@ -807,7 +813,8 @@ suite('Editor Commands - ShiftCommand', () => {
tabSize: 4,
indentSize: 4,
insertSpaces: true,
useTabStops: false
useTabStops: false,
autoIndent: EditorAutoIndentStrategy.Full,
}),
[
' Written | Numeric',
@@ -841,7 +848,8 @@ suite('Editor Commands - ShiftCommand', () => {
tabSize: 4,
indentSize: 4,
insertSpaces: false,
useTabStops: true
useTabStops: true,
autoIndent: EditorAutoIndentStrategy.Full,
}),
[
'\tHello world!',
@@ -951,7 +959,8 @@ suite('Editor Commands - ShiftCommand', () => {
tabSize: tabSize,
indentSize: indentSize,
insertSpaces: insertSpaces,
useTabStops: true
useTabStops: true,
autoIndent: EditorAutoIndentStrategy.Full,
});
let actual = getEditOperation(model, op);
assert.deepEqual(actual, expected);
@@ -965,7 +974,8 @@ suite('Editor Commands - ShiftCommand', () => {
tabSize: tabSize,
indentSize: indentSize,
insertSpaces: insertSpaces,
useTabStops: true
useTabStops: true,
autoIndent: EditorAutoIndentStrategy.Full,
});
let actual = getEditOperation(model, op);
assert.deepEqual(actual, expected);

View File

@@ -726,7 +726,7 @@ suite('Editor Controller - Cursor', () => {
});
});
test('combining marks', () => {
test('grapheme breaking', () => {
withTestCodeEditor([
'abcabc',
'ãããããã',
@@ -2834,7 +2834,7 @@ suite('Editor Controller - Indentation Rules', () => {
],
languageIdentifier: mode.getLanguageIdentifier(),
modelOpts: { insertSpaces: false },
editorOpts: { autoIndent: true }
editorOpts: { autoIndent: 'full' }
}, (model, cursor) => {
moveTo(cursor, 1, 12, false);
assertCursor(cursor, new Selection(1, 12, 1, 12));
@@ -2857,7 +2857,7 @@ suite('Editor Controller - Indentation Rules', () => {
'\t'
],
languageIdentifier: mode.getLanguageIdentifier(),
editorOpts: { autoIndent: true }
editorOpts: { autoIndent: 'full' }
}, (model, cursor) => {
moveTo(cursor, 2, 2, false);
assertCursor(cursor, new Selection(2, 2, 2, 2));
@@ -2876,7 +2876,7 @@ suite('Editor Controller - Indentation Rules', () => {
],
languageIdentifier: mode.getLanguageIdentifier(),
modelOpts: { insertSpaces: false },
editorOpts: { autoIndent: true }
editorOpts: { autoIndent: 'full' }
}, (model, cursor) => {
moveTo(cursor, 2, 15, false);
assertCursor(cursor, new Selection(2, 15, 2, 15));
@@ -2896,7 +2896,7 @@ suite('Editor Controller - Indentation Rules', () => {
],
languageIdentifier: mode.getLanguageIdentifier(),
modelOpts: { insertSpaces: false },
editorOpts: { autoIndent: true }
editorOpts: { autoIndent: 'full' }
}, (model, cursor) => {
moveTo(cursor, 2, 14, false);
assertCursor(cursor, new Selection(2, 14, 2, 14));
@@ -2924,7 +2924,7 @@ suite('Editor Controller - Indentation Rules', () => {
mode.getLanguageIdentifier()
);
withTestCodeEditor(null, { model: model, autoIndent: true }, (editor, cursor) => {
withTestCodeEditor(null, { model: model, autoIndent: 'full' }, (editor, cursor) => {
moveTo(cursor, 2, 11, false);
assertCursor(cursor, new Selection(2, 11, 2, 11));
@@ -2948,7 +2948,7 @@ suite('Editor Controller - Indentation Rules', () => {
'}}'
],
languageIdentifier: mode.getLanguageIdentifier(),
editorOpts: { autoIndent: true }
editorOpts: { autoIndent: 'full' }
}, (model, cursor) => {
moveTo(cursor, 3, 13, false);
assertCursor(cursor, new Selection(3, 13, 3, 13));
@@ -3084,7 +3084,7 @@ suite('Editor Controller - Indentation Rules', () => {
],
languageIdentifier: mode.getLanguageIdentifier(),
modelOpts: { insertSpaces: false },
editorOpts: { autoIndent: true }
editorOpts: { autoIndent: 'full' }
}, (model, cursor) => {
moveTo(cursor, 5, 4, false);
assertCursor(cursor, new Selection(5, 4, 5, 4));
@@ -3554,7 +3554,7 @@ suite('Editor Controller - Indentation Rules', () => {
rubyMode.getLanguageIdentifier()
);
withTestCodeEditor(null, { model: model, autoIndent: true }, (editor, cursor) => {
withTestCodeEditor(null, { model: model, autoIndent: 'full' }, (editor, cursor) => {
moveTo(cursor, 4, 7, false);
assertCursor(cursor, new Selection(4, 7, 4, 7));
@@ -3615,7 +3615,7 @@ suite('Editor Controller - Indentation Rules', () => {
'\t\t'
],
languageIdentifier: mode.getLanguageIdentifier(),
editorOpts: { autoIndent: true }
editorOpts: { autoIndent: 'full' }
}, (model, cursor) => {
moveTo(cursor, 3, 3, false);
assertCursor(cursor, new Selection(3, 3, 3, 3));
@@ -3664,7 +3664,7 @@ suite('Editor Controller - Indentation Rules', () => {
mode.getLanguageIdentifier()
);
withTestCodeEditor(null, { model: model, autoIndent: false }, (editor, cursor) => {
withTestCodeEditor(null, { model: model, autoIndent: 'advanced' }, (editor, cursor) => {
moveTo(cursor, 7, 6, false);
assertCursor(cursor, new Selection(7, 6, 7, 6));
@@ -3728,7 +3728,7 @@ suite('Editor Controller - Indentation Rules', () => {
mode.getLanguageIdentifier()
);
withTestCodeEditor(null, { model: model, autoIndent: false }, (editor, cursor) => {
withTestCodeEditor(null, { model: model, autoIndent: 'advanced' }, (editor, cursor) => {
moveTo(cursor, 8, 1, false);
assertCursor(cursor, new Selection(8, 1, 8, 1));
@@ -3791,7 +3791,7 @@ suite('Editor Controller - Indentation Rules', () => {
mode.getLanguageIdentifier()
);
withTestCodeEditor(null, { model: model, autoIndent: true }, (editor, cursor) => {
withTestCodeEditor(null, { model: model, autoIndent: 'full' }, (editor, cursor) => {
moveTo(cursor, 3, 19, false);
assertCursor(cursor, new Selection(3, 19, 3, 19));
@@ -4936,6 +4936,35 @@ suite('autoClosingPairs', () => {
mode.dispose();
});
test('issue #84998: Overtyping Brackets doesn\'t work after backslash', () => {
let mode = new AutoClosingMode();
usingCursor({
text: [
''
],
languageIdentifier: mode.getLanguageIdentifier()
}, (model, cursor) => {
cursor.setSelections('test', [new Selection(1, 1, 1, 1)]);
cursorCommand(cursor, H.Type, { text: '\\' }, 'keyboard');
assert.equal(model.getValue(), '\\');
cursorCommand(cursor, H.Type, { text: '(' }, 'keyboard');
assert.equal(model.getValue(), '\\()');
cursorCommand(cursor, H.Type, { text: 'abc' }, 'keyboard');
assert.equal(model.getValue(), '\\(abc)');
cursorCommand(cursor, H.Type, { text: '\\' }, 'keyboard');
assert.equal(model.getValue(), '\\(abc\\)');
cursorCommand(cursor, H.Type, { text: ')' }, 'keyboard');
assert.equal(model.getValue(), '\\(abc\\)');
});
mode.dispose();
});
test('issue #2773: Accents (´`¨^, others?) are inserted in the wrong position (Mac)', () => {
let mode = new AutoClosingMode();
usingCursor({

View File

@@ -103,7 +103,7 @@ function doCreateTest(description: string, inputStr: string, expectedStr: string
const selection = new Range(1, 1 + cursorOffset, 1, 1 + cursorOffset + cursorLength);
return PagedScreenReaderStrategy.fromEditorSelection(currentState, model, selection, true);
return PagedScreenReaderStrategy.fromEditorSelection(currentState, model, selection, 10, true);
},
deduceModelPosition: (viewAnchorPosition: Position, deltaOffset: number, lineFeedCnt: number): Position => {
return null!;

View File

@@ -535,7 +535,7 @@ suite('TextAreaState', () => {
function testPagedScreenReaderStrategy(lines: string[], selection: Selection, expected: TextAreaState): void {
const model = TextModel.createFromString(lines.join('\n'));
const actual = PagedScreenReaderStrategy.fromEditorSelection(TextAreaState.EMPTY, model, selection, true);
const actual = PagedScreenReaderStrategy.fromEditorSelection(TextAreaState.EMPTY, model, selection, 10, true);
assert.ok(equalsTextAreaState(actual, expected));
model.dispose();
}

View File

@@ -8,6 +8,7 @@ import { URI } from 'vs/base/common/uri';
import { OpenerService } from 'vs/editor/browser/services/openerService';
import { TestCodeEditorService } from 'vs/editor/test/browser/editorTestServices';
import { CommandsRegistry, ICommandService, NullCommandService } from 'vs/platform/commands/common/commands';
import { matchesScheme } from 'vs/platform/opener/common/opener';
suite('OpenerService', function () {
const editorService = new TestCodeEditorService();
@@ -28,27 +29,27 @@ suite('OpenerService', function () {
lastCommand = undefined;
});
test('delegate to editorService, scheme:///fff', function () {
test('delegate to editorService, scheme:///fff', async function () {
const openerService = new OpenerService(editorService, NullCommandService);
openerService.open(URI.parse('another:///somepath'));
await openerService.open(URI.parse('another:///somepath'));
assert.equal(editorService.lastInput!.options!.selection, undefined);
});
test('delegate to editorService, scheme:///fff#L123', function () {
test('delegate to editorService, scheme:///fff#L123', async function () {
const openerService = new OpenerService(editorService, NullCommandService);
openerService.open(URI.parse('file:///somepath#L23'));
await openerService.open(URI.parse('file:///somepath#L23'));
assert.equal(editorService.lastInput!.options!.selection!.startLineNumber, 23);
assert.equal(editorService.lastInput!.options!.selection!.startColumn, 1);
assert.equal(editorService.lastInput!.options!.selection!.endLineNumber, undefined);
assert.equal(editorService.lastInput!.options!.selection!.endColumn, undefined);
assert.equal(editorService.lastInput!.resource.fragment, '');
openerService.open(URI.parse('another:///somepath#L23'));
await openerService.open(URI.parse('another:///somepath#L23'));
assert.equal(editorService.lastInput!.options!.selection!.startLineNumber, 23);
assert.equal(editorService.lastInput!.options!.selection!.startColumn, 1);
openerService.open(URI.parse('another:///somepath#L23,45'));
await openerService.open(URI.parse('another:///somepath#L23,45'));
assert.equal(editorService.lastInput!.options!.selection!.startLineNumber, 23);
assert.equal(editorService.lastInput!.options!.selection!.startColumn, 45);
assert.equal(editorService.lastInput!.options!.selection!.endLineNumber, undefined);
@@ -56,17 +57,17 @@ suite('OpenerService', function () {
assert.equal(editorService.lastInput!.resource.fragment, '');
});
test('delegate to editorService, scheme:///fff#123,123', function () {
test('delegate to editorService, scheme:///fff#123,123', async function () {
const openerService = new OpenerService(editorService, NullCommandService);
openerService.open(URI.parse('file:///somepath#23'));
await openerService.open(URI.parse('file:///somepath#23'));
assert.equal(editorService.lastInput!.options!.selection!.startLineNumber, 23);
assert.equal(editorService.lastInput!.options!.selection!.startColumn, 1);
assert.equal(editorService.lastInput!.options!.selection!.endLineNumber, undefined);
assert.equal(editorService.lastInput!.options!.selection!.endColumn, undefined);
assert.equal(editorService.lastInput!.resource.fragment, '');
openerService.open(URI.parse('file:///somepath#23,45'));
await openerService.open(URI.parse('file:///somepath#23,45'));
assert.equal(editorService.lastInput!.options!.selection!.startLineNumber, 23);
assert.equal(editorService.lastInput!.options!.selection!.startColumn, 45);
assert.equal(editorService.lastInput!.options!.selection!.endLineNumber, undefined);
@@ -74,22 +75,22 @@ suite('OpenerService', function () {
assert.equal(editorService.lastInput!.resource.fragment, '');
});
test('delegate to commandsService, command:someid', function () {
test('delegate to commandsService, command:someid', async function () {
const openerService = new OpenerService(editorService, commandService);
const id = `aCommand${Math.random()}`;
CommandsRegistry.registerCommand(id, function () { });
openerService.open(URI.parse('command:' + id));
await openerService.open(URI.parse('command:' + id));
assert.equal(lastCommand!.id, id);
assert.equal(lastCommand!.args.length, 0);
openerService.open(URI.parse('command:' + id).with({ query: '123' }));
await openerService.open(URI.parse('command:' + id).with({ query: '123' }));
assert.equal(lastCommand!.id, id);
assert.equal(lastCommand!.args.length, 1);
assert.equal(lastCommand!.args[0], '123');
openerService.open(URI.parse('command:' + id).with({ query: JSON.stringify([12, true]) }));
await openerService.open(URI.parse('command:' + id).with({ query: JSON.stringify([12, true]) }));
assert.equal(lastCommand!.id, id);
assert.equal(lastCommand!.args.length, 2);
assert.equal(lastCommand!.args[0], 12);
@@ -199,4 +200,18 @@ suite('OpenerService', function () {
assert.equal(v1, 2);
assert.equal(v2, 0);
});
test('matchesScheme', function () {
assert.ok(matchesScheme('https://microsoft.com', 'https'));
assert.ok(matchesScheme('http://microsoft.com', 'http'));
assert.ok(matchesScheme('hTTPs://microsoft.com', 'https'));
assert.ok(matchesScheme('httP://microsoft.com', 'http'));
assert.ok(matchesScheme(URI.parse('https://microsoft.com'), 'https'));
assert.ok(matchesScheme(URI.parse('http://microsoft.com'), 'http'));
assert.ok(matchesScheme(URI.parse('hTTPs://microsoft.com'), 'https'));
assert.ok(matchesScheme(URI.parse('httP://microsoft.com'), 'http'));
assert.ok(!matchesScheme(URI.parse('https://microsoft.com'), 'http'));
assert.ok(!matchesScheme(URI.parse('htt://microsoft.com'), 'http'));
assert.ok(!matchesScheme(URI.parse('z://microsoft.com'), 'http'));
});
});

View File

@@ -86,7 +86,7 @@ suite('MinimapCharRenderer', () => {
imageData.data[4 * i + 2] = background.b;
imageData.data[4 * i + 3] = 255;
}
renderer.renderChar(imageData, 0, 0, 'd'.charCodeAt(0), color, background, false);
renderer.renderChar(imageData, 0, 0, 'd'.charCodeAt(0), color, background, 2, false);
let actual: number[] = [];
for (let i = 0; i < imageData.data.length; i++) {
@@ -116,7 +116,7 @@ suite('MinimapCharRenderer', () => {
imageData.data[4 * i + 3] = 255;
}
renderer.renderChar(imageData, 0, 0, 'd'.charCodeAt(0), color, background, false);
renderer.renderChar(imageData, 0, 0, 'd'.charCodeAt(0), color, background, 1, false);
let actual: number[] = [];
for (let i = 0; i < imageData.data.length; i++) {

View File

@@ -1,25 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<style>
</style>
</head>
<body style="background:black">
<canvas id="my-canvas"></canvas>
<script src="../../../../loader.js"></script>
<script>
require.config({
baseUrl: '../../../../../../out'
});
require(['vs/editor/test/browser/view/minimapFontCreator'], function() {
});
</script>
</body>
</html>

View File

@@ -1,119 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { RGBA8 } from 'vs/editor/common/core/rgba';
import { MinimapCharRenderer } from 'vs/editor/browser/viewParts/minimap/minimapCharRenderer';
import { Constants } from 'vs/editor/browser/viewParts/minimap/minimapCharSheet';
import { MinimapCharRendererFactory } from 'vs/editor/browser/viewParts/minimap/minimapCharRendererFactory';
let sampleData = MinimapCharRendererFactory.createSampleData('monospace');
let minimapCharRenderer1x = MinimapCharRendererFactory.createFromSampleData(sampleData.data, 1);
let minimapCharRenderer2x = MinimapCharRendererFactory.createFromSampleData(sampleData.data, 2);
let minimapCharRenderer4x = MinimapCharRendererFactory.createFromSampleData(sampleData.data, 4);
let minimapCharRenderer6x = MinimapCharRendererFactory.createFromSampleData(sampleData.data, 6);
renderImageData(sampleData, 10, 100);
renderMinimapCharRenderer(minimapCharRenderer1x, 400, 1);
renderMinimapCharRenderer(minimapCharRenderer2x, 500, 2);
renderMinimapCharRenderer(minimapCharRenderer4x, 600, 4);
renderMinimapCharRenderer(minimapCharRenderer6x, 750, 8);
function createFakeImageData(width: number, height: number): ImageData {
return {
width: width,
height: height,
data: new Uint8ClampedArray(width * height * Constants.RGBA_CHANNELS_CNT)
};
}
function renderMinimapCharRenderer(minimapCharRenderer: MinimapCharRenderer, y: number, scale: number): void {
let background = new RGBA8(0, 0, 0, 255);
let color = new RGBA8(255, 255, 255, 255);
{
let x2 = createFakeImageData(
Constants.BASE_CHAR_WIDTH * scale * Constants.CHAR_COUNT,
Constants.BASE_CHAR_HEIGHT * scale
);
// set the background color
for (let i = 0, len = x2.data.length / 4; i < len; i++) {
x2.data[4 * i + 0] = background.r;
x2.data[4 * i + 1] = background.g;
x2.data[4 * i + 2] = background.b;
x2.data[4 * i + 3] = 255;
}
let dx = 0;
for (let chCode = Constants.START_CH_CODE; chCode <= Constants.END_CH_CODE; chCode++) {
minimapCharRenderer.renderChar(x2, dx, 0, chCode, color, background, false);
dx += Constants.BASE_CHAR_WIDTH * scale;
}
renderImageData(x2, 10, y);
}
}
(function () {
let r = 'let x2Data = [',
offset = 0;
for (let charIndex = 0; charIndex < Constants.CHAR_COUNT; charIndex++) {
let charCode = charIndex + Constants.START_CH_CODE;
r += '\n\n// ' + String.fromCharCode(charCode);
for (let i = 0; i < Constants.BASE_CHAR_HEIGHT * 2; i++) {
if (i % 2 === 0) {
r += '\n';
}
r += (minimapCharRenderer2x as any).charDataNormal[offset] + ',';
offset++;
}
}
r += '\n\n]';
console.log(r);
})();
(function () {
let r = 'let x1Data = [',
offset = 0;
for (let charIndex = 0; charIndex < Constants.CHAR_COUNT; charIndex++) {
let charCode = charIndex + Constants.START_CH_CODE;
r += '\n\n// ' + String.fromCharCode(charCode);
for (let i = 0; i < Constants.BASE_CHAR_HEIGHT * Constants.BASE_CHAR_WIDTH; i++) {
r += '\n';
r += (minimapCharRenderer1x as any).charDataNormal[offset] + ',';
offset++;
}
}
r += '\n\n]';
console.log(r);
})();
function renderImageData(imageData: ImageData, left: number, top: number): void {
let output = '';
let offset = 0;
let PX_SIZE = 15;
for (let i = 0; i < imageData.height; i++) {
for (let j = 0; j < imageData.width; j++) {
let R = imageData.data[offset];
let G = imageData.data[offset + 1];
let B = imageData.data[offset + 2];
let A = imageData.data[offset + 3];
offset += 4;
output += `<div style="position:absolute;top:${PX_SIZE * i}px;left:${PX_SIZE *
j}px;width:${PX_SIZE}px;height:${PX_SIZE}px;background:rgba(${R},${G},${B},${A / 256})"></div>`;
}
}
let domNode = document.createElement('div');
domNode.style.position = 'absolute';
domNode.style.top = top + 'px';
domNode.style.left = left + 'px';
domNode.style.width = imageData.width * PX_SIZE + 'px';
domNode.style.height = imageData.height * PX_SIZE + 'px';
domNode.style.border = '1px solid #ccc';
domNode.style.background = '#000000';
domNode.innerHTML = output;
document.body.appendChild(domNode);
}

View File

@@ -755,7 +755,7 @@ suite('Editor Model - TextModel', () => {
assert.deepEqual(actual, expected, `validateRange for ${input}, got ${actual}, expected ${expected}`);
}
test('combining marks', () => {
test('grapheme breaking', () => {
const m = TextModel.createFromString([
'abcabc',
'ãããããã',

View File

@@ -202,4 +202,11 @@ suite('Editor Modes - Link Computer', () => {
' http://[::1]:5000/connect/token '
);
});
test('issue #70254: bold links dont open in markdown file using editor mode with ctrl + click', () => {
assertLink(
'2. Navigate to **https://portal.azure.com**',
' https://portal.azure.com '
);
});
});

View File

@@ -6,6 +6,7 @@ import * as assert from 'assert';
import { CharacterPair, IndentAction } from 'vs/editor/common/modes/languageConfiguration';
import { OnEnterSupport } from 'vs/editor/common/modes/supports/onEnter';
import { javascriptOnEnterRules } from 'vs/editor/test/common/modes/supports/javascriptOnEnterRules';
import { EditorAutoIndentStrategy } from 'vs/editor/common/config/editorOptions';
suite('OnEnter', () => {
@@ -18,7 +19,7 @@ suite('OnEnter', () => {
brackets: brackets
});
let testIndentAction = (beforeText: string, afterText: string, expected: IndentAction) => {
let actual = support.onEnter('', beforeText, afterText);
let actual = support.onEnter(EditorAutoIndentStrategy.Advanced, '', beforeText, afterText);
if (expected === IndentAction.None) {
assert.equal(actual, null);
} else {
@@ -48,10 +49,10 @@ suite('OnEnter', () => {
test('uses regExpRules', () => {
let support = new OnEnterSupport({
regExpRules: javascriptOnEnterRules
onEnterRules: javascriptOnEnterRules
});
let testIndentAction = (oneLineAboveText: string, beforeText: string, afterText: string, expectedIndentAction: IndentAction | null, expectedAppendText: string | null, removeText: number = 0) => {
let actual = support.onEnter(oneLineAboveText, beforeText, afterText);
let actual = support.onEnter(EditorAutoIndentStrategy.Advanced, oneLineAboveText, beforeText, afterText);
if (expectedIndentAction === null) {
assert.equal(actual, null, 'isNull:' + beforeText);
} else {
@@ -132,4 +133,4 @@ suite('OnEnter', () => {
testIndentAction('', ' * test() {', '', IndentAction.Indent, null, 0);
testIndentAction(' ', ' * test() {', '', IndentAction.Indent, null, 0);
});
});
});

View File

@@ -109,9 +109,9 @@ suite('Editor Modes - textToHtmlTokenizer', () => {
[
'<div>',
'<span style="color: #ff0000;font-style: italic;font-weight: bold;">Ciao</span>',
'<span style="color: #000000;">&nbsp;</span>',
'<span style="color: #000000;">&#160;</span>',
'<span style="color: #00ff00;">hello</span>',
'<span style="color: #000000;">&nbsp;</span>',
'<span style="color: #000000;">&#160;</span>',
'<span style="color: #0000ff;text-decoration: underline;">world!</span>',
'</div>'
].join('')
@@ -122,9 +122,9 @@ suite('Editor Modes - textToHtmlTokenizer', () => {
[
'<div>',
'<span style="color: #ff0000;font-style: italic;font-weight: bold;">Ciao</span>',
'<span style="color: #000000;">&nbsp;</span>',
'<span style="color: #000000;">&#160;</span>',
'<span style="color: #00ff00;">hello</span>',
'<span style="color: #000000;">&nbsp;</span>',
'<span style="color: #000000;">&#160;</span>',
'<span style="color: #0000ff;text-decoration: underline;">w</span>',
'</div>'
].join('')
@@ -135,9 +135,9 @@ suite('Editor Modes - textToHtmlTokenizer', () => {
[
'<div>',
'<span style="color: #ff0000;font-style: italic;font-weight: bold;">Ciao</span>',
'<span style="color: #000000;">&nbsp;</span>',
'<span style="color: #000000;">&#160;</span>',
'<span style="color: #00ff00;">hello</span>',
'<span style="color: #000000;">&nbsp;</span>',
'<span style="color: #000000;">&#160;</span>',
'</div>'
].join('')
);
@@ -147,9 +147,9 @@ suite('Editor Modes - textToHtmlTokenizer', () => {
[
'<div>',
'<span style="color: #ff0000;font-style: italic;font-weight: bold;">iao</span>',
'<span style="color: #000000;">&nbsp;</span>',
'<span style="color: #000000;">&#160;</span>',
'<span style="color: #00ff00;">hello</span>',
'<span style="color: #000000;">&nbsp;</span>',
'<span style="color: #000000;">&#160;</span>',
'</div>'
].join('')
);
@@ -158,9 +158,9 @@ suite('Editor Modes - textToHtmlTokenizer', () => {
tokenizeLineToHTML(text, lineTokens, colorMap, 4, 11, 4, true),
[
'<div>',
'<span style="color: #000000;">&nbsp;</span>',
'<span style="color: #000000;">&#160;</span>',
'<span style="color: #00ff00;">hello</span>',
'<span style="color: #000000;">&nbsp;</span>',
'<span style="color: #000000;">&#160;</span>',
'</div>'
].join('')
);
@@ -170,7 +170,7 @@ suite('Editor Modes - textToHtmlTokenizer', () => {
[
'<div>',
'<span style="color: #00ff00;">hello</span>',
'<span style="color: #000000;">&nbsp;</span>',
'<span style="color: #000000;">&#160;</span>',
'</div>'
].join('')
);
@@ -241,11 +241,11 @@ suite('Editor Modes - textToHtmlTokenizer', () => {
tokenizeLineToHTML(text, lineTokens, colorMap, 0, 21, 4, true),
[
'<div>',
'<span style="color: #000000;">&nbsp;&nbsp;</span>',
'<span style="color: #000000;">&#160;&#160;</span>',
'<span style="color: #ff0000;font-style: italic;font-weight: bold;">Ciao</span>',
'<span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span>',
'<span style="color: #000000;">&#160;&#160;&#160;</span>',
'<span style="color: #00ff00;">hello</span>',
'<span style="color: #000000;">&nbsp;</span>',
'<span style="color: #000000;">&#160;</span>',
'<span style="color: #0000ff;text-decoration: underline;">world!</span>',
'</div>'
].join('')
@@ -255,11 +255,11 @@ suite('Editor Modes - textToHtmlTokenizer', () => {
tokenizeLineToHTML(text, lineTokens, colorMap, 0, 17, 4, true),
[
'<div>',
'<span style="color: #000000;">&nbsp;&nbsp;</span>',
'<span style="color: #000000;">&#160;&#160;</span>',
'<span style="color: #ff0000;font-style: italic;font-weight: bold;">Ciao</span>',
'<span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span>',
'<span style="color: #000000;">&#160;&#160;&#160;</span>',
'<span style="color: #00ff00;">hello</span>',
'<span style="color: #000000;">&nbsp;</span>',
'<span style="color: #000000;">&#160;</span>',
'<span style="color: #0000ff;text-decoration: underline;">wo</span>',
'</div>'
].join('')
@@ -269,7 +269,7 @@ suite('Editor Modes - textToHtmlTokenizer', () => {
tokenizeLineToHTML(text, lineTokens, colorMap, 0, 3, 4, true),
[
'<div>',
'<span style="color: #000000;">&nbsp;&nbsp;</span>',
'<span style="color: #000000;">&#160;&#160;</span>',
'<span style="color: #ff0000;font-style: italic;font-weight: bold;">C</span>',
'</div>'
].join('')

View File

@@ -167,9 +167,8 @@ suite('EditorSimpleWorker', () => {
assert.ok(false);
return;
}
const { suggestions } = result;
assert.equal(suggestions.length, 1);
assert.equal(suggestions[0].label, 'foobar');
assert.equal(result.length, 1);
assert.equal(result, 'foobar');
});
});

View File

@@ -16,6 +16,7 @@ import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl';
import { ITextResourcePropertiesService } from 'vs/editor/common/services/resourceConfiguration';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService';
import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService';
const GENERATE_TESTS = false;
@@ -27,7 +28,7 @@ suite('ModelService', () => {
configService.setUserConfiguration('files', { 'eol': '\n' });
configService.setUserConfiguration('files', { 'eol': '\r\n' }, URI.file(platform.isWindows ? 'c:\\myroot' : '/myroot'));
modelService = new ModelServiceImpl(configService, new TestTextResourcePropertiesService(configService));
modelService = new ModelServiceImpl(configService, new TestTextResourcePropertiesService(configService), new TestThemeService());
});
teardown(() => {

View File

@@ -702,12 +702,12 @@ suite('Editor ViewLayout - EditorLayoutProvider', () => {
decorationsHeight: 800,
contentLeft: 10,
contentWidth: 901,
contentWidth: 893,
contentHeight: 800,
renderMinimap: RenderMinimap.Text,
minimapLeft: 911,
minimapWidth: 89,
minimapLeft: 903,
minimapWidth: 97,
viewportColumn: 89,
verticalScrollbarWidth: 0,
@@ -760,12 +760,12 @@ suite('Editor ViewLayout - EditorLayoutProvider', () => {
decorationsHeight: 800,
contentLeft: 10,
contentWidth: 901,
contentWidth: 893,
contentHeight: 800,
renderMinimap: RenderMinimap.Text,
minimapLeft: 911,
minimapWidth: 89,
minimapLeft: 903,
minimapWidth: 97,
viewportColumn: 89,
verticalScrollbarWidth: 0,
@@ -818,13 +818,13 @@ suite('Editor ViewLayout - EditorLayoutProvider', () => {
decorationsHeight: 800,
contentLeft: 10,
contentWidth: 943,
contentWidth: 935,
contentHeight: 800,
renderMinimap: RenderMinimap.Text,
minimapLeft: 953,
minimapWidth: 47,
viewportColumn: 94,
minimapLeft: 945,
minimapWidth: 55,
viewportColumn: 93,
verticalScrollbarWidth: 0,
horizontalScrollbarHeight: 0,
@@ -863,26 +863,26 @@ suite('Editor ViewLayout - EditorLayoutProvider', () => {
width: 1000,
height: 800,
glyphMarginLeft: 47,
glyphMarginLeft: 55,
glyphMarginWidth: 0,
glyphMarginHeight: 800,
lineNumbersLeft: 47,
lineNumbersLeft: 55,
lineNumbersWidth: 0,
lineNumbersHeight: 800,
decorationsLeft: 47,
decorationsLeft: 55,
decorationsWidth: 10,
decorationsHeight: 800,
contentLeft: 57,
contentWidth: 943,
contentLeft: 65,
contentWidth: 935,
contentHeight: 800,
renderMinimap: RenderMinimap.Text,
minimapLeft: 0,
minimapWidth: 47,
viewportColumn: 94,
minimapWidth: 55,
viewportColumn: 93,
verticalScrollbarWidth: 0,
horizontalScrollbarHeight: 0,
@@ -934,12 +934,12 @@ suite('Editor ViewLayout - EditorLayoutProvider', () => {
decorationsHeight: 422,
contentLeft: 92,
contentWidth: 1026,
contentWidth: 1018,
contentHeight: 422,
renderMinimap: RenderMinimap.Text,
minimapLeft: 1104,
minimapWidth: 83,
minimapLeft: 1096,
minimapWidth: 91,
viewportColumn: 83,
verticalScrollbarWidth: 14,

View File

@@ -3,10 +3,28 @@
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as assert from 'assert';
import { LinesLayout } from 'vs/editor/common/viewLayout/linesLayout';
import { LinesLayout, EditorWhitespace } from 'vs/editor/common/viewLayout/linesLayout';
suite('Editor ViewLayout - LinesLayout', () => {
function insertWhitespace(linesLayout: LinesLayout, afterLineNumber: number, ordinal: number, heightInPx: number, minWidth: number): string {
return linesLayout.changeWhitespace((accessor) => {
return accessor.insertWhitespace(afterLineNumber, ordinal, heightInPx, minWidth);
});
}
function changeOneWhitespace(linesLayout: LinesLayout, id: string, newAfterLineNumber: number, newHeight: number): void {
linesLayout.changeWhitespace((accessor) => {
accessor.changeOneWhitespace(id, newAfterLineNumber, newHeight);
});
}
function removeWhitespace(linesLayout: LinesLayout, id: string): void {
linesLayout.changeWhitespace((accessor) => {
accessor.removeWhitespace(id);
});
}
test('LinesLayout 1', () => {
// Start off with 10 lines
@@ -39,7 +57,7 @@ suite('Editor ViewLayout - LinesLayout', () => {
assert.equal(linesLayout.getLineNumberAtOrAfterVerticalOffset(29), 3);
// Add whitespace of height 5px after 2nd line
linesLayout.insertWhitespace(2, 0, 5, 0);
insertWhitespace(linesLayout, 2, 0, 5, 0);
// lines: [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
// whitespace: a(2,5)
assert.equal(linesLayout.getLinesTotalHeight(), 105);
@@ -63,8 +81,8 @@ suite('Editor ViewLayout - LinesLayout', () => {
assert.equal(linesLayout.getLineNumberAtOrAfterVerticalOffset(105), 10);
// Add two more whitespaces of height 5px
linesLayout.insertWhitespace(3, 0, 5, 0);
linesLayout.insertWhitespace(4, 0, 5, 0);
insertWhitespace(linesLayout, 3, 0, 5, 0);
insertWhitespace(linesLayout, 4, 0, 5, 0);
// lines: [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
// whitespace: a(2,5), b(3, 5), c(4, 5)
assert.equal(linesLayout.getLinesTotalHeight(), 115);
@@ -120,7 +138,7 @@ suite('Editor ViewLayout - LinesLayout', () => {
// Start off with 10 lines and one whitespace after line 2, of height 5
let linesLayout = new LinesLayout(10, 1);
let a = linesLayout.insertWhitespace(2, 0, 5, 0);
let a = insertWhitespace(linesLayout, 2, 0, 5, 0);
// 10 lines
// whitespace: - a(2,5)
@@ -139,7 +157,7 @@ suite('Editor ViewLayout - LinesLayout', () => {
// Change whitespace height
// 10 lines
// whitespace: - a(2,10)
linesLayout.changeWhitespace(a, 2, 10);
changeOneWhitespace(linesLayout, a, 2, 10);
assert.equal(linesLayout.getLinesTotalHeight(), 20);
assert.equal(linesLayout.getVerticalOffsetForLineNumber(1), 0);
assert.equal(linesLayout.getVerticalOffsetForLineNumber(2), 1);
@@ -155,7 +173,7 @@ suite('Editor ViewLayout - LinesLayout', () => {
// Change whitespace position
// 10 lines
// whitespace: - a(5,10)
linesLayout.changeWhitespace(a, 5, 10);
changeOneWhitespace(linesLayout, a, 5, 10);
assert.equal(linesLayout.getLinesTotalHeight(), 20);
assert.equal(linesLayout.getVerticalOffsetForLineNumber(1), 0);
assert.equal(linesLayout.getVerticalOffsetForLineNumber(2), 1);
@@ -200,7 +218,7 @@ suite('Editor ViewLayout - LinesLayout', () => {
// Remove whitespace
// 10 lines
linesLayout.removeWhitespace(a);
removeWhitespace(linesLayout, a);
assert.equal(linesLayout.getLinesTotalHeight(), 10);
assert.equal(linesLayout.getVerticalOffsetForLineNumber(1), 0);
assert.equal(linesLayout.getVerticalOffsetForLineNumber(2), 1);
@@ -216,7 +234,7 @@ suite('Editor ViewLayout - LinesLayout', () => {
test('LinesLayout getLineNumberAtOrAfterVerticalOffset', () => {
let linesLayout = new LinesLayout(10, 1);
linesLayout.insertWhitespace(6, 0, 10, 0);
insertWhitespace(linesLayout, 6, 0, 10, 0);
// 10 lines
// whitespace: - a(6,10)
@@ -265,7 +283,7 @@ suite('Editor ViewLayout - LinesLayout', () => {
test('LinesLayout getCenteredLineInViewport', () => {
let linesLayout = new LinesLayout(10, 1);
linesLayout.insertWhitespace(6, 0, 10, 0);
insertWhitespace(linesLayout, 6, 0, 10, 0);
// 10 lines
// whitespace: - a(6,10)
@@ -348,7 +366,7 @@ suite('Editor ViewLayout - LinesLayout', () => {
test('LinesLayout getLinesViewportData 1', () => {
let linesLayout = new LinesLayout(10, 10);
linesLayout.insertWhitespace(6, 0, 100, 0);
insertWhitespace(linesLayout, 6, 0, 100, 0);
// 10 lines
// whitespace: - a(6,100)
@@ -479,11 +497,10 @@ suite('Editor ViewLayout - LinesLayout', () => {
assert.deepEqual(viewportData.relativeVerticalOffset, [160, 170, 180, 190]);
});
test('LinesLayout getLinesViewportData 2 & getWhitespaceViewportData', () => {
let linesLayout = new LinesLayout(10, 10);
let a = linesLayout.insertWhitespace(6, 0, 100, 0);
let b = linesLayout.insertWhitespace(7, 0, 50, 0);
let a = insertWhitespace(linesLayout, 6, 0, 100, 0);
let b = insertWhitespace(linesLayout, 7, 0, 50, 0);
// 10 lines
// whitespace: - a(6,100), b(7, 50)
@@ -553,8 +570,8 @@ suite('Editor ViewLayout - LinesLayout', () => {
test('LinesLayout getWhitespaceAtVerticalOffset', () => {
let linesLayout = new LinesLayout(10, 10);
let a = linesLayout.insertWhitespace(6, 0, 100, 0);
let b = linesLayout.insertWhitespace(7, 0, 50, 0);
let a = insertWhitespace(linesLayout, 6, 0, 100, 0);
let b = insertWhitespace(linesLayout, 7, 0, 50, 0);
let whitespace = linesLayout.getWhitespaceAtVerticalOffset(0);
assert.equal(whitespace, null);
@@ -592,4 +609,536 @@ suite('Editor ViewLayout - LinesLayout', () => {
whitespace = linesLayout.getWhitespaceAtVerticalOffset(220);
assert.equal(whitespace, null);
});
test('LinesLayout', () => {
const linesLayout = new LinesLayout(100, 20);
// Insert a whitespace after line number 2, of height 10
const a = insertWhitespace(linesLayout, 2, 0, 10, 0);
// whitespaces: a(2, 10)
assert.equal(linesLayout.getWhitespacesCount(), 1);
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 2);
assert.equal(linesLayout.getHeightForWhitespaceIndex(0), 10);
assert.equal(linesLayout.getWhitespacesAccumulatedHeight(0), 10);
assert.equal(linesLayout.getWhitespacesTotalHeight(), 10);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(1), 0);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(2), 0);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(3), 10);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(4), 10);
// Insert a whitespace again after line number 2, of height 20
let b = insertWhitespace(linesLayout, 2, 0, 20, 0);
// whitespaces: a(2, 10), b(2, 20)
assert.equal(linesLayout.getWhitespacesCount(), 2);
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 2);
assert.equal(linesLayout.getHeightForWhitespaceIndex(0), 10);
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 2);
assert.equal(linesLayout.getHeightForWhitespaceIndex(1), 20);
assert.equal(linesLayout.getWhitespacesAccumulatedHeight(0), 10);
assert.equal(linesLayout.getWhitespacesAccumulatedHeight(1), 30);
assert.equal(linesLayout.getWhitespacesTotalHeight(), 30);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(1), 0);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(2), 0);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(3), 30);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(4), 30);
// Change last inserted whitespace height to 30
changeOneWhitespace(linesLayout, b, 2, 30);
// whitespaces: a(2, 10), b(2, 30)
assert.equal(linesLayout.getWhitespacesCount(), 2);
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 2);
assert.equal(linesLayout.getHeightForWhitespaceIndex(0), 10);
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 2);
assert.equal(linesLayout.getHeightForWhitespaceIndex(1), 30);
assert.equal(linesLayout.getWhitespacesAccumulatedHeight(0), 10);
assert.equal(linesLayout.getWhitespacesAccumulatedHeight(1), 40);
assert.equal(linesLayout.getWhitespacesTotalHeight(), 40);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(1), 0);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(2), 0);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(3), 40);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(4), 40);
// Remove last inserted whitespace
removeWhitespace(linesLayout, b);
// whitespaces: a(2, 10)
assert.equal(linesLayout.getWhitespacesCount(), 1);
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 2);
assert.equal(linesLayout.getHeightForWhitespaceIndex(0), 10);
assert.equal(linesLayout.getWhitespacesAccumulatedHeight(0), 10);
assert.equal(linesLayout.getWhitespacesTotalHeight(), 10);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(1), 0);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(2), 0);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(3), 10);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(4), 10);
// Add a whitespace before the first line of height 50
b = insertWhitespace(linesLayout, 0, 0, 50, 0);
// whitespaces: b(0, 50), a(2, 10)
assert.equal(linesLayout.getWhitespacesCount(), 2);
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 0);
assert.equal(linesLayout.getHeightForWhitespaceIndex(0), 50);
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 2);
assert.equal(linesLayout.getHeightForWhitespaceIndex(1), 10);
assert.equal(linesLayout.getWhitespacesAccumulatedHeight(0), 50);
assert.equal(linesLayout.getWhitespacesAccumulatedHeight(1), 60);
assert.equal(linesLayout.getWhitespacesTotalHeight(), 60);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(1), 50);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(2), 50);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(3), 60);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(4), 60);
// Add a whitespace after line 4 of height 20
insertWhitespace(linesLayout, 4, 0, 20, 0);
// whitespaces: b(0, 50), a(2, 10), c(4, 20)
assert.equal(linesLayout.getWhitespacesCount(), 3);
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 0);
assert.equal(linesLayout.getHeightForWhitespaceIndex(0), 50);
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 2);
assert.equal(linesLayout.getHeightForWhitespaceIndex(1), 10);
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(2), 4);
assert.equal(linesLayout.getHeightForWhitespaceIndex(2), 20);
assert.equal(linesLayout.getWhitespacesAccumulatedHeight(0), 50);
assert.equal(linesLayout.getWhitespacesAccumulatedHeight(1), 60);
assert.equal(linesLayout.getWhitespacesAccumulatedHeight(2), 80);
assert.equal(linesLayout.getWhitespacesTotalHeight(), 80);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(1), 50);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(2), 50);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(3), 60);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(4), 60);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(5), 80);
// Add a whitespace after line 3 of height 30
insertWhitespace(linesLayout, 3, 0, 30, 0);
// whitespaces: b(0, 50), a(2, 10), d(3, 30), c(4, 20)
assert.equal(linesLayout.getWhitespacesCount(), 4);
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 0);
assert.equal(linesLayout.getHeightForWhitespaceIndex(0), 50);
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 2);
assert.equal(linesLayout.getHeightForWhitespaceIndex(1), 10);
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(2), 3);
assert.equal(linesLayout.getHeightForWhitespaceIndex(2), 30);
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(3), 4);
assert.equal(linesLayout.getHeightForWhitespaceIndex(3), 20);
assert.equal(linesLayout.getWhitespacesAccumulatedHeight(0), 50);
assert.equal(linesLayout.getWhitespacesAccumulatedHeight(1), 60);
assert.equal(linesLayout.getWhitespacesAccumulatedHeight(2), 90);
assert.equal(linesLayout.getWhitespacesAccumulatedHeight(3), 110);
assert.equal(linesLayout.getWhitespacesTotalHeight(), 110);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(1), 50);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(2), 50);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(3), 60);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(4), 90);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(5), 110);
// Change whitespace after line 2 to height of 100
changeOneWhitespace(linesLayout, a, 2, 100);
// whitespaces: b(0, 50), a(2, 100), d(3, 30), c(4, 20)
assert.equal(linesLayout.getWhitespacesCount(), 4);
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 0);
assert.equal(linesLayout.getHeightForWhitespaceIndex(0), 50);
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 2);
assert.equal(linesLayout.getHeightForWhitespaceIndex(1), 100);
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(2), 3);
assert.equal(linesLayout.getHeightForWhitespaceIndex(2), 30);
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(3), 4);
assert.equal(linesLayout.getHeightForWhitespaceIndex(3), 20);
assert.equal(linesLayout.getWhitespacesAccumulatedHeight(0), 50);
assert.equal(linesLayout.getWhitespacesAccumulatedHeight(1), 150);
assert.equal(linesLayout.getWhitespacesAccumulatedHeight(2), 180);
assert.equal(linesLayout.getWhitespacesAccumulatedHeight(3), 200);
assert.equal(linesLayout.getWhitespacesTotalHeight(), 200);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(1), 50);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(2), 50);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(3), 150);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(4), 180);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(5), 200);
// Remove whitespace after line 2
removeWhitespace(linesLayout, a);
// whitespaces: b(0, 50), d(3, 30), c(4, 20)
assert.equal(linesLayout.getWhitespacesCount(), 3);
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 0);
assert.equal(linesLayout.getHeightForWhitespaceIndex(0), 50);
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 3);
assert.equal(linesLayout.getHeightForWhitespaceIndex(1), 30);
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(2), 4);
assert.equal(linesLayout.getHeightForWhitespaceIndex(2), 20);
assert.equal(linesLayout.getWhitespacesAccumulatedHeight(0), 50);
assert.equal(linesLayout.getWhitespacesAccumulatedHeight(1), 80);
assert.equal(linesLayout.getWhitespacesAccumulatedHeight(2), 100);
assert.equal(linesLayout.getWhitespacesTotalHeight(), 100);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(1), 50);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(2), 50);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(3), 50);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(4), 80);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(5), 100);
// Remove whitespace before line 1
removeWhitespace(linesLayout, b);
// whitespaces: d(3, 30), c(4, 20)
assert.equal(linesLayout.getWhitespacesCount(), 2);
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 3);
assert.equal(linesLayout.getHeightForWhitespaceIndex(0), 30);
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 4);
assert.equal(linesLayout.getHeightForWhitespaceIndex(1), 20);
assert.equal(linesLayout.getWhitespacesAccumulatedHeight(0), 30);
assert.equal(linesLayout.getWhitespacesAccumulatedHeight(1), 50);
assert.equal(linesLayout.getWhitespacesTotalHeight(), 50);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(1), 0);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(2), 0);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(3), 0);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(4), 30);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(5), 50);
// Delete line 1
linesLayout.onLinesDeleted(1, 1);
// whitespaces: d(2, 30), c(3, 20)
assert.equal(linesLayout.getWhitespacesCount(), 2);
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 2);
assert.equal(linesLayout.getHeightForWhitespaceIndex(0), 30);
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 3);
assert.equal(linesLayout.getHeightForWhitespaceIndex(1), 20);
assert.equal(linesLayout.getWhitespacesAccumulatedHeight(0), 30);
assert.equal(linesLayout.getWhitespacesAccumulatedHeight(1), 50);
assert.equal(linesLayout.getWhitespacesTotalHeight(), 50);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(1), 0);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(2), 0);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(3), 30);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(4), 50);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(5), 50);
// Insert a line before line 1
linesLayout.onLinesInserted(1, 1);
// whitespaces: d(3, 30), c(4, 20)
assert.equal(linesLayout.getWhitespacesCount(), 2);
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 3);
assert.equal(linesLayout.getHeightForWhitespaceIndex(0), 30);
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 4);
assert.equal(linesLayout.getHeightForWhitespaceIndex(1), 20);
assert.equal(linesLayout.getWhitespacesAccumulatedHeight(0), 30);
assert.equal(linesLayout.getWhitespacesAccumulatedHeight(1), 50);
assert.equal(linesLayout.getWhitespacesTotalHeight(), 50);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(1), 0);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(2), 0);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(3), 0);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(4), 30);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(5), 50);
// Delete line 4
linesLayout.onLinesDeleted(4, 4);
// whitespaces: d(3, 30), c(3, 20)
assert.equal(linesLayout.getWhitespacesCount(), 2);
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 3);
assert.equal(linesLayout.getHeightForWhitespaceIndex(0), 30);
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 3);
assert.equal(linesLayout.getHeightForWhitespaceIndex(1), 20);
assert.equal(linesLayout.getWhitespacesAccumulatedHeight(0), 30);
assert.equal(linesLayout.getWhitespacesAccumulatedHeight(1), 50);
assert.equal(linesLayout.getWhitespacesTotalHeight(), 50);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(1), 0);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(2), 0);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(3), 0);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(4), 50);
assert.equal(linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(5), 50);
});
test('LinesLayout findInsertionIndex', () => {
const makeInternalWhitespace = (afterLineNumbers: number[], ordinal: number = 0) => {
return afterLineNumbers.map((afterLineNumber) => new EditorWhitespace('', afterLineNumber, ordinal, 0, 0));
};
let arr: EditorWhitespace[];
arr = makeInternalWhitespace([]);
assert.equal(LinesLayout.findInsertionIndex(arr, 0, 0), 0);
assert.equal(LinesLayout.findInsertionIndex(arr, 1, 0), 0);
assert.equal(LinesLayout.findInsertionIndex(arr, 2, 0), 0);
arr = makeInternalWhitespace([1]);
assert.equal(LinesLayout.findInsertionIndex(arr, 0, 0), 0);
assert.equal(LinesLayout.findInsertionIndex(arr, 1, 0), 1);
assert.equal(LinesLayout.findInsertionIndex(arr, 2, 0), 1);
arr = makeInternalWhitespace([1, 3]);
assert.equal(LinesLayout.findInsertionIndex(arr, 0, 0), 0);
assert.equal(LinesLayout.findInsertionIndex(arr, 1, 0), 1);
assert.equal(LinesLayout.findInsertionIndex(arr, 2, 0), 1);
assert.equal(LinesLayout.findInsertionIndex(arr, 3, 0), 2);
assert.equal(LinesLayout.findInsertionIndex(arr, 4, 0), 2);
arr = makeInternalWhitespace([1, 3, 5]);
assert.equal(LinesLayout.findInsertionIndex(arr, 0, 0), 0);
assert.equal(LinesLayout.findInsertionIndex(arr, 1, 0), 1);
assert.equal(LinesLayout.findInsertionIndex(arr, 2, 0), 1);
assert.equal(LinesLayout.findInsertionIndex(arr, 3, 0), 2);
assert.equal(LinesLayout.findInsertionIndex(arr, 4, 0), 2);
assert.equal(LinesLayout.findInsertionIndex(arr, 5, 0), 3);
assert.equal(LinesLayout.findInsertionIndex(arr, 6, 0), 3);
arr = makeInternalWhitespace([1, 3, 5], 3);
assert.equal(LinesLayout.findInsertionIndex(arr, 0, 0), 0);
assert.equal(LinesLayout.findInsertionIndex(arr, 1, 0), 0);
assert.equal(LinesLayout.findInsertionIndex(arr, 2, 0), 1);
assert.equal(LinesLayout.findInsertionIndex(arr, 3, 0), 1);
assert.equal(LinesLayout.findInsertionIndex(arr, 4, 0), 2);
assert.equal(LinesLayout.findInsertionIndex(arr, 5, 0), 2);
assert.equal(LinesLayout.findInsertionIndex(arr, 6, 0), 3);
arr = makeInternalWhitespace([1, 3, 5, 7]);
assert.equal(LinesLayout.findInsertionIndex(arr, 0, 0), 0);
assert.equal(LinesLayout.findInsertionIndex(arr, 1, 0), 1);
assert.equal(LinesLayout.findInsertionIndex(arr, 2, 0), 1);
assert.equal(LinesLayout.findInsertionIndex(arr, 3, 0), 2);
assert.equal(LinesLayout.findInsertionIndex(arr, 4, 0), 2);
assert.equal(LinesLayout.findInsertionIndex(arr, 5, 0), 3);
assert.equal(LinesLayout.findInsertionIndex(arr, 6, 0), 3);
assert.equal(LinesLayout.findInsertionIndex(arr, 7, 0), 4);
assert.equal(LinesLayout.findInsertionIndex(arr, 8, 0), 4);
arr = makeInternalWhitespace([1, 3, 5, 7, 9]);
assert.equal(LinesLayout.findInsertionIndex(arr, 0, 0), 0);
assert.equal(LinesLayout.findInsertionIndex(arr, 1, 0), 1);
assert.equal(LinesLayout.findInsertionIndex(arr, 2, 0), 1);
assert.equal(LinesLayout.findInsertionIndex(arr, 3, 0), 2);
assert.equal(LinesLayout.findInsertionIndex(arr, 4, 0), 2);
assert.equal(LinesLayout.findInsertionIndex(arr, 5, 0), 3);
assert.equal(LinesLayout.findInsertionIndex(arr, 6, 0), 3);
assert.equal(LinesLayout.findInsertionIndex(arr, 7, 0), 4);
assert.equal(LinesLayout.findInsertionIndex(arr, 8, 0), 4);
assert.equal(LinesLayout.findInsertionIndex(arr, 9, 0), 5);
assert.equal(LinesLayout.findInsertionIndex(arr, 10, 0), 5);
arr = makeInternalWhitespace([1, 3, 5, 7, 9, 11]);
assert.equal(LinesLayout.findInsertionIndex(arr, 0, 0), 0);
assert.equal(LinesLayout.findInsertionIndex(arr, 1, 0), 1);
assert.equal(LinesLayout.findInsertionIndex(arr, 2, 0), 1);
assert.equal(LinesLayout.findInsertionIndex(arr, 3, 0), 2);
assert.equal(LinesLayout.findInsertionIndex(arr, 4, 0), 2);
assert.equal(LinesLayout.findInsertionIndex(arr, 5, 0), 3);
assert.equal(LinesLayout.findInsertionIndex(arr, 6, 0), 3);
assert.equal(LinesLayout.findInsertionIndex(arr, 7, 0), 4);
assert.equal(LinesLayout.findInsertionIndex(arr, 8, 0), 4);
assert.equal(LinesLayout.findInsertionIndex(arr, 9, 0), 5);
assert.equal(LinesLayout.findInsertionIndex(arr, 10, 0), 5);
assert.equal(LinesLayout.findInsertionIndex(arr, 11, 0), 6);
assert.equal(LinesLayout.findInsertionIndex(arr, 12, 0), 6);
arr = makeInternalWhitespace([1, 3, 5, 7, 9, 11, 13]);
assert.equal(LinesLayout.findInsertionIndex(arr, 0, 0), 0);
assert.equal(LinesLayout.findInsertionIndex(arr, 1, 0), 1);
assert.equal(LinesLayout.findInsertionIndex(arr, 2, 0), 1);
assert.equal(LinesLayout.findInsertionIndex(arr, 3, 0), 2);
assert.equal(LinesLayout.findInsertionIndex(arr, 4, 0), 2);
assert.equal(LinesLayout.findInsertionIndex(arr, 5, 0), 3);
assert.equal(LinesLayout.findInsertionIndex(arr, 6, 0), 3);
assert.equal(LinesLayout.findInsertionIndex(arr, 7, 0), 4);
assert.equal(LinesLayout.findInsertionIndex(arr, 8, 0), 4);
assert.equal(LinesLayout.findInsertionIndex(arr, 9, 0), 5);
assert.equal(LinesLayout.findInsertionIndex(arr, 10, 0), 5);
assert.equal(LinesLayout.findInsertionIndex(arr, 11, 0), 6);
assert.equal(LinesLayout.findInsertionIndex(arr, 12, 0), 6);
assert.equal(LinesLayout.findInsertionIndex(arr, 13, 0), 7);
assert.equal(LinesLayout.findInsertionIndex(arr, 14, 0), 7);
arr = makeInternalWhitespace([1, 3, 5, 7, 9, 11, 13, 15]);
assert.equal(LinesLayout.findInsertionIndex(arr, 0, 0), 0);
assert.equal(LinesLayout.findInsertionIndex(arr, 1, 0), 1);
assert.equal(LinesLayout.findInsertionIndex(arr, 2, 0), 1);
assert.equal(LinesLayout.findInsertionIndex(arr, 3, 0), 2);
assert.equal(LinesLayout.findInsertionIndex(arr, 4, 0), 2);
assert.equal(LinesLayout.findInsertionIndex(arr, 5, 0), 3);
assert.equal(LinesLayout.findInsertionIndex(arr, 6, 0), 3);
assert.equal(LinesLayout.findInsertionIndex(arr, 7, 0), 4);
assert.equal(LinesLayout.findInsertionIndex(arr, 8, 0), 4);
assert.equal(LinesLayout.findInsertionIndex(arr, 9, 0), 5);
assert.equal(LinesLayout.findInsertionIndex(arr, 10, 0), 5);
assert.equal(LinesLayout.findInsertionIndex(arr, 11, 0), 6);
assert.equal(LinesLayout.findInsertionIndex(arr, 12, 0), 6);
assert.equal(LinesLayout.findInsertionIndex(arr, 13, 0), 7);
assert.equal(LinesLayout.findInsertionIndex(arr, 14, 0), 7);
assert.equal(LinesLayout.findInsertionIndex(arr, 15, 0), 8);
assert.equal(LinesLayout.findInsertionIndex(arr, 16, 0), 8);
});
test('LinesLayout changeWhitespaceAfterLineNumber & getFirstWhitespaceIndexAfterLineNumber', () => {
const linesLayout = new LinesLayout(100, 20);
const a = insertWhitespace(linesLayout, 0, 0, 1, 0);
const b = insertWhitespace(linesLayout, 7, 0, 1, 0);
const c = insertWhitespace(linesLayout, 3, 0, 1, 0);
assert.equal(linesLayout.getIdForWhitespaceIndex(0), a); // 0
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 0);
assert.equal(linesLayout.getIdForWhitespaceIndex(1), c); // 3
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 3);
assert.equal(linesLayout.getIdForWhitespaceIndex(2), b); // 7
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(2), 7);
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(1), 1); // c
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(2), 1); // c
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(3), 1); // c
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(4), 2); // b
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(5), 2); // b
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(6), 2); // b
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(7), 2); // b
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(8), -1); // --
// Do not really move a
changeOneWhitespace(linesLayout, a, 1, 1);
assert.equal(linesLayout.getIdForWhitespaceIndex(0), a); // 1
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 1);
assert.equal(linesLayout.getIdForWhitespaceIndex(1), c); // 3
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 3);
assert.equal(linesLayout.getIdForWhitespaceIndex(2), b); // 7
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(2), 7);
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(1), 0); // a
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(2), 1); // c
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(3), 1); // c
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(4), 2); // b
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(5), 2); // b
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(6), 2); // b
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(7), 2); // b
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(8), -1); // --
// Do not really move a
changeOneWhitespace(linesLayout, a, 2, 1);
assert.equal(linesLayout.getIdForWhitespaceIndex(0), a); // 2
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 2);
assert.equal(linesLayout.getIdForWhitespaceIndex(1), c); // 3
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 3);
assert.equal(linesLayout.getIdForWhitespaceIndex(2), b); // 7
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(2), 7);
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(1), 0); // a
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(2), 0); // a
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(3), 1); // c
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(4), 2); // b
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(5), 2); // b
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(6), 2); // b
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(7), 2); // b
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(8), -1); // --
// Change a to conflict with c => a gets placed after c
changeOneWhitespace(linesLayout, a, 3, 1);
assert.equal(linesLayout.getIdForWhitespaceIndex(0), c); // 3
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 3);
assert.equal(linesLayout.getIdForWhitespaceIndex(1), a); // 3
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 3);
assert.equal(linesLayout.getIdForWhitespaceIndex(2), b); // 7
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(2), 7);
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(1), 0); // c
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(2), 0); // c
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(3), 0); // c
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(4), 2); // b
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(5), 2); // b
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(6), 2); // b
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(7), 2); // b
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(8), -1); // --
// Make a no-op
changeOneWhitespace(linesLayout, c, 3, 1);
assert.equal(linesLayout.getIdForWhitespaceIndex(0), c); // 3
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 3);
assert.equal(linesLayout.getIdForWhitespaceIndex(1), a); // 3
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 3);
assert.equal(linesLayout.getIdForWhitespaceIndex(2), b); // 7
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(2), 7);
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(1), 0); // c
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(2), 0); // c
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(3), 0); // c
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(4), 2); // b
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(5), 2); // b
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(6), 2); // b
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(7), 2); // b
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(8), -1); // --
// Conflict c with b => c gets placed after b
changeOneWhitespace(linesLayout, c, 7, 1);
assert.equal(linesLayout.getIdForWhitespaceIndex(0), a); // 3
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(0), 3);
assert.equal(linesLayout.getIdForWhitespaceIndex(1), b); // 7
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(1), 7);
assert.equal(linesLayout.getIdForWhitespaceIndex(2), c); // 7
assert.equal(linesLayout.getAfterLineNumberForWhitespaceIndex(2), 7);
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(1), 0); // a
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(2), 0); // a
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(3), 0); // a
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(4), 1); // b
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(5), 1); // b
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(6), 1); // b
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(7), 1); // b
assert.equal(linesLayout.getFirstWhitespaceIndexAfterLineNumber(8), -1); // --
});
test('LinesLayout Bug', () => {
const linesLayout = new LinesLayout(100, 20);
const a = insertWhitespace(linesLayout, 0, 0, 1, 0);
const b = insertWhitespace(linesLayout, 7, 0, 1, 0);
assert.equal(linesLayout.getIdForWhitespaceIndex(0), a); // 0
assert.equal(linesLayout.getIdForWhitespaceIndex(1), b); // 7
const c = insertWhitespace(linesLayout, 3, 0, 1, 0);
assert.equal(linesLayout.getIdForWhitespaceIndex(0), a); // 0
assert.equal(linesLayout.getIdForWhitespaceIndex(1), c); // 3
assert.equal(linesLayout.getIdForWhitespaceIndex(2), b); // 7
const d = insertWhitespace(linesLayout, 2, 0, 1, 0);
assert.equal(linesLayout.getIdForWhitespaceIndex(0), a); // 0
assert.equal(linesLayout.getIdForWhitespaceIndex(1), d); // 2
assert.equal(linesLayout.getIdForWhitespaceIndex(2), c); // 3
assert.equal(linesLayout.getIdForWhitespaceIndex(3), b); // 7
const e = insertWhitespace(linesLayout, 8, 0, 1, 0);
assert.equal(linesLayout.getIdForWhitespaceIndex(0), a); // 0
assert.equal(linesLayout.getIdForWhitespaceIndex(1), d); // 2
assert.equal(linesLayout.getIdForWhitespaceIndex(2), c); // 3
assert.equal(linesLayout.getIdForWhitespaceIndex(3), b); // 7
assert.equal(linesLayout.getIdForWhitespaceIndex(4), e); // 8
const f = insertWhitespace(linesLayout, 11, 0, 1, 0);
assert.equal(linesLayout.getIdForWhitespaceIndex(0), a); // 0
assert.equal(linesLayout.getIdForWhitespaceIndex(1), d); // 2
assert.equal(linesLayout.getIdForWhitespaceIndex(2), c); // 3
assert.equal(linesLayout.getIdForWhitespaceIndex(3), b); // 7
assert.equal(linesLayout.getIdForWhitespaceIndex(4), e); // 8
assert.equal(linesLayout.getIdForWhitespaceIndex(5), f); // 11
const g = insertWhitespace(linesLayout, 10, 0, 1, 0);
assert.equal(linesLayout.getIdForWhitespaceIndex(0), a); // 0
assert.equal(linesLayout.getIdForWhitespaceIndex(1), d); // 2
assert.equal(linesLayout.getIdForWhitespaceIndex(2), c); // 3
assert.equal(linesLayout.getIdForWhitespaceIndex(3), b); // 7
assert.equal(linesLayout.getIdForWhitespaceIndex(4), e); // 8
assert.equal(linesLayout.getIdForWhitespaceIndex(5), g); // 10
assert.equal(linesLayout.getIdForWhitespaceIndex(6), f); // 11
const h = insertWhitespace(linesLayout, 0, 0, 1, 0);
assert.equal(linesLayout.getIdForWhitespaceIndex(0), a); // 0
assert.equal(linesLayout.getIdForWhitespaceIndex(1), h); // 0
assert.equal(linesLayout.getIdForWhitespaceIndex(2), d); // 2
assert.equal(linesLayout.getIdForWhitespaceIndex(3), c); // 3
assert.equal(linesLayout.getIdForWhitespaceIndex(4), b); // 7
assert.equal(linesLayout.getIdForWhitespaceIndex(5), e); // 8
assert.equal(linesLayout.getIdForWhitespaceIndex(6), g); // 10
assert.equal(linesLayout.getIdForWhitespaceIndex(7), f); // 11
});
});

View File

@@ -189,8 +189,8 @@ suite('viewLineRenderer.renderLine', () => {
createPart(48, 12),
]);
let expectedOutput = [
'<span class="vs-whitespace" style="width:40px">\u2192\u00a0\u00a0\u00a0</span>',
'<span class="vs-whitespace" style="width:40px">\u00b7\u00b7\u00b7\u00b7</span>',
'<span class="vs-whitespace" style="display:inline-block;width:40px">\u2192\u00a0\u00a0\u00a0</span>',
'<span class="vs-whitespace" style="display:inline-block;width:40px">\u00b7\u00b7\u00b7\u00b7</span>',
'<span class="mtk2">export</span>',
'<span class="mtk3">\u00a0</span>',
'<span class="mtk4">class</span>',
@@ -201,8 +201,8 @@ suite('viewLineRenderer.renderLine', () => {
'<span class="mtk9">\u00a0</span>',
'<span class="mtk10">//\u00a0</span>',
'<span class="mtk11">http://test.com</span>',
'<span class="vs-whitespace" style="width:20px">\u00b7\u00b7</span>',
'<span class="vs-whitespace" style="width:30px">\u00b7\u00b7\u00b7</span>'
'<span class="vs-whitespace" style="display:inline-block;width:20px">\u00b7\u00b7</span>',
'<span class="vs-whitespace" style="display:inline-block;width:30px">\u00b7\u00b7\u00b7</span>'
].join('');
let expectedOffsetsArr = [
[0],
@@ -867,10 +867,10 @@ suite('viewLineRenderer.renderLine 2', () => {
null,
[
'<span>',
'<span class="vs-whitespace" style="width:40px">\u00b7\u00b7\u00b7\u00b7</span>',
'<span class="vs-whitespace" style="display:inline-block;width:40px">\u00b7\u00b7\u00b7\u00b7</span>',
'<span class="mtk2">He</span>',
'<span class="mtk3">llo\u00a0world!</span>',
'<span class="vs-whitespace" style="width:40px">\u00b7\u00b7\u00b7\u00b7</span>',
'<span class="vs-whitespace" style="display:inline-block;width:40px">\u00b7\u00b7\u00b7\u00b7</span>',
'</span>',
].join('')
);
@@ -889,12 +889,12 @@ suite('viewLineRenderer.renderLine 2', () => {
null,
[
'<span>',
'<span class="vs-whitespace" style="width:40px">\u00b7\u00b7\u00b7\u00b7</span>',
'<span class="vs-whitespace" style="width:40px">\u00b7\u00b7\u00b7\u00b7</span>',
'<span class="vs-whitespace" style="display:inline-block;width:40px">\u00b7\u00b7\u00b7\u00b7</span>',
'<span class="vs-whitespace" style="display:inline-block;width:40px">\u00b7\u00b7\u00b7\u00b7</span>',
'<span class="mtk2">He</span>',
'<span class="mtk3">llo\u00a0world!</span>',
'<span class="vs-whitespace" style="width:40px">\u00b7\u00b7\u00b7\u00b7</span>',
'<span class="vs-whitespace" style="width:40px">\u00b7\u00b7\u00b7\u00b7</span>',
'<span class="vs-whitespace" style="display:inline-block;width:40px">\u00b7\u00b7\u00b7\u00b7</span>',
'<span class="vs-whitespace" style="display:inline-block;width:40px">\u00b7\u00b7\u00b7\u00b7</span>',
'</span>',
].join('')
);
@@ -913,11 +913,11 @@ suite('viewLineRenderer.renderLine 2', () => {
null,
[
'<span>',
'<span class="vs-whitespace" style="width:40px">\u2192\u00a0\u00a0\u00a0</span>',
'<span class="vs-whitespace" style="width:40px">\u2192\u00a0\u00a0\u00a0</span>',
'<span class="vs-whitespace" style="display:inline-block;width:40px">\u2192\u00a0\u00a0\u00a0</span>',
'<span class="vs-whitespace" style="display:inline-block;width:40px">\u2192\u00a0\u00a0\u00a0</span>',
'<span class="mtk2">He</span>',
'<span class="mtk3">llo\u00a0world!</span>',
'<span class="vs-whitespace" style="width:40px">\u2192\u00a0\u00a0\u00a0</span>',
'<span class="vs-whitespace" style="display:inline-block;width:40px">\u2192\u00a0\u00a0\u00a0</span>',
'</span>',
].join('')
);
@@ -936,15 +936,15 @@ suite('viewLineRenderer.renderLine 2', () => {
null,
[
'<span>',
'<span class="vs-whitespace" style="width:40px">\u00b7\u00b7\u2192\u00a0</span>',
'<span class="vs-whitespace" style="width:40px">\u2192\u00a0\u00a0\u00a0</span>',
'<span class="vs-whitespace" style="width:20px">\u00b7\u00b7</span>',
'<span class="vs-whitespace" style="display:inline-block;width:40px">\u00b7\u00b7\u2192\u00a0</span>',
'<span class="vs-whitespace" style="display:inline-block;width:40px">\u2192\u00a0\u00a0\u00a0</span>',
'<span class="vs-whitespace" style="display:inline-block;width:20px">\u00b7\u00b7</span>',
'<span class="mtk2">He</span>',
'<span class="mtk3">llo\u00a0world!</span>',
'<span class="vs-whitespace" style="width:20px">\u00b7\uffeb</span>',
'<span class="vs-whitespace" style="width:40px">\u00b7\u00b7\u2192\u00a0</span>',
'<span class="vs-whitespace" style="width:40px">\u00b7\u00b7\u00b7\uffeb</span>',
'<span class="vs-whitespace" style="width:40px">\u00b7\u00b7\u00b7\u00b7</span>',
'<span class="vs-whitespace" style="display:inline-block;width:20px">\u00b7\uffeb</span>',
'<span class="vs-whitespace" style="display:inline-block;width:40px">\u00b7\u00b7\u2192\u00a0</span>',
'<span class="vs-whitespace" style="display:inline-block;width:40px">\u00b7\u00b7\u00b7\uffeb</span>',
'<span class="vs-whitespace" style="display:inline-block;width:40px">\u00b7\u00b7\u00b7\u00b7</span>',
'</span>',
].join('')
);
@@ -965,13 +965,13 @@ suite('viewLineRenderer.renderLine 2', () => {
[
'<span>',
'<span class="">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0</span>',
'<span class="vs-whitespace" style="width:20px">\u00b7\u00b7</span>',
'<span class="vs-whitespace" style="display:inline-block;width:20px">\u00b7\u00b7</span>',
'<span class="mtk2">He</span>',
'<span class="mtk3">llo\u00a0world!</span>',
'<span class="vs-whitespace" style="width:20px">\u00b7\uffeb</span>',
'<span class="vs-whitespace" style="width:40px">\u00b7\u00b7\u2192\u00a0</span>',
'<span class="vs-whitespace" style="width:40px">\u00b7\u00b7\u00b7\uffeb</span>',
'<span class="vs-whitespace" style="width:40px">\u00b7\u00b7\u00b7\u00b7</span>',
'<span class="vs-whitespace" style="display:inline-block;width:20px">\u00b7\uffeb</span>',
'<span class="vs-whitespace" style="display:inline-block;width:40px">\u00b7\u00b7\u2192\u00a0</span>',
'<span class="vs-whitespace" style="display:inline-block;width:40px">\u00b7\u00b7\u00b7\uffeb</span>',
'<span class="vs-whitespace" style="display:inline-block;width:40px">\u00b7\u00b7\u00b7\u00b7</span>',
'</span>',
].join('')
);
@@ -1016,11 +1016,11 @@ suite('viewLineRenderer.renderLine 2', () => {
[
'<span>',
'<span class="mtk1">it</span>',
'<span class="vs-whitespace" style="width:20px">\u00b7\u00b7</span>',
'<span class="vs-whitespace" style="display:inline-block;width:20px">\u00b7\u00b7</span>',
'<span class="mtk1">it</span>',
'<span class="mtk2">\u00a0</span>',
'<span class="mtk3">it</span>',
'<span class="vs-whitespace" style="width:20px">\u00b7\u00b7</span>',
'<span class="vs-whitespace" style="display:inline-block;width:20px">\u00b7\u00b7</span>',
'<span class="mtk3">it</span>',
'</span>',
].join('')
@@ -1041,12 +1041,12 @@ suite('viewLineRenderer.renderLine 2', () => {
null,
[
'<span>',
'<span class="vs-whitespace" style="width:10px">\u00b7</span>',
'<span class="vs-whitespace" style="display:inline-block;width:10px">\u00b7</span>',
'<span class="mtk0">Hel</span>',
'<span class="mtk1">lo</span>',
'<span class="vs-whitespace" style="width:10px">\u00b7</span>',
'<span class="vs-whitespace" style="display:inline-block;width:10px">\u00b7</span>',
'<span class="mtk2">world!</span>',
'<span class="vs-whitespace" style="width:30px">\u2192\u00a0\u00a0</span>',
'<span class="vs-whitespace" style="display:inline-block;width:30px">\u2192\u00a0\u00a0</span>',
'</span>',
].join('')
);
@@ -1088,12 +1088,12 @@ suite('viewLineRenderer.renderLine 2', () => {
[new LineRange(0, 14)],
[
'<span>',
'<span class="vs-whitespace" style="width:10px">\u00b7</span>',
'<span class="vs-whitespace" style="display:inline-block;width:10px">\u00b7</span>',
'<span class="mtk0">Hel</span>',
'<span class="mtk1">lo</span>',
'<span class="vs-whitespace" style="width:10px">\u00b7</span>',
'<span class="vs-whitespace" style="display:inline-block;width:10px">\u00b7</span>',
'<span class="mtk2">world!</span>',
'<span class="vs-whitespace" style="width:30px">\u2192\u00a0\u00a0</span>',
'<span class="vs-whitespace" style="display:inline-block;width:30px">\u2192\u00a0\u00a0</span>',
'</span>',
].join('')
);
@@ -1113,7 +1113,7 @@ suite('viewLineRenderer.renderLine 2', () => {
[new LineRange(0, 5)],
[
'<span>',
'<span class="vs-whitespace" style="width:10px">\u00b7</span>',
'<span class="vs-whitespace" style="display:inline-block;width:10px">\u00b7</span>',
'<span class="mtk0">Hel</span>',
'<span class="mtk1">lo</span>',
'<span class="mtk2">\u00a0world!\u00a0\u00a0\u00a0</span>',
@@ -1137,11 +1137,11 @@ suite('viewLineRenderer.renderLine 2', () => {
[new LineRange(0, 5), new LineRange(9, 14)],
[
'<span>',
'<span class="vs-whitespace" style="width:10px">\u00b7</span>',
'<span class="vs-whitespace" style="display:inline-block;width:10px">\u00b7</span>',
'<span class="mtk0">Hel</span>',
'<span class="mtk1">lo</span>',
'<span class="mtk2">\u00a0world!</span>',
'<span class="vs-whitespace" style="width:30px">\u2192\u00a0\u00a0</span>',
'<span class="vs-whitespace" style="display:inline-block;width:30px">\u2192\u00a0\u00a0</span>',
'</span>',
].join('')
);
@@ -1162,11 +1162,11 @@ suite('viewLineRenderer.renderLine 2', () => {
[new LineRange(9, 14), new LineRange(0, 5)],
[
'<span>',
'<span class="vs-whitespace" style="width:10px">\u00b7</span>',
'<span class="vs-whitespace" style="display:inline-block;width:10px">\u00b7</span>',
'<span class="mtk0">Hel</span>',
'<span class="mtk1">lo</span>',
'<span class="mtk2">\u00a0world!</span>',
'<span class="vs-whitespace" style="width:30px">\u2192\u00a0\u00a0</span>',
'<span class="vs-whitespace" style="display:inline-block;width:30px">\u2192\u00a0\u00a0</span>',
'</span>',
].join('')
);
@@ -1184,9 +1184,9 @@ suite('viewLineRenderer.renderLine 2', () => {
[new LineRange(0, 1), new LineRange(1, 2), new LineRange(2, 3)],
[
'<span>',
'<span class="vs-whitespace" style="width:10px">\u00b7</span>',
'<span class="vs-whitespace" style="display:inline-block;width:10px">\u00b7</span>',
'<span class="mtk0">*</span>',
'<span class="vs-whitespace" style="width:10px">\u00b7</span>',
'<span class="vs-whitespace" style="display:inline-block;width:10px">\u00b7</span>',
'<span class="mtk0">S</span>',
'</span>',
].join('')
@@ -1293,7 +1293,7 @@ suite('viewLineRenderer.renderLine 2', () => {
let expected = [
'<span>',
'<span class="vs-whitespace" style="width:40px">\u2192\u00a0\u00a0\u00a0</span>',
'<span class="vs-whitespace" style="display:inline-block;width:40px">\u2192\u00a0\u00a0\u00a0</span>',
'<span class="mtk3 before">b</span>',
'<span class="mtk3">la</span>',
'</span>'

View File

@@ -1,558 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as assert from 'assert';
import { WhitespaceComputer } from 'vs/editor/common/viewLayout/whitespaceComputer';
suite('Editor ViewLayout - WhitespaceComputer', () => {
test('WhitespaceComputer', () => {
let whitespaceComputer = new WhitespaceComputer();
// Insert a whitespace after line number 2, of height 10
let a = whitespaceComputer.insertWhitespace(2, 0, 10, 0);
// whitespaces: a(2, 10)
assert.equal(whitespaceComputer.getCount(), 1);
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(0), 2);
assert.equal(whitespaceComputer.getHeightForWhitespaceIndex(0), 10);
assert.equal(whitespaceComputer.getAccumulatedHeight(0), 10);
assert.equal(whitespaceComputer.getTotalHeight(), 10);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(1), 0);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(2), 0);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(3), 10);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(4), 10);
// Insert a whitespace again after line number 2, of height 20
let b = whitespaceComputer.insertWhitespace(2, 0, 20, 0);
// whitespaces: a(2, 10), b(2, 20)
assert.equal(whitespaceComputer.getCount(), 2);
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(0), 2);
assert.equal(whitespaceComputer.getHeightForWhitespaceIndex(0), 10);
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(1), 2);
assert.equal(whitespaceComputer.getHeightForWhitespaceIndex(1), 20);
assert.equal(whitespaceComputer.getAccumulatedHeight(0), 10);
assert.equal(whitespaceComputer.getAccumulatedHeight(1), 30);
assert.equal(whitespaceComputer.getTotalHeight(), 30);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(1), 0);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(2), 0);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(3), 30);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(4), 30);
// Change last inserted whitespace height to 30
whitespaceComputer.changeWhitespaceHeight(b, 30);
// whitespaces: a(2, 10), b(2, 30)
assert.equal(whitespaceComputer.getCount(), 2);
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(0), 2);
assert.equal(whitespaceComputer.getHeightForWhitespaceIndex(0), 10);
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(1), 2);
assert.equal(whitespaceComputer.getHeightForWhitespaceIndex(1), 30);
assert.equal(whitespaceComputer.getAccumulatedHeight(0), 10);
assert.equal(whitespaceComputer.getAccumulatedHeight(1), 40);
assert.equal(whitespaceComputer.getTotalHeight(), 40);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(1), 0);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(2), 0);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(3), 40);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(4), 40);
// Remove last inserted whitespace
whitespaceComputer.removeWhitespace(b);
// whitespaces: a(2, 10)
assert.equal(whitespaceComputer.getCount(), 1);
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(0), 2);
assert.equal(whitespaceComputer.getHeightForWhitespaceIndex(0), 10);
assert.equal(whitespaceComputer.getAccumulatedHeight(0), 10);
assert.equal(whitespaceComputer.getTotalHeight(), 10);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(1), 0);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(2), 0);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(3), 10);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(4), 10);
// Add a whitespace before the first line of height 50
b = whitespaceComputer.insertWhitespace(0, 0, 50, 0);
// whitespaces: b(0, 50), a(2, 10)
assert.equal(whitespaceComputer.getCount(), 2);
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(0), 0);
assert.equal(whitespaceComputer.getHeightForWhitespaceIndex(0), 50);
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(1), 2);
assert.equal(whitespaceComputer.getHeightForWhitespaceIndex(1), 10);
assert.equal(whitespaceComputer.getAccumulatedHeight(0), 50);
assert.equal(whitespaceComputer.getAccumulatedHeight(1), 60);
assert.equal(whitespaceComputer.getTotalHeight(), 60);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(1), 50);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(2), 50);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(3), 60);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(4), 60);
// Add a whitespace after line 4 of height 20
whitespaceComputer.insertWhitespace(4, 0, 20, 0);
// whitespaces: b(0, 50), a(2, 10), c(4, 20)
assert.equal(whitespaceComputer.getCount(), 3);
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(0), 0);
assert.equal(whitespaceComputer.getHeightForWhitespaceIndex(0), 50);
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(1), 2);
assert.equal(whitespaceComputer.getHeightForWhitespaceIndex(1), 10);
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(2), 4);
assert.equal(whitespaceComputer.getHeightForWhitespaceIndex(2), 20);
assert.equal(whitespaceComputer.getAccumulatedHeight(0), 50);
assert.equal(whitespaceComputer.getAccumulatedHeight(1), 60);
assert.equal(whitespaceComputer.getAccumulatedHeight(2), 80);
assert.equal(whitespaceComputer.getTotalHeight(), 80);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(1), 50);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(2), 50);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(3), 60);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(4), 60);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(5), 80);
// Add a whitespace after line 3 of height 30
whitespaceComputer.insertWhitespace(3, 0, 30, 0);
// whitespaces: b(0, 50), a(2, 10), d(3, 30), c(4, 20)
assert.equal(whitespaceComputer.getCount(), 4);
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(0), 0);
assert.equal(whitespaceComputer.getHeightForWhitespaceIndex(0), 50);
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(1), 2);
assert.equal(whitespaceComputer.getHeightForWhitespaceIndex(1), 10);
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(2), 3);
assert.equal(whitespaceComputer.getHeightForWhitespaceIndex(2), 30);
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(3), 4);
assert.equal(whitespaceComputer.getHeightForWhitespaceIndex(3), 20);
assert.equal(whitespaceComputer.getAccumulatedHeight(0), 50);
assert.equal(whitespaceComputer.getAccumulatedHeight(1), 60);
assert.equal(whitespaceComputer.getAccumulatedHeight(2), 90);
assert.equal(whitespaceComputer.getAccumulatedHeight(3), 110);
assert.equal(whitespaceComputer.getTotalHeight(), 110);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(1), 50);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(2), 50);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(3), 60);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(4), 90);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(5), 110);
// Change whitespace after line 2 to height of 100
whitespaceComputer.changeWhitespaceHeight(a, 100);
// whitespaces: b(0, 50), a(2, 100), d(3, 30), c(4, 20)
assert.equal(whitespaceComputer.getCount(), 4);
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(0), 0);
assert.equal(whitespaceComputer.getHeightForWhitespaceIndex(0), 50);
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(1), 2);
assert.equal(whitespaceComputer.getHeightForWhitespaceIndex(1), 100);
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(2), 3);
assert.equal(whitespaceComputer.getHeightForWhitespaceIndex(2), 30);
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(3), 4);
assert.equal(whitespaceComputer.getHeightForWhitespaceIndex(3), 20);
assert.equal(whitespaceComputer.getAccumulatedHeight(0), 50);
assert.equal(whitespaceComputer.getAccumulatedHeight(1), 150);
assert.equal(whitespaceComputer.getAccumulatedHeight(2), 180);
assert.equal(whitespaceComputer.getAccumulatedHeight(3), 200);
assert.equal(whitespaceComputer.getTotalHeight(), 200);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(1), 50);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(2), 50);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(3), 150);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(4), 180);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(5), 200);
// Remove whitespace after line 2
whitespaceComputer.removeWhitespace(a);
// whitespaces: b(0, 50), d(3, 30), c(4, 20)
assert.equal(whitespaceComputer.getCount(), 3);
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(0), 0);
assert.equal(whitespaceComputer.getHeightForWhitespaceIndex(0), 50);
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(1), 3);
assert.equal(whitespaceComputer.getHeightForWhitespaceIndex(1), 30);
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(2), 4);
assert.equal(whitespaceComputer.getHeightForWhitespaceIndex(2), 20);
assert.equal(whitespaceComputer.getAccumulatedHeight(0), 50);
assert.equal(whitespaceComputer.getAccumulatedHeight(1), 80);
assert.equal(whitespaceComputer.getAccumulatedHeight(2), 100);
assert.equal(whitespaceComputer.getTotalHeight(), 100);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(1), 50);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(2), 50);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(3), 50);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(4), 80);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(5), 100);
// Remove whitespace before line 1
whitespaceComputer.removeWhitespace(b);
// whitespaces: d(3, 30), c(4, 20)
assert.equal(whitespaceComputer.getCount(), 2);
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(0), 3);
assert.equal(whitespaceComputer.getHeightForWhitespaceIndex(0), 30);
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(1), 4);
assert.equal(whitespaceComputer.getHeightForWhitespaceIndex(1), 20);
assert.equal(whitespaceComputer.getAccumulatedHeight(0), 30);
assert.equal(whitespaceComputer.getAccumulatedHeight(1), 50);
assert.equal(whitespaceComputer.getTotalHeight(), 50);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(1), 0);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(2), 0);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(3), 0);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(4), 30);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(5), 50);
// Delete line 1
whitespaceComputer.onLinesDeleted(1, 1);
// whitespaces: d(2, 30), c(3, 20)
assert.equal(whitespaceComputer.getCount(), 2);
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(0), 2);
assert.equal(whitespaceComputer.getHeightForWhitespaceIndex(0), 30);
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(1), 3);
assert.equal(whitespaceComputer.getHeightForWhitespaceIndex(1), 20);
assert.equal(whitespaceComputer.getAccumulatedHeight(0), 30);
assert.equal(whitespaceComputer.getAccumulatedHeight(1), 50);
assert.equal(whitespaceComputer.getTotalHeight(), 50);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(1), 0);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(2), 0);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(3), 30);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(4), 50);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(5), 50);
// Insert a line before line 1
whitespaceComputer.onLinesInserted(1, 1);
// whitespaces: d(3, 30), c(4, 20)
assert.equal(whitespaceComputer.getCount(), 2);
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(0), 3);
assert.equal(whitespaceComputer.getHeightForWhitespaceIndex(0), 30);
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(1), 4);
assert.equal(whitespaceComputer.getHeightForWhitespaceIndex(1), 20);
assert.equal(whitespaceComputer.getAccumulatedHeight(0), 30);
assert.equal(whitespaceComputer.getAccumulatedHeight(1), 50);
assert.equal(whitespaceComputer.getTotalHeight(), 50);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(1), 0);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(2), 0);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(3), 0);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(4), 30);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(5), 50);
// Delete line 4
whitespaceComputer.onLinesDeleted(4, 4);
// whitespaces: d(3, 30), c(3, 20)
assert.equal(whitespaceComputer.getCount(), 2);
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(0), 3);
assert.equal(whitespaceComputer.getHeightForWhitespaceIndex(0), 30);
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(1), 3);
assert.equal(whitespaceComputer.getHeightForWhitespaceIndex(1), 20);
assert.equal(whitespaceComputer.getAccumulatedHeight(0), 30);
assert.equal(whitespaceComputer.getAccumulatedHeight(1), 50);
assert.equal(whitespaceComputer.getTotalHeight(), 50);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(1), 0);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(2), 0);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(3), 0);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(4), 50);
assert.equal(whitespaceComputer.getAccumulatedHeightBeforeLineNumber(5), 50);
});
test('WhitespaceComputer findInsertionIndex', () => {
let makeArray = (size: number, fillValue: number) => {
let r: number[] = [];
for (let i = 0; i < size; i++) {
r[i] = fillValue;
}
return r;
};
let arr: number[];
let ordinals: number[];
arr = [];
ordinals = makeArray(arr.length, 0);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 0, ordinals, 0), 0);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 1, ordinals, 0), 0);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 2, ordinals, 0), 0);
arr = [1];
ordinals = makeArray(arr.length, 0);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 0, ordinals, 0), 0);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 1, ordinals, 0), 1);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 2, ordinals, 0), 1);
arr = [1, 3];
ordinals = makeArray(arr.length, 0);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 0, ordinals, 0), 0);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 1, ordinals, 0), 1);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 2, ordinals, 0), 1);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 3, ordinals, 0), 2);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 4, ordinals, 0), 2);
arr = [1, 3, 5];
ordinals = makeArray(arr.length, 0);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 0, ordinals, 0), 0);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 1, ordinals, 0), 1);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 2, ordinals, 0), 1);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 3, ordinals, 0), 2);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 4, ordinals, 0), 2);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 5, ordinals, 0), 3);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 6, ordinals, 0), 3);
arr = [1, 3, 5];
ordinals = makeArray(arr.length, 3);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 0, ordinals, 0), 0);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 1, ordinals, 0), 0);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 2, ordinals, 0), 1);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 3, ordinals, 0), 1);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 4, ordinals, 0), 2);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 5, ordinals, 0), 2);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 6, ordinals, 0), 3);
arr = [1, 3, 5, 7];
ordinals = makeArray(arr.length, 0);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 0, ordinals, 0), 0);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 1, ordinals, 0), 1);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 2, ordinals, 0), 1);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 3, ordinals, 0), 2);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 4, ordinals, 0), 2);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 5, ordinals, 0), 3);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 6, ordinals, 0), 3);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 7, ordinals, 0), 4);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 8, ordinals, 0), 4);
arr = [1, 3, 5, 7, 9];
ordinals = makeArray(arr.length, 0);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 0, ordinals, 0), 0);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 1, ordinals, 0), 1);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 2, ordinals, 0), 1);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 3, ordinals, 0), 2);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 4, ordinals, 0), 2);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 5, ordinals, 0), 3);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 6, ordinals, 0), 3);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 7, ordinals, 0), 4);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 8, ordinals, 0), 4);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 9, ordinals, 0), 5);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 10, ordinals, 0), 5);
arr = [1, 3, 5, 7, 9, 11];
ordinals = makeArray(arr.length, 0);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 0, ordinals, 0), 0);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 1, ordinals, 0), 1);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 2, ordinals, 0), 1);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 3, ordinals, 0), 2);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 4, ordinals, 0), 2);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 5, ordinals, 0), 3);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 6, ordinals, 0), 3);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 7, ordinals, 0), 4);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 8, ordinals, 0), 4);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 9, ordinals, 0), 5);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 10, ordinals, 0), 5);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 11, ordinals, 0), 6);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 12, ordinals, 0), 6);
arr = [1, 3, 5, 7, 9, 11, 13];
ordinals = makeArray(arr.length, 0);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 0, ordinals, 0), 0);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 1, ordinals, 0), 1);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 2, ordinals, 0), 1);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 3, ordinals, 0), 2);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 4, ordinals, 0), 2);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 5, ordinals, 0), 3);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 6, ordinals, 0), 3);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 7, ordinals, 0), 4);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 8, ordinals, 0), 4);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 9, ordinals, 0), 5);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 10, ordinals, 0), 5);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 11, ordinals, 0), 6);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 12, ordinals, 0), 6);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 13, ordinals, 0), 7);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 14, ordinals, 0), 7);
arr = [1, 3, 5, 7, 9, 11, 13, 15];
ordinals = makeArray(arr.length, 0);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 0, ordinals, 0), 0);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 1, ordinals, 0), 1);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 2, ordinals, 0), 1);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 3, ordinals, 0), 2);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 4, ordinals, 0), 2);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 5, ordinals, 0), 3);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 6, ordinals, 0), 3);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 7, ordinals, 0), 4);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 8, ordinals, 0), 4);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 9, ordinals, 0), 5);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 10, ordinals, 0), 5);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 11, ordinals, 0), 6);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 12, ordinals, 0), 6);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 13, ordinals, 0), 7);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 14, ordinals, 0), 7);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 15, ordinals, 0), 8);
assert.equal(WhitespaceComputer.findInsertionIndex(arr, 16, ordinals, 0), 8);
});
test('WhitespaceComputer changeWhitespaceAfterLineNumber & getFirstWhitespaceIndexAfterLineNumber', () => {
let whitespaceComputer = new WhitespaceComputer();
let a = whitespaceComputer.insertWhitespace(0, 0, 1, 0);
let b = whitespaceComputer.insertWhitespace(7, 0, 1, 0);
let c = whitespaceComputer.insertWhitespace(3, 0, 1, 0);
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(0), a); // 0
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(0), 0);
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(1), c); // 3
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(1), 3);
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(2), b); // 7
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(2), 7);
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(1), 1); // c
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(2), 1); // c
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(3), 1); // c
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(4), 2); // b
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(5), 2); // b
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(6), 2); // b
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(7), 2); // b
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(8), -1); // --
// Do not really move a
whitespaceComputer.changeWhitespaceAfterLineNumber(a, 1);
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(0), a); // 1
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(0), 1);
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(1), c); // 3
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(1), 3);
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(2), b); // 7
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(2), 7);
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(1), 0); // a
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(2), 1); // c
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(3), 1); // c
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(4), 2); // b
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(5), 2); // b
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(6), 2); // b
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(7), 2); // b
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(8), -1); // --
// Do not really move a
whitespaceComputer.changeWhitespaceAfterLineNumber(a, 2);
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(0), a); // 2
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(0), 2);
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(1), c); // 3
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(1), 3);
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(2), b); // 7
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(2), 7);
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(1), 0); // a
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(2), 0); // a
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(3), 1); // c
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(4), 2); // b
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(5), 2); // b
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(6), 2); // b
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(7), 2); // b
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(8), -1); // --
// Change a to conflict with c => a gets placed after c
whitespaceComputer.changeWhitespaceAfterLineNumber(a, 3);
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(0), c); // 3
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(0), 3);
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(1), a); // 3
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(1), 3);
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(2), b); // 7
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(2), 7);
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(1), 0); // c
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(2), 0); // c
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(3), 0); // c
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(4), 2); // b
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(5), 2); // b
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(6), 2); // b
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(7), 2); // b
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(8), -1); // --
// Make a no-op
whitespaceComputer.changeWhitespaceAfterLineNumber(c, 3);
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(0), c); // 3
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(0), 3);
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(1), a); // 3
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(1), 3);
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(2), b); // 7
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(2), 7);
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(1), 0); // c
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(2), 0); // c
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(3), 0); // c
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(4), 2); // b
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(5), 2); // b
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(6), 2); // b
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(7), 2); // b
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(8), -1); // --
// Conflict c with b => c gets placed after b
whitespaceComputer.changeWhitespaceAfterLineNumber(c, 7);
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(0), a); // 3
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(0), 3);
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(1), b); // 7
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(1), 7);
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(2), c); // 7
assert.equal(whitespaceComputer.getAfterLineNumberForWhitespaceIndex(2), 7);
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(1), 0); // a
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(2), 0); // a
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(3), 0); // a
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(4), 1); // b
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(5), 1); // b
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(6), 1); // b
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(7), 1); // b
assert.equal(whitespaceComputer.getFirstWhitespaceIndexAfterLineNumber(8), -1); // --
});
test('WhitespaceComputer Bug', () => {
let whitespaceComputer = new WhitespaceComputer();
let a = whitespaceComputer.insertWhitespace(0, 0, 1, 0);
let b = whitespaceComputer.insertWhitespace(7, 0, 1, 0);
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(0), a); // 0
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(1), b); // 7
let c = whitespaceComputer.insertWhitespace(3, 0, 1, 0);
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(0), a); // 0
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(1), c); // 3
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(2), b); // 7
let d = whitespaceComputer.insertWhitespace(2, 0, 1, 0);
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(0), a); // 0
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(1), d); // 2
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(2), c); // 3
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(3), b); // 7
let e = whitespaceComputer.insertWhitespace(8, 0, 1, 0);
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(0), a); // 0
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(1), d); // 2
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(2), c); // 3
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(3), b); // 7
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(4), e); // 8
let f = whitespaceComputer.insertWhitespace(11, 0, 1, 0);
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(0), a); // 0
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(1), d); // 2
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(2), c); // 3
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(3), b); // 7
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(4), e); // 8
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(5), f); // 11
let g = whitespaceComputer.insertWhitespace(10, 0, 1, 0);
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(0), a); // 0
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(1), d); // 2
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(2), c); // 3
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(3), b); // 7
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(4), e); // 8
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(5), g); // 10
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(6), f); // 11
let h = whitespaceComputer.insertWhitespace(0, 0, 1, 0);
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(0), a); // 0
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(1), h); // 0
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(2), d); // 2
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(3), c); // 3
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(4), b); // 7
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(5), e); // 8
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(6), g); // 10
assert.equal(whitespaceComputer.getIdForWhitespaceIndex(7), f); // 11
});
});

View File

@@ -103,16 +103,6 @@ suite('ViewModelDecorations', () => {
// view line 2: (1,14 -> 1,24)
assert.deepEqual(inlineDecorations1, [
{
range: new Range(1, 2, 2, 1),
inlineClassName: 'i-dec2',
type: InlineDecorationType.Regular
},
{
range: new Range(2, 1, 2, 1),
inlineClassName: 'a-dec2',
type: InlineDecorationType.After
},
{
range: new Range(1, 2, 2, 2),
inlineClassName: 'i-dec3',
@@ -124,7 +114,7 @@ suite('ViewModelDecorations', () => {
type: InlineDecorationType.After
},
{
range: new Range(1, 2, 4, 1),
range: new Range(1, 2, 3, 13),
inlineClassName: 'i-dec4',
type: InlineDecorationType.Regular
},
@@ -164,7 +154,7 @@ suite('ViewModelDecorations', () => {
type: InlineDecorationType.After
},
{
range: new Range(2, 1, 4, 1),
range: new Range(2, 1, 3, 13),
inlineClassName: 'i-dec8',
type: InlineDecorationType.Regular
},
@@ -199,7 +189,7 @@ suite('ViewModelDecorations', () => {
type: InlineDecorationType.After
},
{
range: new Range(2, 3, 4, 1),
range: new Range(2, 3, 3, 13),
inlineClassName: 'i-dec11',
type: InlineDecorationType.Regular
},
@@ -228,30 +218,45 @@ suite('ViewModelDecorations', () => {
// view line 3 (24 -> 36)
assert.deepEqual(inlineDecorations2, [
{
range: new Range(1, 2, 4, 1),
range: new Range(1, 2, 3, 13),
inlineClassName: 'i-dec4',
type: InlineDecorationType.Regular
},
{
range: new Range(3, 13, 3, 13),
inlineClassName: 'a-dec4',
type: InlineDecorationType.After
},
{
range: new Range(1, 2, 5, 8),
inlineClassName: 'i-dec5',
type: InlineDecorationType.Regular
},
{
range: new Range(2, 1, 4, 1),
range: new Range(2, 1, 3, 13),
inlineClassName: 'i-dec8',
type: InlineDecorationType.Regular
},
{
range: new Range(3, 13, 3, 13),
inlineClassName: 'a-dec8',
type: InlineDecorationType.After
},
{
range: new Range(2, 1, 5, 8),
inlineClassName: 'i-dec9',
type: InlineDecorationType.Regular
},
{
range: new Range(2, 3, 4, 1),
range: new Range(2, 3, 3, 13),
inlineClassName: 'i-dec11',
type: InlineDecorationType.Regular
},
{
range: new Range(3, 13, 3, 13),
inlineClassName: 'a-dec11',
type: InlineDecorationType.After
},
{
range: new Range(2, 3, 5, 8),
inlineClassName: 'i-dec12',