Add unit test for inserting one-line text on folded lines
This commit is contained in:
parent
56f74f1368
commit
0e0f3a1db3
2 changed files with 104 additions and 25 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue