From a62062e57674e3fc6251156dabd6e49fdb192fd1 Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Wed, 28 Apr 2010 16:41:17 +0200 Subject: [PATCH] fix search for a couple of edge cases --- src/ace/Search.js | 23 ++++++++++++++++++----- src/test/SearchTest.js | 32 +++++++++++++++++++++++++++++++- 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/src/ace/Search.js b/src/ace/Search.js index b2445e74..860c3ca0 100644 --- a/src/ace/Search.js +++ b/src/ace/Search.js @@ -140,8 +140,14 @@ ace.Search.SELECTION = 2; var line = getLine(row); startIndex = start.column; + var stop = false; + while (!callback(line, startIndex, row)) { + if (stop) { + return; + } + row++; startIndex = 0; @@ -155,7 +161,7 @@ ace.Search.SELECTION = 2; } if (row == start.row) - return; + stop = true; var line = getLine(row); } @@ -181,9 +187,13 @@ ace.Search.SELECTION = 2; var line = doc.getLine(row).substring(0, start.column); var startIndex = 0; + var stop = false; while (!callback(line, startIndex, row)) { + if (stop) + return; + row--; var startIndex = 0; @@ -191,16 +201,19 @@ ace.Search.SELECTION = 2; if (wrap) { row = lastRow; } else { - return null; + return; } } if (row == start.row) - return null; + stop = true; line = doc.getLine(row); - if (searchSelection && row == firstRow) { - startIndex = firstColumn; + if (searchSelection) { + if (row == firstRow) + startIndex = firstColumn; + else if (row == lastRow) + line = line.substring(0, range.end.column); } } } diff --git a/src/test/SearchTest.js b/src/test/SearchTest.js index 30ccce5f..d5b59f21 100644 --- a/src/test/SearchTest.js +++ b/src/test/SearchTest.js @@ -26,7 +26,6 @@ var SearchTest = new TestCase("SearchTest", { }); var range = search.find(doc); - console.log(range) assertPosition(1, 5, range.start); assertPosition(1, 12, range.end); }, @@ -173,5 +172,36 @@ var SearchTest = new TestCase("SearchTest", { doc.getSelection().selectTo(1, 2); assertEquals(null, search.find(doc)); + }, + + "test: edge case - match directly before the cursor" : function() { + var doc = new ace.Document(["123", "123", "juhu"]); + + var search = new ace.Search().set({ + needle: "juhu", + wrap: true + }); + + doc.getSelection().moveCursorTo(2, 5); + + var range = search.find(doc); + assertPosition(2, 0, range.start); + assertPosition(2, 4, range.end); + }, + + "test: edge case - match backwards directly after the cursor" : function() { + var doc = new ace.Document(["123", "123", "juhu"]); + + var search = new ace.Search().set({ + needle: "juhu", + wrap: true, + backwards: true + }); + + doc.getSelection().moveCursorTo(2, 0); + + var range = search.find(doc); + assertPosition(2, 0, range.start); + assertPosition(2, 4, range.end); } }); \ No newline at end of file