howl.ui.Searcher
buffer = nil
editor = Editor Buffer {}
searcher = editor.searcher
cursor = editor.cursor
before_each ->
buffer = Buffer howl.mode.by_name 'default'
editor.buffer = buffer
after_each -> searcher\cancel!
cancel() moves the cursor back to the original position
buffer.text = 'hello!'
cursor.pos = 1
searcher\forward_to 'll'
searcher\cancel!
assert.equal 1, cursor.pos
repeat_last() repeats the last search in the last direction
buffer.text = 'hellö wörld'
cursor.pos = 1
searcher\forward_to 'ö'
searcher\commit!
assert.equal 5, cursor.pos
searcher\repeat_last!
assert.equal 8, cursor.pos
cursor.pos = 11
searcher\backward_to 'ö'
searcher\commit!
assert.equal 8, cursor.pos
searcher\repeat_last!
assert.equal 5, cursor.pos
.active is true if the searcher is currently active
assert.is_false searcher.active
searcher\forward_to 'o'
assert.is_true searcher.active
searcher\cancel!
assert.is_false searcher.active
forward_to(string)
moves the cursor to the next occurrence of <string>
buffer.text = 'hellö\nworld!'
cursor.pos = 1
searcher\forward_to 'l'
assert.equal 3, cursor.pos
searcher\forward_to 'ld'
assert.equal 10, cursor.pos
highlights the match with "search"
buffer.text = 'hellö\nworld!'
cursor.pos = 1
searcher\forward_to 'lö'
assert.same { 'search' }, highlight.at_pos buffer, 4
assert.same { 'search' }, highlight.at_pos buffer, 5
assert.not_same { 'search' }, highlight.at_pos buffer, 6
matches at the current position
buffer.text = 'no means no'
cursor.pos = 1
searcher\forward_to 'no'
assert.equal 1, cursor.pos
handles growing match from empty
buffer.text = 'no means no'
cursor.pos = 1
searcher\forward_to ''
assert.equal 1, cursor.pos
searcher\forward_to 'n'
assert.equal 1, cursor.pos
searcher\forward_to 'no'
assert.equal 1, cursor.pos
does not move the cursor when there is no match
buffer.text = 'hello!'
cursor.pos = 1
searcher\forward_to 'foo'
assert.equal 1, cursor.pos
next()
moves to the next match
buffer.text = 'aaaa'
cursor.pos = 1
searcher\forward_to 'a'
assert.equal 1, cursor.pos
searcher\next!
assert.equal 2, cursor.pos
searcher\next!
assert.equal 3, cursor.pos
previous()
moves to the previous match
buffer.text = 'aaaa'
cursor.pos = 4
searcher\forward_to 'a'
assert.equal 4, cursor.pos
searcher\previous!
assert.equal 3, cursor.pos
searcher\previous!
assert.equal 2, cursor.pos
backward_to(string)
moves the cursor to the previous occurrence of <string>
buffer.text = 'hellö\nworld!'
cursor.pos = 11
searcher\backward_to 'l'
assert.equal 10, cursor.pos
searcher\backward_to 'lö'
assert.equal 4, cursor.pos
handles search term growing from empty
buffer.text = 'aaaaaaaa'
cursor.pos = 5
searcher\backward_to ''
assert.equal 5, cursor.pos
searcher\backward_to 'a'
assert.equal 4, cursor.pos
searcher\backward_to 'aa'
assert.equal 4, cursor.pos
skips any matches at the current position by default
buffer.text = 'aaaaaaaa'
cursor.pos = 5
searcher\backward_to 'a'
assert.equal 4, cursor.pos
finds matches that overlap with cursor
buffer.text = 'ababababa'
cursor.pos = 4
searcher\backward_to 'baba'
assert.equal 2, cursor.pos
does not skip any matches at the current position if the searcher is active
buffer.text = 'abaaaaab'
cursor.pos = 8
searcher\backward_to 'a'
assert.equal 7, cursor.pos
searcher\backward_to 'ab'
assert.equal 7, cursor.pos
does not move the cursor when there is no match
buffer.text = 'hello!'
cursor.pos = 3
searcher\backward_to 'f'
assert.equal 3, cursor.pos
next()
moves to the next match
buffer.text = 'aaaa'
cursor.pos = 4
searcher\backward_to 'a'
searcher\next!
assert.equal 4, cursor.pos
previous()
moves to the previous match
buffer.text = 'aaaa'
cursor.pos = 3
searcher\backward_to 'a'
searcher\next!
searcher\previous!
assert.equal 2, cursor.pos
forward_to(string, "word")
moves the cursor to the start of the current word
buffer.text = 'hello helloo hello'
cursor.pos = 2
searcher\forward_to 'hello', 'word'
assert.equal 1, cursor.pos
highlights current word with "search" and other word matches with "search_secondary"
buffer.text = 'hello hola hello hola hello'
cursor.pos = 13
searcher\forward_to 'hello', 'word'
assert.same { 'search' }, highlight.at_pos buffer, 12
assert.same { 'search' }, highlight.at_pos buffer, 16
assert.same { 'search_secondary' }, highlight.at_pos buffer, 1
assert.same { 'search_secondary' }, highlight.at_pos buffer, 23
highlights overlapping matches correctly
buffer.text = 'aaa'
cursor.pos = 2
searcher\forward_to 'aa'
assert.equal 2, cursor.pos
assert.same { 'search_secondary' }, highlight.at_pos buffer, 1
assert.same { 'search_secondary', 'search' }, highlight.at_pos buffer, 2
assert.same { 'search' }, highlight.at_pos buffer, 3
does not move the cursor when there is no match
buffer.text = 'hello!'
cursor.pos = 1
searcher\forward_to 'foo', 'word'
assert.equal 1, cursor.pos
next()
moves to the next word match
buffer.text = 'hello helloo hello'
cursor.pos = 1
searcher\forward_to 'hello', 'word'
searcher\next!
assert.equal 14, cursor.pos
previous()
moves to the previous word match
buffer.text = 'hello helloo hello'
cursor.pos = 1
searcher\forward_to 'hello', 'word'
searcher\next!
searcher\previous!
assert.equal 1, cursor.pos
backward_to(string, "word")
moves the cursor to the previous occurrence of word match <string>
buffer.text = 'hello helloo hello'
cursor.pos = 14
searcher\backward_to 'hello', 'word'
assert.equal 1, cursor.pos
skips match at the current position by default
buffer.text = 'no means no'
cursor.pos = 9
searcher\backward_to 'no', 'word'
assert.equal 1, cursor.pos
does not move the cursor when there is no match
buffer.text = 'hello!'
cursor.pos = 2
searcher\backward_to 'foo', 'word'
assert.equal 2, cursor.pos
handles substring match at start of file gracefully
buffer.text = 'abcd abc'
cursor.pos = 6
searcher\backward_to 'abc', 'word'
assert.equal 7, cursor.pos
next()
moves to the next word match
buffer.text = 'hello helloo hello'
cursor.pos = 14
searcher\backward_to 'hello', 'word'
searcher\next!
assert.equal 14, cursor.pos
previous()
moves to the previous word match
buffer.text = 'hello helloo hello'
cursor.pos = 14
searcher\backward_to 'hello', 'word'
searcher\next!
searcher\previous!
assert.equal 1, cursor.pos