edit_session_test.js 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087
  1. /* ***** BEGIN LICENSE BLOCK *****
  2. * Distributed under the BSD license:
  3. *
  4. * Copyright (c) 2010, Ajax.org B.V.
  5. * All rights reserved.
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions are met:
  9. * * Redistributions of source code must retain the above copyright
  10. * notice, this list of conditions and the following disclaimer.
  11. * * Redistributions in binary form must reproduce the above copyright
  12. * notice, this list of conditions and the following disclaimer in the
  13. * documentation and/or other materials provided with the distribution.
  14. * * Neither the name of Ajax.org B.V. nor the
  15. * names of its contributors may be used to endorse or promote products
  16. * derived from this software without specific prior written permission.
  17. *
  18. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  19. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  20. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  21. * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
  22. * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  23. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  24. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  25. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  26. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  27. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  28. *
  29. * ***** END LICENSE BLOCK ***** */
  30. if (typeof process !== "undefined") {
  31. require("amd-loader");
  32. require("./test/mockdom");
  33. }
  34. define(function(require, exports, module) {
  35. "use strict";
  36. var lang = require("./lib/lang");
  37. var EditSession = require("./edit_session").EditSession;
  38. var Editor = require("./editor").Editor;
  39. var UndoManager = require("./undomanager").UndoManager;
  40. var MockRenderer = require("./test/mockrenderer").MockRenderer;
  41. var Range = require("./range").Range;
  42. var assert = require("./test/assertions");
  43. var JavaScriptMode = require("./mode/javascript").Mode;
  44. function createFoldTestSession() {
  45. var lines = [
  46. "function foo(items) {",
  47. " for (var i=0; i<items.length; i++) {",
  48. " alert(items[i] + \"juhu\");",
  49. " } // Real Tab.",
  50. "}"
  51. ];
  52. var session = new EditSession(lines.join("\n"));
  53. session.setUndoManager(new UndoManager());
  54. session.addFold("args...", new Range(0, 13, 0, 18));
  55. session.addFold("foo...", new Range(1, 10, 2, 10));
  56. session.addFold("bar...", new Range(2, 20, 2, 25));
  57. return session;
  58. }
  59. function assertArray(a, b) {
  60. assert.equal(a+"", b+"");
  61. assert.ok(a.length == b.length);
  62. for (var i = 0; i < a.length; i++) {
  63. assert.equal(a[i], b[i]);
  64. }
  65. }
  66. module.exports = {
  67. "test: find matching opening bracket in Text mode" : function() {
  68. var session = new EditSession(["(()(", "())))"]);
  69. assert.position(session.findMatchingBracket({row: 0, column: 3}), 0, 1);
  70. assert.position(session.findMatchingBracket({row: 1, column: 2}), 1, 0);
  71. assert.position(session.findMatchingBracket({row: 1, column: 3}), 0, 3);
  72. assert.position(session.findMatchingBracket({row: 1, column: 4}), 0, 0);
  73. assert.equal(session.findMatchingBracket({row: 1, column: 5}), null);
  74. },
  75. "test: find matching closing bracket in Text mode" : function() {
  76. var session = new EditSession(["(()(", "())))"]);
  77. assert.position(session.findMatchingBracket({row: 1, column: 1}), 1, 1);
  78. assert.position(session.findMatchingBracket({row: 1, column: 1}), 1, 1);
  79. assert.position(session.findMatchingBracket({row: 0, column: 4}), 1, 2);
  80. assert.position(session.findMatchingBracket({row: 0, column: 2}), 0, 2);
  81. assert.position(session.findMatchingBracket({row: 0, column: 1}), 1, 3);
  82. assert.equal(session.findMatchingBracket({row: 0, column: 0}), null);
  83. },
  84. "test: find matching opening bracket in JavaScript mode" : function() {
  85. var lines = [
  86. "function foo() {",
  87. " var str = \"{ foo()\";",
  88. " if (debug) {",
  89. " // write str (a string) to the console",
  90. " console.log(str);",
  91. " }",
  92. " str += \" bar() }\";",
  93. "}"
  94. ];
  95. var session = new EditSession(lines.join("\n"), new JavaScriptMode());
  96. assert.position(session.findMatchingBracket({row: 0, column: 14}), 0, 12);
  97. assert.position(session.findMatchingBracket({row: 7, column: 1}), 0, 15);
  98. assert.position(session.findMatchingBracket({row: 6, column: 20}), 1, 15);
  99. assert.position(session.findMatchingBracket({row: 1, column: 22}), 1, 20);
  100. assert.position(session.findMatchingBracket({row: 3, column: 31}), 3, 21);
  101. assert.position(session.findMatchingBracket({row: 4, column: 24}), 4, 19);
  102. assert.equal(session.findMatchingBracket({row: 0, column: 1}), null);
  103. },
  104. "test: find matching closing bracket in JavaScript mode" : function() {
  105. var lines = [
  106. "function foo() {",
  107. " var str = \"{ foo()\";",
  108. " if (debug) {",
  109. " // write str (a string) to the console",
  110. " console.log(str);",
  111. " }",
  112. " str += \" bar() }\";",
  113. "}"
  114. ];
  115. var session = new EditSession(lines.join("\n"), new JavaScriptMode());
  116. assert.position(session.findMatchingBracket({row: 0, column: 13}), 0, 13);
  117. assert.position(session.findMatchingBracket({row: 0, column: 16}), 7, 0);
  118. assert.position(session.findMatchingBracket({row: 1, column: 16}), 6, 19);
  119. assert.position(session.findMatchingBracket({row: 1, column: 21}), 1, 21);
  120. assert.position(session.findMatchingBracket({row: 3, column: 22}), 3, 30);
  121. assert.position(session.findMatchingBracket({row: 4, column: 20}), 4, 23);
  122. },
  123. "test: handle unbalanced brackets in JavaScript mode" : function() {
  124. var lines = [
  125. "function foo() {",
  126. " var str = \"{ foo()\";",
  127. " if (debug) {",
  128. " // write str a string) to the console",
  129. " console.log(str);",
  130. " ",
  131. " str += \" bar() \";",
  132. "}"
  133. ];
  134. var session = new EditSession(lines.join("\n"), new JavaScriptMode());
  135. assert.equal(session.findMatchingBracket({row: 0, column: 16}), null);
  136. assert.equal(session.findMatchingBracket({row: 3, column: 30}), null);
  137. assert.equal(session.findMatchingBracket({row: 1, column: 16}), null);
  138. },
  139. "test: match different bracket types" : function() {
  140. var session = new EditSession(["({[", ")]}"]);
  141. assert.position(session.findMatchingBracket({row: 0, column: 1}), 1, 0);
  142. assert.position(session.findMatchingBracket({row: 0, column: 2}), 1, 2);
  143. assert.position(session.findMatchingBracket({row: 0, column: 3}), 1, 1);
  144. assert.position(session.findMatchingBracket({row: 1, column: 1}), 0, 0);
  145. assert.position(session.findMatchingBracket({row: 1, column: 2}), 0, 2);
  146. assert.position(session.findMatchingBracket({row: 1, column: 3}), 0, 1);
  147. },
  148. "test: move lines down" : function() {
  149. var session = new EditSession(["a1", "a2", "a3", "a4"]);
  150. session.moveLinesDown(0, 1);
  151. assert.equal(session.getValue(), ["a3", "a1", "a2", "a4"].join("\n"));
  152. session.moveLinesDown(1, 2);
  153. assert.equal(session.getValue(), ["a3", "a4", "a1", "a2"].join("\n"));
  154. session.moveLinesDown(2, 3);
  155. assert.equal(session.getValue(), ["a3", "a4", "a1", "a2"].join("\n"));
  156. session.moveLinesDown(2, 2);
  157. assert.equal(session.getValue(), ["a3", "a4", "a2", "a1"].join("\n"));
  158. },
  159. "test: move lines up" : function() {
  160. var session = new EditSession(["a1", "a2", "a3", "a4"]);
  161. session.moveLinesUp(2, 3);
  162. assert.equal(session.getValue(), ["a1", "a3", "a4", "a2"].join("\n"));
  163. session.moveLinesUp(1, 2);
  164. assert.equal(session.getValue(), ["a3", "a4", "a1", "a2"].join("\n"));
  165. session.moveLinesUp(0, 1);
  166. assert.equal(session.getValue(), ["a3", "a4", "a1", "a2"].join("\n"));
  167. session.moveLinesUp(2, 2);
  168. assert.equal(session.getValue(), ["a3", "a1", "a4", "a2"].join("\n"));
  169. },
  170. "test: duplicate lines" : function() {
  171. var session = new EditSession(["1", "2", "3", "4"]);
  172. session.duplicateLines(1, 2);
  173. assert.equal(session.getValue(), ["1", "2", "3", "2", "3", "4"].join("\n"));
  174. },
  175. "test: duplicate last line" : function() {
  176. var session = new EditSession(["1", "2", "3"]);
  177. session.duplicateLines(2, 2);
  178. assert.equal(session.getValue(), ["1", "2", "3", "3"].join("\n"));
  179. },
  180. "test: duplicate first line" : function() {
  181. var session = new EditSession(["1", "2", "3"]);
  182. session.duplicateLines(0, 0);
  183. assert.equal(session.getValue(), ["1", "1", "2", "3"].join("\n"));
  184. },
  185. "test: getScreenLastRowColumn": function() {
  186. var session = new EditSession([
  187. "juhu",
  188. "12\t\t34",
  189. "ぁぁa"
  190. ]);
  191. assert.equal(session.getScreenLastRowColumn(0), 4);
  192. assert.equal(session.getScreenLastRowColumn(1), 10);
  193. assert.equal(session.getScreenLastRowColumn(2), 5);
  194. },
  195. "test: convert document to screen coordinates" : function() {
  196. var session = new EditSession("01234\t567890\t1234");
  197. session.setTabSize(4);
  198. assert.equal(session.documentToScreenColumn(0, 0), 0);
  199. assert.equal(session.documentToScreenColumn(0, 4), 4);
  200. assert.equal(session.documentToScreenColumn(0, 5), 5);
  201. assert.equal(session.documentToScreenColumn(0, 6), 8);
  202. assert.equal(session.documentToScreenColumn(0, 12), 14);
  203. assert.equal(session.documentToScreenColumn(0, 13), 16);
  204. session.setTabSize(2);
  205. assert.equal(session.documentToScreenColumn(0, 0), 0);
  206. assert.equal(session.documentToScreenColumn(0, 4), 4);
  207. assert.equal(session.documentToScreenColumn(0, 5), 5);
  208. assert.equal(session.documentToScreenColumn(0, 6), 6);
  209. assert.equal(session.documentToScreenColumn(0, 7), 7);
  210. assert.equal(session.documentToScreenColumn(0, 12), 12);
  211. assert.equal(session.documentToScreenColumn(0, 13), 14);
  212. },
  213. "test: convert document to screen coordinates with leading tabs": function() {
  214. var session = new EditSession("\t\t123");
  215. session.setTabSize(4);
  216. assert.equal(session.documentToScreenColumn(0, 0), 0);
  217. assert.equal(session.documentToScreenColumn(0, 1), 4);
  218. assert.equal(session.documentToScreenColumn(0, 2), 8);
  219. assert.equal(session.documentToScreenColumn(0, 3), 9);
  220. },
  221. "test: documentToScreen without soft wrap": function() {
  222. var session = new EditSession([
  223. "juhu",
  224. "12\t\t34",
  225. "ぁぁa"
  226. ]);
  227. assert.position(session.documentToScreenPosition(0, 3), 0, 3);
  228. assert.position(session.documentToScreenPosition(1, 3), 1, 4);
  229. assert.position(session.documentToScreenPosition(1, 4), 1, 8);
  230. assert.position(session.documentToScreenPosition(2, 2), 2, 4);
  231. },
  232. "test: documentToScreen with soft wrap": function() {
  233. var session = new EditSession(["foo bar foo bar"]);
  234. session.setUseWrapMode(true);
  235. session.setWrapLimitRange(12, 12);
  236. session.adjustWrapLimit(80);
  237. session.setOption("wrapMethod", "text");
  238. assert.position(session.documentToScreenPosition(0, 11), 0, 11);
  239. assert.position(session.documentToScreenPosition(0, 12), 1, 0);
  240. },
  241. "test: documentToScreen with soft wrap and multibyte characters": function() {
  242. var session = new EditSession(["ぁぁa"]);
  243. session.setUseWrapMode(true);
  244. session.setWrapLimitRange(2, 2);
  245. session.adjustWrapLimit(80);
  246. assert.position(session.documentToScreenPosition(0, 1), 1, 0);
  247. assert.position(session.documentToScreenPosition(0, 2), 2, 0);
  248. assert.position(session.documentToScreenPosition(0, 4), 2, 1);
  249. },
  250. "test: documentToScreen should clip position to the document boundaries": function() {
  251. var session = new EditSession("foo bar\njuhu kinners");
  252. assert.position(session.documentToScreenPosition(-1, 4), 0, 0);
  253. assert.position(session.documentToScreenPosition(3, 0), 1, 12);
  254. },
  255. "test: convert screen to document coordinates" : function() {
  256. var session = new EditSession("01234\t567890\t1234");
  257. session.setTabSize(4);
  258. assert.equal(session.screenToDocumentColumn(0, 0), 0);
  259. assert.equal(session.screenToDocumentColumn(0, 4), 4);
  260. assert.equal(session.screenToDocumentColumn(0, 5), 5);
  261. assert.equal(session.screenToDocumentColumn(0, 6), 5);
  262. assert.equal(session.screenToDocumentColumn(0, 7), 5);
  263. assert.equal(session.screenToDocumentColumn(0, 8), 6);
  264. assert.equal(session.screenToDocumentColumn(0, 9), 7);
  265. assert.equal(session.screenToDocumentColumn(0, 15), 12);
  266. assert.equal(session.screenToDocumentColumn(0, 19), 16);
  267. session.setTabSize(2);
  268. assert.equal(session.screenToDocumentColumn(0, 0), 0);
  269. assert.equal(session.screenToDocumentColumn(0, 4), 4);
  270. assert.equal(session.screenToDocumentColumn(0, 5), 5);
  271. assert.equal(session.screenToDocumentColumn(0, 6), 6);
  272. assert.equal(session.screenToDocumentColumn(0, 12), 12);
  273. assert.equal(session.screenToDocumentColumn(0, 13), 12);
  274. assert.equal(session.screenToDocumentColumn(0, 14), 13);
  275. },
  276. "test: screenToDocument with soft wrap": function() {
  277. var session = new EditSession(["foo bar foo bar"]);
  278. session.setUseWrapMode(true);
  279. session.setWrapLimitRange(12, 12);
  280. session.adjustWrapLimit(80);
  281. assert.position(session.screenToDocumentPosition(1, 0), 0, 12);
  282. assert.position(session.screenToDocumentPosition(0, 11), 0, 11);
  283. // Check if the position is clamped the right way.
  284. assert.position(session.screenToDocumentPosition(0, 12), 0, 11);
  285. assert.position(session.screenToDocumentPosition(0, 20), 0, 11);
  286. },
  287. "test: screenToDocument with soft wrap and multi byte characters": function() {
  288. var session = new EditSession(["ぁ a"]);
  289. session.setUseWrapMode(true);
  290. session.adjustWrapLimit(80);
  291. assert.position(session.screenToDocumentPosition(0, 1), 0, 0);
  292. assert.position(session.screenToDocumentPosition(0, 2), 0, 1);
  293. assert.position(session.screenToDocumentPosition(0, 3), 0, 2);
  294. assert.position(session.screenToDocumentPosition(0, 4), 0, 3);
  295. assert.position(session.screenToDocumentPosition(0, 5), 0, 3);
  296. },
  297. "test: screenToDocument should clip position to the document boundaries": function() {
  298. var session = new EditSession("foo bar\njuhu kinners");
  299. assert.position(session.screenToDocumentPosition(-1, 4), 0, 0);
  300. assert.position(session.screenToDocumentPosition(0, -1), 0, 0);
  301. assert.position(session.screenToDocumentPosition(0, 30), 0, 7);
  302. assert.position(session.screenToDocumentPosition(2, 4), 1, 12);
  303. assert.position(session.screenToDocumentPosition(1, 30), 1, 12);
  304. assert.position(session.screenToDocumentPosition(20, 50), 1, 12);
  305. assert.position(session.screenToDocumentPosition(20, 5), 1, 12);
  306. // and the same for folded rows
  307. session.addFold("...", new Range(0,1,1,3));
  308. assert.position(session.screenToDocumentPosition(1, 2), 1, 12);
  309. // for wrapped rows
  310. session.setUseWrapMode(true);
  311. session.setWrapLimitRange(5,5);
  312. assert.position(session.screenToDocumentPosition(4, 1), 1, 12);
  313. },
  314. "test: wrapLine split function" : function() {
  315. function computeAndAssert(line, assertEqual, wrapLimit, tabSize) {
  316. wrapLimit = wrapLimit || 12;
  317. tabSize = tabSize || 4;
  318. line = lang.stringTrimRight(line);
  319. var tokens = EditSession.prototype.$getDisplayTokens(line);
  320. var splits = EditSession.prototype.$computeWrapSplits(tokens, wrapLimit, tabSize);
  321. console.log("String:", line, "Result:", splits, "Expected:", assertEqual);
  322. assert.ok(splits.length == assertEqual.length);
  323. for (var i = 0; i < splits.length; i++) {
  324. assert.ok(splits[i] == assertEqual[i]);
  325. }
  326. }
  327. EditSession.prototype.$wrapAsCode = true;
  328. EditSession.prototype.$indentedSoftWrap = false;
  329. // Basic splitting.
  330. computeAndAssert("foo bar foo bar", [ 12 ]);
  331. computeAndAssert("foo bar f bar", [ 12 ]);
  332. computeAndAssert("foo bar f r", [ 12 ]); // 14 if we enable
  333. computeAndAssert("foo bar foo bar foo bara foo", [12, 25]);
  334. // Don't split if there is only whitespaces/tabs at the end of the line.
  335. computeAndAssert("foo foo foo \t \t", [ ]);
  336. // If there is no space to split, force split.
  337. computeAndAssert("foooooooooooooo", [ 12 ]);
  338. computeAndAssert("fooooooooooooooooooooooooooo", [12, 24]);
  339. computeAndAssert("foo bar fooooooooooobooooooo", [8, 20]);
  340. // Basic splitting + tabs.
  341. computeAndAssert("foo \t\tbar", [ 6 ]);
  342. computeAndAssert("foo \t \tbar", [ 7 ]);
  343. // Ignore spaces/tabs at beginning of split.
  344. computeAndAssert("foo \t \t \t \t bar", [ 7 ]); // 14
  345. // Test wrapping for asian characters.
  346. computeAndAssert("ぁぁ", [1], 2);
  347. computeAndAssert(" ぁぁ", [1, 2], 2);
  348. computeAndAssert(" ぁ\tぁ", [1, 3], 2);
  349. computeAndAssert(" ぁぁ\tぁ", [2, 4], 4);
  350. computeAndAssert("ぁぁ ぁぁ\tぁ", [3, 6], 6);
  351. // Test wrapping for punctuation.
  352. computeAndAssert(" ab.c;ef++", [2, 4, 6, 8], 2);
  353. computeAndAssert(" ab.c;ef++", [3, 5, 8], 3);
  354. computeAndAssert(" a.b", [1, 2, 3], 1);
  355. computeAndAssert("#>>", [1, 2], 1);
  356. // Test wrapping for punctuation in
  357. EditSession.prototype.$wrapAsCode = false;
  358. computeAndAssert("ab cde, Juhu kinners", [3, 8, 13, 19], 6);
  359. // test indented wrapping
  360. EditSession.prototype.$indentedSoftWrap = true;
  361. computeAndAssert("foo bar foo bar foo bara foo", [12, 25]);
  362. computeAndAssert("fooooooooooooooooooooooooooo", [12, 24]);
  363. computeAndAssert("\t\tfoo bar fooooooooooobooooooo", [6, 10, 16, 22, 28]);
  364. computeAndAssert("\t\t\tfoo bar fooooooooooobooooooo", [3, 7, 11, 17, 23, 29]);
  365. computeAndAssert("\tfoo \t \t \t \t bar", [6, 12]); // 14
  366. },
  367. "test get longest line" : function() {
  368. var session = new EditSession(["12"]);
  369. session.setTabSize(4);
  370. assert.equal(session.getScreenWidth(), 2);
  371. session.doc.insertMergedLines({row: 0, column: Infinity}, ['', '']);
  372. session.doc.insertFullLines(1, ["123"]);
  373. assert.equal(session.getScreenWidth(), 3);
  374. session.doc.insertMergedLines({row: 0, column: Infinity}, ['', '']);
  375. session.doc.insertFullLines(1, ["\t\t"]);
  376. assert.equal(session.getScreenWidth(), 8);
  377. session.setTabSize(2);
  378. assert.equal(session.getScreenWidth(), 4);
  379. },
  380. "test getDisplayString": function() {
  381. var session = new EditSession(["12"]);
  382. session.setTabSize(4);
  383. assert.equal(session.$getDisplayTokens("\t").length, 4);
  384. assert.equal(session.$getDisplayTokens("abc").length, 3);
  385. assert.equal(session.$getDisplayTokens("abc\t").length, 4);
  386. },
  387. "test issue 83": function() {
  388. var session = new EditSession("");
  389. var editor = new Editor(new MockRenderer(), session);
  390. var document = session.getDocument();
  391. session.setUseWrapMode(true);
  392. document.insertFullLines(0, ["a", "b"]);
  393. document.insertFullLines(2, ["c", "d"]);
  394. document.removeFullLines(1, 2);
  395. },
  396. "test wrapMode init has to create wrapData array": function() {
  397. var session = new EditSession("foo bar\nfoo bar");
  398. var editor = new Editor(new MockRenderer(), session);
  399. var document = session.getDocument();
  400. session.setUseWrapMode(true);
  401. session.setWrapLimitRange(3, 3);
  402. session.adjustWrapLimit(80);
  403. // Test if wrapData is there and was computed.
  404. assert.equal(session.$wrapData.length, 2);
  405. assert.equal(session.$wrapData[0].length, 1);
  406. assert.equal(session.$wrapData[1].length, 1);
  407. },
  408. "test first line blank with wrap": function() {
  409. var session = new EditSession("\nfoo");
  410. session.setUseWrapMode(true);
  411. assert.equal(session.doc.getValue(), ["", "foo"].join("\n"));
  412. },
  413. "test first line blank with wrap 2" : function() {
  414. var session = new EditSession("");
  415. session.setUseWrapMode(true);
  416. session.setValue("\nfoo");
  417. assert.equal(session.doc.getValue(), ["", "foo"].join("\n"));
  418. },
  419. "test fold getFoldDisplayLine": function() {
  420. var session = createFoldTestSession();
  421. function assertDisplayLine(foldLine, str) {
  422. var line = session.getLine(foldLine.end.row);
  423. var displayLine =
  424. session.getFoldDisplayLine(foldLine, foldLine.end.row, line.length);
  425. assert.equal(displayLine, str);
  426. }
  427. assertDisplayLine(session.$foldData[0], "function foo(args...) {")
  428. assertDisplayLine(session.$foldData[1], " for (vfoo...ert(items[bar...\"juhu\");");
  429. },
  430. "test foldLine idxToPosition": function() {
  431. var session = createFoldTestSession();
  432. function assertIdx2Pos(foldLineIdx, idx, row, column) {
  433. var foldLine = session.$foldData[foldLineIdx];
  434. assert.position(foldLine.idxToPosition(idx), row, column);
  435. }
  436. // "function foo(items) {",
  437. // " for (var i=0; i<items.length; i++) {",
  438. // " alert(items[i] + \"juhu\");",
  439. // " } // Real Tab.",
  440. // "}"
  441. assertIdx2Pos(0, 12, 0, 12);
  442. assertIdx2Pos(0, 13, 0, 13);
  443. assertIdx2Pos(0, 14, 0, 13);
  444. assertIdx2Pos(0, 19, 0, 13);
  445. assertIdx2Pos(0, 20, 0, 18);
  446. assertIdx2Pos(1, 10, 1, 10);
  447. assertIdx2Pos(1, 11, 1, 10);
  448. assertIdx2Pos(1, 15, 1, 10);
  449. assertIdx2Pos(1, 16, 2, 10);
  450. assertIdx2Pos(1, 26, 2, 20);
  451. assertIdx2Pos(1, 27, 2, 20);
  452. assertIdx2Pos(1, 32, 2, 25);
  453. },
  454. "test fold documentToScreen": function() {
  455. var session = createFoldTestSession();
  456. function assertDoc2Screen(docRow, docCol, screenRow, screenCol) {
  457. assert.position(
  458. session.documentToScreenPosition(docRow, docCol),
  459. screenRow, screenCol
  460. );
  461. }
  462. // One fold ending in the same row.
  463. assertDoc2Screen(0, 0, 0, 0);
  464. assertDoc2Screen(0, 13, 0, 13);
  465. assertDoc2Screen(0, 14, 0, 13);
  466. assertDoc2Screen(0, 17, 0, 13);
  467. assertDoc2Screen(0, 18, 0, 20);
  468. // Fold ending on some other row.
  469. assertDoc2Screen(1, 0, 1, 0);
  470. assertDoc2Screen(1, 10, 1, 10);
  471. assertDoc2Screen(1, 11, 1, 10);
  472. assertDoc2Screen(1, 99, 1, 10);
  473. assertDoc2Screen(2, 0, 1, 10);
  474. assertDoc2Screen(2, 9, 1, 10);
  475. assertDoc2Screen(2, 10, 1, 16);
  476. assertDoc2Screen(2, 11, 1, 17);
  477. // Fold in the same row with fold over more then one row in the same row.
  478. assertDoc2Screen(2, 19, 1, 25);
  479. assertDoc2Screen(2, 20, 1, 26);
  480. assertDoc2Screen(2, 21, 1, 26);
  481. assertDoc2Screen(2, 24, 1, 26);
  482. assertDoc2Screen(2, 25, 1, 32);
  483. assertDoc2Screen(2, 26, 1, 33);
  484. assertDoc2Screen(2, 99, 1, 40);
  485. // Test one position after the folds. Should be all like normal.
  486. assertDoc2Screen(3, 0, 2, 0);
  487. },
  488. "test fold screenToDocument": function() {
  489. var session = createFoldTestSession();
  490. function assertScreen2Doc(docRow, docCol, screenRow, screenCol) {
  491. assert.position(
  492. session.screenToDocumentPosition(screenRow, screenCol),
  493. docRow, docCol
  494. );
  495. }
  496. // One fold ending in the same row.
  497. assertScreen2Doc(0, 0, 0, 0);
  498. assertScreen2Doc(0, 13, 0, 13);
  499. assertScreen2Doc(0, 13, 0, 14);
  500. assertScreen2Doc(0, 18, 0, 20);
  501. assertScreen2Doc(0, 19, 0, 21);
  502. // Fold ending on some other row.
  503. assertScreen2Doc(1, 0, 1, 0);
  504. assertScreen2Doc(1, 10, 1, 10);
  505. assertScreen2Doc(1, 10, 1, 11);
  506. assertScreen2Doc(1, 10, 1, 15);
  507. assertScreen2Doc(2, 10, 1, 16);
  508. assertScreen2Doc(2, 11, 1, 17);
  509. // Fold in the same row with fold over more then one row in the same row.
  510. assertScreen2Doc(2, 19, 1, 25);
  511. assertScreen2Doc(2, 20, 1, 26);
  512. assertScreen2Doc(2, 20, 1, 27);
  513. assertScreen2Doc(2, 20, 1, 31);
  514. assertScreen2Doc(2, 25, 1, 32);
  515. assertScreen2Doc(2, 26, 1, 33);
  516. assertScreen2Doc(2, 33, 1, 99);
  517. // Test one position after the folds. Should be all like normal.
  518. assertScreen2Doc(3, 0, 2, 0);
  519. },
  520. "test getFoldsInRange()": function() {
  521. var session = createFoldTestSession();
  522. var foldLines = session.$foldData;
  523. var folds = foldLines[0].folds.concat(foldLines[1].folds);
  524. function test(startRow, startColumn, endColumn, endRow, folds) {
  525. var r = new Range(startRow, startColumn, endColumn, endRow);
  526. var retFolds = session.getFoldsInRange(r);
  527. assert.ok(retFolds.length == folds.length);
  528. for (var i = 0; i < retFolds.length; i++) {
  529. assert.equal(retFolds[i].range + "", folds[i].range + "");
  530. }
  531. }
  532. test(0, 0, 0, 13, [ ]);
  533. test(0, 0, 0, 14, [ folds[0] ]);
  534. test(0, 0, 0, 18, [ folds[0] ]);
  535. test(0, 0, 1, 10, [ folds[0] ]);
  536. test(0, 0, 1, 11, [ folds[0], folds[1] ]);
  537. test(0, 18, 1, 11, [ folds[1] ]);
  538. test(2, 0, 2, 13, [ folds[1] ]);
  539. test(2, 10, 2, 20, [ ]);
  540. test(2, 10, 2, 11, [ ]);
  541. test(2, 19, 2, 20, [ ]);
  542. },
  543. "test fold one-line text insert": function() {
  544. // These are mostly test for the FoldLine.addRemoveChars function.
  545. var session = createFoldTestSession();
  546. var undoManager = session.getUndoManager();
  547. var foldLines = session.$foldData;
  548. function insert(row, column, text) {
  549. session.insert({row: row, column: column}, text);
  550. // Force the session to store all changes made to the document NOW
  551. // on the undoManager's queue. Otherwise we can't undo in separate
  552. // steps later.
  553. session.$syncInformUndoManager();
  554. }
  555. var foldLine, fold, folds;
  556. // First line.
  557. foldLine = session.$foldData[0];
  558. fold = foldLine.folds[0];
  559. insert(0, 0, "0");
  560. assert.range(foldLine.range, 0, 14, 0, 19);
  561. assert.range(fold.range, 0, 14, 0, 19);
  562. insert(0, 14, "1");
  563. assert.range(foldLine.range, 0, 15, 0, 20);
  564. assert.range(fold.range, 0, 15, 0, 20);
  565. insert(0, 20, "2");
  566. assert.range(foldLine.range, 0, 15, 0, 20);
  567. assert.range(fold.range, 0, 15, 0, 20);
  568. // Second line.
  569. foldLine = session.$foldData[1];
  570. folds = foldLine.folds;
  571. insert(1, 0, "3");
  572. assert.range(foldLine.range, 1, 11, 2, 25);
  573. assert.range(folds[0].range, 1, 11, 2, 10);
  574. assert.range(folds[1].range, 2, 20, 2, 25);
  575. insert(1, 11, "4");
  576. assert.range(foldLine.range, 1, 12, 2, 25);
  577. assert.range(folds[0].range, 1, 12, 2, 10);
  578. assert.range(folds[1].range, 2, 20, 2, 25);
  579. insert(2, 10, "5");
  580. assert.range(foldLine.range, 1, 12, 2, 26);
  581. assert.range(folds[0].range, 1, 12, 2, 10);
  582. assert.range(folds[1].range, 2, 21, 2, 26);
  583. insert(2, 21, "6");
  584. assert.range(foldLine.range, 1, 12, 2, 27);
  585. assert.range(folds[0].range, 1, 12, 2, 10);
  586. assert.range(folds[1].range, 2, 22, 2, 27);
  587. insert(2, 27, "7");
  588. assert.range(foldLine.range, 1, 12, 2, 27);
  589. assert.range(folds[0].range, 1, 12, 2, 10);
  590. assert.range(folds[1].range, 2, 22, 2, 27);
  591. // UNDO = REMOVE
  592. undoManager.undo(); // 6
  593. assert.range(foldLine.range, 1, 12, 2, 27);
  594. assert.range(folds[0].range, 1, 12, 2, 10);
  595. assert.range(folds[1].range, 2, 22, 2, 27);
  596. undoManager.undo(); // 5
  597. assert.range(foldLine.range, 1, 12, 2, 26);
  598. assert.range(folds[0].range, 1, 12, 2, 10);
  599. assert.range(folds[1].range, 2, 21, 2, 26);
  600. undoManager.undo(); // 4
  601. assert.range(foldLine.range, 1, 12, 2, 25);
  602. assert.range(folds[0].range, 1, 12, 2, 10);
  603. assert.range(folds[1].range, 2, 20, 2, 25);
  604. undoManager.undo(); // 3
  605. assert.range(foldLine.range, 1, 11, 2, 25);
  606. assert.range(folds[0].range, 1, 11, 2, 10);
  607. assert.range(folds[1].range, 2, 20, 2, 25);
  608. undoManager.undo(); // Beginning first line.
  609. assert.equal(foldLines.length, 2);
  610. assert.range(foldLines[0].range, 0, 15, 0, 20);
  611. assert.range(foldLines[1].range, 1, 10, 2, 25);
  612. foldLine = session.$foldData[0];
  613. fold = foldLine.folds[0];
  614. undoManager.undo(); // 2
  615. assert.range(foldLine.range, 0, 15, 0, 20);
  616. assert.range(fold.range, 0, 15, 0, 20);
  617. undoManager.undo(); // 1
  618. assert.range(foldLine.range, 0, 14, 0, 19);
  619. assert.range(fold.range, 0, 14, 0, 19);
  620. undoManager.undo(); // 0
  621. assert.range(foldLine.range, 0, 13, 0, 18);
  622. assert.range(fold.range, 0, 13, 0, 18);
  623. },
  624. "test fold multi-line insert/remove": function() {
  625. var session = createFoldTestSession(),
  626. undoManager = session.getUndoManager(),
  627. foldLines = session.$foldData;
  628. function insert(row, column, text) {
  629. session.insert({row: row, column: column}, text);
  630. // Force the session to store all changes made to the document NOW
  631. // on the undoManager's queue. Otherwise we can't undo in separate
  632. // steps later.
  633. session.$syncInformUndoManager();
  634. }
  635. var foldLines = session.$foldData, foldLine, fold, folds;
  636. insert(0, 0, "\nfo0");
  637. assert.equal(foldLines.length, 2);
  638. assert.range(foldLines[0].range, 1, 16, 1, 21);
  639. assert.range(foldLines[1].range, 2, 10, 3, 25);
  640. insert(2, 0, "\nba1");
  641. assert.equal(foldLines.length, 2);
  642. assert.range(foldLines[0].range, 1, 16, 1, 21);
  643. assert.range(foldLines[1].range, 3, 13, 4, 25);
  644. insert(3, 10, "\nfo2");
  645. assert.equal(foldLines.length, 2);
  646. assert.range(foldLines[0].range, 1, 16, 1, 21);
  647. assert.range(foldLines[1].range, 4, 6, 5, 25);
  648. insert(5, 10, "\nba3");
  649. assert.equal(foldLines.length, 3);
  650. assert.range(foldLines[0].range, 1, 16, 1, 21);
  651. assert.range(foldLines[1].range, 4, 6, 5, 10);
  652. assert.range(foldLines[2].range, 6, 13, 6, 18);
  653. insert(6, 18, "\nfo4");
  654. assert.equal(foldLines.length, 3);
  655. assert.range(foldLines[0].range, 1, 16, 1, 21);
  656. assert.range(foldLines[1].range, 4, 6, 5, 10);
  657. assert.range(foldLines[2].range, 6, 13, 6, 18);
  658. undoManager.undo(); // 3
  659. assert.equal(foldLines.length, 3);
  660. assert.range(foldLines[0].range, 1, 16, 1, 21);
  661. assert.range(foldLines[1].range, 4, 6, 5, 10);
  662. assert.range(foldLines[2].range, 6, 13, 6, 18);
  663. undoManager.undo(); // 2
  664. assert.equal(foldLines.length, 2);
  665. assert.range(foldLines[0].range, 1, 16, 1, 21);
  666. assert.range(foldLines[1].range, 4, 6, 5, 25);
  667. undoManager.undo(); // 1
  668. assert.equal(foldLines.length, 2);
  669. assert.range(foldLines[0].range, 1, 16, 1, 21);
  670. assert.range(foldLines[1].range, 3, 13, 4, 25);
  671. undoManager.undo(); // 0
  672. assert.equal(foldLines.length, 2);
  673. assert.range(foldLines[0].range, 1, 16, 1, 21);
  674. assert.range(foldLines[1].range, 2, 10, 3, 25);
  675. undoManager.undo(); // Beginning
  676. assert.equal(foldLines.length, 2);
  677. assert.range(foldLines[0].range, 0, 13, 0, 18);
  678. assert.range(foldLines[1].range, 1, 10, 2, 25);
  679. // TODO: Add test for inseration inside of folds.
  680. },
  681. "test fold wrap data compution": function() {
  682. function assertWrap(line0, line1, line2) {
  683. line0 && assertArray(wrapData[0], line0);
  684. line1 && assertArray(wrapData[1], line1);
  685. line2 && assertArray(wrapData[2], line2);
  686. }
  687. function removeFoldAssertWrap(docRow, docColumn, line0, line1, line2) {
  688. session.removeFold(session.getFoldAt(docRow, docColumn));
  689. assertWrap(line0, line1, line2);
  690. }
  691. var lines = [
  692. "foo bar foo bar",
  693. "foo bar foo bar",
  694. "foo bar foo bar"
  695. ];
  696. var session = new EditSession(lines.join("\n"));
  697. session.setUseWrapMode(true);
  698. session.$wrapLimit = 7;
  699. session.$updateWrapData(0, 2);
  700. var wrapData = session.$wrapData;
  701. // Do a simple assertion without folds to check basic functionallity.
  702. assertWrap([8], [8], [8]);
  703. // --- Do in line folding ---
  704. // Adding a fold. The split position is inside of the fold. As placeholder
  705. // are not splitable, the split should be before the split.
  706. session.addFold("woot", new Range(0, 4, 0, 15));
  707. assertWrap([4], [8], [8]);
  708. // Remove the fold again which should reset the wrapData.
  709. removeFoldAssertWrap(0, 4, [8], [8], [8]);
  710. session.addFold("woot", new Range(0, 6, 0, 9));
  711. assertWrap([6, 13], [8], [8]);
  712. removeFoldAssertWrap(0, 6, [8], [8], [8]);
  713. // The fold fits into the wrap limit - no split expected.
  714. session.addFold("woot", new Range(0, 3, 0, 15));
  715. assertWrap([], [8], [8]);
  716. removeFoldAssertWrap(0, 4, [8], [8], [8]);
  717. // Fold after split position should be all fine.
  718. session.addFold("woot", new Range(0, 8, 0, 15));
  719. assertWrap([8], [8], [8]);
  720. removeFoldAssertWrap(0, 8, [8], [8], [8]);
  721. // Fold's placeholder is far too long for wrapSplit.
  722. session.addFold("woot0123456789", new Range(0, 8, 0, 15));
  723. assertWrap([8], [8], [8]);
  724. removeFoldAssertWrap(0, 8, [8], [8], [8]);
  725. // Fold's placeholder is far too long for wrapSplit
  726. // + content at the end of the line
  727. session.addFold("woot0123456789", new Range(0, 6, 0, 8));
  728. assertWrap([6, 20], [8], [8]);
  729. removeFoldAssertWrap(0, 8, [8], [8], [8]);
  730. session.addFold("woot0123456789", new Range(0, 6, 0, 8));
  731. session.addFold("woot0123456789", new Range(0, 8, 0, 10));
  732. assertWrap([6, 20, 34], [8], [8]);
  733. session.removeFold(session.getFoldAt(0, 7));
  734. removeFoldAssertWrap(0, 8, [8], [8], [8]);
  735. session.addFold("woot0123456789", new Range(0, 7, 0, 9));
  736. session.addFold("woot0123456789", new Range(0, 13, 0, 15));
  737. assertWrap([7, 21, 25], [8], [8]);
  738. session.removeFold(session.getFoldAt(0, 7));
  739. removeFoldAssertWrap(0, 14, [8], [8], [8]);
  740. // --- Do some multiline folding ---
  741. // Add a fold over two lines. Note, that the wrapData[1] stays the
  742. // same. This is an implementation detail and expected behavior.
  743. session.addFold("woot", new Range(0, 8, 1, 15));
  744. assertWrap([8], [8 /* See comments */], [8]);
  745. removeFoldAssertWrap(0, 8, [8], [8], [8]);
  746. session.addFold("woot", new Range(0, 9, 1, 11));
  747. assertWrap([8, 14], [8 /* See comments */], [8]);
  748. removeFoldAssertWrap(0, 9, [8], [8], [8]);
  749. session.addFold("woot", new Range(0, 9, 1, 15));
  750. assertWrap([8], [8 /* See comments */], [8]);
  751. removeFoldAssertWrap(0, 9, [8], [8], [8]);
  752. return session;
  753. },
  754. "test delete fold with wrap enabled": function() {
  755. var session = new EditSession("");
  756. session.setValue([
  757. "This is some placeholder text that will be folded inline.",
  758. "This is some placeholder text that will be folded inline.",
  759. "More text.",
  760. "<p>The cursor in this paragraph text will be offset by 1 row.<p>",
  761. "<p>Everything after this will be offset as well due to the folds in the row before too.</p>"
  762. ].join("\n"));
  763. session.addFold('...', new Range(0, 8, 0, 42));
  764. session.addFold('...', new Range(1, 8, 1, 42));
  765. session.addFold('...', new Range(3, 7, 3, 51));
  766. session.setOption("wrap", 40);
  767. session.remove(new Range(0,0, 2, 5));
  768. // needed because adjustWrapLimit is called async from renderer
  769. session.adjustWrapLimit(80);
  770. assert.equal(session.$wrapData + "", [[], [], [40, 76]] + "");
  771. },
  772. "test add fold": function() {
  773. var session = createFoldTestSession();
  774. var fold;
  775. function tryAddFold(placeholder, range, shouldFail) {
  776. var fail = false;
  777. try {
  778. fold = session.addFold(placeholder, range);
  779. } catch (e) {
  780. fail = true;
  781. }
  782. if (fail != shouldFail) {
  783. throw new Error("Expected to get an exception");
  784. }
  785. }
  786. tryAddFold("foo", new Range(0, 13, 0, 17), false);
  787. tryAddFold("foo", new Range(0, 14, 0, 18), true);
  788. tryAddFold("foo", new Range(0, 13, 0, 18), false);
  789. assert.equal(session.$foldData[0].folds.length, 1);
  790. tryAddFold("f", new Range(0, 13, 0, 18), false);
  791. tryAddFold("foo", new Range(0, 18, 0, 21), false);
  792. assert.equal(session.$foldData[0].folds.length, 2);
  793. session.removeFold(fold);
  794. tryAddFold("foo", new Range(0, 18, 0, 22), false);
  795. tryAddFold("foo", new Range(0, 18, 0, 19), true);
  796. tryAddFold("foo", new Range(0, 22, 1, 10), false);
  797. },
  798. "test add subfolds": function() {
  799. var session = createFoldTestSession();
  800. var fold, oldFold;
  801. var foldData = session.$foldData;
  802. oldFold = foldData[0].folds[0];
  803. fold = session.addFold("fold0", new Range(0, 10, 0, 21));
  804. assert.equal(foldData[0].folds.length, 1);
  805. assert.equal(fold.subFolds.length, 1);
  806. assert.equal(fold.subFolds[0], oldFold);
  807. session.expandFold(fold);
  808. assert.equal(foldData[0].folds.length, 1);
  809. assert.equal(foldData[0].folds[0], oldFold);
  810. assert.equal(fold.subFolds.length, 0);
  811. fold = session.addFold("fold0", new Range(0, 13, 2, 10));
  812. assert.equal(foldData.length, 1);
  813. assert.equal(fold.subFolds.length, 2);
  814. assert.equal(fold.subFolds[0], oldFold);
  815. session.expandFold(fold);
  816. assert.equal(foldData.length, 2);
  817. assert.equal(foldData[0].folds.length, 1);
  818. assert.equal(foldData[0].folds[0], oldFold);
  819. assert.equal(fold.subFolds.length, 0);
  820. session.unfold(null, true);
  821. fold = session.addFold("fold0", new Range(0, 0, 0, 21));
  822. session.addFold("fold0", new Range(0, 1, 0, 5));
  823. session.addFold("fold0", new Range(0, 6, 0, 8));
  824. assert.equal(fold.subFolds.length, 2);
  825. },
  826. "test row cache": function() {
  827. var session = createFoldTestSession();
  828. session.screenToDocumentPosition(2,3);
  829. assertArray(session.$docRowCache, [1,3]);
  830. assertArray(session.$screenRowCache, [1,2]);
  831. session.screenToDocumentPosition(5,3);
  832. assertArray(session.$docRowCache, [1,3,4]);
  833. assertArray(session.$screenRowCache, [1,2,3]);
  834. session.screenToDocumentPosition(0,3);
  835. assertArray(session.$docRowCache, [1,3,4]);
  836. assertArray(session.$screenRowCache, [1,2,3]);
  837. var pos = session.screenToDocumentPosition(0,0);
  838. assert.equal(pos.row, 0);
  839. assertArray(session.$docRowCache, [1,3,4]);
  840. assertArray(session.$screenRowCache, [1,2,3]);
  841. session.screenToDocumentPosition(1,0);
  842. assertArray(session.$docRowCache, [1,3,4]);
  843. assertArray(session.$screenRowCache, [1,2,3]);
  844. session.$resetRowCache();
  845. assertArray(session.$docRowCache, []);
  846. assertArray(session.$screenRowCache, []);
  847. session.screenToDocumentPosition(1,3);
  848. assertArray(session.$docRowCache, [1]);
  849. assertArray(session.$screenRowCache, [1]);
  850. session.screenToDocumentPosition(5,3);
  851. assertArray(session.$docRowCache, [1,3,4]);
  852. assertArray(session.$screenRowCache, [1,2,3]);
  853. session = new EditSession(new Array(30).join("\n"));
  854. session.documentToScreenPosition(2,0);
  855. session.documentToScreenPosition(2,0);
  856. assertArray(session.$docRowCache, [1,2]);
  857. assertArray(session.$screenRowCache, [1,2]);
  858. },
  859. "test annotations": function() {
  860. var session = new EditSession([]),
  861. annotation = {row: 0, type: 'info', text: "This is a test."};
  862. session.clearAnnotations();
  863. assertArray(session.getAnnotations(), []);
  864. session.setAnnotations([annotation]);
  865. assertArray(session.getAnnotations(), [annotation]);
  866. },
  867. "test: mode loading" : function(next) {
  868. if (!require.undef) {
  869. console.log("Skipping test: This test only runs in the browser");
  870. next();
  871. return;
  872. }
  873. var session = new EditSession([]);
  874. session.setMode("ace/mode/javascript");
  875. assert.equal(session.$modeid, "ace/mode/javascript");
  876. session.on("changeMode", function() {
  877. assert.equal(session.$modeid, "ace/mode/javascript");
  878. });
  879. session.setMode("ace/mode/sh", function(mode) {
  880. assert.ok(!mode);
  881. });
  882. setTimeout(function() {
  883. session.setMode("ace/mode/javascript", function(mode) {
  884. session.setMode("ace/mode/javascript");
  885. assert.equal(session.$modeid, "ace/mode/javascript");
  886. next();
  887. });
  888. }, 0);
  889. }
  890. };
  891. });
  892. if (typeof module !== "undefined" && module === require.main) {
  893. require("asyncjs").test.testcase(module.exports).exec();
  894. }