some more anchor tests and fixes

This commit is contained in:
Fabian Jakobs 2011-02-10 17:21:05 +01:00
commit 7dfa56c6b8
2 changed files with 42 additions and 4 deletions

View file

@ -71,8 +71,17 @@ var Anchor = exports.Anchor = function(doc, row, column) {
this.onChange = function(e) {
var delta = e.data;
var range = delta.range;
var pos = this.getPosition();
if (range.start.row == range.end.row && range.start.row != this.pos.row)
return;
if (range.start.row > this.pos.row)
return;
if (range.start.row == this.pos.row && range.start.column > this.pos.column)
return;
var pos = this.getPosition();
if (delta.action === "insertText") {
if (range.start.row === pos.row && range.start.column <= pos.column) {
if (range.start.row === range.end.row) {
@ -92,8 +101,12 @@ var Anchor = exports.Anchor = function(doc, row, column) {
}
}
else if (delta.action == "removeText") {
if (range.start.row == pos.row && range.start.column <= pos.column) {
pos.column -= Math.max(0, range.end.column - range.start.column);
if (range.start.row == pos.row && range.start.column < pos.column) {
if (range.end.column >= pos.column)
pos.column = range.start.column;
else
pos.column = Math.max(0, pos.column - (range.end.column - range.start.column));
} else if (range.start.row !== range.end.row && range.start.row < pos.row) {
if (range.end.row == pos.row) {
pos.column = Math.max(0, pos.column - range.end.column) + range.start.column;
@ -102,7 +115,7 @@ var Anchor = exports.Anchor = function(doc, row, column) {
}
else if (range.end.row == pos.row) {
pos.row -= range.end.row - range.start.row;
pos.column = pos.column - range.end.column + range.start.column;
pos.column = Math.max(0, pos.column - range.end.column) + range.start.column;
}
} else if (delta.action == "removeLines") {
if (range.start.row <= pos.row) {

View file

@ -91,6 +91,23 @@ var Test = {
assert.position(anchor.getPosition(), 1, 2);
},
"test remove range which contains the anchor should move the anchor to the start of the range": function() {
var doc = new Document("juhu\nkinners");
var anchor = new Anchor(doc, 0, 3);
doc.remove(new Range(0, 1, 1, 3));
assert.position(anchor.getPosition(), 0, 1);
},
"test delete character before the anchor should have no effect": function() {
var doc = new Document("juhu\nkinners");
var anchor = new Anchor(doc, 1, 4);
doc.remove(new Range(1, 4, 1, 5));
console.log(doc.$lines);
assert.position(anchor.getPosition(), 1, 4);
},
"test delete lines in anchor line before anchor should move anchor row": function() {
var doc = new Document("juhu\n1\n2\nkinners");
var anchor = new Anchor(doc, 3, 4);
@ -123,6 +140,14 @@ var Test = {
assert.position(anchor.getPosition(), 1, 0);
},
"test remove after the anchor should have no effect": function() {
var doc = new Document("juhu\nkinners\n123");
var anchor = new Anchor(doc, 1, 2);
doc.remove(new Range(1, 4, 2, 2));
assert.position(anchor.getPosition(), 1, 2);
},
"test anchor changes triggered by document changes should emit change event": function(next) {
var doc = new Document("juhu\nkinners\n123");
var anchor = new Anchor(doc, 1, 5);