From f381b26fd20c9f9717609077127f064b020416d7 Mon Sep 17 00:00:00 2001 From: mikedeboer Date: Mon, 18 Oct 2010 14:38:23 +0200 Subject: [PATCH 01/14] fixed search case boolean setting --- src/ace/Search.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ace/Search.js b/src/ace/Search.js index 61bdf5d2..2399f172 100644 --- a/src/ace/Search.js +++ b/src/ace/Search.js @@ -170,7 +170,7 @@ Search.SELECTION = 2; } var modifier = "g"; - if (this.$options.caseSensitive) { + if (!this.$options.caseSensitive) { modifier += "i"; } From 7e2a2d3493129d456498494eeb7e55b84aa0d401 Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Mon, 18 Oct 2010 19:52:31 +0200 Subject: [PATCH 02/14] refactor tests --- jsTestDriver.conf | 26 ++--- .../ace => ace/test}/ChangeDocumentTest.js | 28 ++++-- src/{test/ace => ace/test}/DocumentTest.js | 57 +++++++---- .../ace => ace/test}/EventEmitterTest.js | 13 ++- src/{test/ace => ace/test}/MockRenderer.js | 6 ++ src/{test/ace => ace/test}/NavigationTest.js | 27 +++-- src/{test/ace => ace/test}/RangeTest.js | 35 ++++--- src/{test/ace => ace/test}/SearchTest.js | 99 ++++++++++--------- src/{test/ace => ace/test}/SelectionTest.js | 33 ++++--- src/{test/ace => ace/test}/TextEditTest.js | 87 +++++++++------- .../ace => ace/test}/VirtualRendererTest.js | 16 ++- src/ace/test/all.js | 11 +++ src/{test/ace => ace/test}/assertions.js | 13 ++- src/{test/ace => ace/test}/mode/CssTest.js | 23 ++++- .../ace => ace/test}/mode/CssTokenizerTest.js | 11 ++- src/{test/ace => ace/test}/mode/HtmlTest.js | 19 +++- .../test}/mode/HtmlTokenizerTest.js | 11 ++- .../ace => ace/test}/mode/JavaScriptTest.js | 39 +++++--- .../test}/mode/JavaScriptTokenizerTest.js | 11 ++- src/{test/ace => ace/test}/mode/TextTest.js | 19 +++- src/{test/ace => ace/test}/mode/XmlTest.js | 23 ++++- .../ace => ace/test}/mode/XmlTokenizerTest.js | 11 ++- 22 files changed, 428 insertions(+), 190 deletions(-) rename src/{test/ace => ace/test}/ChangeDocumentTest.js (87%) rename src/{test/ace => ace/test}/DocumentTest.js (84%) rename src/{test/ace => ace/test}/EventEmitterTest.js (78%) rename src/{test/ace => ace/test}/MockRenderer.js (97%) rename src/{test/ace => ace/test}/NavigationTest.js (84%) rename src/{test/ace => ace/test}/RangeTest.js (78%) rename src/{test/ace => ace/test}/SearchTest.js (75%) rename src/{test/ace => ace/test}/SelectionTest.js (92%) rename src/{test/ace => ace/test}/TextEditTest.js (77%) rename src/{test/ace => ace/test}/VirtualRendererTest.js (85%) create mode 100644 src/ace/test/all.js rename src/{test/ace => ace/test}/assertions.js (66%) rename src/{test/ace => ace/test}/mode/CssTest.js (77%) rename src/{test/ace => ace/test}/mode/CssTokenizerTest.js (90%) rename src/{test/ace => ace/test}/mode/HtmlTest.js (75%) rename src/{test/ace => ace/test}/mode/HtmlTokenizerTest.js (88%) rename src/{test/ace => ace/test}/mode/JavaScriptTest.js (82%) rename src/{test/ace => ace/test}/mode/JavaScriptTokenizerTest.js (92%) rename src/{test/ace => ace/test}/mode/TextTest.js (70%) rename src/{test/ace => ace/test}/mode/XmlTest.js (74%) rename src/{test/ace => ace/test}/mode/XmlTokenizerTest.js (84%) diff --git a/jsTestDriver.conf b/jsTestDriver.conf index 12b88997..8407508c 100644 --- a/jsTestDriver.conf +++ b/jsTestDriver.conf @@ -2,17 +2,19 @@ server: http://localhost:4224 load: - - src/ace/lib/core.js - - src/ace/lib/*.js - - src/ace/MEventEmitter.js - - src/ace/mode/Text.js - - src/ace/mode/TextHighlightRules.js - - src/ace/mode/*.js - - src/ace/layer/*.js - - src/ace/*.js + - demo/require.js +# - src/ace/lib/core.js +# - src/ace/lib/*.js +# - src/ace/MEventEmitter.js +# - src/ace/mode/Text.js +# - src/ace/mode/TextHighlightRules.js +# - src/ace/mode/*.js +# - src/ace/layer/*.js +# - src/ace/*.js - - src/debug/*.js +# - src/debug/*.js - - src/test/ace/*.js - - src/test/ace/mode/*.js - - src/test/debug/*.js \ No newline at end of file +# - src/test/ace/*.js +# - src/test/ace/mode/*.js +# - src/test/debug/*.js + - src/ace/test/all.js \ No newline at end of file diff --git a/src/test/ace/ChangeDocumentTest.js b/src/ace/test/ChangeDocumentTest.js similarity index 87% rename from src/test/ace/ChangeDocumentTest.js rename to src/ace/test/ChangeDocumentTest.js index 98db7997..796b9e42 100644 --- a/src/test/ace/ChangeDocumentTest.js +++ b/src/ace/test/ChangeDocumentTest.js @@ -5,12 +5,26 @@ * @license LGPLv3 * @author Fabian Jakobs */ -var ChangeDocumentTest = new TestCase("ChangeDocumentTest", { +require.def([ + "ace/Document", + "ace/Editor", + "ace/mode/Text", + "ace/mode/JavaScript", + "ace/test/MockRenderer" + ], function( + Document, + Editor, + TextMode, + JavaScriptMode, + MockRenderer + ) { + +var ChangeDocumentTest = new TestCase("ChangeDocumentTest", { setUp : function() { - this.doc1 = new ace.Document(["abc", "def"].join("\n")); - this.doc2 = new ace.Document(["ghi", "jkl"].join("\n")); - this.editor = new ace.Editor(new MockRenderer()); + 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() { @@ -105,10 +119,12 @@ var ChangeDocumentTest = new TestCase("ChangeDocumentTest", { this.editor.setDocument(this.doc2); var called = false; - this.doc1.setMode(new ace.mode.Text()); + this.doc1.setMode(new Text()); assertFalse(called); - this.doc2.setMode(new ace.mode.JavaScript()); + this.doc2.setMode(new JavaScriptMode()); assertTrue(called); } +}); + }); \ No newline at end of file diff --git a/src/test/ace/DocumentTest.js b/src/ace/test/DocumentTest.js similarity index 84% rename from src/test/ace/DocumentTest.js rename to src/ace/test/DocumentTest.js index 6a8f8a36..1caadebf 100644 --- a/src/test/ace/DocumentTest.js +++ b/src/ace/test/DocumentTest.js @@ -5,10 +5,23 @@ * @license LGPLv3 * @author Fabian Jakobs */ + +require.def([ + "ace/Document", + "ace/UndoManager", + "ace/Editor", + "ace/test/MockRenderer" + ], function( + Document, + UndoManager, + Editor, + MockRenderer + ) { + var TextDocumentTest = new TestCase("TextDocumentTest", { "test: find matching opening bracket" : function() { - var doc = new ace.Document(["(()(", "())))"]); + var doc = new Document(["(()(", "())))"]); assertPosition(0, 1, doc.findMatchingBracket({row: 0, column: 3})); assertPosition(1, 0, doc.findMatchingBracket({row: 1, column: 2})); @@ -18,7 +31,7 @@ var TextDocumentTest = new TestCase("TextDocumentTest", { }, "test: find matching closing bracket" : function() { - var doc = new ace.Document(["(()(", "())))"]); + var doc = new Document(["(()(", "())))"]); assertPosition(1, 1, doc.findMatchingBracket({row: 1, column: 1})); assertPosition(1, 1, doc.findMatchingBracket({row: 1, column: 1})); @@ -29,7 +42,7 @@ var TextDocumentTest = new TestCase("TextDocumentTest", { }, "test: match different bracket types" : function() { - var doc = new ace.Document(["({[", ")]}"]); + var doc = new Document(["({[", ")]}"]); assertPosition(1, 0, doc.findMatchingBracket({row: 0, column: 1})); assertPosition(1, 2, doc.findMatchingBracket({row: 0, column: 2})); @@ -41,7 +54,7 @@ var TextDocumentTest = new TestCase("TextDocumentTest", { }, "test: move lines down" : function() { - var doc = new ace.Document(["1", "2", "3", "4"]); + var doc = new Document(["1", "2", "3", "4"]); doc.moveLinesDown(0, 1); assertEquals(["3", "1", "2", "4"].join("\n"), doc.toString()); @@ -57,7 +70,7 @@ var TextDocumentTest = new TestCase("TextDocumentTest", { }, "test: move lines up" : function() { - var doc = new ace.Document(["1", "2", "3", "4"]); + var doc = new Document(["1", "2", "3", "4"]); doc.moveLinesUp(2, 3); assertEquals(["1", "3", "4", "2"].join("\n"), doc.toString()); @@ -73,70 +86,70 @@ var TextDocumentTest = new TestCase("TextDocumentTest", { }, "test: duplicate lines" : function() { - var doc = new ace.Document(["1", "2", "3", "4"]); + var doc = new Document(["1", "2", "3", "4"]); doc.duplicateLines(1, 2); assertEquals(["1", "2", "3", "2", "3", "4"].join("\n"), doc.toString()); }, "test: duplicate last line" : function() { - var doc = new ace.Document(["1", "2", "3"]); + var doc = new Document(["1", "2", "3"]); doc.duplicateLines(2, 2); assertEquals(["1", "2", "3", "3"].join("\n"), doc.toString()); }, "test: duplicate first line" : function() { - var doc = new ace.Document(["1", "2", "3"]); + var doc = new Document(["1", "2", "3"]); doc.duplicateLines(0, 0); assertEquals(["1", "1", "2", "3"].join("\n"), doc.toString()); }, "test: should handle unix style new lines" : function() { - var doc = new ace.Document(["1", "2", "3"]); + var doc = new Document(["1", "2", "3"]); assertEquals(["1", "2", "3"].join("\n"), doc.toString()); }, "test: should handle windows style new lines" : function() { - var doc = new ace.Document(["1", "2", "3"].join("\r\n")); + var doc = new Document(["1", "2", "3"].join("\r\n")); doc.setNewLineMode("unix"); assertEquals(["1", "2", "3"].join("\n"), doc.toString()); }, "test: set new line mode to 'windows' should use '\r\n' as new lines": function() { - var doc = new ace.Document(["1", "2", "3"].join("\n")); + var doc = new Document(["1", "2", "3"].join("\n")); doc.setNewLineMode("windows"); assertEquals(["1", "2", "3"].join("\r\n"), doc.toString()); }, "test: set new line mode to 'unix' should use '\n' as new lines": function() { - var doc = new ace.Document(["1", "2", "3"].join("\r\n")); + var doc = new Document(["1", "2", "3"].join("\r\n")); doc.setNewLineMode("unix"); assertEquals(["1", "2", "3"].join("\n"), doc.toString()); }, "test: set new line mode to 'auto' should use detect the incoming nl type": function() { - var doc = new ace.Document(["1", "2", "3"].join("\n")); + var doc = new Document(["1", "2", "3"].join("\n")); doc.setNewLineMode("auto"); assertEquals(["1", "2", "3"].join("\n"), doc.toString()); - var doc = new ace.Document(["1", "2", "3"].join("\r\n")); + var doc = new Document(["1", "2", "3"].join("\r\n")); doc.setNewLineMode("auto"); assertEquals(["1", "2", "3"].join("\r\n"), doc.toString()); - doc.replace(new ace.Range(0, 0, 2, 1), ["4", "5", "6"].join("\n")); + doc.replace(new Range(0, 0, 2, 1), ["4", "5", "6"].join("\n")); assertEquals(["4", "5", "6"].join("\n"), doc.toString()); }, "test: undo/redo for delete line" : function() { - var doc = new ace.Document(["111", "222", "333"]); - var undoManager = new ace.UndoManager(); + var doc = new Document(["111", "222", "333"]); + var undoManager = new UndoManager(); doc.setUndoManager(undoManager); var initialText = doc.toString(); - var editor = new ace.Editor(new MockRenderer(), doc); + var editor = new Editor(new MockRenderer(), doc); editor.removeLines(); var step1 = doc.toString(); @@ -172,7 +185,7 @@ var TextDocumentTest = new TestCase("TextDocumentTest", { }, "test: convert document to screen coordinates" : function() { - var doc = new ace.Document("01234\t567890\t1234"); + var doc = new Document("01234\t567890\t1234"); doc.setTabSize(4); assertEquals(0, doc.documentToScreenColumn(0, 0)); @@ -193,7 +206,7 @@ var TextDocumentTest = new TestCase("TextDocumentTest", { }, "test: convert document to scrren coordinates with leading tabs": function() { - var doc = new ace.Document("\t\t123"); + var doc = new Document("\t\t123"); doc.setTabSize(4); assertEquals(0, doc.documentToScreenColumn(0, 0)); @@ -203,7 +216,7 @@ var TextDocumentTest = new TestCase("TextDocumentTest", { }, "test: convert screen to document coordinates" : function() { - var doc = new ace.Document("01234\t567890\t1234"); + var doc = new Document("01234\t567890\t1234"); doc.setTabSize(4); assertEquals(0, doc.screenToDocumentColumn(0, 0)); @@ -216,4 +229,6 @@ var TextDocumentTest = new TestCase("TextDocumentTest", { assertEquals(12, doc.screenToDocumentColumn(0, 15)); assertEquals(13, doc.screenToDocumentColumn(0, 19)); } +}); + }); \ No newline at end of file diff --git a/src/test/ace/EventEmitterTest.js b/src/ace/test/EventEmitterTest.js similarity index 78% rename from src/test/ace/EventEmitterTest.js rename to src/ace/test/EventEmitterTest.js index a2e092fa..22c6e9fe 100644 --- a/src/test/ace/EventEmitterTest.js +++ b/src/ace/test/EventEmitterTest.js @@ -5,9 +5,18 @@ * @license LGPLv3 * @author Fabian Jakobs */ + +require.def([ + "ace/lib/oop", + "ace/MEventEmitter" + ], function( + oop, + MEventEmitter + ) { + var EventEmitter = function() {}; -ace.implement(EventEmitter.prototype, ace.MEventEmitter); +oop.implement(EventEmitter.prototype, MEventEmitter); var EventEmitterTest = new TestCase("EventEmitterTest", { "test: dispatch event with no data" : function() { @@ -22,4 +31,6 @@ var EventEmitterTest = new TestCase("EventEmitterTest", { emitter.$dispatchEvent("juhu"); assertTrue(called); } +}); + }); \ No newline at end of file diff --git a/src/test/ace/MockRenderer.js b/src/ace/test/MockRenderer.js similarity index 97% rename from src/test/ace/MockRenderer.js rename to src/ace/test/MockRenderer.js index 589f72bf..2d14096f 100644 --- a/src/test/ace/MockRenderer.js +++ b/src/ace/test/MockRenderer.js @@ -5,6 +5,9 @@ * @license LGPLv3 * @author Fabian Jakobs */ + +require.def([], function() { + MockRenderer = function(visibleRowCount) { this.container = document.createElement("div"); this.cursor = { @@ -80,3 +83,6 @@ MockRenderer.prototype.addMarker = function() { MockRenderer.prototype.setBreakpoints = function() { }; + +return MockRenderer; +}); diff --git a/src/test/ace/NavigationTest.js b/src/ace/test/NavigationTest.js similarity index 84% rename from src/test/ace/NavigationTest.js rename to src/ace/test/NavigationTest.js index 91a3e9ff..45e73cc2 100644 --- a/src/test/ace/NavigationTest.js +++ b/src/ace/test/NavigationTest.js @@ -5,17 +5,28 @@ * @license LGPLv3 * @author Fabian Jakobs */ + +require.def([ + "ace/Document", + "ace/Editor", + "ace/test/MockRenderer" + ], function( + Document, + Editor, + MockRenderer + ) { + var NavigationTest = TestCase("NavigationTest", { createTextDocument : function(rows, cols) { var line = new Array(cols + 1).join("a"); var text = new Array(rows).join(line + "\n") + line; - return new ace.Document(text); + return new Document(text); }, "test: navigate to end of file should scroll the last line into view" : function() { var doc = this.createTextDocument(200, 10); - var editor = new ace.Editor(new MockRenderer(), doc); + var editor = new Editor(new MockRenderer(), doc); editor.navigateFileEnd(); var cursor = editor.getCursorPosition(); @@ -26,7 +37,7 @@ var NavigationTest = TestCase("NavigationTest", "test: navigate to start of file should scroll the first row into view" : function() { var doc = this.createTextDocument(200, 10); - var editor = new ace.Editor(new MockRenderer(), doc); + var editor = new Editor(new MockRenderer(), doc); editor.moveCursorTo(editor.getLastVisibleRow() + 20); editor.navigateFileStart(); @@ -35,7 +46,7 @@ var NavigationTest = TestCase("NavigationTest", }, "test: goto hidden line should scroll the line into the middle of the viewport" : function() { - var editor = new ace.Editor(new MockRenderer(), this.createTextDocument(200, 5)); + var editor = new Editor(new MockRenderer(), this.createTextDocument(200, 5)); editor.navigateTo(0, 0); editor.gotoLine(101); @@ -69,7 +80,7 @@ var NavigationTest = TestCase("NavigationTest", }, "test: goto visible line should only move the cursor and not scroll": function() { - var editor = new ace.Editor(new MockRenderer(), this.createTextDocument(200, 5)); + var editor = new Editor(new MockRenderer(), this.createTextDocument(200, 5)); editor.navigateTo(0, 0); editor.gotoLine(12); @@ -83,7 +94,7 @@ var NavigationTest = TestCase("NavigationTest", }, "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 ace.Editor(new MockRenderer(), new ace.Document(["123456", "1"])); + var editor = new Editor(new MockRenderer(), new Document(["123456", "1"])); editor.navigateTo(0, 6); assertPosition(0, 6, editor.getCursorPosition()); @@ -96,7 +107,7 @@ var NavigationTest = TestCase("NavigationTest", }, "test: reset desired column on navigate left or right": function() { - var editor = new ace.Editor(new MockRenderer(), new ace.Document(["123456", "12"])); + var editor = new Editor(new MockRenderer(), new Document(["123456", "12"])); editor.navigateTo(0, 6); assertPosition(0, 6, editor.getCursorPosition()); @@ -110,4 +121,6 @@ var NavigationTest = TestCase("NavigationTest", editor.navigateUp(); assertPosition(0, 1, editor.getCursorPosition()); } +}); + }); \ No newline at end of file diff --git a/src/test/ace/RangeTest.js b/src/ace/test/RangeTest.js similarity index 78% rename from src/test/ace/RangeTest.js rename to src/ace/test/RangeTest.js index ae8e5b2b..346ed5fe 100644 --- a/src/test/ace/RangeTest.js +++ b/src/ace/test/RangeTest.js @@ -5,10 +5,17 @@ * @license LGPLv3 * @author Fabian Jakobs */ + +require.def([ + "ace/Range" + ], function( + Range + ) { + RangeTest = new TestCase("RangeTest", { "test: create range": function() { - var range = new ace.Range(1,2,3,4); + var range = new Range(1,2,3,4); assertEquals(1, range.start.row); assertEquals(2, range.start.column); @@ -17,7 +24,7 @@ RangeTest = new TestCase("RangeTest", { }, "test: create from points": function() { - var range = ace.Range.fromPoints({row: 1, column: 2}, {row:3, column:4}); + var range = Range.fromPoints({row: 1, column: 2}, {row:3, column:4}); assertEquals(1, range.start.row); assertEquals(2, range.start.column); @@ -26,10 +33,10 @@ RangeTest = new TestCase("RangeTest", { }, "test: clip to rows": function() { - assertRange(10, 0, 31, 0, new ace.Range(0, 20, 100, 30).clipRows(10, 30)); - assertRange(10, 0, 30, 10, new ace.Range(0, 20, 30, 10).clipRows(10, 30)); + 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)); - var range = new ace.Range(0, 20, 3, 10); + var range = new Range(0, 20, 3, 10); var range = range.clipRows(10, 30); assertTrue(range.isEmpty()); @@ -37,23 +44,23 @@ RangeTest = new TestCase("RangeTest", { }, "test: isEmpty": function() { - var range = new ace.Range(1, 2, 1, 2); + var range = new Range(1, 2, 1, 2); assertTrue(range.isEmpty()); - var range = new ace.Range(1, 2, 1, 6); + var range = new Range(1, 2, 1, 6); assertFalse(range.isEmpty()); }, "test: is multi line": function() { - var range = new ace.Range(1, 2, 1, 6); + var range = new Range(1, 2, 1, 6); assertFalse(range.isMultiLine()); - var range = new ace.Range(1, 2, 2, 6); + var range = new Range(1, 2, 2, 6); assertTrue(range.isMultiLine()); }, "test: clone": function() { - var range = new ace.Range(1, 2, 3, 4); + var range = new Range(1, 2, 3, 4); var clone = range.clone(); assertPosition(1, 2, clone.start); @@ -67,7 +74,7 @@ RangeTest = new TestCase("RangeTest", { }, "test: contains for multi line ranges": function() { - var range = new ace.Range(1, 10, 5, 20); + var range = new Range(1, 10, 5, 20); assertTrue(range.contains(1, 10)); assertTrue(range.contains(2, 0)); @@ -81,7 +88,7 @@ RangeTest = new TestCase("RangeTest", { }, "test: contains for single line ranges": function() { - var range = new ace.Range(1, 10, 1, 20); + var range = new Range(1, 10, 1, 20); assertTrue(range.contains(1, 10)); assertTrue(range.contains(1, 15)); @@ -94,7 +101,7 @@ RangeTest = new TestCase("RangeTest", { }, "test: extend range": function() { - var range = new ace.Range(2, 10, 2, 30); + var range = new Range(2, 10, 2, 30); var range = range.extend(2, 5); assertRange(2, 5, 2, 30, range); @@ -111,4 +118,6 @@ RangeTest = new TestCase("RangeTest", { var range = range.extend(6, 10); assertRange(1, 4, 6, 10, range); } +}); + }); \ No newline at end of file diff --git a/src/test/ace/SearchTest.js b/src/ace/test/SearchTest.js similarity index 75% rename from src/test/ace/SearchTest.js rename to src/ace/test/SearchTest.js index cc8e7f0e..81397065 100644 --- a/src/test/ace/SearchTest.js +++ b/src/ace/test/SearchTest.js @@ -5,19 +5,28 @@ * @license LGPLv3 * @author Fabian Jakobs */ + +require.def([ + "ace/Document", + "ace/Search" + ], function( + Document, + Search + ) { + var SearchTest = new TestCase("SearchTest", { "test: configure the search object" : function() { - var search = new ace.Search(); + var search = new Search(); search.set({ needle: "juhu", - scope: ace.Search.ALL + scope: Search.ALL }); }, "test: find simple text in document" : function() { - var doc = new ace.Document(["juhu kinners 123", "456"]); - var search = new ace.Search().set({ + var doc = new Document(["juhu kinners 123", "456"]); + var search = new Search().set({ needle: "kinners" }); @@ -27,8 +36,8 @@ var SearchTest = new TestCase("SearchTest", { }, "test: find simple text in next line" : function() { - var doc = new ace.Document(["abc", "juhu kinners 123", "456"]); - var search = new ace.Search().set({ + var doc = new Document(["abc", "juhu kinners 123", "456"]); + var search = new Search().set({ needle: "kinners" }); @@ -38,9 +47,9 @@ var SearchTest = new TestCase("SearchTest", { }, "test: find text starting at cursor position" : function() { - var doc = new ace.Document(["juhu kinners", "juhu kinners 123"]); + var doc = new Document(["juhu kinners", "juhu kinners 123"]); doc.getSelection().moveCursorTo(0, 6); - var search = new ace.Search().set({ + var search = new Search().set({ needle: "kinners" }); @@ -50,10 +59,10 @@ var SearchTest = new TestCase("SearchTest", { }, "test: wrap search is off by default" : function() { - var doc = new ace.Document(["abc", "juhu kinners 123", "456"]); + var doc = new Document(["abc", "juhu kinners 123", "456"]); doc.getSelection().moveCursorTo(2, 1); - var search = new ace.Search().set({ + var search = new Search().set({ needle: "kinners" }); @@ -61,10 +70,10 @@ var SearchTest = new TestCase("SearchTest", { }, "test: wrap search should wrap at file end" : function() { - var doc = new ace.Document(["abc", "juhu kinners 123", "456"]); + var doc = new Document(["abc", "juhu kinners 123", "456"]); doc.getSelection().moveCursorTo(2, 1); - var search = new ace.Search().set({ + var search = new Search().set({ needle: "kinners", wrap: true }); @@ -75,10 +84,10 @@ var SearchTest = new TestCase("SearchTest", { }, "test: wrap search with no match should return 'null'": function() { - var doc = new ace.Document(["abc", "juhu kinners 123", "456"]); + var doc = new Document(["abc", "juhu kinners 123", "456"]); doc.getSelection().moveCursorTo(2, 1); - var search = new ace.Search().set({ + var search = new Search().set({ needle: "xyz", wrap: true }); @@ -87,9 +96,9 @@ var SearchTest = new TestCase("SearchTest", { }, "test: case sensitive is by default off": function() { - var doc = new ace.Document(["abc", "juhu kinners 123", "456"]); + var doc = new Document(["abc", "juhu kinners 123", "456"]); - var search = new ace.Search().set({ + var search = new Search().set({ needle: "JUHU" }); @@ -97,9 +106,9 @@ var SearchTest = new TestCase("SearchTest", { }, "test: case sensitive search": function() { - var doc = new ace.Document(["abc", "juhu kinners 123", "456"]); + var doc = new Document(["abc", "juhu kinners 123", "456"]); - var search = new ace.Search().set({ + var search = new Search().set({ needle: "KINNERS", caseSensitive: true }); @@ -110,9 +119,9 @@ var SearchTest = new TestCase("SearchTest", { }, "test: whole word search should not match inside of words": function() { - var doc = new ace.Document(["juhukinners", "juhu kinners 123", "456"]); + var doc = new Document(["juhukinners", "juhu kinners 123", "456"]); - var search = new ace.Search().set({ + var search = new Search().set({ needle: "kinners", wholeWord: true }); @@ -123,9 +132,9 @@ var SearchTest = new TestCase("SearchTest", { }, "test: find backwards": function() { - var doc = new ace.Document(["juhu juhu juhu juhu"]); + var doc = new Document(["juhu juhu juhu juhu"]); doc.getSelection().moveCursorTo(0, 10); - var search = new ace.Search().set({ + var search = new Search().set({ needle: "juhu", backwards: true }); @@ -136,14 +145,14 @@ var SearchTest = new TestCase("SearchTest", { }, "test: find in selection": function() { - var doc = new ace.Document(["juhu", "juhu", "juhu", "juhu"]); + var doc = new Document(["juhu", "juhu", "juhu", "juhu"]); doc.getSelection().setSelectionAnchor(1, 0); doc.getSelection().selectTo(3, 5); - var search = new ace.Search().set({ + var search = new Search().set({ needle: "juhu", wrap: true, - scope: ace.Search.SELECTION + scope: Search.SELECTION }); var range = search.find(doc); @@ -159,13 +168,13 @@ var SearchTest = new TestCase("SearchTest", { }, "test: find backwards in selection": function() { - var doc = new ace.Document(["juhu", "juhu", "juhu", "juhu"]); + var doc = new Document(["juhu", "juhu", "juhu", "juhu"]); - var search = new ace.Search().set({ + var search = new Search().set({ needle: "juhu", wrap: true, backwards: true, - scope: ace.Search.SELECTION + scope: Search.SELECTION }); doc.getSelection().setSelectionAnchor(0, 2); @@ -182,9 +191,9 @@ var SearchTest = new TestCase("SearchTest", { }, "test: edge case - match directly before the cursor" : function() { - var doc = new ace.Document(["123", "123", "juhu"]); + var doc = new Document(["123", "123", "juhu"]); - var search = new ace.Search().set({ + var search = new Search().set({ needle: "juhu", wrap: true }); @@ -197,9 +206,9 @@ var SearchTest = new TestCase("SearchTest", { }, "test: edge case - match backwards directly after the cursor" : function() { - var doc = new ace.Document(["123", "123", "juhu"]); + var doc = new Document(["123", "123", "juhu"]); - var search = new ace.Search().set({ + var search = new Search().set({ needle: "juhu", wrap: true, backwards: true @@ -213,9 +222,9 @@ var SearchTest = new TestCase("SearchTest", { }, "test: find using a regular expression" : function() { - var doc = new ace.Document(["abc123 123 cd", "abc"]); + var doc = new Document(["abc123 123 cd", "abc"]); - var search = new ace.Search().set({ + var search = new Search().set({ needle: "\\d+", regExp: true }); @@ -226,9 +235,9 @@ var SearchTest = new TestCase("SearchTest", { }, "test: find using a regular expression and whole word" : function() { - var doc = new ace.Document(["abc123 123 cd", "abc"]); + var doc = new Document(["abc123 123 cd", "abc"]); - var search = new ace.Search().set({ + var search = new Search().set({ needle: "\\d+\\b", regExp: true, wholeWord: true @@ -240,9 +249,9 @@ var SearchTest = new TestCase("SearchTest", { }, "test: use regular expressions with capture groups": function() { - var doc = new ace.Document([" ab: 12px", "

