From 7d50280a49fb5bbf89bf21260408906aa5382925 Mon Sep 17 00:00:00 2001 From: Zef Hemel Date: Thu, 17 Nov 2011 10:39:42 +0100 Subject: [PATCH] Unit tests for placeholder and bugfixes resulting from the test. --- lib/ace/placeholder.js | 10 +-- lib/ace/placeholder_test.js | 143 ++++++++++++++++++++++++++++++++++++ 2 files changed, 147 insertions(+), 6 deletions(-) create mode 100644 lib/ace/placeholder_test.js diff --git a/lib/ace/placeholder.js b/lib/ace/placeholder.js index 2b9ec30d..df6a5f98 100644 --- a/lib/ace/placeholder.js +++ b/lib/ace/placeholder.js @@ -36,7 +36,7 @@ * ***** END LICENSE BLOCK ***** */ define(function(require, exports, module) { -var Range = require('ace/range').Range; +var Range = require('./range').Range; var EventEmitter = require("./lib/event_emitter").EventEmitter; var oop = require("./lib/oop"); @@ -98,7 +98,6 @@ var PlaceHolder = function(session, length, pos, others, mainClass, othersClass) anchor.markerId = session.addMarker(new Range(event.value.row, event.value.column, event.value.row, event.value.column+_self.length), _self.othersClass, null, false); }); }); - console.log("Showing"); }; this.hideOtherMarkers = function() { @@ -107,7 +106,6 @@ var PlaceHolder = function(session, length, pos, others, mainClass, othersClass) for (var i = 0; i < this.others.length; i++) { this.session.removeMarker(this.others[i].markerId); } - console.log("Hiding"); }; this.onUpdate = function(event) { @@ -117,7 +115,7 @@ var PlaceHolder = function(session, length, pos, others, mainClass, othersClass) if(range.start.row !== this.pos.row) return; var lengthDiff = delta.action === "insertText" ? range.end.column - range.start.column : range.start.column - range.end.column; - if(range.start.column >= this.pos.column && range.end.column <= this.pos.column + this.length + 1) { + if(range.start.column >= this.pos.column && range.start.column <= this.pos.column + this.length + 1) { var distanceFromStart = range.start.column - this.pos.column; this.length += lengthDiff; if(!this.session.$fromUndo) { @@ -149,7 +147,7 @@ var PlaceHolder = function(session, length, pos, others, mainClass, othersClass) newPos.column += lengthDiff; other.setPosition(newPos.row, newPos.column); } - }.bind(this)); + }.bind(this), 0); } else if(range.start.column === this.pos.column && delta.action === "removeText") { setTimeout(function() { @@ -159,7 +157,7 @@ var PlaceHolder = function(session, length, pos, others, mainClass, othersClass) other.setPosition(other.row, other.column - lengthDiff); } } - }.bind(this)); + }.bind(this), 0); } } this.pos._dispatchEvent("change", {value: this.pos}); diff --git a/lib/ace/placeholder_test.js b/lib/ace/placeholder_test.js new file mode 100644 index 00000000..6130aa3f --- /dev/null +++ b/lib/ace/placeholder_test.js @@ -0,0 +1,143 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Ajax.org Code Editor (ACE). + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Fabian Jakobs + * Julian Viereck + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +if (typeof process !== "undefined") { + require("amd-loader"); + require("./test/mockdom"); +} + +define(function(require, exports, module) { + +var EditSession = require("./edit_session").EditSession; +var Editor = require("./editor").Editor; +var MockRenderer = require("./test/mockrenderer").MockRenderer; +var assert = require("./test/assertions"); +var JavaScriptMode = require("./mode/javascript").Mode; +var PlaceHolder = require('./placeholder').PlaceHolder; + +module.exports = { + + "test: simple at the end appending of text" : function() { + var session = new EditSession("var a = 10;\nconsole.log(a, a);", new JavaScriptMode()); + var editor = new Editor(new MockRenderer(), session); + + new PlaceHolder(session, 1, {row: 0, column: 4}, [{row: 1, column: 12}, {row: 1, column: 15}]); + + editor.moveCursorTo(0, 5); + editor.insert('b'); + assert.equal(session.doc.getValue(), "var ab = 10;\nconsole.log(ab, ab);"); + editor.insert('cd'); + assert.equal(session.doc.getValue(), "var abcd = 10;\nconsole.log(abcd, abcd);"); + editor.remove('left'); + editor.remove('left'); + editor.remove('left'); + assert.equal(session.doc.getValue(), "var a = 10;\nconsole.log(a, a);"); + }, + + "test: inserting text outside placeholder" : function() { + var session = new EditSession("var a = 10;\nconsole.log(a, a);\n", new JavaScriptMode()); + var editor = new Editor(new MockRenderer(), session); + + new PlaceHolder(session, 1, {row: 0, column: 4}, [{row: 1, column: 12}, {row: 1, column: 15}]); + + editor.moveCursorTo(2, 0); + editor.insert('b'); + assert.equal(session.doc.getValue(), "var a = 10;\nconsole.log(a, a);\nb"); + }, + + "test: insertion at the beginning" : function(next) { + var session = new EditSession("var a = 10;\nconsole.log(a, a);", new JavaScriptMode()); + var editor = new Editor(new MockRenderer(), session); + + var p = new PlaceHolder(session, 1, {row: 0, column: 4}, [{row: 1, column: 12}, {row: 1, column: 15}]); + + editor.moveCursorTo(0, 4); + editor.insert('$'); + assert.equal(session.doc.getValue(), "var $a = 10;\nconsole.log($a, $a);"); + editor.moveCursorTo(0, 4); + // Have to put this in a setTimeout because the anchor is only fixed later. + setTimeout(function() { + editor.insert('v'); + assert.equal(session.doc.getValue(), "var v$a = 10;\nconsole.log(v$a, v$a);"); + next(); + }, 10); + }, + + "test: detaching placeholder" : function() { + var session = new EditSession("var a = 10;\nconsole.log(a, a);", new JavaScriptMode()); + var editor = new Editor(new MockRenderer(), session); + + var p = new PlaceHolder(session, 1, {row: 0, column: 4}, [{row: 1, column: 12}, {row: 1, column: 15}]); + + editor.moveCursorTo(0, 5); + editor.insert('b'); + assert.equal(session.doc.getValue(), "var ab = 10;\nconsole.log(ab, ab);"); + p.detach(); + editor.insert('cd'); + assert.equal(session.doc.getValue(), "var abcd = 10;\nconsole.log(ab, ab);"); + }, + + "test: events" : function() { + var session = new EditSession("var a = 10;\nconsole.log(a, a);", new JavaScriptMode()); + var editor = new Editor(new MockRenderer(), session); + + var p = new PlaceHolder(session, 1, {row: 0, column: 4}, [{row: 1, column: 12}, {row: 1, column: 15}]); + var entered = false; + var left = false; + p.on("cursorEnter", function() { + entered = true; + }); + p.on("cursorLeave", function() { + left = true; + }); + + editor.moveCursorTo(0, 0); + editor.moveCursorTo(0, 4); + p.onCursorChange(); // Have to do this by hand because moveCursorTo doesn't trigger the event + assert.ok(entered); + editor.moveCursorTo(1, 0); + p.onCursorChange(); // Have to do this by hand because moveCursorTo doesn't trigger the event + assert.ok(left); + } +}; + +}); + +if (typeof module !== "undefined" && module === require.main) { + require("asyncjs").test.testcase(module.exports).exec() +} \ No newline at end of file