Add unit test for inserting one-line text on folded lines

This commit is contained in:
Julian Viereck 2011-04-25 12:24:27 +02:00
commit 0e0f3a1db3
2 changed files with 104 additions and 25 deletions

View file

@ -861,7 +861,9 @@ var EditSession = function(text, mode) {
var len;
var action = e.data.action;
var firstRow = e.data.range.start.row,
lastRow = e.data.range.end.row;
lastRow = e.data.range.end.row,
start = e.data.range.start,
end = e.data.range.end;
if (action.indexOf("Lines") != -1) {
if (action == "insertLines") {
@ -900,6 +902,15 @@ var EditSession = function(text, mode) {
// TODO: Expand folds here if needed.
// TODO: Split foldLine in case there are new lines added in
// between of a foldLine.
// If some new line is added inside of a foldLine, then split
// the fold line up.
var foldLine = this.getFoldLine(firstRow);
if (foldLine && foldLine.range.inside(start.row, start.column)) {
var foldLine = foldLine.split(start.row, start.column);
}
var foldLines = this.$foldData;
for (var i = 0; i < foldLines.length; i++) {
var foldLine = foldLines[i];
@ -909,8 +920,8 @@ var EditSession = function(text, mode) {
}
}
} else {
len = Math.abs(e.data.range.start.column - e.data.range.end.column);
var column;
len = Math.abs(e.data.range.start.column - e.data.range.end.column);
if (action.indexOf("insert") != -1) {
column = e.data.range.start.column;
} else {
@ -919,29 +930,7 @@ var EditSession = function(text, mode) {
}
var foldLine = this.getFoldLine(firstRow);
if (foldLine) {
// TODO: Adding new characters into a fold range should
// expand/remove the fold.
// for (var i = 0; i <= )
var ret = foldLine.getNextFoldTo(firstRow, column);
if (ret) {
var fold = ret.fold;
if (ret.kind == "inside"
&& fold.start.column != column
&& fold.start.row != firstRow)
{
// TODO: Implement adding new characters inside of an
// fold. This should extend/remove the fold etc.
} else if (ret.fold.start.row == firstRow){
var folds = foldLine.folds;
for (var i = folds.indexOf(ret.fold); i < folds.length; i++) {
folds[i].start.column += len;
if (!folds[i].sameRow) {
break;
}
folds[i].end.column += len;
}
}
}
foldLine.addRemoveChars(firstRow, column, len);
}
}
@ -1455,6 +1444,13 @@ var EditSession = function(text, mode) {
this.folds.sort(function(a, b) {
return -a.range.compareEnd(b.start.row, b.start.column);
});
if (this.range.compareEnd(fold.start.row, fold.start.column) > 0) {
this.end.row = fold.end.row;
this.end.column = fold.end.column;
} else if (this.range.compareStart(fold.end.row, fold.end.column) < 0) {
this.start.row = fold.start.row;
this.start.column = fold.start.column;
}
} else if (fold.start.row == this.end.row) {
this.folds.push(fold);
this.end.row = fold.end.row;
@ -1573,6 +1569,36 @@ var EditSession = function(text, mode) {
return str;
}
}
this.addRemoveChars = function(row, column, len) {
var ret = this.getNextFoldTo(row, column),
fold, folds;
if (ret) {
fold = ret.fold;
if (ret.kind == "inside"
&& fold.start.column != column
&& fold.start.row != row)
{
// TODO: Implement adding new characters inside of an
// fold. This should extend/remove the fold etc.
} else if (fold.start.row == row) {
folds = this.folds;
var i = folds.indexOf(fold);
if (i == 0) {
this.start.column += len;
}
for (i; i < folds.length; i++) {
fold = folds[i];
fold.start.column += len;
if (!fold.sameRow) {
return;
}
fold.end.column += len;
}
this.end.column += len;
}
}
}
}).call(FoldLine.prototype);
this.getFoldAt = function(row, column, side) {

View file

@ -449,6 +449,59 @@ module.exports = {
// Test one position after the folds. Should be all like normal.
assertScreen2Doc(3, 0, 2, 0);
},
"test fold one-line text insert": function() {
// These are mostly test for the FoldLine.addRemoveChars function.
var session = createFoldTestSession(),
foldLines = session.$foldData;
function insert(row, column, text) {
session.insert({row: row, column: column}, text);
}
var foldLine, fold, folds;
// First line.
foldLine = session.$foldData[0];
fold = foldLine.folds[0];
insert(0, 0, "F");
assert.range(foldLine.range, 0, 14, 0, 19);
assert.range(fold.range, 0, 14, 0, 19);
insert(0, 14, "F");
assert.range(foldLine.range, 0, 15, 0, 20);
assert.range(fold.range, 0, 15, 0, 20);
insert(0, 20, "F");
assert.range(foldLine.range, 0, 15, 0, 20);
assert.range(fold.range, 0, 15, 0, 20);
// Second line.
foldLine = session.$foldData[1];
folds = foldLine.folds;
insert(1, 0, "F");
assert.range(foldLine.range, 1, 11, 2, 25);
assert.range(folds[0].range, 1, 11, 2, 10);
assert.range(folds[1].range, 2, 20, 2, 25);
insert(1, 11, "F");
assert.range(foldLine.range, 1, 12, 2, 25);
assert.range(folds[0].range, 1, 12, 2, 10);
assert.range(folds[1].range, 2, 20, 2, 25);
insert(2, 10, "F");
assert.range(foldLine.range, 1, 12, 2, 26);
assert.range(folds[0].range, 1, 12, 2, 10);
assert.range(folds[1].range, 2, 21, 2, 26);
insert(2, 21, "F");
assert.range(foldLine.range, 1, 12, 2, 27);
assert.range(folds[0].range, 1, 12, 2, 10);
assert.range(folds[1].range, 2, 22, 2, 27);
insert(2, 27, "F");
assert.range(foldLine.range, 1, 12, 2, 27);
assert.range(folds[0].range, 1, 12, 2, 10);
assert.range(folds[1].range, 2, 22, 2, 27);
}
};