* @author Fabian Jakobs */ + +require.def([ + "ace/Document" + ], function( + Document + ) { + var SelectionTest = TestCase("SelectionTest", { createTextDocument : function(rows, cols) { var line = new Array(cols + 1).join("a"); var text = new Array(rows).join(line + "\n") + line; - return new ace.Document(text); + return new Document(text); }, "test: move cursor to end of file should place the cursor on last row and column" : function() { @@ -56,7 +63,7 @@ var SelectionTest = TestCase("SelectionTest", }, "test: move cursor word right" : function() { - var doc = new ace.Document( ["ab", + var doc = new Document( ["ab", " Juhu Kinners (abc, 12)", " cde"].join("\n")); var selection = doc.getSelection(); @@ -96,7 +103,7 @@ var SelectionTest = TestCase("SelectionTest", }, "test: select word right if cursor in word" : function() { - var doc = new ace.Document("Juhu Kinners"); + var doc = new Document("Juhu Kinners"); var selection = doc.getSelection(); selection.moveCursorTo(0, 2); @@ -106,7 +113,7 @@ var SelectionTest = TestCase("SelectionTest", }, "test: moveCursor word left" : function() { - var doc = new ace.Document( ["ab", + var doc = new Document( ["ab", " Juhu Kinners (abc, 12)", " cde"].join("\n")); var selection = doc.getSelection(); @@ -147,7 +154,7 @@ var SelectionTest = TestCase("SelectionTest", }, "test: select word left if cursor in word" : function() { - var doc = new ace.Document("Juhu Kinners"); + var doc = new Document("Juhu Kinners"); var selection = doc.getSelection(); selection.moveCursorTo(0, 8); @@ -157,7 +164,7 @@ var SelectionTest = TestCase("SelectionTest", }, "test: select word right and select" : function() { - var doc = new ace.Document("Juhu Kinners"); + var doc = new Document("Juhu Kinners"); var selection = doc.getSelection(); selection.moveCursorTo(0, 0); @@ -170,7 +177,7 @@ var SelectionTest = TestCase("SelectionTest", }, "test: select word left and select" : function() { - var doc = new ace.Document("Juhu Kinners"); + var doc = new Document("Juhu Kinners"); var selection = doc.getSelection(); selection.moveCursorTo(0, 3); @@ -183,7 +190,7 @@ var SelectionTest = TestCase("SelectionTest", }, "test: select word with cursor in word should select the word" : function() { - var doc = new ace.Document("Juhu Kinners 123"); + var doc = new Document("Juhu Kinners 123"); var selection = doc.getSelection(); selection.moveCursorTo(0, 8); @@ -195,7 +202,7 @@ var SelectionTest = TestCase("SelectionTest", }, "test: select word with cursor betwen white space and word should select the word" : function() { - var doc = new ace.Document("Juhu Kinners"); + var doc = new Document("Juhu Kinners"); var selection = doc.getSelection(); selection.moveCursorTo(0, 4); @@ -214,7 +221,7 @@ var SelectionTest = TestCase("SelectionTest", }, "test: select word with cursor in white space should select white space" : function() { - var doc = new ace.Document("Juhu Kinners"); + var doc = new Document("Juhu Kinners"); var selection = doc.getSelection(); selection.moveCursorTo(0, 5); @@ -226,7 +233,7 @@ var SelectionTest = TestCase("SelectionTest", }, "test: moving cursor should fire a 'changeCursor' event" : function() { - var doc = new ace.Document("Juhu Kinners"); + var doc = new Document("Juhu Kinners"); var selection = doc.getSelection(); selection.moveCursorTo(0, 5); @@ -241,7 +248,7 @@ var SelectionTest = TestCase("SelectionTest", }, "test: calling setCursor with the same position should not fire an event": function() { - var doc = new ace.Document("Juhu Kinners"); + var doc = new Document("Juhu Kinners"); var selection = doc.getSelection(); selection.moveCursorTo(0, 5); @@ -254,4 +261,6 @@ var SelectionTest = TestCase("SelectionTest", selection.moveCursorTo(0, 5); assertFalse(called); } +}); + }); \ No newline at end of file diff --git a/src/test/ace/TextEditTest.js b/src/ace/test/TextEditTest.js similarity index 77% rename from src/test/ace/TextEditTest.js rename to src/ace/test/TextEditTest.js index aebe21df..654529db 100644 --- a/src/test/ace/TextEditTest.js +++ b/src/ace/test/TextEditTest.js @@ -5,11 +5,24 @@ * @license LGPLv3 * @author Fabian Jakobs */ + +require.def([ + "ace/Document", + "ace/Editor", + "ace/mode/JavaScript", + "ace/test/MockRenderer" + ], function( + Document, + Editor, + JavaScriptMode, + MockRenderer + ) { + var TextEditTest = TestCase("TextEditTest", { "test: delete line from the middle" : function() { - var doc = new ace.Document(["a", "b", "c", "d"].join("\n")); - var editor = new ace.Editor(new MockRenderer(), doc); + var doc = new Document(["a", "b", "c", "d"].join("\n")); + var editor = new Editor(new MockRenderer(), doc); editor.moveCursorTo(1, 1); editor.removeLines(); @@ -34,8 +47,8 @@ var TextEditTest = TestCase("TextEditTest", }, "test: delete multiple selected lines" : function() { - var doc = new ace.Document(["a", "b", "c", "d"].join("\n")); - var editor = new ace.Editor(new MockRenderer(), doc); + var doc = new Document(["a", "b", "c", "d"].join("\n")); + var editor = new Editor(new MockRenderer(), doc); editor.moveCursorTo(1, 1); editor.getSelection().selectDown(); @@ -46,8 +59,8 @@ var TextEditTest = TestCase("TextEditTest", }, "test: delete first line" : function() { - var doc = new ace.Document(["a", "b", "c"].join("\n")); - var editor = new ace.Editor(new MockRenderer(), doc); + var doc = new Document(["a", "b", "c"].join("\n")); + var editor = new Editor(new MockRenderer(), doc); editor.removeLines(); @@ -56,8 +69,8 @@ var TextEditTest = TestCase("TextEditTest", }, "test: delete last" : function() { - var doc = new ace.Document(["a", "b", "c"].join("\n")); - var editor = new ace.Editor(new MockRenderer(), doc); + var doc = new Document(["a", "b", "c"].join("\n")); + var editor = new Editor(new MockRenderer(), doc); editor.moveCursorTo(2, 1); editor.removeLines(); @@ -67,8 +80,8 @@ var TextEditTest = TestCase("TextEditTest", }, "test: indent block" : function() { - var doc = new ace.Document(["a12345", "b12345", "c12345"].join("\n")); - var editor = new ace.Editor(new MockRenderer(), doc); + var doc = new Document(["a12345", "b12345", "c12345"].join("\n")); + var editor = new Editor(new MockRenderer(), doc); editor.moveCursorTo(1, 3); editor.getSelection().selectDown(); @@ -86,8 +99,8 @@ var TextEditTest = TestCase("TextEditTest", }, "test: outdent block" : function() { - var doc = new ace.Document([" a12345", " b12345", " c12345"].join("\n")); - var editor = new ace.Editor(new MockRenderer(), doc); + var doc = new Document([" a12345", " b12345", " c12345"].join("\n")); + var editor = new Editor(new MockRenderer(), doc); editor.moveCursorTo(0, 3); editor.getSelection().selectDown(); @@ -114,8 +127,8 @@ var TextEditTest = TestCase("TextEditTest", }, "test: outent without a selection should update cursor" : function() { - var doc = new ace.Document(" 12"); - var editor = new ace.Editor(new MockRenderer(), doc); + var doc = new Document(" 12"); + var editor = new Editor(new MockRenderer(), doc); editor.moveCursorTo(0, 3); editor.blockOutdent(" "); @@ -125,8 +138,8 @@ var TextEditTest = TestCase("TextEditTest", }, "test: comment lines should perserve selection" : function() { - var doc = new ace.Document([" abc", "cde"].join("\n"), new ace.mode.JavaScript()); - var editor = new ace.Editor(new MockRenderer(), doc); + var doc = new Document([" abc", "cde"].join("\n"), new JavaScriptMode()); + var editor = new Editor(new MockRenderer(), doc); editor.moveCursorTo(0, 2); editor.getSelection().selectDown(); @@ -141,8 +154,8 @@ var TextEditTest = TestCase("TextEditTest", }, "test: uncomment lines should perserve selection" : function() { - var doc = new ace.Document(["// abc", "//cde"].join("\n"), new ace.mode.JavaScript()); - var editor = new ace.Editor(new MockRenderer(), doc); + var doc = new Document(["// abc", "//cde"].join("\n"), new JavaScriptMode()); + var editor = new Editor(new MockRenderer(), doc); editor.moveCursorTo(0, 1); editor.getSelection().selectDown(); @@ -157,8 +170,8 @@ var TextEditTest = TestCase("TextEditTest", "test: comment lines - if the selection end is at the line start it should stay there": function() { //select down - var doc = new ace.Document(["abc", "cde"].join("\n"), new ace.mode.JavaScript()); - var editor = new ace.Editor(new MockRenderer(), doc); + var doc = new Document(["abc", "cde"].join("\n"), new JavaScriptMode()); + var editor = new Editor(new MockRenderer(), doc); editor.moveCursorTo(0, 0); editor.getSelection().selectDown(); @@ -167,8 +180,8 @@ var TextEditTest = TestCase("TextEditTest", assertRange(0, 2, 1, 0, editor.getSelectionRange()); // select up - var doc = new ace.Document(["abc", "cde"].join("\n"), new ace.mode.JavaScript()); - var editor = new ace.Editor(new MockRenderer(), doc); + var doc = new Document(["abc", "cde"].join("\n"), new JavaScriptMode()); + var editor = new Editor(new MockRenderer(), doc); editor.moveCursorTo(1, 0); editor.getSelection().selectUp(); @@ -178,8 +191,8 @@ var TextEditTest = TestCase("TextEditTest", }, "test: move lines down should select moved lines" : function() { - var doc = new ace.Document(["11", "22", "33", "44"].join("\n")); - var editor = new ace.Editor(new MockRenderer(), doc); + var doc = new Document(["11", "22", "33", "44"].join("\n")); + var editor = new Editor(new MockRenderer(), doc); editor.moveCursorTo(0, 1); editor.getSelection().selectDown(); @@ -205,8 +218,8 @@ var TextEditTest = TestCase("TextEditTest", }, "test: move lines up should select moved lines" : function() { - var doc = new ace.Document(["11", "22", "33", "44"].join("\n")); - var editor = new ace.Editor(new MockRenderer(), doc); + var doc = new Document(["11", "22", "33", "44"].join("\n")); + var editor = new Editor(new MockRenderer(), doc); editor.moveCursorTo(2, 1); editor.getSelection().selectDown(); @@ -226,8 +239,8 @@ var TextEditTest = TestCase("TextEditTest", "test: move line without active selection should move cursor to start of the moved line" : function() { - var doc = new ace.Document(["11", "22", "33", "44"].join("\n")); - var editor = new ace.Editor(new MockRenderer(), doc); + var doc = new Document(["11", "22", "33", "44"].join("\n")); + var editor = new Editor(new MockRenderer(), doc); editor.moveCursorTo(1, 1); editor.clearSelection(); @@ -244,8 +257,8 @@ var TextEditTest = TestCase("TextEditTest", }, "test: copy lines down should select lines and place cursor at the selection start" : function() { - var doc = new ace.Document(["11", "22", "33", "44"].join("\n")); - var editor = new ace.Editor(new MockRenderer(), doc); + var doc = new Document(["11", "22", "33", "44"].join("\n")); + var editor = new Editor(new MockRenderer(), doc); editor.moveCursorTo(1, 1); editor.getSelection().selectDown(); @@ -259,8 +272,8 @@ var TextEditTest = TestCase("TextEditTest", }, "test: copy lines up should select lines and place cursor at the selection start" : function() { - var doc = new ace.Document(["11", "22", "33", "44"].join("\n")); - var editor = new ace.Editor(new MockRenderer(), doc); + var doc = new Document(["11", "22", "33", "44"].join("\n")); + var editor = new Editor(new MockRenderer(), doc); editor.moveCursorTo(1, 1); editor.getSelection().selectDown(); @@ -274,8 +287,8 @@ var TextEditTest = TestCase("TextEditTest", }, "test: input a tab with soft tab should convert it to spaces" : function() { - var doc = new ace.Document(""); - var editor = new ace.Editor(new MockRenderer(), doc); + var doc = new Document(""); + var editor = new Editor(new MockRenderer(), doc); doc.setTabSize(2); doc.setUseSoftTabs(true); @@ -289,12 +302,14 @@ var TextEditTest = TestCase("TextEditTest", }, "test: input tab without soft tabs should keep the tab character" : function() { - var doc = new ace.Document(""); - var editor = new ace.Editor(new MockRenderer(), doc); + var doc = new Document(""); + var editor = new Editor(new MockRenderer(), doc); doc.setUseSoftTabs(false); editor.onTextInput("\t"); assertEquals("\t", doc.toString()); } +}); + }); \ No newline at end of file diff --git a/src/test/ace/VirtualRendererTest.js b/src/ace/test/VirtualRendererTest.js similarity index 85% rename from src/test/ace/VirtualRendererTest.js rename to src/ace/test/VirtualRendererTest.js index 3b2e8659..f164fd4b 100644 --- a/src/test/ace/VirtualRendererTest.js +++ b/src/ace/test/VirtualRendererTest.js @@ -5,6 +5,15 @@ * @license LGPLv3 * @author Fabian Jakobs */ + +require.def([ + "ace/Document", + "ace/VirtualRenderer" + ], function( + Document, + VirtualRenderer + ) { + var VirtualRendererTest = new TestCase("VirtualRendererTest", { "test: screen2text the column should be rounded to the next character edge" : function() { @@ -17,8 +26,8 @@ var VirtualRendererTest = new TestCase("VirtualRendererTest", { document.body.style.padding = "0px"; document.body.appendChild(el); - var renderer = new ace.VirtualRenderer(el); - renderer.setDocument(new ace.Document("1234")); + var renderer = new VirtualRenderer(el); + renderer.setDocument(new Document("1234")); renderer.characterWidth = 10; renderer.lineHeight = 15; @@ -33,6 +42,7 @@ var VirtualRendererTest = new TestCase("VirtualRendererTest", { document.body.removeChild(el); } - // change tab size after setDocument (for text layer) +}); + }); \ No newline at end of file diff --git a/src/ace/test/all.js b/src/ace/test/all.js new file mode 100644 index 00000000..be6a4ffa --- /dev/null +++ b/src/ace/test/all.js @@ -0,0 +1,11 @@ +require({ + paths: { + "ace": "../src/ace" + }}, + ["ace/test/assertions", "ace/test/ChangeDocumentTest"], + function(a) { + console.log(a) + alert("a " + a) + } +); + diff --git a/src/test/ace/assertions.js b/src/ace/test/assertions.js similarity index 66% rename from src/test/ace/assertions.js rename to src/ace/test/assertions.js index 3683b90b..8dc4893b 100644 --- a/src/test/ace/assertions.js +++ b/src/ace/test/assertions.js @@ -5,16 +5,21 @@ * @license LGPLv3 * @author Fabian Jakobs */ -assertPosition = function(row, column, cursor) { + +require.def([], function() { + +window.assertPosition = function(row, column, cursor) { assertEquals(row, cursor.row); assertEquals(column, cursor.column); }; -assertRange = function(startRow, startColumn, endRow, endColumn, range) { +window.assertRange = function(startRow, startColumn, endRow, endColumn, range) { assertPosition(startRow, startColumn, range.start); assertPosition(endRow, endColumn, range.end); }; -assertJsonEquals = function(expectedJson, foundJson) { +window.assertJsonEquals = function(expectedJson, foundJson) { assertEquals(JSON.stringify(expectedJson), JSON.stringify(foundJson)); -}; \ No newline at end of file +}; + +}); \ No newline at end of file diff --git a/src/test/ace/mode/CssTest.js b/src/ace/test/mode/CssTest.js similarity index 77% rename from src/test/ace/mode/CssTest.js rename to src/ace/test/mode/CssTest.js index 8ac7758a..0660ad56 100644 --- a/src/test/ace/mode/CssTest.js +++ b/src/ace/test/mode/CssTest.js @@ -5,16 +5,27 @@ * @license LGPLv3 * @author Fabian Jakobs */ -var CssTest = new TestCase("mode.CssTest", { + +require.def([ + "ace/Document", + "ace/Range", + "ace/mode/Css" + ], function( + Document, + Range, + CssMode + ) { + + var CssTest = new TestCase("mode.CssTest", { setUp : function() { - this.mode = new ace.mode.Css(); + this.mode = new CssMode(); }, "test: toggle comment lines should not do anything" : function() { - var doc = new ace.Document([" abc", "cde", "fg"].join("\n")); + var doc = new Document([" abc", "cde", "fg"].join("\n")); - var range = new ace.Range(0, 3, 1, 1); + var range = new Range(0, 3, 1, 1); var comment = this.mode.toggleCommentLines("start", doc, range); assertEquals([" abc", "cde", "fg"].join("\n"), doc.toString()); }, @@ -34,4 +45,6 @@ var CssTest = new TestCase("mode.CssTest", { assertEquals(" ", this.mode.getNextLineIndent("start", " /*{", " ")); assertEquals(" ", this.mode.getNextLineIndent("start", " /*{ ", " ")); } -}); \ No newline at end of file +}); + +}); diff --git a/src/test/ace/mode/CssTokenizerTest.js b/src/ace/test/mode/CssTokenizerTest.js similarity index 90% rename from src/test/ace/mode/CssTokenizerTest.js rename to src/ace/test/mode/CssTokenizerTest.js index 8ece8de1..d6200751 100644 --- a/src/test/ace/mode/CssTokenizerTest.js +++ b/src/ace/test/mode/CssTokenizerTest.js @@ -5,10 +5,17 @@ * @license LGPLv3 * @author Fabian Jakobs */ + +require.def([ + "ace/mode/Css" + ], function( + CssMode + ) { + var CssTest = new TestCase("mode.CssTest", { setUp : function() { - this.tokenizer = new ace.mode.Css().getTokenizer(); + this.tokenizer = new CssMode().getTokenizer(); }, "test: tokenize pixel number" : function() { @@ -41,4 +48,6 @@ var CssTest = new TestCase("mode.CssTest", { assertEquals("text", tokens[1].type); assertEquals("rparen", tokens[2].type); } +}); + }); \ No newline at end of file diff --git a/src/test/ace/mode/HtmlTest.js b/src/ace/test/mode/HtmlTest.js similarity index 75% rename from src/test/ace/mode/HtmlTest.js rename to src/ace/test/mode/HtmlTest.js index 4335a781..d809315f 100644 --- a/src/test/ace/mode/HtmlTest.js +++ b/src/ace/test/mode/HtmlTest.js @@ -5,16 +5,27 @@ * @license LGPLv3 * @author Fabian Jakobs */ + +require.def([ + "ace/Document", + "ace/Range", + "ace/mode/Html" + ], function( + Document, + Range, + HtmlMode + ) { + var HtmlTest = new TestCase("mode.HtmlTest", { setUp : function() { - this.mode = new ace.mode.Html(); + this.mode = new HtmlMode(); }, "test: toggle comment lines should not do anything" : function() { - var doc = new ace.Document([" abc", "cde", "fg"]); + var doc = new Document([" abc", "cde", "fg"]); - var range = new ace.Range(0, 3, 1, 1); + var range = new Range(0, 3, 1, 1); var comment = this.mode.toggleCommentLines("start", doc, range); assertEquals([" abc", "cde", "fg"].join("\n"), doc.toString()); }, @@ -24,4 +35,6 @@ var HtmlTest = new TestCase("mode.HtmlTest", { assertEquals("", this.mode.getNextLineIndent("start", "abc")); assertEquals("\t", this.mode.getNextLineIndent("start", "\tabc")); } +}); + }); \ No newline at end of file diff --git a/src/test/ace/mode/HtmlTokenizerTest.js b/src/ace/test/mode/HtmlTokenizerTest.js similarity index 88% rename from src/test/ace/mode/HtmlTokenizerTest.js rename to src/ace/test/mode/HtmlTokenizerTest.js index a30580c3..b538e4c4 100644 --- a/src/test/ace/mode/HtmlTokenizerTest.js +++ b/src/ace/test/mode/HtmlTokenizerTest.js @@ -5,10 +5,17 @@ * @license LGPLv3 * @author Fabian Jakobs */ + +require.def([ + "ace/mode/Html" + ], function( + HtmlMode + ) { + var HtmlTest = new TestCase("mode.HtmlTest", { setUp : function() { - this.tokenizer = new ace.mode.Html().getTokenizer(); + this.tokenizer = new HtmlMode().getTokenizer(); }, "test: tokenize embedded script" : function() { @@ -29,4 +36,6 @@ var HtmlTest = new TestCase("mode.HtmlTest", { assertEquals("keyword", tokens[9].type); assertEquals("text", tokens[10].type); } +}); + }); \ No newline at end of file diff --git a/src/test/ace/mode/JavaScriptTest.js b/src/ace/test/mode/JavaScriptTest.js similarity index 82% rename from src/test/ace/mode/JavaScriptTest.js rename to src/ace/test/mode/JavaScriptTest.js index fc21d812..8f61d55a 100644 --- a/src/test/ace/mode/JavaScriptTest.js +++ b/src/ace/test/mode/JavaScriptTest.js @@ -5,49 +5,62 @@ * @license LGPLv3 * @author Fabian Jakobs */ + +require.def([ + "ace/Document", + "ace/Range", + "ace/Tokenizer", + "ace/mode/JavaScript" + ], function( + Document, + Range, + Tokenizer, + JavaScriptMode + ) { + var JavaScriptTest = new TestCase("mode.JavaScriptTest", { setUp : function() { - this.mode = new ace.mode.JavaScript(); + this.mode = new JavaScriptMode(); }, "test: getTokenizer() (smoke test)" : function() { var tokenizer = this.mode.getTokenizer(); - assertTrue(tokenizer instanceof ace.Tokenizer); + assertTrue(tokenizer instanceof Tokenizer); var tokens = tokenizer.getLineTokens("'juhu'", "start").tokens; assertEquals("string", tokens[0].type); }, "test: toggle comment lines should prepend '//' to each line" : function() { - var doc = new ace.Document([" abc", "cde", "fg"]); + var doc = new Document([" abc", "cde", "fg"]); - var range = new ace.Range(0, 3, 1, 1); + var range = new Range(0, 3, 1, 1); var comment = this.mode.toggleCommentLines("start", doc, range); assertEquals(["// abc", "//cde", "fg"].join("\n"), doc.toString()); }, "test: toggle comment on commented lines should remove leading '//' chars" : function() { - var doc = new ace.Document(["// abc", "//cde", "fg"]); + var doc = new Document(["// abc", "//cde", "fg"]); - var range = new ace.Range(0, 3, 1, 1); + var range = new Range(0, 3, 1, 1); var comment = this.mode.toggleCommentLines("start", doc, range); assertEquals([" abc", "cde", "fg"].join("\n"), doc.toString()); }, "test: toggle comment on multiple lines with one commented line prepend '//' to each line" : function() { - var doc = new ace.Document(["// abc", "//cde", "fg"]); + var doc = new Document(["// abc", "//cde", "fg"]); - var range = new ace.Range(0, 3, 2, 1); + var range = new Range(0, 3, 2, 1); var comment = this.mode.toggleCommentLines("start", doc, range); assertEquals(["//// abc", "////cde", "//fg"].join("\n"), doc.toString()); }, "test: toggle comment on a comment line with leading white space": function() { - var doc = new ace.Document(["//cde", " //fg"]); + var doc = new Document(["//cde", " //fg"]); - var range = new ace.Range(0, 3, 1, 1); + var range = new Range(0, 3, 1, 1); var comment = this.mode.toggleCommentLines("start", doc, range); assertEquals(["cde", " fg"].join("\n"), doc.toString()); }, @@ -92,15 +105,17 @@ var JavaScriptTest = new TestCase("mode.JavaScriptTest", { }, "test: auto outdent should indent the line with the same indent as the line with the matching opening brace" : function() { - var doc = new ace.Document([" function foo() {", " bla", " }"]); + var doc = new Document([" function foo() {", " bla", " }"]); this.mode.autoOutdent("start", doc, 2); assertEquals(" }", doc.getLine(2)); }, "test: no auto outdent if no matching brace is found" : function() { - var doc = new ace.Document([" function foo()", " bla", " }"]); + var doc = new Document([" function foo()", " bla", " }"]); this.mode.autoOutdent("start", doc, 2); assertEquals(" }", doc.getLine(2)); } +}); + }); \ No newline at end of file diff --git a/src/test/ace/mode/JavaScriptTokenizerTest.js b/src/ace/test/mode/JavaScriptTokenizerTest.js similarity index 92% rename from src/test/ace/mode/JavaScriptTokenizerTest.js rename to src/ace/test/mode/JavaScriptTokenizerTest.js index 7db23a7b..65f40f21 100644 --- a/src/test/ace/mode/JavaScriptTokenizerTest.js +++ b/src/ace/test/mode/JavaScriptTokenizerTest.js @@ -5,10 +5,17 @@ * @license LGPLv3 * @author Fabian Jakobs */ + +require.def([ + "ace/mode/JavaScript" + ], function( + JavaScriptMode + ) { + var JavaScriptTokenizerTest = new TestCase("mode.JavaScriptTokenizerTest", { setUp : function() { - this.tokenizer = new ace.mode.JavaScript().getTokenizer(); + this.tokenizer = new JavaScriptMode().getTokenizer(); }, "test: tokenize1" : function() { @@ -56,4 +63,6 @@ var JavaScriptTokenizerTest = new TestCase("mode.JavaScriptTokenizerTest", { assertEquals("text", tokens[1].type); assertEquals("rparen", tokens[2].type); } +}); + }); \ No newline at end of file diff --git a/src/test/ace/mode/TextTest.js b/src/ace/test/mode/TextTest.js similarity index 70% rename from src/test/ace/mode/TextTest.js rename to src/ace/test/mode/TextTest.js index 6cd1a685..252b867e 100644 --- a/src/test/ace/mode/TextTest.js +++ b/src/ace/test/mode/TextTest.js @@ -5,16 +5,27 @@ * @license LGPLv3 * @author Fabian Jakobs */ + +require.def([ + "ace/Document", + "ace/Range", + "ace/mode/Text" + ], function( + Document, + Range, + TextMode + ) { + var TextTest = new TestCase("mode.TextTest", { setUp : function() { - this.mode = new ace.mode.Text(); + this.mode = new TextMode(); }, "test: toggle comment lines should not do anything" : function() { - var doc = new ace.Document([" abc", "cde", "fg"]); + var doc = new Document([" abc", "cde", "fg"]); - var range = new ace.Range(0, 3, 1, 1); + var range = new Range(0, 3, 1, 1); var comment = this.mode.toggleCommentLines("start", doc, range); assertEquals([" abc", "cde", "fg"].join("\n"), doc.toString()); }, @@ -23,4 +34,6 @@ var TextTest = new TestCase("mode.TextTest", { "text: lines should not be indented" : function() { assertEquals("", this.mode.getNextLineIndent("start", " abc", " ")); } +}); + }); \ No newline at end of file diff --git a/src/test/ace/mode/XmlTest.js b/src/ace/test/mode/XmlTest.js similarity index 74% rename from src/test/ace/mode/XmlTest.js rename to src/ace/test/mode/XmlTest.js index 0692f5c0..8c8e7f92 100644 --- a/src/test/ace/mode/XmlTest.js +++ b/src/ace/test/mode/XmlTest.js @@ -5,25 +5,38 @@ * @license LGPLv3 * @author Fabian Jakobs */ + +require.def([ + "ace/Document", + "ace/Range", + "ace/Tokenizer", + "ace/mode/Xml" + ], function( + Document, + Range, + Tokenizer, + XmlMode + ) { + var XmlTest = new TestCase("mode.XmlTest", { setUp : function() { - this.mode = new ace.mode.Xml(); + this.mode = new XmlMode(); }, "test: getTokenizer() (smoke test)" : function() { var tokenizer = this.mode.getTokenizer(); - assertTrue(tokenizer instanceof ace.Tokenizer); + assertTrue(tokenizer instanceof Tokenizer); var tokens = tokenizer.getLineTokens("", "start").tokens; assertEquals("keyword", tokens[1].type); }, "test: toggle comment lines should not do anything" : function() { - var doc = new ace.Document([" abc", "cde", "fg"]); + var doc = new Document([" abc", "cde", "fg"]); - var range = new ace.Range(0, 3, 1, 1); + var range = new Range(0, 3, 1, 1); var comment = this.mode.toggleCommentLines("start", doc, range); assertEquals([" abc", "cde", "fg"].join("\n"), doc.toString()); }, @@ -33,4 +46,6 @@ var XmlTest = new TestCase("mode.XmlTest", { assertEquals("", this.mode.getNextLineIndent("start", "abc")); assertEquals("\t", this.mode.getNextLineIndent("start", "\tabc")); } +}); + }); \ No newline at end of file diff --git a/src/test/ace/mode/XmlTokenizerTest.js b/src/ace/test/mode/XmlTokenizerTest.js similarity index 84% rename from src/test/ace/mode/XmlTokenizerTest.js rename to src/ace/test/mode/XmlTokenizerTest.js index e3e09b5d..3963fa70 100644 --- a/src/test/ace/mode/XmlTokenizerTest.js +++ b/src/ace/test/mode/XmlTokenizerTest.js @@ -5,10 +5,17 @@ * @license LGPLv3 * @author Fabian Jakobs */ + +require.def([ + "ace/mode/Xml" + ], function( + XmlMode + ) { + var XmlTest = new TestCase("mode.XmlTest", { setUp : function() { - this.tokenizer = new ace.mode.Xml().getTokenizer(); + this.tokenizer = new XmlMode().getTokenizer(); }, "test: tokenize1" : function() { @@ -23,4 +30,6 @@ var XmlTest = new TestCase("mode.XmlTest", { assertEquals("keyword", tokens[3].type); assertEquals("text", tokens[4].type); } +}); + }); \ No newline at end of file From 59584a0e1187e445ce4da161f1f966ae8cf3accd Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Mon, 18 Oct 2010 19:52:41 +0200 Subject: [PATCH 03/14] update requirejs --- demo/require.js | 168 +++++++++++++++++++++++++----------------------- 1 file changed, 89 insertions(+), 79 deletions(-) diff --git a/demo/require.js b/demo/require.js index bfaccea6..739a12a3 100644 --- a/demo/require.js +++ b/demo/require.js @@ -13,7 +13,7 @@ setInterval: false, importScripts: false */ var require; (function () { //Change this version number for each release. - var version = "0.14.1", + var version = "0.14.2", empty = {}, s, i, defContextName = "_", contextLoads = [], scripts, script, rePkg, src, m, dataMain, cfg = {}, setReadyState, @@ -43,7 +43,7 @@ var require; cfg = require; } } - + /** * Calls a method on a plugin. The obj object should have two property, * name: the name of the method to call on the plugin @@ -65,7 +65,7 @@ var require; req(["require/" + prefix], context.contextName); } } - + /** * Convenience method to call main for a require.def call that was put on * hold in the defQueue. @@ -78,6 +78,33 @@ var require; context.loaded[args[0]] = true; } + /** + * Used to set up package paths from a packagePaths or packages config object. + * @param {Object} packages the object to store the new package config + * @param {Array} currentPackages an array of packages to configure + * @param {String} [dir] a prefix dir to use. + */ + function configurePackageDir(packages, currentPackages, dir) { + var i, location, pkgObj; + for (i = 0; (pkgObj = currentPackages[i]); i++) { + pkgObj = typeof pkgObj === "string" ? { name: pkgObj } : pkgObj; + location = pkgObj.location; + + //Add dir to the path, but avoid paths that start with a slash + //or have a colon (indicates a protocol) + if (dir && (!location || (location.indexOf("/") !== 0 && location.indexOf(":") === -1))) { + pkgObj.location = dir + "/" + (pkgObj.location || pkgObj.name); + } + + //Normalize package paths. + pkgObj.location = pkgObj.location || pkgObj.name; + pkgObj.lib = pkgObj.lib || "lib"; + pkgObj.main = pkgObj.main || "main"; + + packages[pkgObj.name] = pkgObj; + } + } + /** * Resumes tracing of dependencies and then checks if everything is loaded. */ @@ -253,7 +280,7 @@ var require; var context, newContext, loaded, pluginPrefix, canSetContext, prop, newLength, outDeps, mods, paths, index, i, deferMods, deferModArgs, lastModArg, waitingName, packages, - packagePaths, pkgPath, pkgNames, pkgName, pkgObj; + packagePaths; contextName = contextName ? contextName : (config && config.context ? config.context : s.ctxName); context = s.contexts[contextName]; @@ -271,7 +298,7 @@ var require; pluginPrefix = context.defPlugin[name]; } - + //If module already defined for context, or already waiting to be //evaluated, leave. waitingName = context.waiting[name]; @@ -326,7 +353,7 @@ var require; if (s.plugins.newContext) { s.plugins.newContext(newContext); } - + context = s.contexts[contextName] = newContext; } @@ -365,43 +392,14 @@ var require; if (packagePaths) { for (prop in packagePaths) { if (!(prop in empty)) { - pkgPath = prop; - pkgNames = packagePaths[pkgPath]; - for (i = 0; (pkgName = pkgNames[i]); i++) { - if (typeof pkgName === "string") { - //Standard package mapping. - pkgObj = packages[pkgName] = { - name: pkgName, - location: pkgPath + "/" + pkgName - }; - } else { - //A custom setup. - pkgObj = context.config.packages[pkgName.name] = pkgName; - pkgObj.location = pkgPath + "/" + (pkgObj.location || pkgObj.name); - } - } + configurePackageDir(packages, packagePaths[prop], prop); } } } //Adjust packages if necessary. if (config.packages) { - for (prop in config.packages) { - if (!(prop in empty)) { - pkgObj = packages[prop] = config.packages[prop]; - pkgObj.name = pkgObj.name || prop; - } - } - } - - //Normalize package paths. - for (prop in packages) { - if (!(prop in empty)) { - pkgObj = packages[prop]; - pkgObj.location = pkgObj.location || pkgObj.name; - pkgObj.lib = pkgObj.lib || "lib"; - pkgObj.main = pkgObj.main || "main"; - } + configurePackageDir(packages, config.packages); } //Done with modifications, assing packages back to context config @@ -430,7 +428,7 @@ var require; if (config.ready) { req.ready(config.ready); } - + //If it is just a config block, nothing else, //then return. if (!deps) { @@ -445,7 +443,7 @@ var require; outDeps = deps; deps = []; for (i = 0; i < outDeps.length; i++) { - deps[i] = req.splitPrefix(outDeps[i], name); + deps[i] = req.splitPrefix(outDeps[i], name, context); } } @@ -501,7 +499,7 @@ var require; args: [name, deps, callback, context] }); } - + //Hold on to the module until a script load or other adapter has finished //evaluating the whole file. This helps when a file has more than one //module in it -- dependencies are not traced and fetched until the whole @@ -630,7 +628,7 @@ var require; return req; }; - + /** * Internal method used by environment adapters to complete a load event. * A load event could be a script load or just a load pass from a synchronous @@ -663,7 +661,7 @@ var require; //moduleName that maps to a require.def call. This line is important //for traditional browser scripts. context.loaded[moduleName] = true; - + context.scriptCount -= 1; resume(context); }; @@ -788,7 +786,7 @@ var require; } } }; - + req.isArray = function (it) { return ostring.call(it) === "[object Array]"; }; @@ -817,10 +815,12 @@ var require; } contextName = contextName || s.ctxName; - //Normalize module name, if it contains . or .. - moduleName = req.normalizeName(moduleName, relModuleName); + var ret, context = s.contexts[contextName]; - var ret = s.contexts[contextName].defined[moduleName]; + //Normalize module name, if it contains . or .. + moduleName = req.normalizeName(moduleName, relModuleName, context); + + ret = context.defined[moduleName]; if (ret === undefined) { req.onError(new Error("require: module name '" + moduleName + @@ -867,16 +867,17 @@ var require; req.jsExtRegExp = /\.js$/; - + /** * Given a relative module name, like ./something, normalize it to * a real name that can be mapped to a path. * @param {String} name the relative name * @param {String} baseName a real name that the name arg is relative * to. + * @param {Object} context * @returns {String} normalized name */ - req.normalizeName = function (name, baseName) { + req.normalizeName = function (name, baseName, context) { //Adjust any relative paths. var part; if (name.charAt(0) === ".") { @@ -885,13 +886,20 @@ var require; name + ", no relative module name available.")); } - //Convert baseName to array, and lop off the last part, - //so that . matches that "directory" and not name of the baseName's - //module. For instance, baseName of "one/two/three", maps to - //"one/two/three.js", but we want the directory, "one/two" for - //this normalization. - baseName = baseName.split("/"); - baseName = baseName.slice(0, baseName.length - 1); + + if (context.config.packages[baseName]) { + //If the baseName is a package name, then just treat it as one + //name to concat the name with. + baseName = [baseName]; + } else { + //Convert baseName to array, and lop off the last part, + //so that . matches that "directory" and not name of the baseName's + //module. For instance, baseName of "one/two/three", maps to + //"one/two/three.js", but we want the directory, "one/two" for + //this normalization. + baseName = baseName.split("/"); + baseName = baseName.slice(0, baseName.length - 1); + } name = baseName.concat(name.split("/")); for (i = 0; (part = name[i]); i++) { @@ -912,16 +920,17 @@ var require; * Splits a name into a possible plugin prefix and * the module name. If baseName is provided it will * also normalize the name via require.normalizeName() - * + * * @param {String} name the module name * @param {String} [baseName] base name that name is * relative to. + * @param {Object} context * * @returns {Object} with properties, 'prefix' (which * may be null), 'name' and 'fullName', which is a combination * of the prefix (if it exists) and the name. */ - req.splitPrefix = function (name, baseName) { + req.splitPrefix = function (name, baseName, context) { var index = name.indexOf("!"), prefix = null; if (index !== -1) { prefix = name.substring(0, index); @@ -929,7 +938,7 @@ var require; } //Account for relative paths if there is a base name. - name = req.normalizeName(name, baseName); + name = req.normalizeName(name, baseName, context); return { prefix: prefix, @@ -943,10 +952,11 @@ var require; */ req.nameToUrl = function (moduleName, ext, contextName, relModuleName) { var paths, packages, pkg, pkgPath, syms, i, parentModule, url, - config = s.contexts[contextName].config; + context = s.contexts[contextName], + config = context.config; //Normalize module name if have a base relative module name to work from. - moduleName = req.normalizeName(moduleName, relModuleName); + moduleName = req.normalizeName(moduleName, relModuleName, context); //If a colon is in the URL, it indicates a protocol is used and it is just //an URL to a file, or if it starts with a slash or ends with .js, it is just a plain file. @@ -1010,7 +1020,7 @@ var require; priorityName, pIsWaiting = s.plugins.isWaiting, pOrderDeps = s.plugins.orderDeps, - + i, module, allDone, loads, loadArgs, err; //If already doing a checkLoaded call, @@ -1103,7 +1113,7 @@ var require; if (pOrderDeps) { pOrderDeps(context); } - + //Before defining the modules, give priority treatment to any modifiers //for modules that are already defined. for (prop in modifiers) { @@ -1113,7 +1123,7 @@ var require; } } } - + //Define the modules, doing a depth first search. for (i = 0; (module = waiting[i]); i++) { req.exec(module, {}, waiting, context); @@ -1212,12 +1222,12 @@ var require; /** * Executes the modules in the correct order. - * + * * @private */ req.exec = function (module, traced, waiting, context) { //Some modules are just plain script files, abddo not have a formal - //module definition, + //module definition, if (!module) { //Returning undefined for Spidermonky strict checking in Komodo return undefined; @@ -1281,7 +1291,7 @@ var require; ret = defined[name]; } else { if (cjsModule && "exports" in cjsModule) { - ret = defined[name] = depModule.exports; + ret = defined[name] = cjsModule.exports; } else { if (name in defined && !usingExports) { req.onError(new Error(name + " has already been defined")); @@ -1294,7 +1304,7 @@ var require; //Execute modifiers, if they exist. req.execModifiers(name, traced, waiting, context); - + return ret; }; @@ -1334,7 +1344,7 @@ var require; delete modifiers[target]; } }; - + /** * callback for script loads, used to check status of loading. * @@ -1455,11 +1465,11 @@ var require; if (cfg.baseUrlMatch) { rePkg = cfg.baseUrlMatch; } else { - - - + + + rePkg = /(allplugins-|transportD-)?require\.js(\W|$)/i; - + } for (i = scripts.length - 1; i > -1 && (script = scripts[i]); i--) { @@ -1590,7 +1600,7 @@ var require; } } //****** END page load functionality **************** - + //Set up default context. If require was a configuration object, use that as base config. req(cfg); @@ -1888,7 +1898,7 @@ var require; if (loc === "_match") { //Found default locale to use for the top-level bundle name. defLoc = msWaiting[loc]; - + } else if (msWaiting[loc] !== loc) { //A "best fit" locale, store it off to the end and handle //it at the end by just assigning the best fit value, since @@ -1918,7 +1928,7 @@ var require; //loop above so that the default locale bundle has been properly mixed //together. context.defined[master] = context.defined[modulePrefix + "/" + defLoc + "/" + moduleSuffix]; - + //Handle any best fit locale definitions. if (bestFit) { for (loc in bestFit) { @@ -1983,7 +1993,7 @@ var require; progIds = [progId]; // so faster next time break; } - } + } } if (!xhr) { @@ -1993,7 +2003,7 @@ var require; return xhr; }; } - + if (!require.fetchText) { require.fetchText = function (url, callback) { var xhr = require.getXhr(); @@ -2092,7 +2102,7 @@ var require; require.fetchText(url, function (text) { context.text[key] = text; context.loaded[name] = true; - require.checkLoaded(contextName); + require.checkLoaded(contextName); }); } }, @@ -2376,7 +2386,7 @@ var require; /** * Called when all modules have been loaded. Not needed for this plugin. - * State is reset as part of scriptCacheCallback. + * State is reset as part of scriptCacheCallback. */ orderDeps: function (context) { } From 69bcbacfb3c162ee73986af2617e28c2c420afe0 Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Mon, 18 Oct 2010 19:52:52 +0200 Subject: [PATCH 04/14] increase scroll speed --- src/ace/BackgroundTokenizer.js | 4 ++-- src/ace/Editor.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ace/BackgroundTokenizer.js b/src/ace/BackgroundTokenizer.js index 6a05b8b8..57e74f84 100644 --- a/src/ace/BackgroundTokenizer.js +++ b/src/ace/BackgroundTokenizer.js @@ -34,7 +34,7 @@ var BackgroundTokenizer = function(tokenizer, editor) { processedLines += 1; if ((processedLines % 5 == 0) && (new Date() - workerStart) > 20) { self.fireUpdateEvent(startLine, self.currentLine-1); - + var timeout = self.currentLine < lastVisibleRow ? 20 : 100; self.running = setTimeout(self.$worker, timeout); return; @@ -102,7 +102,7 @@ var BackgroundTokenizer = function(tokenizer, editor) { this.$tokenizeRows = function(firstRow, lastRow) { var rows = []; - // determin start state + // determine start state var state = "start"; var doCache = false; if (firstRow > 0 && this.lines[firstRow - 1]) { diff --git a/src/ace/Editor.js b/src/ace/Editor.js index 8e640c51..c695c91b 100644 --- a/src/ace/Editor.js +++ b/src/ace/Editor.js @@ -344,7 +344,7 @@ var Editor = function(renderer, doc) { }; this.onMouseWheel = function(e) { - this.renderer.scrollBy(e.wheelX, e.wheelY); + this.renderer.scrollBy(e.wheelX * 2, e.wheelY * 2); return event.preventDefault(e); }; From aa9cd40a0110b33a99d66e5a39a1613df4d416f6 Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Mon, 18 Oct 2010 19:53:08 +0200 Subject: [PATCH 05/14] update theme --- src/ace/theme/tm.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ace/theme/tm.css b/src/ace/theme/tm.css index ab3c995f..202deaa7 100644 --- a/src/ace/theme/tm.css +++ b/src/ace/theme/tm.css @@ -1,6 +1,6 @@ .ace-tm .ace_editor { border: 2px solid rgb(159, 159, 159); - font-family: Monaco, "Courier New"; + font-family: "Menlo", "Monaco", "Courier New", "Courier", monospace; font-size: 12px; } @@ -12,7 +12,7 @@ width: 50px; background: #e8e8e8; color: #333; - font-family: Monaco, "Courier New"; + font-family: Menlo, Monaco, "Courier New"; font-size: 12px; overflow : hidden; } From 7de4d4ea3c694cd3426fe65f701d0aa71a0b1cd3 Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Tue, 19 Oct 2010 16:19:32 +0200 Subject: [PATCH 06/14] comments are no longer italic --- src/ace/theme/tm.css | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ace/theme/tm.css b/src/ace/theme/tm.css index 202deaa7..1e557489 100644 --- a/src/ace/theme/tm.css +++ b/src/ace/theme/tm.css @@ -73,7 +73,6 @@ } .ace-tm .ace_line .ace_comment { - font-style: italic; color: rgb(76, 136, 107); } From b6c2dace95c5e3c859a071a268dca54780398361 Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Wed, 20 Oct 2010 11:12:50 +0200 Subject: [PATCH 07/14] fix undo bug when inserting more than one line --- src/ace/Document.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/ace/Document.js b/src/ace/Document.js index 2bb17c99..e064c24f 100644 --- a/src/ace/Document.js +++ b/src/ace/Document.js @@ -430,10 +430,10 @@ var Document = function(text, mode) { var lastLine = newLines[newLines.length - 1] + line.substring(position.column); this.lines[position.row] = firstLine; - this.$insertLines(position.row + 1, [lastLine], fromUndo); + this.$insertLines(position.row + 1, [lastLine], true); if (newLines.length > 2) { - this.$insertLines(position.row + 1, newLines.slice(1, -1), fromUndo); + this.$insertLines(position.row + 1, newLines.slice(1, -1), true); } var end = { @@ -443,7 +443,6 @@ var Document = function(text, mode) { } if (!fromUndo && this.$undoManager) { - var nl = this.$getNewLineCharacter(); this.$deltas.push({ action: "insertText", range: Range.fromPoints(position, end), From b6da535e2061e73f76c1028330ed9aa3411280d7 Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Wed, 20 Oct 2010 11:24:54 +0200 Subject: [PATCH 08/14] fix copy and paste issue in Chrome and Safari --- src/ace/TextInput.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ace/TextInput.js b/src/ace/TextInput.js index ae015169..b29bac8c 100644 --- a/src/ace/TextInput.js +++ b/src/ace/TextInput.js @@ -71,6 +71,7 @@ var TextInput = function(parentNode, host) { text.value = host.getCopyText(); text.select(); copied = true; + setTimeout(sendText, 0); }; var onCut = function() { @@ -78,6 +79,7 @@ var TextInput = function(parentNode, host) { text.value = host.getCopyText(); host.onCut(); text.select(); + setTimeout(sendText, 0); }; event.addListener(text, "keypress", onTextInput); From 87d0a837967ffeb1ffa3f638084395184ef3ce5e Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Wed, 20 Oct 2010 12:12:58 +0200 Subject: [PATCH 09/14] highlight buildin constants and future reserved keywords --- src/ace/mode/JavaScriptHighlightRules.js | 51 ++++++++++-------------- src/ace/theme/tm.css | 5 +++ 2 files changed, 26 insertions(+), 30 deletions(-) diff --git a/src/ace/mode/JavaScriptHighlightRules.js b/src/ace/mode/JavaScriptHighlightRules.js index 5c06175f..3a2d29b1 100644 --- a/src/ace/mode/JavaScriptHighlightRules.js +++ b/src/ace/mode/JavaScriptHighlightRules.js @@ -8,40 +8,29 @@ require.def("ace/mode/JavaScriptHighlightRules", [ "ace/lib/oop", + "ace/lib/lang", "ace/mode/DocCommentHighlightRules", "ace/mode/TextHighlightRules" - ], function(oop, DocCommentHighlightRules, TextHighlightRules) { + ], function(oop, lang, DocCommentHighlightRules, TextHighlightRules) { JavaScriptHighlightRules = function() { var docComment = new DocCommentHighlightRules(); - var keywords = { - "break" : 1, - "case" : 1, - "catch" : 1, - "continue" : 1, - "default" : 1, - "delete" : 1, - "do" : 1, - "else" : 1, - "finally" : 1, - "for" : 1, - "function" : 1, - "if" : 1, - "in" : 1, - "instanceof" : 1, - "new" : 1, - "return" : 1, - "switch" : 1, - "throw" : 1, - "try" : 1, - "typeof" : 1, - "var" : 1, - "while" : 1, - "with" : 1 - }; + var keywords = lang.arrayToMap( + ("break|case|catch|continue|default|delete|do|else|finally|for|function|\ + if|in|instanceof|new|return|switch|throw|try|typeof|var|while|with").split("|") + ); + + var buildinConstants = lang.arrayToMap( + ("true|false|null|undefined|Infinity|NaN|undefined").split("|") + ); + + var futureReserved = lang.arrayToMap( + ("class|enum|extends|super|const|export|import|implements|let|private|\ + public|yield|interface|package|protected|static").split("|") + ); // regexp must not have capturing parentheses. Use (?:) instead. // regexps are ordered -> the first match is used @@ -80,12 +69,14 @@ JavaScriptHighlightRules = function() { token : function(value) { if (value == "this") return "variable"; - if (keywords[value]) { + else if (keywords[value]) return "keyword"; - } - else { + else if (buildinConstants[value]) + return "buildin-constant"; + else if (futureReserved[value] || value == "debugger") + return "invalid"; + else return "identifier"; - } }, regex : "[a-zA-Z_][a-zA-Z0-9_]*\\b" }, { diff --git a/src/ace/theme/tm.css b/src/ace/theme/tm.css index 1e557489..2f7cdd73 100644 --- a/src/ace/theme/tm.css +++ b/src/ace/theme/tm.css @@ -60,6 +60,11 @@ color: rgb(6, 150, 14); } +.ace-tm .ace_line .ace_invalid { + background-color: rgb(153, 0, 0); + color: white; +} + .ace-tm .ace_line .ace_buildin-function { color: rgb(60, 76, 114); } From adde939166168918a7177a5a39e093b5c5b1be4f Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Wed, 20 Oct 2010 12:29:35 +0200 Subject: [PATCH 10/14] also highlight "if" --- src/ace/mode/JavaScriptHighlightRules.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ace/mode/JavaScriptHighlightRules.js b/src/ace/mode/JavaScriptHighlightRules.js index 3a2d29b1..6b1ede7f 100644 --- a/src/ace/mode/JavaScriptHighlightRules.js +++ b/src/ace/mode/JavaScriptHighlightRules.js @@ -19,8 +19,8 @@ JavaScriptHighlightRules = function() { var docComment = new DocCommentHighlightRules(); var keywords = lang.arrayToMap( - ("break|case|catch|continue|default|delete|do|else|finally|for|function|\ - if|in|instanceof|new|return|switch|throw|try|typeof|var|while|with").split("|") + ("break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|instanceof|new|return|switch|throw|try|typeof|var|while|with").split("|") ); var buildinConstants = lang.arrayToMap( @@ -28,8 +28,8 @@ JavaScriptHighlightRules = function() { ); var futureReserved = lang.arrayToMap( - ("class|enum|extends|super|const|export|import|implements|let|private|\ - public|yield|interface|package|protected|static").split("|") + ("class|enum|extends|super|const|export|import|implements|let|private|" + + "public|yield|interface|package|protected|static").split("|") ); // regexp must not have capturing parentheses. Use (?:) instead. From 5f0213b11038b848b6fbbf00df2ce328b1a26eff Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Wed, 20 Oct 2010 12:52:21 +0200 Subject: [PATCH 11/14] change move to line start to act like in Eclipse and Netbeans --- src/ace/Document.js | 11 +++++++++++ src/ace/Selection.js | 9 ++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/ace/Document.js b/src/ace/Document.js index e064c24f..949685ad 100644 --- a/src/ace/Document.js +++ b/src/ace/Document.js @@ -249,10 +249,21 @@ var Document = function(text, mode) { } }; + /** + * Get a verbatim copy of the given line as it is in the document + */ this.getLine = function(row) { return this.lines[row] || ""; }; + /** + * Get a line as it is displayed on screen. Tabs are replaced by spaces. + */ + this.getDisplayLine = function(row) { + var tab = new Array(this.getTabSize()+1).join(" "); + return this.lines[row].replace(/\t/g, tab); + }; + this.getLines = function(firstRow, lastRow) { return this.lines.slice(firstRow, lastRow+1); }; diff --git a/src/ace/Selection.js b/src/ace/Selection.js index 6f6178ef..89ccea38 100644 --- a/src/ace/Selection.js +++ b/src/ace/Selection.js @@ -281,7 +281,14 @@ var Selection = function(doc) { }; this.moveCursorLineStart = function() { - this.moveCursorTo(this.selectionLead.row, 0); + var row = this.selectionLead.row; + var column = this.selectionLead.column; + var beforeCursor = this.doc.getDisplayLine(row).slice(0, column); + var leadingSpace = beforeCursor.match(/^\s+/); + if (!leadingSpace || leadingSpace[0].length >= column) + this.moveCursorTo(this.selectionLead.row, 0); + else + this.moveCursorTo(this.selectionLead.row, leadingSpace[0].length); }; this.moveCursorLineEnd = function() { From f6b03d1a0a38f9a7decc4452997a2397405f5fdb Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Wed, 20 Oct 2010 13:25:00 +0200 Subject: [PATCH 12/14] make default font size smaller --- src/ace/theme/tm.css | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ace/theme/tm.css b/src/ace/theme/tm.css index 2f7cdd73..be5ef74f 100644 --- a/src/ace/theme/tm.css +++ b/src/ace/theme/tm.css @@ -1,7 +1,7 @@ .ace-tm .ace_editor { border: 2px solid rgb(159, 159, 159); font-family: "Menlo", "Monaco", "Courier New", "Courier", monospace; - font-size: 12px; + font-size: 11px; } .ace-tm .ace_editor.ace_focus { @@ -12,8 +12,8 @@ width: 50px; background: #e8e8e8; color: #333; - font-family: Menlo, Monaco, "Courier New"; - font-size: 12px; + font-family: "Menlo", "Monaco", "Courier New", monospace; + font-size: 11px; overflow : hidden; } From ddf5f6f138724403c58440e886705ca68d0995e8 Mon Sep 17 00:00:00 2001 From: Eddy Bruel Date: Wed, 20 Oct 2010 15:07:58 +0200 Subject: [PATCH 13/14] - Fixed the issue where indenting a single line would always insert spaces when in soft tabbing mode. What should happen instead is that the line is indented to the next tab stop. --- src/ace/Document.js | 5 +++-- src/ace/Editor.js | 23 ++++++++++++++++++----- src/ace/commands/DefaultCommands.js | 7 +------ src/ace/lib/lang.js | 4 ++++ 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/ace/Document.js b/src/ace/Document.js index e064c24f..2d766f5d 100644 --- a/src/ace/Document.js +++ b/src/ace/Document.js @@ -97,7 +97,7 @@ var Document = function(text, mode) { this.getTabString = function() { if (this.getUseSoftTabs()) { - return new Array(this.getTabSize()+1).join(" "); + return lang.stringRepeat(" ", this.getTabSize()); } else { return "\t"; } @@ -545,7 +545,8 @@ var Document = function(text, mode) { }; this.indentRows = function(range, indentString) { - for (var row=range.start.row; row<= range.end.row; row++) { + indentString.replace("\t", this.getTabString()); + for (var row=range.start.row; row<=range.end.row; row++) { this.$insert({row: row, column:0}, indentString); } this.fireChangeEvent(range.start.row, range.end.row); diff --git a/src/ace/Editor.js b/src/ace/Editor.js index c695c91b..add0d5db 100644 --- a/src/ace/Editor.js +++ b/src/ace/Editor.js @@ -9,6 +9,7 @@ require.def("ace/Editor", [ "ace/ace", "ace/lib/event", + "ace/lib/lang", "ace/TextInput", "ace/KeyBinding", "ace/Document", @@ -16,7 +17,7 @@ require.def("ace/Editor", "ace/BackgroundTokenizer", "ace/Range", "ace/MEventEmitter" - ], function(ace, event, TextInput, KeyBinding, Document, Search, BackgroundTokenizer, Range, MEventEmitter) { + ], function(ace, event, lang, TextInput, KeyBinding, Document, Search, BackgroundTokenizer, Range, MEventEmitter) { var Editor = function(renderer, doc) { var container = renderer.getContainerElement(); @@ -524,14 +525,26 @@ var Editor = function(renderer, doc) { this.clearSelection(); }; - this.blockIndent = function(indentString) { + this.indent = function() { if (this.$readOnly) return; - var indentString = indentString || this.doc.getTabString(); - var addedColumns = this.doc.indentRows(this.getSelectionRange(), indentString); + if (this.selection.isMultiLine()) { + var addedColumns = this.doc.indentRows(this.getSelectionRange(), "\t"); + this.selection.shiftSelection(addedColumns); + } else { + if (!this.doc.getUseSoftTabs()) + return this.onTextInput("\t"); + + var cursor = this.doc.remove(this.getSelectionRange()); + this.clearSelection(); - this.selection.shiftSelection(addedColumns); + // compute indent string + var indentString = lang.stringRepeat(" ", this.doc.getTabSize() - (cursor.column % this.doc.getTabSize())); + var addedColumns = this.doc.indentRows(this.getSelectionRange(), indentString); + cursor.column += addedColumns; + this.moveCursorToPosition(cursor); + } this.$updateDesiredColumn(); }; diff --git a/src/ace/commands/DefaultCommands.js b/src/ace/commands/DefaultCommands.js index 6c4b9b94..305fa902 100644 --- a/src/ace/commands/DefaultCommands.js +++ b/src/ace/commands/DefaultCommands.js @@ -151,12 +151,7 @@ PluginManager.registerCommand("outdent", function(editor, selection) { editor.blockOutdent(); }); PluginManager.registerCommand("indent", function(editor, selection) { - if (selection.isMultiLine()) { - editor.blockIndent(); - } - else { - editor.onTextInput("\t"); - } + editor.indent(); }); }); \ No newline at end of file diff --git a/src/ace/lib/lang.js b/src/ace/lib/lang.js index 429172f9..fcfab0a2 100644 --- a/src/ace/lib/lang.js +++ b/src/ace/lib/lang.js @@ -16,6 +16,10 @@ require.def("ace/lib/lang", function() { return string.split("").reverse().join(""); }; + lang.stringRepeat = function (string, count) { + return new Array(count + 1).join(string); + } + if (Array.prototype.indexOf) { lang.arrayIndexOf = function(array, searchElement) { return array.indexOf(searchElement); From 1b88d3f45a0e8e9fb6135eae04dc5def6ab18837 Mon Sep 17 00:00:00 2001 From: Eddy Bruel Date: Wed, 20 Oct 2010 18:05:35 +0200 Subject: [PATCH 14/14] Fixed outdenting to work correctly with blocks that are separated by newlines, and indented by a mixture of tabs and spaces. --- src/ace/Document.js | 50 ++++++++++++++++++++------------------------ src/ace/Editor.js | 12 ++++------- src/ace/Selection.js | 27 +++++++++++------------- 3 files changed, 39 insertions(+), 50 deletions(-) diff --git a/src/ace/Document.js b/src/ace/Document.js index ae8b5dc8..6bd9b8f0 100644 --- a/src/ace/Document.js +++ b/src/ace/Document.js @@ -249,21 +249,10 @@ var Document = function(text, mode) { } }; - /** - * Get a verbatim copy of the given line as it is in the document - */ this.getLine = function(row) { return this.lines[row] || ""; }; - /** - * Get a line as it is displayed on screen. Tabs are replaced by spaces. - */ - this.getDisplayLine = function(row) { - var tab = new Array(this.getTabSize()+1).join(" "); - return this.lines[row].replace(/\t/g, tab); - }; - this.getLines = function(firstRow, lastRow) { return this.lines.slice(firstRow, lastRow+1); }; @@ -564,27 +553,34 @@ var Document = function(text, mode) { return indentString.length; }; - this.outdentRows = function(range, indentString) { - outdentLength = indentString.length; - - for (var i=range.start.row; i<= range.end.row; i++) { - if (this.getLine(i).substr(0, outdentLength) !== indentString) { - return 0; - } - } - - var deleteRange = new Range(0, 0, 0, outdentLength); - - for (var i=range.start.row; i<= range.end.row; i++) - { + this.outdentRows = function (range) { + var deleteRange = new Range(0, 0, 0, 0), + size = this.getTabSize(); + + for (var i = range.start.row; i <= range.end.row; ++i) { + var line = this.getLine(i); + deleteRange.start.row = i; deleteRange.end.row = i; + for (var j = 0; j < size; ++j) + if (line.charAt(j) != ' ') + break; + if (j < size && line.charAt(j) == '\t') { + deleteRange.start.column = j; + deleteRange.end.column = j + 1; + } else { + deleteRange.start.column = 0; + deleteRange.end.column = j; + } + if (i == range.start.row) + range.start.column -= deleteRange.end.column - deleteRange.start.column; + if (i == range.end.row) + range.end.column -= deleteRange.end.column - deleteRange.start.column; this.$remove(deleteRange); } - this.fireChangeEvent(range.start.row, range.end.row); - return -outdentLength; - }; + return range; + } this.moveLinesUp = function(firstRow, lastRow) { if (firstRow <= 0) return 0; diff --git a/src/ace/Editor.js b/src/ace/Editor.js index add0d5db..a3247e4b 100644 --- a/src/ace/Editor.js +++ b/src/ace/Editor.js @@ -552,14 +552,10 @@ var Editor = function(renderer, doc) { if (this.$readOnly) return; - var indentString = indentString || this.doc.getTabString(); - var addedColumns = this.doc.outdentRows(this.getSelectionRange(), indentString); - - // besides the indent string also outdent tabs - if (addedColumns == 0 && indentString != "\t") - var addedColumns = this.doc.outdentRows(this.getSelectionRange(), "\t"); - - this.selection.shiftSelection(addedColumns); + var selection = this.doc.getSelection(), + range = this.doc.outdentRows(selection.getRange()); + + selection.setSelectionRange(range, selection.isBackwards()); this.$updateDesiredColumn(); }; diff --git a/src/ace/Selection.js b/src/ace/Selection.js index 89ccea38..c65d8039 100644 --- a/src/ace/Selection.js +++ b/src/ace/Selection.js @@ -79,7 +79,7 @@ var Selection = function(doc) { var anchor = this.getSelectionAnchor(); var lead = this.getSelectionLead(); - var isBackwards = this.$isBackwards(); + var isBackwards = this.isBackwards(); if (!isBackwards || anchor.column !== 0) this.setSelectionAnchor(anchor.row, anchor.column + columns); @@ -91,7 +91,7 @@ var Selection = function(doc) { } }; - this.$isBackwards = function() { + this.isBackwards = function() { var anchor = this.selectionAnchor || this.selectionLead; var lead = this.selectionLead; return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column)); @@ -101,7 +101,7 @@ var Selection = function(doc) { var anchor = this.selectionAnchor || this.selectionLead; var lead = this.selectionLead; - if (this.$isBackwards()) { + if (this.isBackwards()) { return Range.fromPoints(lead, anchor); } else { @@ -116,7 +116,6 @@ var Selection = function(doc) { } }; - this.selectAll = function() { var lastRow = this.doc.getLength() - 1; this.setSelectionAnchor(lastRow, this.doc.getLine(lastRow).length); @@ -126,9 +125,14 @@ var Selection = function(doc) { }); }; - this.setSelectionRange = function(range) { - this.setSelectionAnchor(range.start.row, range.start.column); - this.selectTo(range.end.row, range.end.column); + this.setSelectionRange = function(range, reverse) { + if (reverse) { + this.setSelectionAnchor(range.end.row, range.end.column); + this.selectTo(range.start.row, range.start.column); + } else { + this.setSelectionAnchor(range.start.row, range.start.column); + this.selectTo(range.end.row, range.end.column); + } }; this.$moveSelection = function(mover) { @@ -281,14 +285,7 @@ var Selection = function(doc) { }; this.moveCursorLineStart = function() { - var row = this.selectionLead.row; - var column = this.selectionLead.column; - var beforeCursor = this.doc.getDisplayLine(row).slice(0, column); - var leadingSpace = beforeCursor.match(/^\s+/); - if (!leadingSpace || leadingSpace[0].length >= column) - this.moveCursorTo(this.selectionLead.row, 0); - else - this.moveCursorTo(this.selectionLead.row, leadingSpace[0].length); + this.moveCursorTo(this.selectionLead.row, 0); }; this.moveCursorLineEnd = function() {