test('decorations change when inserting text after them', () => { addDecoration(thisModel, 1, 2, 3, 2, 'myType'); modelHasDecoration(thisModel, 1, 2, 3, 2, 'myType'); thisModel.applyEdits([EditOperation.insert(new Position(3, 2), 'Hallo')]); modelHasDecoration(thisModel, 1, 2, 3, 7, 'myType'); });
test('empty file', () => { let model = TextModel.createFromString(''); let snapshot = model.createSnapshot(); assert.equal(snapshot.read(), null); model.dispose(); });
function testBrackets(contents: string[], brackets: CharacterPair[]): void { function toRelaxedFoundBracket(a: IFoundBracket) { if (!a) { return null; } return { range: a.range.toString(), open: a.open, close: a.close, isOpen: a.isOpen }; } let charIsBracket: { [char: string]: boolean } = {}; let charIsOpenBracket: { [char: string]: boolean } = {}; let openForChar: { [char: string]: string } = {}; let closeForChar: { [char: string]: string } = {}; brackets.forEach((b) => { charIsBracket[b[0]] = true; charIsBracket[b[1]] = true; charIsOpenBracket[b[0]] = true; charIsOpenBracket[b[1]] = false; openForChar[b[0]] = b[0]; closeForChar[b[0]] = b[1]; openForChar[b[1]] = b[0]; closeForChar[b[1]] = b[1]; }); let expectedBrackets: IFoundBracket[] = []; for (let lineIndex = 0; lineIndex < contents.length; lineIndex++) { let lineText = contents[lineIndex]; for (let charIndex = 0; charIndex < lineText.length; charIndex++) { let ch = lineText.charAt(charIndex); if (charIsBracket[ch]) { expectedBrackets.push({ open: openForChar[ch], close: closeForChar[ch], isOpen: charIsOpenBracket[ch], range: new Range(lineIndex + 1, charIndex + 1, lineIndex + 1, charIndex + 2) }); } } } class Mode extends MockMode { constructor() { super(); LanguageConfigurationRegistry.register(this.getId(), { brackets: brackets }); } } let model = new TextModelWithTokens([], TextModel.toRawText(contents.join('\n'), TextModel.DEFAULT_CREATION_OPTIONS), new Mode().getId()); // findPrevBracket { let expectedBracketIndex = expectedBrackets.length - 1; let currentExpectedBracket = expectedBracketIndex >= 0 ? expectedBrackets[expectedBracketIndex] : null; for (let lineNumber = contents.length; lineNumber >= 1; lineNumber--) { let lineText = contents[lineNumber - 1]; for (let column = lineText.length + 1; column >= 1; column--) { if (currentExpectedBracket) { if (lineNumber === currentExpectedBracket.range.startLineNumber && column < currentExpectedBracket.range.endColumn) { expectedBracketIndex--; currentExpectedBracket = expectedBracketIndex >= 0 ? expectedBrackets[expectedBracketIndex] : null; } } let actual = model.findPrevBracket({ lineNumber: lineNumber, column: column }); assert.deepEqual(toRelaxedFoundBracket(actual), toRelaxedFoundBracket(currentExpectedBracket), 'findPrevBracket of ' + lineNumber + ', ' + column); } } } // findNextBracket { let expectedBracketIndex = 0; let currentExpectedBracket = expectedBracketIndex < expectedBrackets.length ? expectedBrackets[expectedBracketIndex] : null; for (let lineNumber = 1; lineNumber <= contents.length; lineNumber++) { let lineText = contents[lineNumber - 1]; for (let column = 1; column <= lineText.length + 1; column++) { if (currentExpectedBracket) { if (lineNumber === currentExpectedBracket.range.startLineNumber && column > currentExpectedBracket.range.startColumn) { expectedBracketIndex++; currentExpectedBracket = expectedBracketIndex < expectedBrackets.length ? expectedBrackets[expectedBracketIndex] : null; } } let actual = model.findNextBracket({ lineNumber: lineNumber, column: column }); assert.deepEqual(toRelaxedFoundBracket(actual), toRelaxedFoundBracket(currentExpectedBracket), 'findNextBracket of ' + lineNumber + ', ' + column); } } } model.dispose(); }
test('nope', () => { let model = TextModel.createFromString('hello world!'); assert.equal(model.mightContainRTL(), false); });
test('setValue resets 1', () => { let model = TextModel.createFromString('hello world!'); assert.equal(model.mightContainRTL(), false); model.setValue('Hello,\nזוהי עובדה מבוססת שדעתו'); assert.equal(model.mightContainRTL(), true); });
teardown(function () { model.dispose(); });
test('issue #71480: validateRange handle floats', () => { let m = TextModel.createFromString('line one\nline two'); assert.deepEqual(m.validateRange(new Range(0.2, 1.5, 0.8, 2.5)), new Range(1, 1, 1, 1)); assert.deepEqual(m.validateRange(new Range(1.2, 1.7, 1.8, 2.2)), new Range(1, 1, 1, 2)); });
function modelHasNoDecorations(model: TextModel) { assert.equal(model.getAllDecorations().length, 0, 'Model has no decoration'); }
test('removeAllDecorationsWithOwnerId can be called after model dispose', () => { let model = TextModel.createFromString('asd'); model.dispose(); model.removeAllDecorationsWithOwnerId(1); });
test('decorations are updated when deleting one line text before it', () => { addDecoration(thisModel, 1, 2, 3, 2, 'myType'); modelHasDecoration(thisModel, 1, 2, 3, 2, 'myType'); thisModel.applyEdits([EditOperation.delete(new Range(1, 1, 1, 2))]); modelHasDecoration(thisModel, 1, 1, 3, 2, 'myType'); });