search_test.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  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. }
  33. define(function(require, exports, module) {
  34. "use strict";
  35. var EditSession = require("./edit_session").EditSession;
  36. var Search = require("./search").Search;
  37. var assert = require("./test/assertions");
  38. module.exports = {
  39. "test: configure the search object" : function() {
  40. var search = new Search();
  41. search.set({
  42. needle: "juhu"
  43. });
  44. },
  45. "test: find simple text in document" : function() {
  46. var session = new EditSession(["juhu kinners 123", "456"]);
  47. var search = new Search().set({
  48. needle: "kinners"
  49. });
  50. var range = search.find(session);
  51. assert.position(range.start, 0, 5);
  52. assert.position(range.end, 0, 12);
  53. },
  54. "test: find simple text in next line" : function() {
  55. var session = new EditSession(["abc", "juhu kinners 123", "456"]);
  56. var search = new Search().set({
  57. needle: "kinners"
  58. });
  59. var range = search.find(session);
  60. assert.position(range.start, 1, 5);
  61. assert.position(range.end, 1, 12);
  62. },
  63. "test: find text starting at cursor position" : function() {
  64. var session = new EditSession(["juhu kinners", "juhu kinners 123"]);
  65. session.getSelection().moveCursorTo(0, 6);
  66. var search = new Search().set({
  67. needle: "kinners"
  68. });
  69. var range = search.find(session);
  70. assert.position(range.start, 1, 5);
  71. assert.position(range.end, 1, 12);
  72. },
  73. "test: wrap search is on by default" : function() {
  74. var session = new EditSession(["abc", "juhu kinners 123", "456"]);
  75. session.getSelection().moveCursorTo(2, 1);
  76. var search = new Search().set({
  77. needle: "kinners"
  78. });
  79. assert.notEqual(search.find(session), null);
  80. },
  81. "test: wrap search should wrap at file end" : function() {
  82. var session = new EditSession(["abc", "juhu kinners 123", "456"]);
  83. session.getSelection().moveCursorTo(2, 1);
  84. var search = new Search().set({
  85. needle: "kinners",
  86. wrap: true
  87. });
  88. var range = search.find(session);
  89. assert.position(range.start, 1, 5);
  90. assert.position(range.end, 1, 12);
  91. },
  92. "test: wrap search should find needle even if it starts inside it" : function() {
  93. var session = new EditSession(["abc", "juhu kinners 123", "456"]);
  94. session.getSelection().moveCursorTo(6, 1);
  95. var search = new Search().set({
  96. needle: "kinners",
  97. wrap: true
  98. });
  99. var range = search.find(session);
  100. assert.position(range.start, 1, 5);
  101. assert.position(range.end, 1, 12);
  102. },
  103. "test: wrap search with no match should return 'null'": function() {
  104. var session = new EditSession(["abc", "juhu kinners 123", "456"]);
  105. session.getSelection().moveCursorTo(2, 1);
  106. var search = new Search().set({
  107. needle: "xyz",
  108. wrap: true
  109. });
  110. assert.equal(search.find(session), null);
  111. },
  112. "test: case sensitive is by default off": function() {
  113. var session = new EditSession(["abc", "juhu kinners 123", "456"]);
  114. var search = new Search().set({
  115. needle: "JUHU"
  116. });
  117. assert.range(search.find(session), 1, 0, 1, 4);
  118. },
  119. "test: case sensitive search": function() {
  120. var session = new EditSession(["abc", "juhu kinners 123", "456"]);
  121. var search = new Search().set({
  122. needle: "KINNERS",
  123. caseSensitive: true
  124. });
  125. var range = search.find(session);
  126. assert.equal(range, null);
  127. },
  128. "test: whole word search should not match inside of words": function() {
  129. var session = new EditSession(["juhukinners", "juhu kinners 123", "456"]);
  130. var search = new Search().set({
  131. needle: "kinners",
  132. wholeWord: true
  133. });
  134. var range = search.find(session);
  135. assert.position(range.start, 1, 5);
  136. assert.position(range.end, 1, 12);
  137. },
  138. "test: find backwards": function() {
  139. var session = new EditSession(["juhu juhu juhu juhu"]);
  140. session.getSelection().moveCursorTo(0, 10);
  141. var search = new Search().set({
  142. needle: "juhu",
  143. backwards: true
  144. });
  145. var range = search.find(session);
  146. assert.position(range.start, 0, 5);
  147. assert.position(range.end, 0, 9);
  148. },
  149. "test: find in selection": function() {
  150. var session = new EditSession(["juhu", "juhu", "juhu", "juhu"]);
  151. session.getSelection().setSelectionAnchor(1, 0);
  152. session.getSelection().selectTo(3, 5);
  153. var search = new Search().set({
  154. needle: "juhu",
  155. wrap: true,
  156. range: session.getSelection().getRange()
  157. });
  158. var range = search.find(session);
  159. assert.position(range.start, 1, 0);
  160. assert.position(range.end, 1, 4);
  161. search = new Search().set({
  162. needle: "juhu",
  163. wrap: true,
  164. range: session.getSelection().getRange()
  165. });
  166. session.getSelection().setSelectionAnchor(0, 2);
  167. session.getSelection().selectTo(3, 2);
  168. var range = search.find(session);
  169. assert.position(range.start, 1, 0);
  170. assert.position(range.end, 1, 4);
  171. },
  172. "test: find backwards in selection": function() {
  173. var session = new EditSession(["juhu", "juhu", "juhu", "juhu"]);
  174. session.getSelection().setSelectionAnchor(0, 2);
  175. session.getSelection().selectTo(3, 2);
  176. var search = new Search().set({
  177. needle: "juhu",
  178. wrap: true,
  179. backwards: true,
  180. range: session.getSelection().getRange()
  181. });
  182. var range = search.find(session);
  183. assert.position(range.start, 2, 0);
  184. assert.position(range.end, 2, 4);
  185. search = new Search().set({
  186. needle: "juhu",
  187. wrap: true,
  188. range: session.getSelection().getRange()
  189. });
  190. session.getSelection().setSelectionAnchor(0, 2);
  191. session.getSelection().selectTo(1, 2);
  192. var range = search.find(session);
  193. assert.position(range.start, 1, 0);
  194. assert.position(range.end, 1, 4);
  195. },
  196. "test: edge case - match directly before the cursor" : function() {
  197. var session = new EditSession(["123", "123", "juhu"]);
  198. var search = new Search().set({
  199. needle: "juhu",
  200. wrap: true
  201. });
  202. session.getSelection().moveCursorTo(2, 5);
  203. var range = search.find(session);
  204. assert.position(range.start, 2, 0);
  205. assert.position(range.end, 2, 4);
  206. },
  207. "test: edge case - match backwards directly after the cursor" : function() {
  208. var session = new EditSession(["123", "123", "juhu"]);
  209. var search = new Search().set({
  210. needle: "juhu",
  211. wrap: true,
  212. backwards: true
  213. });
  214. session.getSelection().moveCursorTo(2, 0);
  215. var range = search.find(session);
  216. assert.position(range.start, 2, 0);
  217. assert.position(range.end, 2, 4);
  218. },
  219. "test: find using a regular expression" : function() {
  220. var session = new EditSession(["abc123 123 cd", "abc"]);
  221. var search = new Search().set({
  222. needle: "\\d+",
  223. regExp: true
  224. });
  225. var range = search.find(session);
  226. assert.position(range.start, 0, 3);
  227. assert.position(range.end, 0, 6);
  228. },
  229. "test: find using a regular expression and whole word" : function() {
  230. var session = new EditSession(["abc123 123 cd", "abc"]);
  231. var search = new Search().set({
  232. needle: "\\d+\\b",
  233. regExp: true,
  234. wholeWord: true
  235. });
  236. var range = search.find(session);
  237. assert.position(range.start, 0, 7);
  238. assert.position(range.end, 0, 10);
  239. },
  240. "test: use regular expressions with capture groups": function() {
  241. var session = new EditSession([" ab: 12px", " <h1 abc"]);
  242. var search = new Search().set({
  243. needle: "(\\d+)",
  244. regExp: true
  245. });
  246. var range = search.find(session);
  247. assert.position(range.start, 0, 6);
  248. assert.position(range.end, 0, 8);
  249. },
  250. "test: find all matches in selection" : function() {
  251. var session = new EditSession(["juhu", "juhu", "juhu", "juhu"]);
  252. session.getSelection().setSelectionAnchor(0, 2);
  253. session.getSelection().selectTo(3, 2);
  254. var search = new Search().set({
  255. needle: "uh",
  256. wrap: true,
  257. range: session.getSelection().getRange()
  258. });
  259. var ranges = search.findAll(session);
  260. assert.equal(ranges.length, 2);
  261. assert.position(ranges[0].start, 1, 1);
  262. assert.position(ranges[0].end, 1, 3);
  263. assert.position(ranges[1].start, 2, 1);
  264. assert.position(ranges[1].end, 2, 3);
  265. },
  266. "test: find all multiline matches" : function() {
  267. var session = new EditSession(["juhu", "juhu", "juhu", "juhu"]);
  268. var search = new Search().set({
  269. needle: "hu\nju",
  270. wrap: true
  271. });
  272. var ranges = search.findAll(session);
  273. assert.equal(ranges.length, 3);
  274. assert.position(ranges[0].start, 0, 2);
  275. assert.position(ranges[0].end, 1, 2);
  276. assert.position(ranges[1].start, 1, 2);
  277. assert.position(ranges[1].end, 2, 2);
  278. },
  279. "test: replace() should return the replacement if the input matches the needle" : function() {
  280. var search = new Search().set({
  281. needle: "juhu"
  282. });
  283. assert.equal(search.replace("juhu", "kinners"), "kinners");
  284. assert.equal(search.replace("", "kinners"), null);
  285. assert.equal(search.replace(" juhu", "kinners"), null);
  286. // case sensitivity
  287. assert.equal(search.replace("Juhu", "kinners"), "kinners");
  288. search.set({caseSensitive: true});
  289. assert.equal(search.replace("Juhu", "kinners"), null);
  290. // regexp replacement
  291. },
  292. "test: replace with a RegExp search" : function() {
  293. var search = new Search().set({
  294. needle: "\\d+",
  295. regExp: true
  296. });
  297. assert.equal(search.replace("123", "kinners"), "kinners");
  298. assert.equal(search.replace("01234", "kinners"), "kinners");
  299. assert.equal(search.replace("", "kinners"), null);
  300. assert.equal(search.replace("a12", "kinners"), null);
  301. assert.equal(search.replace("12a", "kinners"), null);
  302. },
  303. "test: replace with RegExp match and capture groups" : function() {
  304. var search = new Search().set({
  305. needle: "ab(\\d\\d)",
  306. regExp: true
  307. });
  308. assert.equal(search.replace("ab12", "cd$1"), "cd12");
  309. assert.equal(search.replace("ab12", "-$&-"), "-ab12-");
  310. assert.equal(search.replace("ab12", "$$"), "$");
  311. },
  312. "test: find all using regular expresion containing $" : function() {
  313. var session = new EditSession(["a", " b", "c ", "d"]);
  314. var search = new Search().set({
  315. needle: "[ ]+$",
  316. regExp: true,
  317. wrap: true
  318. });
  319. session.getSelection().moveCursorTo(1, 2);
  320. var ranges = search.findAll(session);
  321. assert.equal(ranges.length, 1);
  322. assert.position(ranges[0].start, 2, 1);
  323. assert.position(ranges[0].end, 2, 2);
  324. },
  325. "test: find all matches in a line" : function() {
  326. var session = new EditSession("foo bar foo baz foobar foo");
  327. var search = new Search().set({
  328. needle: "foo",
  329. wrap: true,
  330. wholeWord: true
  331. });
  332. session.getSelection().moveCursorTo(0, 4);
  333. var ranges = search.findAll(session);
  334. assert.equal(ranges.length, 3);
  335. assert.position(ranges[0].start, 0, 0);
  336. assert.position(ranges[0].end, 0, 3);
  337. assert.position(ranges[1].start, 0, 8);
  338. assert.position(ranges[1].end, 0, 11);
  339. assert.position(ranges[2].start, 0, 23);
  340. assert.position(ranges[2].end, 0, 26);
  341. },
  342. "test: find all matches in a line backwards" : function() {
  343. var session = new EditSession("foo bar foo baz foobar foo");
  344. var search = new Search().set({
  345. needle: "foo",
  346. wrap: true,
  347. wholeWord: true,
  348. backwards: true
  349. });
  350. session.getSelection().moveCursorTo(0, 13);
  351. var ranges = search.findAll(session);
  352. assert.equal(ranges.length, 3);
  353. assert.position(ranges[2].start, 0, 23);
  354. assert.position(ranges[2].end, 0, 26);
  355. assert.position(ranges[1].start, 0, 8);
  356. assert.position(ranges[1].end, 0, 11);
  357. assert.position(ranges[0].start, 0, 0);
  358. assert.position(ranges[0].end, 0, 3);
  359. }
  360. };
  361. });
  362. if (typeof module !== "undefined" && module === require.main) {
  363. require("asyncjs").test.testcase(module.exports).exec()
  364. }