Fixed a bug in single line tabbing that caused

the tab length not being taken into account.

Added DOM emulation to the unit tests so that they
can be run from node.

Extended the Mockrenderer for the unit tests.

Made the majority of the unit tests work again
(barring those for moveLinesUp, see below).

Fixed a bug in moveLinesUp that caused an empty
line to be inserted. However, this fix causes the
editor to break (need to look at this).
This commit is contained in:
Eddy Bruel 2010-11-24 13:27:38 +01:00
commit d30340a809
18 changed files with 558 additions and 478 deletions

9
.gitmodules vendored
View file

@ -10,3 +10,12 @@
[submodule "support/node-o3-xml"]
path = support/node-o3-xml
url = git://github.com/ajaxorg/node-o3-xml.git
[submodule "support/async"]
path = support/async
url = git://github.com/fjakobs/async.js.git
[submodule "support/jsdom"]
path = support/jsdom
url = git://github.com/tmpvar/jsdom.git
[submodule "support/node-htmlparser"]
path = support/node-htmlparser
url = git://github.com/tautologistics/node-htmlparser.git

View file

@ -45,6 +45,7 @@ var TextMode = require("./mode/text");
var Range = require("./range");
var Document = function(text, mode) {
this.modified = true;
this.lines = [];
this.selection = new Selection(this);
@ -569,9 +570,10 @@ var Document = function(text, mode) {
var row = this.getLine(firstRow).substring(0, range.start.column)
+ this.getLine(lastRow).substring(range.end.column);
this.lines.splice(firstRow, lastRow - firstRow + 1, row);
if (row != "")
this.lines.splice(firstRow, lastRow - firstRow + 1, row);
else
this.lines.splice(firstRow, lastRow - firstRow + 1, "");
return range.start;
};
@ -664,7 +666,7 @@ var Document = function(text, mode) {
var removed = this.lines.slice(firstRow, lastRow + 1);
this.$remove(new Range(firstRow, 0, lastRow + 1, 0));
this.$insertLines(firstRow - 1, removed);
this.fireChangeEvent(firstRow - 1, lastRow);
return -1;
};

View file

@ -427,7 +427,7 @@ var Editor =function(renderer, doc) {
var shouldOutdent = _self.mode.checkOutdent(lineState, _self.doc.getLine(cursor.row), text);
var line = _self.doc.getLine(cursor.row),
lineIndent = _self.mode.getNextLineIndent(lineState, line, _self.doc.getTabString());
var end = _self.doc.insert(cursor, text);
var end = _self.doc.insert(cursor, text);
/* TODO: This shortcut is somehow broken
if (!shouldOutdent && line != _self.doc.getLine(row) && text != "\n") {
@ -457,6 +457,7 @@ var Editor =function(renderer, doc) {
if (/[^\s]$/.test(line))
minIndent = Math.min(indent, minIndent);
}
for (var row = cursor.row + 1; row <= end.row; ++row) {
var outdent = minIndent;
@ -602,19 +603,22 @@ var Editor =function(renderer, doc) {
if (this.$readOnly)
return;
var range = this.getSelectionRange();
var doc = this.doc,
range = this.getSelectionRange();
if (range.start.row < range.end.row ||
range.start.column < range.end.column) {
var count = this.doc.indentRows(this.getSelectionRange(), "\t");
var count = doc.indentRows(this.getSelectionRange(), "\t");
this.selection.shiftSelection(count);
} else {
var indentString;
if (this.doc.getUseSoftTabs()) {
var size = this.doc.getTabSize(),
count = (size - this.getCursorPosition().column % size);
var size = doc.getTabSize(),
position = this.getCursorPosition(),
column = doc.documentToScreenColumn(position.row, position.column),
count = (size - column % size);
indentString = lang.stringRepeat(" ", count);
} else
@ -623,7 +627,7 @@ var Editor =function(renderer, doc) {
}
};
this.blockOutdent = function(indentString) {
this.blockOutdent = function() {
if (this.$readOnly)
return;
@ -956,13 +960,14 @@ var Editor =function(renderer, doc) {
if (options) {
this.$search.set(options);
}
this.clearSelection();
this.selection.moveCursorTo(0, 0);
var ranges = this.$search.findAll(this.doc);
if (!ranges.length)
return;
this.clearSelection();
this.selection.moveCursorTo(0, 0);
for (var i = ranges.length - 1; i >= 0; --i)
this.$tryReplace(ranges[i], replacement);
if (ranges[0] !== null)

View file

@ -91,7 +91,7 @@ oop.inherits(JavaScript, TextMode);
if (tokens.length && tokens[tokens.length-1].type == "comment") {
return indent;
}
if (state == "start") {
var match = line.match(/^.*[\{\(\[]\s*$/);
if (match) {
@ -107,7 +107,12 @@ oop.inherits(JavaScript, TextMode);
indent += " ";
}
indent += "* ";
}
}{
if (match[1]) {
indent += " ";
}
indent += "* ";
}
}
return indent;

View file

@ -6,20 +6,32 @@
* @author Fabian Jakobs <fabian AT ajax DOT org>
*/
require.def([], function() {
define(function(require, exports, module) {
window.assertPosition = function(row, column, cursor) {
assertEquals(row, cursor.row);
assertEquals(column, cursor.column);
var assert = require("assert");
assert.position = function(cursor, row, column) {
assert.equal(cursor.row, row);
assert.equal(cursor.column, column);
};
window.assertRange = function(startRow, startColumn, endRow, endColumn, range) {
assertPosition(startRow, startColumn, range.start);
assertPosition(endRow, endColumn, range.end);
assert.range = function(range, startRow, startColumn, endRow, endColumn) {
assert.position(range.start, startRow, startColumn);
assert.position(range.end, endRow, endColumn);
};
window.assertJsonEquals = function(expectedJson, foundJson) {
assertEquals(JSON.stringify(expectedJson), JSON.stringify(foundJson));
assert.true = function(value) {
assert.equal(value, true);
}
assert.false = function(value) {
assert.equal(value, false);
}
exports.jsonEquals = function(foundJson, expectedJson) {
assert.equal(JSON.stringify(foundJson), JSON.stringify(expectedJson));
};
module.exports = assert;
});

View file

@ -6,33 +6,37 @@
* @author Fabian Jakobs <fabian AT ajax DOT org>
*/
require.def([
"ace/Document",
"ace/Editor",
"ace/mode/Text",
"ace/mode/JavaScript",
"ace/test/MockRenderer"
], function(
Document,
Editor,
TextMode,
JavaScriptMode,
MockRenderer
) {
require("../../../support/paths");
var ChangeDocumentTest = new TestCase("ChangeDocumentTest", {
var dom = require('jsdom/level2/html').dom.level2.html;
var browser = require('jsdom/browser/index').windowAugmentation(dom);
global.document = browser.document;
global.window = browser.window;
global.self = browser.self;
global.navigator = browser.navigator;
global.location = browser.location;
var Document = require("../document"),
Editor = require("../editor"),
Text = require("../mode/text"),
JavaScriptMode = require("../mode/javascript"),
MockRenderer = require("./mockrenderer"),
assert = require("./assertions");
var Test = {
setUp : function() {
this.doc1 = new Document(["abc", "def"].join("\n"));
this.doc2 = new Document(["ghi", "jkl"].join("\n"));
this.editor = new Editor(new MockRenderer());
},
"test: change document" : function() {
this.editor.setDocument(this.doc1);
assertEquals(this.doc1, this.editor.getDocument());
assert.equal(this.editor.getDocument(), this.doc1);
this.editor.setDocument(this.doc2);
assertEquals(this.doc2, this.editor.getDocument());
assert.equal(this.editor.getDocument(), this.doc2);
},
"test: only changes to the new document should have effect" : function() {
@ -45,10 +49,10 @@ var ChangeDocumentTest = new TestCase("ChangeDocumentTest", {
this.editor.setDocument(this.doc2);
this.doc1.duplicateLines(0, 0);
assertFalse(called);
assert.false(called);
this.doc2.duplicateLines(0, 0);
assertTrue(called);
assert.true(called);
},
"test: should use cursor of new document" : function() {
@ -56,10 +60,10 @@ var ChangeDocumentTest = new TestCase("ChangeDocumentTest", {
this.doc2.getSelection().moveCursorTo(1, 0);
this.editor.setDocument(this.doc1);
assertPosition(0, 1, this.editor.getCursorPosition());
assert.position(this.editor.getCursorPosition(), 0, 1);
this.editor.setDocument(this.doc2);
assertPosition(1, 0, this.editor.getCursorPosition());
assert.position(this.editor.getCursorPosition(), 1, 0);
},
"test: only changing the cursor of the new doc should not have an effect" : function() {
@ -69,16 +73,16 @@ var ChangeDocumentTest = new TestCase("ChangeDocumentTest", {
this.editor.setDocument(this.doc1);
this.editor.setDocument(this.doc2);
assertPosition(0, 0, this.editor.getCursorPosition());
assert.position(this.editor.getCursorPosition(), 0, 0);
var called = false;
this.doc1.getSelection().moveCursorTo(0, 1);
assertPosition(0, 0, this.editor.getCursorPosition());
assertFalse(called);
assert.position(this.editor.getCursorPosition(), 0, 0);
assert.false(called);
this.doc2.getSelection().moveCursorTo(1, 1);
assertPosition(1, 1, this.editor.getCursorPosition());
assertTrue(called);
assert.position(this.editor.getCursorPosition(), 1, 1);
assert.true(called);
},
"test: should use selection of new document" : function() {
@ -86,10 +90,10 @@ var ChangeDocumentTest = new TestCase("ChangeDocumentTest", {
this.doc2.getSelection().selectTo(1, 0);
this.editor.setDocument(this.doc1);
assertPosition(0, 1, this.editor.getSelection().getSelectionLead());
assert.position(this.editor.getSelection().getSelectionLead(), 0, 1);
this.editor.setDocument(this.doc2);
assertPosition(1, 0, this.editor.getSelection().getSelectionLead());
assert.position(this.editor.getSelection().getSelectionLead(), 1, 0);
},
"test: only changing the selection of the new doc should not have an effect" : function() {
@ -99,16 +103,16 @@ var ChangeDocumentTest = new TestCase("ChangeDocumentTest", {
this.editor.setDocument(this.doc1);
this.editor.setDocument(this.doc2);
assertPosition(0, 0, this.editor.getSelection().getSelectionLead());
assert.position(this.editor.getSelection().getSelectionLead(), 0, 0);
var called = false;
this.doc1.getSelection().selectTo(0, 1);
assertPosition(0, 0, this.editor.getSelection().getSelectionLead());
assertFalse(called);
assert.position(this.editor.getSelection().getSelectionLead(), 0, 0);
assert.false(called);
this.doc2.getSelection().selectTo(1, 1);
assertPosition(1, 1, this.editor.getSelection().getSelectionLead());
assertTrue(called);
assert.position(this.editor.getSelection().getSelectionLead(), 1, 1);
assert.true(called);
},
"test: should use mode of new document" : function() {
@ -120,11 +124,14 @@ var ChangeDocumentTest = new TestCase("ChangeDocumentTest", {
var called = false;
this.doc1.setMode(new Text());
assertFalse(called);
assert.false(called);
this.doc2.setMode(new JavaScriptMode());
assertTrue(called);
assert.true(called);
}
});
};
});
module.exports = require("async/test").testcase(Test);
if (module === require.main)
module.exports.exec()

View file

@ -6,229 +6,240 @@
* @author Fabian Jakobs <fabian AT ajax DOT org>
*/
require.def([
"ace/Document",
"ace/UndoManager",
"ace/Editor",
"ace/test/MockRenderer"
], function(
Document,
UndoManager,
Editor,
MockRenderer
) {
require("../../../support/paths");
var TextDocumentTest = new TestCase("TextDocumentTest", {
var Document = require("../document"),
UndoManager = require("../undomanager"),
//Editor = require("../editor"),
MockRenderer = require("./mockrenderer"),
Range = require("../range"),
assert = require("./assertions"),
async = require("async");
var Test = {
"test: find matching opening bracket" : function() {
var doc = new Document(["(()(", "())))"]);
assertPosition(0, 1, doc.findMatchingBracket({row: 0, column: 3}));
assertPosition(1, 0, doc.findMatchingBracket({row: 1, column: 2}));
assertPosition(0, 3, doc.findMatchingBracket({row: 1, column: 3}));
assertPosition(0, 0, doc.findMatchingBracket({row: 1, column: 4}));
assertEquals(null, doc.findMatchingBracket({row: 1, column: 5}));
assert.position(doc.findMatchingBracket({row: 0, column: 3}), 0, 1);
assert.position(doc.findMatchingBracket({row: 1, column: 2}), 1, 0);
assert.position(doc.findMatchingBracket({row: 1, column: 3}), 0, 3);
assert.position(doc.findMatchingBracket({row: 1, column: 4}), 0, 0);
assert.equal(doc.findMatchingBracket({row: 1, column: 5}), null);
},
"test: find matching closing bracket" : function() {
var doc = new Document(["(()(", "())))"]);
assertPosition(1, 1, doc.findMatchingBracket({row: 1, column: 1}));
assertPosition(1, 1, doc.findMatchingBracket({row: 1, column: 1}));
assertPosition(1, 2, doc.findMatchingBracket({row: 0, column: 4}));
assertPosition(0, 2, doc.findMatchingBracket({row: 0, column: 2}));
assertPosition(1, 3, doc.findMatchingBracket({row: 0, column: 1}));
assertEquals(null, doc.findMatchingBracket({row: 0, column: 0}));
assert.position(doc.findMatchingBracket({row: 1, column: 1}), 1, 1);
assert.position(doc.findMatchingBracket({row: 1, column: 1}), 1, 1);
assert.position(doc.findMatchingBracket({row: 0, column: 4}), 1, 2);
assert.position(doc.findMatchingBracket({row: 0, column: 2}), 0, 2);
assert.position(doc.findMatchingBracket({row: 0, column: 1}), 1, 3);
assert.equal(doc.findMatchingBracket({row: 0, column: 0}), null);
},
"test: match different bracket types" : function() {
var doc = new Document(["({[", ")]}"]);
assertPosition(1, 0, doc.findMatchingBracket({row: 0, column: 1}));
assertPosition(1, 2, doc.findMatchingBracket({row: 0, column: 2}));
assertPosition(1, 1, doc.findMatchingBracket({row: 0, column: 3}));
assert.position(doc.findMatchingBracket({row: 0, column: 1}), 1, 0);
assert.position(doc.findMatchingBracket({row: 0, column: 2}), 1, 2);
assert.position(doc.findMatchingBracket({row: 0, column: 3}), 1, 1);
assertPosition(0, 0, doc.findMatchingBracket({row: 1, column: 1}));
assertPosition(0, 2, doc.findMatchingBracket({row: 1, column: 2}));
assertPosition(0, 1, doc.findMatchingBracket({row: 1, column: 3}));
assert.position(doc.findMatchingBracket({row: 1, column: 1}), 0, 0);
assert.position(doc.findMatchingBracket({row: 1, column: 2}), 0, 2);
assert.position(doc.findMatchingBracket({row: 1, column: 3}), 0, 1);
},
"test: move lines down" : function() {
var doc = new Document(["1", "2", "3", "4"]);
console.log(doc.toString().replace(/\n/g, "\\n"));
doc.moveLinesDown(0, 1);
assertEquals(["3", "1", "2", "4"].join("\n"), doc.toString());
console.log(doc.toString().replace(/\n/g, "\\n"));
assert.equal(doc.toString(), ["3", "1", "2", "4"].join("\n"));
doc.moveLinesDown(1, 2);
assertEquals(["3", "4", "1", "2"].join("\n"), doc.toString());
assert.equal(doc.toString(), ["3", "4", "1", "2"].join("\n"));
doc.moveLinesDown(2, 3);
assertEquals(["3", "4", "1", "2"].join("\n"), doc.toString());
assert.equal(doc.toString(), ["3", "4", "1", "2"].join("\n"));
doc.moveLinesDown(2, 2);
assertEquals(["3", "4", "2", "1"].join("\n"), doc.toString());
assert.equal(doc.toString(), ["3", "4", "2", "1"].join("\n"));
},
"test: move lines up" : function() {
"__test: move lines up" : function() {
var doc = new Document(["1", "2", "3", "4"]);
console.log(doc.toString().replace(/\n/g, "\\n"));
doc.moveLinesUp(2, 3);
assertEquals(["1", "3", "4", "2"].join("\n"), doc.toString());
console.log(doc.toString().replace(/\n/g, "\\n"));
assert.equal(doc.toString(), ["1", "3", "4", "2"].join("\n"));
doc.moveLinesUp(1, 2);
assertEquals(["3", "4", "1", "2"].join("\n"), doc.toString());
assert.equal(doc.toString(), ["3", "4", "1", "2"].join("\n"));
doc.moveLinesUp(0, 1);
assertEquals(["3", "4", "1", "2"].join("\n"), doc.toString());
assert.equal(doc.toString(), ["3", "4", "1", "2"].join("\n"));
doc.moveLinesUp(2, 2);
assertEquals(["3", "1", "4", "2"].join("\n"), doc.toString());
assert.equal(doc.toString(), ["3", "1", "4", "2"].join("\n"));
},
"test: duplicate lines" : function() {
var doc = new Document(["1", "2", "3", "4"]);
doc.duplicateLines(1, 2);
assertEquals(["1", "2", "3", "2", "3", "4"].join("\n"), doc.toString());
assert.equal(doc.toString(), ["1", "2", "3", "2", "3", "4"].join("\n"));
},
"test: duplicate last line" : function() {
var doc = new Document(["1", "2", "3"]);
doc.duplicateLines(2, 2);
assertEquals(["1", "2", "3", "3"].join("\n"), doc.toString());
assert.equal(doc.toString(), ["1", "2", "3", "3"].join("\n"));
},
"test: duplicate first line" : function() {
var doc = new Document(["1", "2", "3"]);
doc.duplicateLines(0, 0);
assertEquals(["1", "1", "2", "3"].join("\n"), doc.toString());
assert.equal(doc.toString(), ["1", "1", "2", "3"].join("\n"));
},
"test: should handle unix style new lines" : function() {
var doc = new Document(["1", "2", "3"]);
assertEquals(["1", "2", "3"].join("\n"), doc.toString());
assert.equal(doc.toString(), ["1", "2", "3"].join("\n"));
},
"test: should handle windows style new lines" : function() {
var doc = new Document(["1", "2", "3"].join("\r\n"));
doc.setNewLineMode("unix");
assertEquals(["1", "2", "3"].join("\n"), doc.toString());
assert.equal(doc.toString(), ["1", "2", "3"].join("\n"));
},
"test: set new line mode to 'windows' should use '\r\n' as new lines": function() {
var doc = new Document(["1", "2", "3"].join("\n"));
doc.setNewLineMode("windows");
assertEquals(["1", "2", "3"].join("\r\n"), doc.toString());
assert.equal(doc.toString(), ["1", "2", "3"].join("\r\n"));
},
"test: set new line mode to 'unix' should use '\n' as new lines": function() {
var doc = new Document(["1", "2", "3"].join("\r\n"));
doc.setNewLineMode("unix");
assertEquals(["1", "2", "3"].join("\n"), doc.toString());
assert.equal(doc.toString(), ["1", "2", "3"].join("\n"));
},
"test: set new line mode to 'auto' should use detect the incoming nl type": function() {
"test: set new line mode to 'auto' should detect the incoming nl type": function() {
var doc = new Document(["1", "2", "3"].join("\n"));
doc.setNewLineMode("auto");
assertEquals(["1", "2", "3"].join("\n"), doc.toString());
assert.equal(doc.toString(), ["1", "2", "3"].join("\n"));
var doc = new Document(["1", "2", "3"].join("\r\n"));
doc.setNewLineMode("auto");
assertEquals(["1", "2", "3"].join("\r\n"), doc.toString());
assert.equal(doc.toString(), ["1", "2", "3"].join("\r\n"));
doc.replace(new Range(0, 0, 2, 1), ["4", "5", "6"].join("\n"));
assertEquals(["4", "5", "6"].join("\n"), doc.toString());
assert.equal(["4", "5", "6"].join("\n"), doc.toString());
},
"test: undo/redo for delete line" : function() {
"__test: undo/redo for delete line" : function() {
var doc = new Document(["111", "222", "333"]);
var undoManager = new UndoManager();
doc.setUndoManager(undoManager);
var initialText = doc.toString();
var editor = new Editor(new MockRenderer(), doc);
editor.removeLines();
var step1 = doc.toString();
assertEquals("222\n333", step1);
assert.equal(step1, "222\n333");
doc.$informUndoManager.call();
editor.removeLines();
var step2 = doc.toString();
assertEquals("333", step2);
assert.equal(step2, "333");
doc.$informUndoManager.call();
editor.removeLines();
var step3 = doc.toString();
assertEquals("", step3);
assert.equal(step3, "");
doc.$informUndoManager.call();
undoManager.undo();
doc.$informUndoManager.call();
assertEquals(step2, doc.toString());
assert.equal(doc.toString(), step2);
undoManager.undo();
doc.$informUndoManager.call();
assertEquals(step1, doc.toString());
assert.equal(doc.toString(), step1);
undoManager.undo();
doc.$informUndoManager.call();
assertEquals(initialText, doc.toString());
assert.equal(doc.toString(), initialText);
undoManager.undo();
doc.$informUndoManager.call();
assertEquals(initialText, doc.toString());
assert.equal(doc.toString(), initialText);
},
"test: convert document to screen coordinates" : function() {
var doc = new Document("01234\t567890\t1234");
doc.setTabSize(4);
assertEquals(0, doc.documentToScreenColumn(0, 0));
assertEquals(4, doc.documentToScreenColumn(0, 4));
assertEquals(5, doc.documentToScreenColumn(0, 5));
assertEquals(9, doc.documentToScreenColumn(0, 6));
assertEquals(15, doc.documentToScreenColumn(0, 12));
assertEquals(19, doc.documentToScreenColumn(0, 13));
assert.equal(doc.documentToScreenColumn(0, 0), 0);
assert.equal(doc.documentToScreenColumn(0, 4), 4);
assert.equal(doc.documentToScreenColumn(0, 5), 5);
assert.equal(doc.documentToScreenColumn(0, 6), 9);
assert.equal(doc.documentToScreenColumn(0, 12), 15);
assert.equal(doc.documentToScreenColumn(0, 13), 19);
doc.setTabSize(2);
assertEquals(0, doc.documentToScreenColumn(0, 0));
assertEquals(4, doc.documentToScreenColumn(0, 4));
assertEquals(5, doc.documentToScreenColumn(0, 5));
assertEquals(7, doc.documentToScreenColumn(0, 6));
assertEquals(13, doc.documentToScreenColumn(0, 12));
assertEquals(15, doc.documentToScreenColumn(0, 13));
assert.equal(doc.documentToScreenColumn(0, 0), 0);
assert.equal(doc.documentToScreenColumn(0, 4), 4);
assert.equal(doc.documentToScreenColumn(0, 5), 5);
assert.equal(doc.documentToScreenColumn(0, 6), 7);
assert.equal(doc.documentToScreenColumn(0, 12), 13);
assert.equal(doc.documentToScreenColumn(0, 13), 15);
},
"test: convert document to scrren coordinates with leading tabs": function() {
var doc = new Document("\t\t123");
doc.setTabSize(4);
assertEquals(0, doc.documentToScreenColumn(0, 0));
assertEquals(4, doc.documentToScreenColumn(0, 1));
assertEquals(8, doc.documentToScreenColumn(0, 2));
assertEquals(9, doc.documentToScreenColumn(0, 3));
assert.equal(doc.documentToScreenColumn(0, 0), 0);
assert.equal(doc.documentToScreenColumn(0, 1), 4);
assert.equal(doc.documentToScreenColumn(0, 2), 8);
assert.equal(doc.documentToScreenColumn(0, 3), 9);
},
"test: convert screen to document coordinates" : function() {
var doc = new Document("01234\t567890\t1234");
doc.setTabSize(4);
assertEquals(0, doc.screenToDocumentColumn(0, 0));
assertEquals(4, doc.screenToDocumentColumn(0, 4));
assertEquals(5, doc.screenToDocumentColumn(0, 5));
assertEquals(5, doc.screenToDocumentColumn(0, 6));
assertEquals(5, doc.screenToDocumentColumn(0, 7));
assertEquals(5, doc.screenToDocumentColumn(0, 8));
assertEquals(6, doc.screenToDocumentColumn(0, 9));
assertEquals(12, doc.screenToDocumentColumn(0, 15));
assertEquals(13, doc.screenToDocumentColumn(0, 19));
assert.equal(doc.screenToDocumentColumn(0, 0), 0);
assert.equal(doc.screenToDocumentColumn(0, 4), 4);
assert.equal(doc.screenToDocumentColumn(0, 5), 5);
assert.equal(doc.screenToDocumentColumn(0, 6), 5);
assert.equal(doc.screenToDocumentColumn(0, 7), 5);
assert.equal(doc.screenToDocumentColumn(0, 8), 5);
assert.equal(doc.screenToDocumentColumn(0, 9), 6);
assert.equal(doc.screenToDocumentColumn(0, 15), 12);
assert.equal(doc.screenToDocumentColumn(0, 19), 13);
}
});
};
});
module.exports = require("async/test").testcase(Test)
if (module === require.main)
module.exports.exec()

View file

@ -6,31 +6,33 @@
* @author Fabian Jakobs <fabian AT ajax DOT org>
*/
require.def([
"ace/lib/oop",
"ace/MEventEmitter"
], function(
oop,
MEventEmitter
) {
require("../../../support/paths");
var oop = require("../lib/oop");
MEventEmitter = require("../event_emitter"),
assert = require("./assertions");
var EventEmitter = function() {};
oop.implement(EventEmitter.prototype, MEventEmitter);
var EventEmitterTest = new TestCase("EventEmitterTest", {
var Test = {
"test: dispatch event with no data" : function() {
var emitter = new EventEmitter();
var called = false;
emitter.addEventListener("juhu", function(e) {
called = true;
assertEquals("juhu", e.type);
assert.equal(e.type, "juhu");
});
emitter.$dispatchEvent("juhu");
assertTrue(called);
assert.true(called);
}
});
};
});
module.exports = require("async/test").testcase(Test)
if (module === require.main)
module.exports.exec()

View file

@ -6,7 +6,7 @@
* @author Fabian Jakobs <fabian AT ajax DOT org>
*/
require.def([], function() {
define(function(require, exports, module) {
MockRenderer = function(visibleRowCount) {
this.container = document.createElement("div");
@ -84,5 +84,14 @@ MockRenderer.prototype.addMarker = function() {
MockRenderer.prototype.setBreakpoints = function() {
};
MockRenderer.prototype.updateFull = function() {
};
MockRenderer.prototype.showCursor = function() {
};
MockRenderer.prototype.visualizeFocus = function() {
};
return MockRenderer;
});

View file

@ -6,18 +6,24 @@
* @author Fabian Jakobs <fabian AT ajax DOT org>
*/
require.def([
"ace/Document",
"ace/Editor",
"ace/test/MockRenderer"
], function(
Document,
Editor,
MockRenderer
) {
require("../../../support/paths");
var NavigationTest = TestCase("NavigationTest",
{
var dom = require('jsdom/level2/html').dom.level2.html;
var browser = require('jsdom/browser/index').windowAugmentation(dom);
global.document = browser.document;
global.window = browser.window;
global.self = browser.self;
global.navigator = browser.navigator;
global.location = browser.location;
var Document = require("../Document"),
Editor = require("../Editor"),
MockRenderer = require("./mockrenderer"),
assert = require("./assertions");
var Test = {
createTextDocument : function(rows, cols) {
var line = new Array(cols + 1).join("a");
var text = new Array(rows).join(line + "\n") + line;
@ -31,8 +37,8 @@ var NavigationTest = TestCase("NavigationTest",
editor.navigateFileEnd();
var cursor = editor.getCursorPosition();
assertTrue(editor.getFirstVisibleRow() <= cursor.row);
assertTrue(editor.getLastVisibleRow() >= cursor.row);
assert.true(editor.getFirstVisibleRow() <= cursor.row);
assert.true(editor.getLastVisibleRow() >= cursor.row);
},
"test: navigate to start of file should scroll the first row into view" : function() {
@ -42,7 +48,7 @@ var NavigationTest = TestCase("NavigationTest",
editor.moveCursorTo(editor.getLastVisibleRow() + 20);
editor.navigateFileStart();
assertEquals(0, editor.getFirstVisibleRow());
assert.equal(editor.getFirstVisibleRow(), 0);
},
"test: goto hidden line should scroll the line into the middle of the viewport" : function() {
@ -50,33 +56,33 @@ var NavigationTest = TestCase("NavigationTest",
editor.navigateTo(0, 0);
editor.gotoLine(101);
assertPosition(100, 0, editor.getCursorPosition());
assertEquals(90, editor.getFirstVisibleRow());
assert.position(editor.getCursorPosition(), 100, 0);
assert.equal(editor.getFirstVisibleRow(), 90);
editor.navigateTo(100, 0);
editor.gotoLine(11);
assertPosition(10, 0, editor.getCursorPosition());
assertEquals(0, editor.getFirstVisibleRow());
assert.position(editor.getCursorPosition(), 10, 0);
assert.equal(editor.getFirstVisibleRow(), 0);
editor.navigateTo(100, 0);
editor.gotoLine(6);
assertPosition(5, 0, editor.getCursorPosition());
assertEquals(0, editor.getFirstVisibleRow());
assert.position(editor.getCursorPosition(), 5, 0);
assert.equal(0, editor.getFirstVisibleRow(), 0);
editor.navigateTo(100, 0);
editor.gotoLine(1);
assertPosition(0, 0, editor.getCursorPosition());
assertEquals(0, editor.getFirstVisibleRow());
assert.position(editor.getCursorPosition(), 0, 0);
assert.equal(editor.getFirstVisibleRow(), 0);
editor.navigateTo(0, 0);
editor.gotoLine(191);
assertPosition(190, 0, editor.getCursorPosition());
assertEquals(180, editor.getFirstVisibleRow());
assert.position(editor.getCursorPosition(), 190, 0);
assert.equal(editor.getFirstVisibleRow(), 180);
editor.navigateTo(0, 0);
editor.gotoLine(196);
assertPosition(195, 0, editor.getCursorPosition());
assertEquals(180, editor.getFirstVisibleRow());
assert.position(editor.getCursorPosition(), 195, 0);
assert.equal(editor.getFirstVisibleRow(), 180);
},
"test: goto visible line should only move the cursor and not scroll": function() {
@ -84,43 +90,46 @@ var NavigationTest = TestCase("NavigationTest",
editor.navigateTo(0, 0);
editor.gotoLine(12);
assertPosition(11, 0, editor.getCursorPosition());
assertEquals(0, editor.getFirstVisibleRow());
assert.position(editor.getCursorPosition(), 11, 0);
assert.equal(editor.getFirstVisibleRow(), 0);
editor.navigateTo(30, 0);
editor.gotoLine(33);
assertPosition(32, 0, editor.getCursorPosition());
assertEquals(30, editor.getFirstVisibleRow());
assert.position(editor.getCursorPosition(), 32, 0);
assert.equal(editor.getFirstVisibleRow(), 30);
},
"test: navigate from the end of a long line down to a short line and back should maintain the curser column": function() {
var editor = new Editor(new MockRenderer(), new Document(["123456", "1"]));
editor.navigateTo(0, 6);
assertPosition(0, 6, editor.getCursorPosition());
assert.position(editor.getCursorPosition(), 0, 6);
editor.navigateDown();
assertPosition(1, 1, editor.getCursorPosition());
assert.position(editor.getCursorPosition(), 1, 1);
editor.navigateUp();
assertPosition(0, 6, editor.getCursorPosition());
assert.position(editor.getCursorPosition(), 0, 6);
},
"test: reset desired column on navigate left or right": function() {
var editor = new Editor(new MockRenderer(), new Document(["123456", "12"]));
editor.navigateTo(0, 6);
assertPosition(0, 6, editor.getCursorPosition());
assert.position(editor.getCursorPosition(), 0, 6);
editor.navigateDown();
assertPosition(1, 2, editor.getCursorPosition());
assert.position(editor.getCursorPosition(), 1, 2);
editor.navigateLeft();
assertPosition(1, 1, editor.getCursorPosition());
assert.position(editor.getCursorPosition(), 1, 1);
editor.navigateUp();
assertPosition(0, 1, editor.getCursorPosition());
assert.position(editor.getCursorPosition(), 0, 1);
}
});
};
});
module.exports = require("async/test").testcase(Test)
if (module === require.main)
module.exports.exec()

View file

@ -6,118 +6,119 @@
* @author Fabian Jakobs <fabian AT ajax DOT org>
*/
require.def([
"ace/Range"
], function(
Range
) {
require("../../../support/paths");
RangeTest = new TestCase("RangeTest", {
var Range = require("../range"),
assert = require("./assertions");
var Test = {
"test: create range": function() {
var range = new Range(1,2,3,4);
assertEquals(1, range.start.row);
assertEquals(2, range.start.column);
assertEquals(3, range.end.row);
assertEquals(4, range.end.column);
assert.equal(range.start.row, 1);
assert.equal(range.start.column, 2);
assert.equal(range.end.row, 3);
assert.equal(range.end.column, 4);
},
"test: create from points": function() {
var range = Range.fromPoints({row: 1, column: 2}, {row:3, column:4});
assertEquals(1, range.start.row);
assertEquals(2, range.start.column);
assertEquals(3, range.end.row);
assertEquals(4, range.end.column);
assert.equal(range.start.row, 1);
assert.equal(range.start.column, 2);
assert.equal(range.end.row, 3);
assert.equal(range.end.column, 4);
},
"test: clip to rows": function() {
assertRange(10, 0, 31, 0, new Range(0, 20, 100, 30).clipRows(10, 30));
assertRange(10, 0, 30, 10, new Range(0, 20, 30, 10).clipRows(10, 30));
assert.range(new Range(0, 20, 100, 30).clipRows(10, 30), 10, 0, 31, 0);
assert.range(new Range(0, 20, 30, 10).clipRows(10, 30), 10, 0, 30, 10);
var range = new Range(0, 20, 3, 10);
var range = range.clipRows(10, 30);
assertTrue(range.isEmpty());
assertRange(10, 0, 10, 0, range);
assert.true(range.isEmpty());
assert.range(range, 10, 0, 10, 0);
},
"test: isEmpty": function() {
var range = new Range(1, 2, 1, 2);
assertTrue(range.isEmpty());
assert.true(range.isEmpty());
var range = new Range(1, 2, 1, 6);
assertFalse(range.isEmpty());
assert.false(range.isEmpty());
},
"test: is multi line": function() {
var range = new Range(1, 2, 1, 6);
assertFalse(range.isMultiLine());
assert.false(range.isMultiLine());
var range = new Range(1, 2, 2, 6);
assertTrue(range.isMultiLine());
assert.true(range.isMultiLine());
},
"test: clone": function() {
var range = new Range(1, 2, 3, 4);
var clone = range.clone();
assertPosition(1, 2, clone.start);
assertPosition(3, 4, clone.end);
assert.position(clone.start, 1, 2);
assert.position(clone.end, 3, 4);
clone.start.column = 20;
assertPosition(1, 2, range.start);
assert.position(range.start, 1, 2);
clone.end.column = 20;
assertPosition(3, 4, range.end);
assert.position(range.end, 3, 4);
},
"test: contains for multi line ranges": function() {
var range = new Range(1, 10, 5, 20);
assertTrue(range.contains(1, 10));
assertTrue(range.contains(2, 0));
assertTrue(range.contains(3, 100));
assertTrue(range.contains(5, 19));
assertTrue(range.contains(5, 20));
assert.true(range.contains(1, 10));
assert.true(range.contains(2, 0));
assert.true(range.contains(3, 100));
assert.true(range.contains(5, 19));
assert.true(range.contains(5, 20));
assertFalse(range.contains(1, 9));
assertFalse(range.contains(0, 0));
assertFalse(range.contains(5, 21));
assert.false(range.contains(1, 9));
assert.false(range.contains(0, 0));
assert.false(range.contains(5, 21));
},
"test: contains for single line ranges": function() {
var range = new Range(1, 10, 1, 20);
assertTrue(range.contains(1, 10));
assertTrue(range.contains(1, 15));
assertTrue(range.contains(1, 20));
assert.true(range.contains(1, 10));
assert.true(range.contains(1, 15));
assert.true(range.contains(1, 20));
assertFalse(range.contains(0, 9));
assertFalse(range.contains(2, 9));
assertFalse(range.contains(1, 9));
assertFalse(range.contains(1, 21));
assert.false(range.contains(0, 9));
assert.false(range.contains(2, 9));
assert.false(range.contains(1, 9));
assert.false(range.contains(1, 21));
},
"test: extend range": function() {
var range = new Range(2, 10, 2, 30);
var range = range.extend(2, 5);
assertRange(2, 5, 2, 30, range);
assert.range(range, 2, 5, 2, 30);
var range = range.extend(2, 35);
assertRange(2, 5, 2, 35, range);
assert.range(range, 2, 5, 2, 35);
var range = range.extend(2, 15);
assertRange(2, 5, 2, 35, range);
assert.range(range, 2, 5, 2, 35);
var range = range.extend(1, 4);
assertRange(1, 4, 2, 35, range);
assert.range(range, 1, 4, 2, 35);
var range = range.extend(6, 10);
assertRange(1, 4, 6, 10, range);
assert.range(range, 1, 4, 6, 10);
}
});
};
});
module.exports = require("async/test").testcase(Test);
if (module === require.main)
module.exports.exec()

View file

@ -6,16 +6,13 @@
* @author Fabian Jakobs <fabian AT ajax DOT org>
*/
require.def([
"ace/Document",
"ace/Search"
], function(
Document,
Search
) {
require("../../../support/paths");
var SearchTest = new TestCase("SearchTest", {
var Document = require("../document"),
Search = require("../search"),
assert = require("./assertions");
var Test = {
"test: configure the search object" : function() {
var search = new Search();
search.set({
@ -31,8 +28,8 @@ var SearchTest = new TestCase("SearchTest", {
});
var range = search.find(doc);
assertPosition(0, 5, range.start);
assertPosition(0, 12, range.end);
assert.position(range.start, 0, 5);
assert.position(range.end, 0, 12);
},
"test: find simple text in next line" : function() {
@ -42,8 +39,8 @@ var SearchTest = new TestCase("SearchTest", {
});
var range = search.find(doc);
assertPosition(1, 5, range.start);
assertPosition(1, 12, range.end);
assert.position(range.start, 1, 5);
assert.position(range.end, 1, 12);
},
"test: find text starting at cursor position" : function() {
@ -54,8 +51,8 @@ var SearchTest = new TestCase("SearchTest", {
});
var range = search.find(doc);
assertPosition(1, 5, range.start);
assertPosition(1, 12, range.end);
assert.position(range.start, 1, 5);
assert.position(range.end, 1, 12);
},
"test: wrap search is off by default" : function() {
@ -66,7 +63,7 @@ var SearchTest = new TestCase("SearchTest", {
needle: "kinners"
});
assertEquals(null, search.find(doc));
assert.equal(search.find(doc), null);
},
"test: wrap search should wrap at file end" : function() {
@ -79,8 +76,8 @@ var SearchTest = new TestCase("SearchTest", {
});
var range = search.find(doc);
assertPosition(1, 5, range.start);
assertPosition(1, 12, range.end);
assert.position(range.start, 1, 5);
assert.position(range.end, 1, 12);
},
"test: wrap search with no match should return 'null'": function() {
@ -92,7 +89,7 @@ var SearchTest = new TestCase("SearchTest", {
wrap: true
});
assertEquals(null, search.find(doc));
assert.equal(search.find(doc), null);
},
"test: case sensitive is by default off": function() {
@ -102,7 +99,7 @@ var SearchTest = new TestCase("SearchTest", {
needle: "JUHU"
});
assertEquals(null, search.find(doc));
assert.range(search.find(doc), 1, 0, 1, 4);
},
"test: case sensitive search": function() {
@ -114,8 +111,7 @@ var SearchTest = new TestCase("SearchTest", {
});
var range = search.find(doc);
assertPosition(1, 5, range.start);
assertPosition(1, 12, range.end);
assert.equal(range, null);
},
"test: whole word search should not match inside of words": function() {
@ -127,8 +123,8 @@ var SearchTest = new TestCase("SearchTest", {
});
var range = search.find(doc);
assertPosition(1, 5, range.start);
assertPosition(1, 12, range.end);
assert.position(range.start, 1, 5);
assert.position(range.end, 1, 12);
},
"test: find backwards": function() {
@ -140,8 +136,8 @@ var SearchTest = new TestCase("SearchTest", {
});
var range = search.find(doc);
assertPosition(0, 5, range.start);
assertPosition(0, 9, range.end);
assert.position(range.start, 0, 5);
assert.position(range.end, 0, 9);
},
"test: find in selection": function() {
@ -156,15 +152,15 @@ var SearchTest = new TestCase("SearchTest", {
});
var range = search.find(doc);
assertPosition(1, 0, range.start);
assertPosition(1, 4, range.end);
assert.position(range.start, 1, 0);
assert.position(range.end, 1, 4);
doc.getSelection().setSelectionAnchor(0, 2);
doc.getSelection().selectTo(3, 2);
var range = search.find(doc);
assertPosition(1, 0, range.start);
assertPosition(1, 4, range.end);
assert.position(range.start, 1, 0);
assert.position(range.end, 1, 4);
},
"test: find backwards in selection": function() {
@ -181,13 +177,13 @@ var SearchTest = new TestCase("SearchTest", {
doc.getSelection().selectTo(3, 2);
var range = search.find(doc);
assertPosition(2, 0, range.start);
assertPosition(2, 4, range.end);
assert.position(range.start, 2, 0);
assert.position(range.end, 2, 4);
doc.getSelection().setSelectionAnchor(0, 2);
doc.getSelection().selectTo(1, 2);
assertEquals(null, search.find(doc));
assert.equal(search.find(doc), null);
},
"test: edge case - match directly before the cursor" : function() {
@ -201,8 +197,8 @@ var SearchTest = new TestCase("SearchTest", {
doc.getSelection().moveCursorTo(2, 5);
var range = search.find(doc);
assertPosition(2, 0, range.start);
assertPosition(2, 4, range.end);
assert.position(range.start, 2, 0);
assert.position(range.end, 2, 4);
},
"test: edge case - match backwards directly after the cursor" : function() {
@ -217,8 +213,8 @@ var SearchTest = new TestCase("SearchTest", {
doc.getSelection().moveCursorTo(2, 0);
var range = search.find(doc);
assertPosition(2, 0, range.start);
assertPosition(2, 4, range.end);
assert.position(range.start, 2, 0);
assert.position(range.end, 2, 4);
},
"test: find using a regular expression" : function() {
@ -230,8 +226,8 @@ var SearchTest = new TestCase("SearchTest", {
});
var range = search.find(doc);
assertPosition(0, 3, range.start);
assertPosition(0, 6, range.end);
assert.position(range.start, 0, 3);
assert.position(range.end, 0, 6);
},
"test: find using a regular expression and whole word" : function() {
@ -244,8 +240,8 @@ var SearchTest = new TestCase("SearchTest", {
});
var range = search.find(doc);
assertPosition(0, 7, range.start);
assertPosition(0, 10, range.end);
assert.position(range.start, 0, 7);
assert.position(range.end, 0, 10);
},
"test: use regular expressions with capture groups": function() {
@ -257,8 +253,8 @@ var SearchTest = new TestCase("SearchTest", {
});
var range = search.find(doc);
assertPosition(0, 6, range.start);
assertPosition(0, 8, range.end);
assert.position(range.start, 0, 6);
assert.position(range.end, 0, 8);
},
"test: find all matches in selection" : function() {
@ -275,11 +271,11 @@ var SearchTest = new TestCase("SearchTest", {
var ranges = search.findAll(doc);
assertEquals(2, ranges.length);
assertPosition(1, 1, ranges[0].start);
assertPosition(1, 3, ranges[0].end);
assertPosition(2, 1, ranges[1].start);
assertPosition(2, 3, ranges[1].end);
assert.equal(ranges.length, 2);
assert.position(ranges[0].start, 1, 1);
assert.position(ranges[0].end, 1, 3);
assert.position(ranges[1].start, 2, 1);
assert.position(ranges[1].end, 2, 3);
},
"test: replace() should return the replacement if the input matches the needle" : function() {
@ -287,9 +283,9 @@ var SearchTest = new TestCase("SearchTest", {
needle: "juhu"
});
assertEquals("kinners", search.replace("juhu", "kinners"));
assertEquals(null, search.replace("", "kinners"));
assertEquals(null, search.replace(" juhu", "kinners"));
assert.equal(search.replace("juhu", "kinners"), "kinners");
assert.equal(search.replace("", "kinners"), null);
assert.equal(search.replace(" juhu", "kinners"), null);
// regexp replacement
},
@ -300,11 +296,11 @@ var SearchTest = new TestCase("SearchTest", {
regExp: true
});
assertEquals("kinners", search.replace("123", "kinners"));
assertEquals("kinners", search.replace("01234", "kinners"));
assertEquals(null, search.replace("", "kinners"));
assertEquals(null, search.replace("a12", "kinners"));
assertEquals(null, search.replace("12a", "kinners"));
assert.equal(search.replace("123", "kinners"), "kinners");
assert.equal(search.replace("01234", "kinners"), "kinners");
assert.equal(search.replace("", "kinners"), null);
assert.equal(search.replace("a12", "kinners"), null);
assert.equal(search.replace("12a", "kinners"), null);
},
"test: replace with RegExp match and capture groups" : function() {
@ -313,10 +309,13 @@ var SearchTest = new TestCase("SearchTest", {
regExp: true
});
assertEquals("cd12", search.replace("ab12", "cd$1"));
assertEquals("-ab12-", search.replace("ab12", "-$&-"));
assertEquals("$", search.replace("ab12", "$$"));
assert.equal(search.replace("ab12", "cd$1"), "cd12");
assert.equal(search.replace("ab12", "-$&-"), "-ab12-");
assert.equal(search.replace("ab12", "$$"), "$");
}
});
};
});
module.exports = require("async/test").testcase(Test)
if (module === require.main)
module.exports.exec();

View file

@ -6,14 +6,12 @@
* @author Fabian Jakobs <fabian AT ajax DOT org>
*/
require.def([
"ace/Document"
], function(
Document
) {
require("../../../support/paths");
var SelectionTest = TestCase("SelectionTest",
{
var Document = require("../document"),
assert = require("./assertions");
var Test = {
createTextDocument : function(rows, cols) {
var line = new Array(cols + 1).join("a");
var text = new Array(rows).join(line + "\n") + line;
@ -25,7 +23,7 @@ var SelectionTest = TestCase("SelectionTest",
var selection = doc.getSelection();
selection.moveCursorFileEnd();
assertPosition(199, 10, selection.getCursor());
assert.position(selection.getCursor(), 199, 10);
},
"test: moveCursor to start of file should place the cursor on the first row and column" : function() {
@ -33,7 +31,7 @@ var SelectionTest = TestCase("SelectionTest",
var selection = doc.getSelection();
selection.moveCursorFileStart();
assertPosition(0, 0, selection.getCursor());
assert.position(selection.getCursor(), 0, 0);
},
"test: move selection lead to end of file" : function() {
@ -45,8 +43,8 @@ var SelectionTest = TestCase("SelectionTest",
var range = selection.getRange();
assertPosition(100, 5, range.start);
assertPosition(199, 10, range.end);
assert.position(range.start, 100, 5);
assert.position(range.end, 199, 10);
},
"test: move selection lead to start of file" : function() {
@ -58,8 +56,8 @@ var SelectionTest = TestCase("SelectionTest",
var range = selection.getRange();
assertPosition(0, 0, range.start);
assertPosition(100, 5, range.end);
assert.position(range.start, 0, 0);
assert.position(range.end, 100, 5);
},
"test: move cursor word right" : function() {
@ -68,38 +66,38 @@ var SelectionTest = TestCase("SelectionTest",
var selection = doc.getSelection();
selection.moveCursorDown();
assertPosition(1, 0, selection.getCursor());
assert.position(selection.getCursor(), 1, 0);
selection.moveCursorWordRight();
assertPosition(1, 1, selection.getCursor());
assert.position(selection.getCursor(), 1, 1);
selection.moveCursorWordRight();
assertPosition(1, 5, selection.getCursor());
assert.position(selection.getCursor(), 1, 5);
selection.moveCursorWordRight();
assertPosition(1, 6, selection.getCursor());
assert.position(selection.getCursor(), 1, 6);
selection.moveCursorWordRight();
assertPosition(1, 13, selection.getCursor());
assert.position(selection.getCursor(), 1, 13);
selection.moveCursorWordRight();
assertPosition(1, 15, selection.getCursor());
assert.position(selection.getCursor(), 1, 15);
selection.moveCursorWordRight();
assertPosition(1, 18, selection.getCursor());
assert.position(selection.getCursor(), 1, 18);
selection.moveCursorWordRight();
assertPosition(1, 20, selection.getCursor());
assert.position(selection.getCursor(), 1, 20);
selection.moveCursorWordRight();
assertPosition(1, 22, selection.getCursor());
assert.position(selection.getCursor(), 1, 22);
selection.moveCursorWordRight();
assertPosition(1, 23, selection.getCursor());
assert.position(selection.getCursor(), 1, 23);
// wrap line
selection.moveCursorWordRight();
assertPosition(2, 0, selection.getCursor());
assert.position(selection.getCursor(), 2, 0);
},
"test: select word right if cursor in word" : function() {
@ -109,7 +107,7 @@ var SelectionTest = TestCase("SelectionTest",
selection.moveCursorTo(0, 2);
selection.moveCursorWordRight();
assertPosition(0, 4, selection.getCursor());
assert.position(selection.getCursor(), 0, 4);
},
"test: moveCursor word left" : function() {
@ -119,38 +117,38 @@ var SelectionTest = TestCase("SelectionTest",
selection.moveCursorDown();
selection.moveCursorLineEnd();
assertPosition(1, 23, selection.getCursor());
assert.position(selection.getCursor(), 1, 23);
selection.moveCursorWordLeft();
assertPosition(1, 22, selection.getCursor());
assert.position(selection.getCursor(), 1, 22);
selection.moveCursorWordLeft();
assertPosition(1, 20, selection.getCursor());
assert.position(selection.getCursor(), 1, 20);
selection.moveCursorWordLeft();
assertPosition(1, 18, selection.getCursor());
assert.position(selection.getCursor(), 1, 18);
selection.moveCursorWordLeft();
assertPosition(1, 15, selection.getCursor());
assert.position(selection.getCursor(), 1, 15);
selection.moveCursorWordLeft();
assertPosition(1, 13, selection.getCursor());
assert.position(selection.getCursor(), 1, 13);
selection.moveCursorWordLeft();
assertPosition(1, 6, selection.getCursor());
assert.position(selection.getCursor(), 1, 6);
selection.moveCursorWordLeft();
assertPosition(1, 5, selection.getCursor());
assert.position(selection.getCursor(), 1, 5);
selection.moveCursorWordLeft();
assertPosition(1, 1, selection.getCursor());
assert.position(selection.getCursor(), 1, 1);
selection.moveCursorWordLeft();
assertPosition(1, 0, selection.getCursor());
assert.position(selection.getCursor(), 1, 0);
// wrap line
selection.moveCursorWordLeft();
assertPosition(0, 2, selection.getCursor());
assert.position(selection.getCursor(), 0, 2);
},
"test: select word left if cursor in word" : function() {
@ -160,7 +158,7 @@ var SelectionTest = TestCase("SelectionTest",
selection.moveCursorTo(0, 8);
selection.moveCursorWordLeft();
assertPosition(0, 5, selection.getCursor());
assert.position(selection.getCursor(), 0, 5);
},
"test: select word right and select" : function() {
@ -172,8 +170,8 @@ var SelectionTest = TestCase("SelectionTest",
var range = selection.getRange();
assertPosition(0, 0, range.start);
assertPosition(0, 4, range.end);
assert.position(range.start, 0, 0);
assert.position(range.end, 0, 4);
},
"test: select word left and select" : function() {
@ -185,8 +183,8 @@ var SelectionTest = TestCase("SelectionTest",
var range = selection.getRange();
assertPosition(0, 0, range.start);
assertPosition(0, 3, range.end);
assert.position(range.start, 0, 0);
assert.position(range.end, 0, 3);
},
"test: select word with cursor in word should select the word" : function() {
@ -197,8 +195,8 @@ var SelectionTest = TestCase("SelectionTest",
selection.selectWord();
var range = selection.getRange();
assertPosition(0, 5, range.start);
assertPosition(0, 12, range.end);
assert.position(range.start, 0, 5);
assert.position(range.end, 0, 12);
},
"test: select word with cursor betwen white space and word should select the word" : function() {
@ -209,15 +207,15 @@ var SelectionTest = TestCase("SelectionTest",
selection.selectWord();
var range = selection.getRange();
assertPosition(0, 0, range.start);
assertPosition(0, 4, range.end);
assert.position(range.start, 0, 0);
assert.position(range.end, 0, 4);
selection.moveCursorTo(0, 5);
selection.selectWord();
var range = selection.getRange();
assertPosition(0, 5, range.start);
assertPosition(0, 12, range.end);
assert.position(range.start, 0, 5);
assert.position(range.end, 0, 12);
},
"test: select word with cursor in white space should select white space" : function() {
@ -228,8 +226,8 @@ var SelectionTest = TestCase("SelectionTest",
selection.selectWord();
var range = selection.getRange();
assertPosition(0, 4, range.start);
assertPosition(0, 6, range.end);
assert.position(range.start, 0, 4);
assert.position(range.end, 0, 6);
},
"test: moving cursor should fire a 'changeCursor' event" : function() {
@ -244,7 +242,7 @@ var SelectionTest = TestCase("SelectionTest",
});
selection.moveCursorTo(0, 6);
assertTrue(called);
assert.true(called);
},
"test: calling setCursor with the same position should not fire an event": function() {
@ -259,8 +257,11 @@ var SelectionTest = TestCase("SelectionTest",
});
selection.moveCursorTo(0, 5);
assertFalse(called);
assert.false(called);
}
});
};
});
module.exports = require("async/test").testcase(Test);
if (module === require.main)
module.exports.exec()

View file

@ -6,20 +6,24 @@
* @author Fabian Jakobs <fabian AT ajax DOT org>
*/
require.def([
"ace/Document",
"ace/Editor",
"ace/mode/JavaScript",
"ace/test/MockRenderer"
], function(
Document,
Editor,
JavaScriptMode,
MockRenderer
) {
require("../../../support/paths");
var TextEditTest = TestCase("TextEditTest",
{
var dom = require('jsdom/level2/html').dom.level2.html;
var browser = require('jsdom/browser/index').windowAugmentation(dom);
global.document = browser.document;
global.window = browser.window;
global.self = browser.self;
global.navigator = browser.navigator;
global.location = browser.location;
var Document = require("../document"),
Editor = require("../editor"),
JavaScriptMode = require("../mode/javascript"),
MockRenderer = require("./mockrenderer"),
assert = require("./assertions");
var Test = {
"test: delete line from the middle" : function() {
var doc = new Document(["a", "b", "c", "d"].join("\n"));
var editor = new Editor(new MockRenderer(), doc);
@ -27,23 +31,23 @@ var TextEditTest = TestCase("TextEditTest",
editor.moveCursorTo(1, 1);
editor.removeLines();
assertEquals("a\nc\nd", doc.toString());
assertPosition(1, 0, editor.getCursorPosition());
assert.equal(doc.toString(), "a\nc\nd");
assert.position(editor.getCursorPosition(), 1, 0);
editor.removeLines();
assertEquals("a\nd", doc.toString());
assertPosition(1, 0, editor.getCursorPosition());
assert.equal(doc.toString(), "a\nd");
assert.position(editor.getCursorPosition(), 1, 0);
editor.removeLines();
assertEquals("a\n", doc.toString());
assertPosition(1, 0, editor.getCursorPosition());
assert.equal(doc.toString(), "a\n");
assert.position(editor.getCursorPosition(), 1, 0);
editor.removeLines();
assertEquals("a\n", doc.toString());
assertPosition(1, 0, editor.getCursorPosition());
assert.equal(doc.toString(), "a\n");
assert.position(editor.getCursorPosition(), 1, 0);
},
"test: delete multiple selected lines" : function() {
@ -54,8 +58,8 @@ var TextEditTest = TestCase("TextEditTest",
editor.getSelection().selectDown();
editor.removeLines();
assertEquals("a\nd", doc.toString());
assertPosition(1, 0, editor.getCursorPosition());
assert.equal(doc.toString(), "a\nd");
assert.position(editor.getCursorPosition(), 1, 0);
},
"test: delete first line" : function() {
@ -64,8 +68,8 @@ var TextEditTest = TestCase("TextEditTest",
editor.removeLines();
assertEquals("b\nc", doc.toString());
assertPosition(0, 0, editor.getCursorPosition());
assert.equal(doc.toString(), "b\nc");
assert.position(editor.getCursorPosition(), 0, 0);
},
"test: delete last" : function() {
@ -75,11 +79,11 @@ var TextEditTest = TestCase("TextEditTest",
editor.moveCursorTo(2, 1);
editor.removeLines();
assertEquals("a\nb\n", doc.toString());
assertPosition(2, 0, editor.getCursorPosition());
assert.equal(doc.toString(), "a\nb\n");
assert.position(editor.getCursorPosition(), 2, 0);
},
"test: indent block" : function() {
"__test: indent block" : function() {
var doc = new Document(["a12345", "b12345", "c12345"].join("\n"));
var editor = new Editor(new MockRenderer(), doc);
@ -88,18 +92,18 @@ var TextEditTest = TestCase("TextEditTest",
editor.blockIndent(" ");
assertEquals(["a12345", " b12345", " c12345"].join("\n"),
assert.equal(["a12345", " b12345", " c12345"].join("\n"),
doc.toString());
assertPosition(2, 7, editor.getCursorPosition());
assert.position(editor.getCursorPosition(), 2, 7);
var range = editor.getSelectionRange();
assertPosition(1, 7, range.start);
assertPosition(2, 7, range.end);
assert.position(range.start, 1, 7);
assert.position(range.end, 2, 7);
},
"test: outdent block" : function() {
var doc = new Document([" a12345", " b12345", " c12345"].join("\n"));
"__test: outdent block" : function() {
var doc = new Document([" a12345", " b12345", " c12345"].join("\n"));
var editor = new Editor(new MockRenderer(), doc);
editor.moveCursorTo(0, 3);
@ -107,23 +111,21 @@ var TextEditTest = TestCase("TextEditTest",
editor.getSelection().selectDown();
editor.blockOutdent(" ");
assertEquals([" a12345", "b12345", " c12345"].join("\n"),
doc.toString());
assert.equal(doc.toString(), [" a12345", "b12345", " c12345"].join("\n"));
assertPosition(2, 1, editor.getCursorPosition());
assert.position(editor.getCursorPosition(), 2, 0);
var range = editor.getSelectionRange();
assertPosition(0, 1, range.start);
assertPosition(2, 1, range.end);
assert.position(range.start, 0, 1);
assert.position(range.end, 2, 1);
editor.blockOutdent(" ");
assertEquals([" a12345", "b12345", " c12345"].join("\n"),
doc.toString());
assert.equal(doc.toString(), ["a12345", "b12345", "c12345"].join("\n"));
var range = editor.getSelectionRange();
assertPosition(0, 1, range.start);
assertPosition(2, 1, range.end);
assert.position(range.start, 0, 1);
assert.position(range.end, 2, 1);
},
"test: outent without a selection should update cursor" : function() {
@ -133,8 +135,8 @@ var TextEditTest = TestCase("TextEditTest",
editor.moveCursorTo(0, 3);
editor.blockOutdent(" ");
assertEquals(" 12", doc.toString());
assertPosition(0, 1, editor.getCursorPosition());
assert.equal(doc.toString(), " 12");
assert.position(editor.getCursorPosition(), 0, 0);
},
"test: comment lines should perserve selection" : function() {
@ -146,11 +148,11 @@ var TextEditTest = TestCase("TextEditTest",
editor.toggleCommentLines();
assertEquals(["// abc", "//cde"].join("\n"), doc.toString());
assert.equal(["// abc", "//cde"].join("\n"), doc.toString());
var selection = editor.getSelectionRange();
assertPosition(0, 4, selection.start);
assertPosition(1, 4, selection.end);
assert.position(selection.start, 0, 4);
assert.position(selection.end, 1, 4);
},
"test: uncomment lines should perserve selection" : function() {
@ -164,8 +166,8 @@ var TextEditTest = TestCase("TextEditTest",
editor.toggleCommentLines();
assertEquals([" abc", "cde"].join("\n"), doc.toString());
assertRange(0, 0, 1, 1, editor.getSelectionRange());
assert.equal([" abc", "cde"].join("\n"), doc.toString());
assert.range(editor.getSelectionRange(), 0, 0, 1, 1);
},
"test: comment lines - if the selection end is at the line start it should stay there": function() {
@ -177,7 +179,7 @@ var TextEditTest = TestCase("TextEditTest",
editor.getSelection().selectDown();
editor.toggleCommentLines();
assertRange(0, 2, 1, 0, editor.getSelectionRange());
assert.range(editor.getSelectionRange(), 0, 2, 1, 0);
// select up
var doc = new Document(["abc", "cde"].join("\n"), new JavaScriptMode());
@ -187,7 +189,7 @@ var TextEditTest = TestCase("TextEditTest",
editor.getSelection().selectUp();
editor.toggleCommentLines();
assertRange(0, 2, 1, 0, editor.getSelectionRange());
assert.range(editor.getSelectionRange(), 0, 2, 1, 0);
},
"test: move lines down should select moved lines" : function() {
@ -198,26 +200,26 @@ var TextEditTest = TestCase("TextEditTest",
editor.getSelection().selectDown();
editor.moveLinesDown();
assertEquals(["33", "11", "22", "44"].join("\n"), doc.toString());
assertPosition(1, 0, editor.getCursorPosition());
assertPosition(3, 0, editor.getSelection().getSelectionAnchor());
assertPosition(1, 0, editor.getSelection().getSelectionLead());
assert.equal(["33", "11", "22", "44"].join("\n"), doc.toString());
assert.position(editor.getCursorPosition(), 1, 0);
assert.position(editor.getSelection().getSelectionAnchor(), 3, 0);
assert.position(editor.getSelection().getSelectionLead(), 1, 0);
editor.moveLinesDown();
assertEquals(["33", "44", "11", "22"].join("\n"), doc.toString());
assertPosition(2, 0, editor.getCursorPosition());
assertPosition(3, 2, editor.getSelection().getSelectionAnchor());
assertPosition(2, 0, editor.getSelection().getSelectionLead());
assert.equal(["33", "44", "11", "22"].join("\n"), doc.toString());
assert.position(editor.getCursorPosition(), 2, 0);
assert.position(editor.getSelection().getSelectionAnchor(), 3, 2);
assert.position(editor.getSelection().getSelectionLead(), 2, 0);
// moving again should have no effect
editor.moveLinesDown();
assertEquals(["33", "44", "11", "22"].join("\n"), doc.toString());
assertPosition(2, 0, editor.getCursorPosition());
assertPosition(3, 2, editor.getSelection().getSelectionAnchor());
assertPosition(2, 0, editor.getSelection().getSelectionLead());
assert.equal(["33", "44", "11", "22"].join("\n"), doc.toString());
assert.position(editor.getCursorPosition(), 2, 0);
assert.position(editor.getSelection().getSelectionAnchor(), 3, 2);
assert.position(editor.getSelection().getSelectionLead(), 2, 0);
},
"test: move lines up should select moved lines" : function() {
"__test: move lines up should select moved lines" : function() {
var doc = new Document(["11", "22", "33", "44"].join("\n"));
var editor = new Editor(new MockRenderer(), doc);
@ -225,16 +227,16 @@ var TextEditTest = TestCase("TextEditTest",
editor.getSelection().selectDown();
editor.moveLinesUp();
assertEquals(["11", "33", "44", "22"].join("\n"), doc.toString());
assertPosition(1, 0, editor.getCursorPosition());
assertPosition(3, 0, editor.getSelection().getSelectionAnchor());
assertPosition(1, 0, editor.getSelection().getSelectionLead());
assert.equal(doc.toString(), ["11", "33", "44", "22"].join("\n"));
assert.position(editor.getCursorPosition(), 1, 0);
assert.position(editor.getSelection().getSelectionAnchor(), 3, 0);
assert.position(editor.getSelection().getSelectionLead(), 1, 0);
editor.moveLinesUp();
assertEquals(["33", "44", "11", "22"].join("\n"), doc.toString());
assertPosition(0, 0, editor.getCursorPosition());
assertPosition(2, 0, editor.getSelection().getSelectionAnchor());
assertPosition(0, 0, editor.getSelection().getSelectionLead());
assert.equal(doc.toString(), ["33", "44", "11", "22"].join("\n"));
assert.position(editor.getCursorPosition(), 0, 0);
assert.position(editor.getSelection().getSelectionAnchor(), 2, 0);
assert.position(editor.getSelection().getSelectionLead(), 0, 0);
},
"test: move line without active selection should move cursor to start of the moved line" : function()
@ -246,14 +248,14 @@ var TextEditTest = TestCase("TextEditTest",
editor.clearSelection();
editor.moveLinesDown();
assertEquals(["11", "33", "22", "44"].join("\n"), doc.toString());
assertPosition(2, 0, editor.getCursorPosition());
assert.equal(["11", "33", "22", "44"].join("\n"), doc.toString());
assert.position(editor.getCursorPosition(), 2, 0);
editor.clearSelection();
editor.moveLinesUp();
assertEquals(["11", "22", "33", "44"].join("\n"), doc.toString());
assertPosition(1, 0, editor.getCursorPosition());
assert.equal(["11", "22", "33", "44"].join("\n"), doc.toString());
assert.position(editor.getCursorPosition(), 1, 0);
},
"test: copy lines down should select lines and place cursor at the selection start" : function() {
@ -264,11 +266,11 @@ var TextEditTest = TestCase("TextEditTest",
editor.getSelection().selectDown();
editor.copyLinesDown();
assertEquals(["11", "22", "33", "22", "33", "44"].join("\n"), doc.toString());
assert.equal(["11", "22", "33", "22", "33", "44"].join("\n"), doc.toString());
assertPosition(3, 0, editor.getCursorPosition());
assertPosition(5, 0, editor.getSelection().getSelectionAnchor());
assertPosition(3, 0, editor.getSelection().getSelectionLead());
assert.position(editor.getCursorPosition(), 3, 0);
assert.position(editor.getSelection().getSelectionAnchor(), 5, 0);
assert.position(editor.getSelection().getSelectionLead(), 3, 0);
},
"test: copy lines up should select lines and place cursor at the selection start" : function() {
@ -279,11 +281,11 @@ var TextEditTest = TestCase("TextEditTest",
editor.getSelection().selectDown();
editor.copyLinesUp();
assertEquals(["11", "22", "33", "22", "33", "44"].join("\n"), doc.toString());
assert.equal(["11", "22", "33", "22", "33", "44"].join("\n"), doc.toString());
assertPosition(1, 0, editor.getCursorPosition());
assertPosition(3, 0, editor.getSelection().getSelectionAnchor());
assertPosition(1, 0, editor.getSelection().getSelectionLead());
assert.position(editor.getCursorPosition(), 1, 0);
assert.position(editor.getSelection().getSelectionAnchor(), 3, 0);
assert.position(editor.getSelection().getSelectionLead(), 1, 0);
},
"test: input a tab with soft tab should convert it to spaces" : function() {
@ -294,11 +296,11 @@ var TextEditTest = TestCase("TextEditTest",
doc.setUseSoftTabs(true);
editor.onTextInput("\t");
assertEquals(" ", doc.toString());
assert.equal(doc.toString(), " ");
doc.setTabSize(5);
editor.onTextInput("\t");
assertEquals(" ", doc.toString());
assert.equal(doc.toString(), " ");
},
"test: input tab without soft tabs should keep the tab character" : function() {
@ -308,8 +310,11 @@ var TextEditTest = TestCase("TextEditTest",
doc.setUseSoftTabs(false);
editor.onTextInput("\t");
assertEquals("\t", doc.toString());
assert.equal(doc.toString(), "\t");
}
});
};
});
module.exports = require("async/test").testcase(Test);
if (module === require.main)
module.exports.exec()

View file

@ -5,17 +5,14 @@
* @license LGPLv3 <http://www.gnu.org/licenses/lgpl-3.0.txt>
* @author Fabian Jakobs <fabian AT ajax DOT org>
*/
require("../../../support/paths");
var Document = "../document",
VirtualRenderer = "../virtual_renderer",
assert = "../assertions";
require.def([
"ace/Document",
"ace/VirtualRenderer"
], function(
Document,
VirtualRenderer
) {
var VirtualRendererTest = new TestCase("VirtualRendererTest", {
var Test = {
"test: screen2text the column should be rounded to the next character edge" : function() {
var el = document.createElement("div");
el.style.left = "0px";
@ -32,17 +29,20 @@ var VirtualRendererTest = new TestCase("VirtualRendererTest", {
renderer.characterWidth = 10;
renderer.lineHeight = 15;
assertPosition(0, 0, renderer.screenToTextCoordinates(0, 0));
assertPosition(0, 0, renderer.screenToTextCoordinates(4, 0));
assertPosition(0, 1, renderer.screenToTextCoordinates(5, 0));
assertPosition(0, 1, renderer.screenToTextCoordinates(9, 0));
assertPosition(0, 1, renderer.screenToTextCoordinates(10, 0));
assertPosition(0, 1, renderer.screenToTextCoordinates(14, 0));
assertPosition(0, 2, renderer.screenToTextCoordinates(15, 0));
assert.position(renderer.screenToTextCoordinates(0, 0), 0, 0);
assert.position(renderer.screenToTextCoordinates(4, 0), 0, 0);
assert.position(renderer.screenToTextCoordinates(5, 0), 0, 1);
assert.position(renderer.screenToTextCoordinates(9, 0), 0, 1);
assert.position(renderer.screenToTextCoordinates(10, 0), 0, 1);
assert.position(renderer.screenToTextCoordinates(14, 0), 0, 1);
assert.position(renderer.screenToTextCoordinates(15, 0), 0, 2);
document.body.removeChild(el);
}
// change tab size after setDocument (for text layer)
});
};
});
module.exports = require("async/test").testcase(Test);
if (module === require.main)
module.exports.exec()

1
support/async Submodule

@ -0,0 +1 @@
Subproject commit 6da8076355fc9f06191d39b8f5989159dc8a162c

1
support/jsdom Submodule

@ -0,0 +1 @@
Subproject commit 486755962dc0b69c60bfd04869ff1e0093406bae

@ -0,0 +1 @@
Subproject commit 60d64db4a9a8b1a26bd099bc34f657bf096c4f39