diff --git a/lib/ace/document.js b/lib/ace/document.js index 74b5f8df..357520cb 100644 --- a/lib/ace/document.js +++ b/lib/ace/document.js @@ -47,7 +47,7 @@ var Range = require("ace/range").Range; var Document = function(text, mode) { this.modified = true; - this.lines = [""]; + this.lines = []; this.selection = new Selection(this); this.$breakpoints = []; @@ -623,7 +623,7 @@ var Document = function(text, mode) { }; this.indentRows = function(range, indentString) { - indentString.replace("\t", this.getTabString()); + indentString = indentString.replace("\t", this.getTabString()); for (var row=range.start.row; row<=range.end.row; row++) { this.$insert({row: row, column:0}, indentString); } diff --git a/lib/ace/test/all.js b/lib/ace/test/all.js index 297c69a4..7ed48c4a 100644 --- a/lib/ace/test/all.js +++ b/lib/ace/test/all.js @@ -35,14 +35,17 @@ * * ***** END LICENSE BLOCK ***** */ -require({ - paths: { - "ace": "../src/ace" - }}, - ["ace/test/assertions", "ace/test/ChangeDocumentTest"], - function(a) { - console.log(a) - alert("a " + a) - } -); +require("../../../support/paths"); +var async = require("async"); + +async.concat( + require("./change_document_test"), + require("./document_test"), + require("./event_emitter_test"), + require("./navigation_test"), + require("./range_test"), + require("./search_test"), + require("./selection_test"), + require("./text_edit_test") +).exec(); diff --git a/lib/ace/test/change_document_test.js b/lib/ace/test/change_document_test.js index 90ca741f..24561d9b 100644 --- a/lib/ace/test/change_document_test.js +++ b/lib/ace/test/change_document_test.js @@ -36,20 +36,12 @@ * ***** END LICENSE BLOCK ***** */ require("../../../support/paths"); +require("./mockdom"); -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"), +var Document = require("../document").Document, + Editor = require("../editor").Editor, + Text = require("../mode/text").Mode, + JavaScriptMode = require("../mode/javascript").Mode, MockRenderer = require("./mockrenderer"), assert = require("./assertions"); diff --git a/lib/ace/test/document_test.js b/lib/ace/test/document_test.js index 6ae725da..fd5995da 100644 --- a/lib/ace/test/document_test.js +++ b/lib/ace/test/document_test.js @@ -36,12 +36,12 @@ * ***** END LICENSE BLOCK ***** */ require("../../../support/paths"); +require("./mockdom"); -var Document = require("../document"), - UndoManager = require("../undomanager"), - //Editor = require("../editor"), +var Document = require("../document").Document, + UndoManager = require("../undomanager").UndoManager, MockRenderer = require("./mockrenderer"), - Range = require("../range"), + Range = require("../range").Range, assert = require("./assertions"), async = require("async"); @@ -83,9 +83,7 @@ var Test = { "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); - console.log(doc.toString().replace(/\n/g, "\\n")); assert.equal(doc.toString(), ["3", "1", "2", "4"].join("\n")); doc.moveLinesDown(1, 2); @@ -98,12 +96,10 @@ var Test = { 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); - console.log(doc.toString().replace(/\n/g, "\\n")); assert.equal(doc.toString(), ["1", "3", "4", "2"].join("\n")); doc.moveLinesUp(1, 2); @@ -178,49 +174,6 @@ var Test = { assert.equal(["4", "5", "6"].join("\n"), doc.toString()); }, - "__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(); - assert.equal(step1, "222\n333"); - doc.$informUndoManager.call(); - - editor.removeLines(); - var step2 = doc.toString(); - assert.equal(step2, "333"); - doc.$informUndoManager.call(); - - editor.removeLines(); - var step3 = doc.toString(); - assert.equal(step3, ""); - doc.$informUndoManager.call(); - - - undoManager.undo(); - doc.$informUndoManager.call(); - assert.equal(doc.toString(), step2); - - undoManager.undo(); - doc.$informUndoManager.call(); - assert.equal(doc.toString(), step1); - - undoManager.undo(); - doc.$informUndoManager.call(); - assert.equal(doc.toString(), initialText); - - undoManager.undo(); - doc.$informUndoManager.call(); - assert.equal(doc.toString(), initialText); - }, - "test: convert document to screen coordinates" : function() { var doc = new Document("01234\t567890\t1234"); doc.setTabSize(4); diff --git a/lib/ace/test/event_emitter_test.js b/lib/ace/test/event_emitter_test.js index 8b6b6a26..f28a345a 100644 --- a/lib/ace/test/event_emitter_test.js +++ b/lib/ace/test/event_emitter_test.js @@ -37,17 +37,17 @@ require("../../../support/paths"); -var oop = require("../lib/oop"); - MEventEmitter = require("../event_emitter"), +var oop = require("pilot/oop").oop; + EventEmitter = require("pilot/event_emitter").EventEmitter, assert = require("./assertions"); -var EventEmitter = function() {}; +var Emitter = function() {}; -oop.implement(EventEmitter.prototype, EventEmitter); +oop.implement(Emitter.prototype, EventEmitter); var Test = { "test: dispatch event with no data" : function() { - var emitter = new EventEmitter(); + var emitter = new Emitter(); var called = false; emitter.addEventListener("juhu", function(e) { @@ -55,7 +55,7 @@ var Test = { assert.equal(e.type, "juhu"); }); - emitter.$dispatchEvent("juhu"); + emitter._dispatchEvent("juhu"); assert.true(called); } }; diff --git a/lib/ace/test/mockdom.js b/lib/ace/test/mockdom.js new file mode 100644 index 00000000..1c9b8476 --- /dev/null +++ b/lib/ace/test/mockdom.js @@ -0,0 +1,8 @@ +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; \ No newline at end of file diff --git a/lib/ace/test/mockrenderer.js b/lib/ace/test/mockrenderer.js index 6a3f51a1..61739218 100644 --- a/lib/ace/test/mockrenderer.js +++ b/lib/ace/test/mockrenderer.js @@ -116,6 +116,9 @@ MockRenderer.prototype.setBreakpoints = function() { MockRenderer.prototype.updateFull = function() { }; +MockRenderer.prototype.updateText = function() { +}; + MockRenderer.prototype.showCursor = function() { }; diff --git a/lib/ace/test/navigation_test.js b/lib/ace/test/navigation_test.js index 63e519e8..907650a5 100644 --- a/lib/ace/test/navigation_test.js +++ b/lib/ace/test/navigation_test.js @@ -36,21 +36,12 @@ * ***** END LICENSE BLOCK ***** */ require("../../../support/paths"); +require("./mockdom"); -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"), +var Document = require("../Document").Document, + Editor = require("../Editor").Editor, MockRenderer = require("./mockrenderer"), assert = require("./assertions"); - var Test = { createTextDocument : function(rows, cols) { diff --git a/lib/ace/test/range_test.js b/lib/ace/test/range_test.js index 3aa1cc72..a590889a 100644 --- a/lib/ace/test/range_test.js +++ b/lib/ace/test/range_test.js @@ -37,7 +37,7 @@ require("../../../support/paths"); -var Range = require("../range"), +var Range = require("../range").Range, assert = require("./assertions"); var Test = { diff --git a/lib/ace/test/search_test.js b/lib/ace/test/search_test.js index ba9b6e10..d86d59e0 100644 --- a/lib/ace/test/search_test.js +++ b/lib/ace/test/search_test.js @@ -37,8 +37,8 @@ require("../../../support/paths"); -var Document = require("../document"), - Search = require("../search"), +var Document = require("../document").Document, + Search = require("../search").Search, assert = require("./assertions"); var Test = { diff --git a/lib/ace/test/selection_test.js b/lib/ace/test/selection_test.js index 407fd3bf..571117dd 100644 --- a/lib/ace/test/selection_test.js +++ b/lib/ace/test/selection_test.js @@ -37,7 +37,7 @@ require("../../../support/paths"); -var Document = require("../document"), +var Document = require("../document").Document, assert = require("./assertions"); var Test = { diff --git a/lib/ace/test/text_edit_test.js b/lib/ace/test/text_edit_test.js index fbc39d2b..ea9b77a9 100644 --- a/lib/ace/test/text_edit_test.js +++ b/lib/ace/test/text_edit_test.js @@ -36,19 +36,12 @@ * ***** END LICENSE BLOCK ***** */ require("../../../support/paths"); +require("./mockdom"); -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"), +var Document = require("../document").Document, + Editor = require("../editor").Editor, JavaScriptMode = require("../mode/javascript").Mode, + UndoManager = require("../undomanager").UndoManager, MockRenderer = require("./mockrenderer"), assert = require("./assertions"); @@ -119,7 +112,7 @@ var Test = { editor.moveCursorTo(1, 3); editor.getSelection().selectDown(); - editor.blockIndent(" "); + editor.indent(); assert.equal(["a12345", " b12345", " c12345"].join("\n"), doc.toString()); @@ -135,26 +128,25 @@ var Test = { var doc = new Document([" a12345", " b12345", " c12345"].join("\n")); var editor = new Editor(new MockRenderer(), doc); - editor.moveCursorTo(0, 3); + editor.moveCursorTo(0, 5); editor.getSelection().selectDown(); editor.getSelection().selectDown(); - editor.blockOutdent(" "); + editor.blockOutdent(); assert.equal(doc.toString(), [" a12345", "b12345", " c12345"].join("\n")); - assert.position(editor.getCursorPosition(), 2, 0); + assert.position(editor.getCursorPosition(), 2, 1); var range = editor.getSelectionRange(); assert.position(range.start, 0, 1); assert.position(range.end, 2, 1); - - editor.blockOutdent(" "); + editor.blockOutdent(); assert.equal(doc.toString(), ["a12345", "b12345", "c12345"].join("\n")); var range = editor.getSelectionRange(); - assert.position(range.start, 0, 1); - assert.position(range.end, 2, 1); + assert.position(range.start, 0, 0); + assert.position(range.end, 2, 0); }, "test: outent without a selection should update cursor" : function() { @@ -340,6 +332,49 @@ var Test = { editor.onTextInput("\t"); assert.equal(doc.toString(), "\t"); + }, + + "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(); + assert.equal(step1, "222\n333"); + doc.$informUndoManager.call(); + + editor.removeLines(); + var step2 = doc.toString(); + assert.equal(step2, "333"); + doc.$informUndoManager.call(); + + editor.removeLines(); + var step3 = doc.toString(); + assert.equal(step3, ""); + doc.$informUndoManager.call(); + + + undoManager.undo(); + doc.$informUndoManager.call(); + assert.equal(doc.toString(), step2); + + undoManager.undo(); + doc.$informUndoManager.call(); + assert.equal(doc.toString(), step1); + + undoManager.undo(); + doc.$informUndoManager.call(); + assert.equal(doc.toString(), initialText); + + undoManager.undo(); + doc.$informUndoManager.call(); + assert.equal(doc.toString(), initialText); } }; diff --git a/lib/ace/test/virtual_renderer_test.js b/lib/ace/test/virtual_renderer_test.js index 776d8bab..088dcb28 100644 --- a/lib/ace/test/virtual_renderer_test.js +++ b/lib/ace/test/virtual_renderer_test.js @@ -36,10 +36,11 @@ * ***** END LICENSE BLOCK ***** */ require("../../../support/paths"); +require("./mockdom"); -var Document = "../document", - VirtualRenderer = "../virtual_renderer", - assert = "../assertions"; +var Document = require("../document").Document, + VirtualRenderer = require("../virtual_renderer").VirtualRenderer, + assert = require("./assertions"); var Test = { "test: screen2text the column should be rounded to the next character edge" : function() { diff --git a/support/paths.js b/support/paths.js index 4244a500..1be92a90 100644 --- a/support/paths.js +++ b/support/paths.js @@ -1,4 +1,6 @@ require("./requireJS-node"); +require.paths.unshift(__dirname + "/../lib"); +require.paths.unshift(__dirname + "/../plugins"); require.paths.unshift(__dirname + "/async/lib"); require.paths.unshift(__dirname + "/node-htmlparser/lib"); require.paths.unshift(__dirname + "/jsdom/lib"); diff --git a/support/requireJS-node.js b/support/requireJS-node.js index 0e5e5a37..debb0124 100644 --- a/support/requireJS-node.js +++ b/support/requireJS-node.js @@ -1,6 +1,6 @@ var path = require("path"); +var fs = require("fs"); var currentModule, defaultCompile = module.constructor.prototype._compile; -//console.log(module.id); module.constructor.prototype._compile = function(content, filename){ currentModule = this; @@ -21,15 +21,29 @@ global.define = function (id, injects, factory) { var module = currentModule; - var req = function(relativeId) { + var req = function(relativeId, callback) { + if (Array.isArray(relativeId)) { + // async require + return callback.apply(this, relativeId.map(req)) + } + + var chunks = relativeId.split("!"); + if (chunks.length >= 2) { + var prefix = chunks[0]; + relativeId = chunks.slice(1).join("!") + } + if (relativeId.charAt(0) === '.') { var rootPath = path.dirname(path.dirname(requireModule.filename)) + "/", absolutePath = path.dirname(module.filename) + "/" + relativeId; relativeId = "../" + absolutePath.match(new RegExp(rootPath + "(.*)"))[1]; } - - return require(relativeId); + + if (prefix == "text") { + return fs.readFileSync(findModulePath(relativeId)) + } else + return require(relativeId); }; if (!factory) { // two or less arguments @@ -77,3 +91,57 @@ global.define = function (id, injects, factory) { module.exports = returned; } }; + +// slighly modified version of +// https://github.com/ry/node/blob/1dad95a3a960c645ffec28f9ec023dad6a17c0d4/src/node.js#L159 +// +// given a module name, and a list of paths to test, returns the first +// matching file in the following precedence. +// +// require("a.") +// -> a. +// +// require("a") +// -> a +// -> a. +// -> a/index. +function findModulePath(request) { + var fs = require('fs'), + exts = ["js"], + paths = ['.'].concat(require.paths) + + paths = request.charAt(0) === '/' ? [''] : paths; + + // check if the file exists and is not a directory + var tryFile = function(requestPath) { + try { + var stats = fs.statSync(requestPath); + if (stats && !stats.isDirectory()) { + return requestPath; + } + } catch (e) {} + return false; + }; + + // given a path check a the file exists with any of the set extensions + var tryExtensions = function(p, extension) { + for (var i = 0, EL = exts.length; i < EL; i++) { + f = tryFile(p + exts[i]); + if (f) { return f; } + } + return false; + }; + + // For each path + for (var i = 0, PL = paths.length; i < PL; i++) { + var p = paths[i], + // try to join the request to the path + f = tryFile(path.join(p, request)) || + // try it with each of the extensions + tryExtensions(path.join(p, request)) || + // try it with each of the extensions at "index" + tryExtensions(path.join(p, request, 'index')); + if (f) { return f; } + } + return false; +} \ No newline at end of file