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 len;
|
||||||
var action = e.data.action;
|
var action = e.data.action;
|
||||||
var firstRow = e.data.range.start.row,
|
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.indexOf("Lines") != -1) {
|
||||||
if (action == "insertLines") {
|
if (action == "insertLines") {
|
||||||
|
|
@ -900,6 +902,15 @@ var EditSession = function(text, mode) {
|
||||||
// TODO: Expand folds here if needed.
|
// TODO: Expand folds here if needed.
|
||||||
// TODO: Split foldLine in case there are new lines added in
|
// TODO: Split foldLine in case there are new lines added in
|
||||||
// between of a foldLine.
|
// 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;
|
var foldLines = this.$foldData;
|
||||||
for (var i = 0; i < foldLines.length; i++) {
|
for (var i = 0; i < foldLines.length; i++) {
|
||||||
var foldLine = foldLines[i];
|
var foldLine = foldLines[i];
|
||||||
|
|
@ -909,8 +920,8 @@ var EditSession = function(text, mode) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
len = Math.abs(e.data.range.start.column - e.data.range.end.column);
|
|
||||||
var column;
|
var column;
|
||||||
|
len = Math.abs(e.data.range.start.column - e.data.range.end.column);
|
||||||
if (action.indexOf("insert") != -1) {
|
if (action.indexOf("insert") != -1) {
|
||||||
column = e.data.range.start.column;
|
column = e.data.range.start.column;
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -919,29 +930,7 @@ var EditSession = function(text, mode) {
|
||||||
}
|
}
|
||||||
var foldLine = this.getFoldLine(firstRow);
|
var foldLine = this.getFoldLine(firstRow);
|
||||||
if (foldLine) {
|
if (foldLine) {
|
||||||
// TODO: Adding new characters into a fold range should
|
foldLine.addRemoveChars(firstRow, column, len);
|
||||||
// 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1455,6 +1444,13 @@ var EditSession = function(text, mode) {
|
||||||
this.folds.sort(function(a, b) {
|
this.folds.sort(function(a, b) {
|
||||||
return -a.range.compareEnd(b.start.row, b.start.column);
|
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) {
|
} else if (fold.start.row == this.end.row) {
|
||||||
this.folds.push(fold);
|
this.folds.push(fold);
|
||||||
this.end.row = fold.end.row;
|
this.end.row = fold.end.row;
|
||||||
|
|
@ -1573,6 +1569,36 @@ var EditSession = function(text, mode) {
|
||||||
return str;
|
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);
|
}).call(FoldLine.prototype);
|
||||||
|
|
||||||
this.getFoldAt = function(row, column, side) {
|
this.getFoldAt = function(row, column, side) {
|
||||||
|
|
|
||||||
|
|
@ -449,6 +449,59 @@ module.exports = {
|
||||||
|
|
||||||
// Test one position after the folds. Should be all like normal.
|
// Test one position after the folds. Should be all like normal.
|
||||||
assertScreen2Doc(3, 0, 2, 0);
|
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