blob: 15da1555629381d8481dd875ef4ee199c531d192 [file] [log] [blame]
Bram Moolenaar9dfa3132019-05-04 21:08:40 +02001" Tests for search_stats, when "S" is not in 'shortmess'
Bram Moolenaar9dfa3132019-05-04 21:08:40 +02002
Bram Moolenaar0f63ed32019-09-04 16:32:36 +02003source check.vim
4source screendump.vim
Bram Moolenaarc7a10b32019-05-06 21:37:18 +02005
Bram Moolenaar0f63ed32019-09-04 16:32:36 +02006func Test_search_stat()
Bram Moolenaar9dfa3132019-05-04 21:08:40 +02007 new
8 set shortmess-=S
Bram Moolenaar9ce3fa82019-05-07 21:29:11 +02009 " Append 50 lines with text to search for, "foobar" appears 20 times
Bram Moolenaar9dfa3132019-05-04 21:08:40 +020010 call append(0, repeat(['foobar', 'foo', 'fooooobar', 'foba', 'foobar'], 10))
11
Bram Moolenaar9dfa3132019-05-04 21:08:40 +020012 call cursor(1, 1)
Bram Moolenaare8f5ec02020-06-01 17:28:35 +020013
14 " searchcount() returns an empty dictionary when previous pattern was not set
15 call assert_equal({}, searchcount(#{pattern: ''}))
16 " but setting @/ should also work (even 'n' nor 'N' was executed)
17 " recompute the count when the last position is different.
18 call assert_equal(
19 \ #{current: 1, exact_match: 1, total: 40, incomplete: 0, maxcount: 99},
20 \ searchcount(#{pattern: 'foo'}))
21 call assert_equal(
22 \ #{current: 0, exact_match: 0, total: 10, incomplete: 0, maxcount: 99},
23 \ searchcount(#{pattern: 'fooooobar'}))
24 call assert_equal(
25 \ #{current: 0, exact_match: 0, total: 10, incomplete: 0, maxcount: 99},
26 \ searchcount(#{pattern: 'fooooobar', pos: [2, 1, 0]}))
27 call assert_equal(
28 \ #{current: 1, exact_match: 1, total: 10, incomplete: 0, maxcount: 99},
29 \ searchcount(#{pattern: 'fooooobar', pos: [3, 1, 0]}))
Bram Moolenaar57f75a52020-06-02 22:06:21 +020030 " on last char of match
31 call assert_equal(
32 \ #{current: 1, exact_match: 1, total: 10, incomplete: 0, maxcount: 99},
33 \ searchcount(#{pattern: 'fooooobar', pos: [3, 9, 0]}))
34 " on char after match
35 call assert_equal(
36 \ #{current: 1, exact_match: 0, total: 10, incomplete: 0, maxcount: 99},
37 \ searchcount(#{pattern: 'fooooobar', pos: [3, 10, 0]}))
Bram Moolenaare8f5ec02020-06-01 17:28:35 +020038 call assert_equal(
39 \ #{current: 1, exact_match: 0, total: 10, incomplete: 0, maxcount: 99},
40 \ searchcount(#{pattern: 'fooooobar', pos: [4, 1, 0]}))
41 call assert_equal(
42 \ #{current: 1, exact_match: 0, total: 2, incomplete: 2, maxcount: 1},
43 \ searchcount(#{pattern: 'fooooobar', pos: [4, 1, 0], maxcount: 1}))
44 call assert_equal(
45 \ #{current: 0, exact_match: 0, total: 2, incomplete: 2, maxcount: 1},
46 \ searchcount(#{pattern: 'fooooobar', maxcount: 1}))
47
48 " match at second line
Bram Moolenaar984f0312019-05-24 13:11:47 +020049 let messages_before = execute('messages')
Bram Moolenaar9dfa3132019-05-04 21:08:40 +020050 let @/ = 'fo*\(bar\?\)\?'
51 let g:a = execute(':unsilent :norm! n')
52 let stat = '\[2/50\]'
53 let pat = escape(@/, '()*?'). '\s\+'
54 call assert_match(pat .. stat, g:a)
Bram Moolenaare8f5ec02020-06-01 17:28:35 +020055 call assert_equal(
56 \ #{current: 2, exact_match: 1, total: 50, incomplete: 0, maxcount: 99},
57 \ searchcount(#{recompute: 0}))
Bram Moolenaar984f0312019-05-24 13:11:47 +020058 " didn't get added to message history
59 call assert_equal(messages_before, execute('messages'))
Bram Moolenaar9dfa3132019-05-04 21:08:40 +020060
Bram Moolenaar984f0312019-05-24 13:11:47 +020061 " Match at last line
Bram Moolenaar9dfa3132019-05-04 21:08:40 +020062 call cursor(line('$')-2, 1)
63 let g:a = execute(':unsilent :norm! n')
64 let stat = '\[50/50\]'
65 call assert_match(pat .. stat, g:a)
Bram Moolenaare8f5ec02020-06-01 17:28:35 +020066 call assert_equal(
67 \ #{current: 50, exact_match: 1, total: 50, incomplete: 0, maxcount: 99},
68 \ searchcount(#{recompute: 0}))
Bram Moolenaar9dfa3132019-05-04 21:08:40 +020069
Bram Moolenaar984f0312019-05-24 13:11:47 +020070 " No search stat
Bram Moolenaar9dfa3132019-05-04 21:08:40 +020071 set shortmess+=S
72 call cursor(1, 1)
73 let stat = '\[2/50\]'
74 let g:a = execute(':unsilent :norm! n')
75 call assert_notmatch(pat .. stat, g:a)
Bram Moolenaare8f5ec02020-06-01 17:28:35 +020076 " n does not update search stat
77 call assert_equal(
78 \ #{current: 50, exact_match: 1, total: 50, incomplete: 0, maxcount: 99},
79 \ searchcount(#{recompute: 0}))
80 call assert_equal(
81 \ #{current: 2, exact_match: 1, total: 50, incomplete: 0, maxcount: 99},
82 \ searchcount(#{recompute: v:true}))
Bram Moolenaar9dfa3132019-05-04 21:08:40 +020083 set shortmess-=S
84
Bram Moolenaar984f0312019-05-24 13:11:47 +020085 " Many matches
Bram Moolenaar9dfa3132019-05-04 21:08:40 +020086 call cursor(line('$')-2, 1)
87 let @/ = '.'
88 let pat = escape(@/, '()*?'). '\s\+'
89 let g:a = execute(':unsilent :norm! n')
90 let stat = '\[>99/>99\]'
91 call assert_match(pat .. stat, g:a)
Bram Moolenaare8f5ec02020-06-01 17:28:35 +020092 call assert_equal(
93 \ #{current: 100, exact_match: 0, total: 100, incomplete: 2, maxcount: 99},
94 \ searchcount(#{recompute: 0}))
95 call assert_equal(
96 \ #{current: 272, exact_match: 1, total: 280, incomplete: 0, maxcount: 0},
Bram Moolenaarea6561a2020-06-01 21:32:45 +020097 \ searchcount(#{recompute: v:true, maxcount: 0, timeout: 200}))
Bram Moolenaare8f5ec02020-06-01 17:28:35 +020098 call assert_equal(
99 \ #{current: 1, exact_match: 1, total: 280, incomplete: 0, maxcount: 0},
Bram Moolenaarea6561a2020-06-01 21:32:45 +0200100 \ searchcount(#{recompute: 1, maxcount: 0, pos: [1, 1, 0], timeout: 200}))
Bram Moolenaardc6855a2019-05-18 19:26:29 +0200101 call cursor(line('$'), 1)
102 let g:a = execute(':unsilent :norm! n')
Bram Moolenaar16b58ae2019-09-06 20:40:21 +0200103 let stat = 'W \[1/>99\]'
Bram Moolenaardc6855a2019-05-18 19:26:29 +0200104 call assert_match(pat .. stat, g:a)
Bram Moolenaare8f5ec02020-06-01 17:28:35 +0200105 call assert_equal(
106 \ #{current: 1, exact_match: 1, total: 100, incomplete: 2, maxcount: 99},
107 \ searchcount(#{recompute: 0}))
108 call assert_equal(
109 \ #{current: 1, exact_match: 1, total: 280, incomplete: 0, maxcount: 0},
Bram Moolenaarea6561a2020-06-01 21:32:45 +0200110 \ searchcount(#{recompute: 1, maxcount: 0, timeout: 200}))
Bram Moolenaare8f5ec02020-06-01 17:28:35 +0200111 call assert_equal(
112 \ #{current: 271, exact_match: 1, total: 280, incomplete: 0, maxcount: 0},
Bram Moolenaarea6561a2020-06-01 21:32:45 +0200113 \ searchcount(#{recompute: 1, maxcount: 0, pos: [line('$')-2, 1, 0], timeout: 200}))
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200114
Bram Moolenaar984f0312019-05-24 13:11:47 +0200115 " Many matches
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200116 call cursor(1, 1)
117 let g:a = execute(':unsilent :norm! n')
118 let stat = '\[2/>99\]'
119 call assert_match(pat .. stat, g:a)
Bram Moolenaardc6855a2019-05-18 19:26:29 +0200120 call cursor(1, 1)
121 let g:a = execute(':unsilent :norm! N')
Bram Moolenaar16b58ae2019-09-06 20:40:21 +0200122 let stat = 'W \[>99/>99\]'
Bram Moolenaardc6855a2019-05-18 19:26:29 +0200123 call assert_match(pat .. stat, g:a)
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200124
Bram Moolenaar984f0312019-05-24 13:11:47 +0200125 " right-left
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200126 if exists("+rightleft")
127 set rl
128 call cursor(1,1)
129 let @/ = 'foobar'
130 let pat = 'raboof/\s\+'
131 let g:a = execute(':unsilent :norm! n')
132 let stat = '\[20/2\]'
133 call assert_match(pat .. stat, g:a)
134 set norl
135 endif
136
Bram Moolenaar984f0312019-05-24 13:11:47 +0200137 " right-left bottom
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200138 if exists("+rightleft")
139 set rl
140 call cursor('$',1)
141 let pat = 'raboof?\s\+'
142 let g:a = execute(':unsilent :norm! N')
143 let stat = '\[20/20\]'
144 call assert_match(pat .. stat, g:a)
145 set norl
146 endif
147
Bram Moolenaar984f0312019-05-24 13:11:47 +0200148 " right-left back at top
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200149 if exists("+rightleft")
150 set rl
151 call cursor('$',1)
152 let pat = 'raboof/\s\+'
153 let g:a = execute(':unsilent :norm! n')
Bram Moolenaar16b58ae2019-09-06 20:40:21 +0200154 let stat = 'W \[20/1\]'
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200155 call assert_match(pat .. stat, g:a)
156 call assert_match('search hit BOTTOM, continuing at TOP', g:a)
157 set norl
158 endif
159
Bram Moolenaar984f0312019-05-24 13:11:47 +0200160 " normal, back at bottom
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200161 call cursor(1,1)
162 let @/ = 'foobar'
163 let pat = '?foobar\s\+'
164 let g:a = execute(':unsilent :norm! N')
Bram Moolenaar16b58ae2019-09-06 20:40:21 +0200165 let stat = 'W \[20/20\]'
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200166 call assert_match(pat .. stat, g:a)
167 call assert_match('search hit TOP, continuing at BOTTOM', g:a)
Bram Moolenaar16b58ae2019-09-06 20:40:21 +0200168 call assert_match('W \[20/20\]', Screenline(&lines))
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200169
Bram Moolenaar984f0312019-05-24 13:11:47 +0200170 " normal, no match
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200171 call cursor(1,1)
172 let @/ = 'zzzzzz'
173 let g:a = ''
174 try
175 let g:a = execute(':unsilent :norm! n')
176 catch /^Vim\%((\a\+)\)\=:E486/
177 let stat = ''
178 " error message is not redir'ed to g:a, it is empty
179 call assert_true(empty(g:a))
180 catch
181 call assert_false(1)
182 endtry
183
Bram Moolenaar8f46e4c2019-05-24 22:08:15 +0200184 " with count
185 call cursor(1, 1)
186 let @/ = 'fo*\(bar\?\)\?'
187 let g:a = execute(':unsilent :norm! 2n')
188 let stat = '\[3/50\]'
189 let pat = escape(@/, '()*?'). '\s\+'
190 call assert_match(pat .. stat, g:a)
191 let g:a = execute(':unsilent :norm! 2n')
192 let stat = '\[5/50\]'
193 call assert_match(pat .. stat, g:a)
194
195 " with offset
196 call cursor(1, 1)
197 call feedkeys("/fo*\\(bar\\?\\)\\?/+1\<cr>", 'tx')
198 let g:a = execute(':unsilent :norm! n')
199 let stat = '\[5/50\]'
200 let pat = escape(@/ .. '/+1', '()*?'). '\s\+'
201 call assert_match(pat .. stat, g:a)
202
Bram Moolenaar984f0312019-05-24 13:11:47 +0200203 " normal, n comes from a mapping
Bram Moolenaar9ce3fa82019-05-07 21:29:11 +0200204 " Need to move over more than 64 lines to trigger char_avail(.
205 nnoremap n nzv
206 call cursor(1,1)
207 call append(50, repeat(['foobar', 'foo', 'fooooobar', 'foba', 'foobar'], 10))
208 call setline(2, 'find this')
209 call setline(70, 'find this')
210 let @/ = 'find this'
211 let pat = '/find this\s\+'
212 let g:a = execute(':unsilent :norm n')
213 " g:a will contain several lines
214 let g:b = split(g:a, "\n")[-1]
215 let stat = '\[1/2\]'
216 call assert_match(pat .. stat, g:b)
217 unmap n
218
Bram Moolenaar984f0312019-05-24 13:11:47 +0200219 " normal, but silent
Bram Moolenaar9ce3fa82019-05-07 21:29:11 +0200220 call cursor(1,1)
221 let @/ = 'find this'
222 let pat = '/find this\s\+'
223 let g:a = execute(':norm! n')
224 let stat = '\[1/2\]'
225 call assert_notmatch(pat .. stat, g:a)
226
Bram Moolenaar19e8ac72019-09-03 22:23:38 +0200227 " normal, n comes from a silent mapping
228 " First test a normal mapping, then a silent mapping
229 call cursor(1,1)
230 nnoremap n n
231 let @/ = 'find this'
232 let pat = '/find this\s\+'
233 let g:a = execute(':unsilent :norm n')
234 let g:b = split(g:a, "\n")[-1]
235 let stat = '\[1/2\]'
236 call assert_match(pat .. stat, g:b)
237 nnoremap <silent> n n
238 call cursor(1,1)
239 let g:a = execute(':unsilent :norm n')
240 let g:b = split(g:a, "\n")[-1]
241 let stat = '\[1/2\]'
242 call assert_notmatch(pat .. stat, g:b)
243 call assert_match(stat, g:b)
Bram Moolenaar0f63ed32019-09-04 16:32:36 +0200244 " Test that the message is not truncated
245 " it would insert '...' into the output.
246 call assert_match('^\s\+' .. stat, g:b)
Bram Moolenaar19e8ac72019-09-03 22:23:38 +0200247 unmap n
248
Bram Moolenaare8f5ec02020-06-01 17:28:35 +0200249 " Time out
250 %delete _
251 call append(0, repeat(['foobar', 'foo', 'fooooobar', 'foba', 'foobar'], 100000))
252 call cursor(1, 1)
253 call assert_equal(1, searchcount(#{pattern: 'foo', maxcount: 0, timeout: 1}).incomplete)
254
Bram Moolenaar19e8ac72019-09-03 22:23:38 +0200255 " Clean up
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200256 set shortmess+=S
Bram Moolenaar19e8ac72019-09-03 22:23:38 +0200257 " close the window
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200258 bwipe!
259endfunc
Bram Moolenaar0f63ed32019-09-04 16:32:36 +0200260
Bram Moolenaar14681622020-06-03 22:57:39 +0200261func Test_searchcount_fails()
262 call assert_fails('echo searchcount("boo!")', 'E715:')
Bram Moolenaar531be472020-09-23 22:38:05 +0200263 call assert_fails('echo searchcount({"timeout" : []})', 'E745:')
264 call assert_fails('echo searchcount({"maxcount" : []})', 'E745:')
265 call assert_fails('echo searchcount({"pattern" : []})', 'E730:')
266 call assert_fails('echo searchcount({"pos" : 1})', 'E475:')
267 call assert_fails('echo searchcount({"pos" : [1]})', 'E475:')
268 call assert_fails('echo searchcount({"pos" : [[], 2, 3]})', 'E745:')
269 call assert_fails('echo searchcount({"pos" : [1, [], 3]})', 'E745:')
270 call assert_fails('echo searchcount({"pos" : [1, 2, []]})', 'E745:')
Bram Moolenaar14681622020-06-03 22:57:39 +0200271endfunc
272
Bram Moolenaar442a8532020-06-04 20:56:09 +0200273func Test_searchcount_in_statusline()
274 CheckScreendump
275
276 let lines =<< trim END
277 set shortmess-=S
278 call append(0, 'this is something')
279 function TestSearchCount() abort
280 let search_count = searchcount()
281 if !empty(search_count)
282 return '[' . search_count.current . '/' . search_count.total . ']'
283 else
284 return ''
285 endif
286 endfunction
287 set hlsearch
288 set laststatus=2 statusline+=%{TestSearchCount()}
289 END
290 call writefile(lines, 'Xsearchstatusline')
291 let buf = RunVimInTerminal('-S Xsearchstatusline', #{rows: 10})
292 call TermWait(buf)
293 call term_sendkeys(buf, "/something")
294 call VerifyScreenDump(buf, 'Test_searchstat_4', {})
295
296 call term_sendkeys(buf, "\<Esc>")
297 call StopVimInTerminal(buf)
298 call delete('Xsearchstatusline')
299endfunc
300
Bram Moolenaar6cb07262020-05-29 22:49:43 +0200301func Test_search_stat_foldopen()
302 CheckScreendump
303
304 let lines =<< trim END
305 set shortmess-=S
306 setl foldenable foldmethod=indent foldopen-=search
307 call append(0, ['if', "\tfoo", "\tfoo", 'endif'])
308 let @/ = 'foo'
309 call cursor(1,1)
310 norm n
311 END
312 call writefile(lines, 'Xsearchstat1')
313
314 let buf = RunVimInTerminal('-S Xsearchstat1', #{rows: 10})
Bram Moolenaar6cb07262020-05-29 22:49:43 +0200315 call VerifyScreenDump(buf, 'Test_searchstat_3', {})
316
317 call term_sendkeys(buf, "n")
Bram Moolenaar6cb07262020-05-29 22:49:43 +0200318 call VerifyScreenDump(buf, 'Test_searchstat_3', {})
319
320 call term_sendkeys(buf, "n")
Bram Moolenaar6cb07262020-05-29 22:49:43 +0200321 call VerifyScreenDump(buf, 'Test_searchstat_3', {})
322
323 call StopVimInTerminal(buf)
324 call delete('Xsearchstat1')
325endfunc
326
Bram Moolenaar0f63ed32019-09-04 16:32:36 +0200327func! Test_search_stat_screendump()
328 CheckScreendump
329
330 let lines =<< trim END
331 set shortmess-=S
332 " Append 50 lines with text to search for, "foobar" appears 20 times
333 call append(0, repeat(['foobar', 'foo', 'fooooobar', 'foba', 'foobar'], 20))
334 call setline(2, 'find this')
335 call setline(70, 'find this')
336 nnoremap n n
337 let @/ = 'find this'
338 call cursor(1,1)
339 norm n
340 END
341 call writefile(lines, 'Xsearchstat')
342 let buf = RunVimInTerminal('-S Xsearchstat', #{rows: 10})
Bram Moolenaar0f63ed32019-09-04 16:32:36 +0200343 call VerifyScreenDump(buf, 'Test_searchstat_1', {})
344
345 call term_sendkeys(buf, ":nnoremap <silent> n n\<cr>")
346 call term_sendkeys(buf, "gg0n")
Bram Moolenaar0f63ed32019-09-04 16:32:36 +0200347 call VerifyScreenDump(buf, 'Test_searchstat_2', {})
348
349 call StopVimInTerminal(buf)
350 call delete('Xsearchstat')
351endfunc
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +0200352
Bram Moolenaar0c711142021-11-12 10:30:04 +0000353func Test_search_stat_then_gd()
354 CheckScreendump
355
356 let lines =<< trim END
357 call setline(1, ['int cat;', 'int dog;', 'cat = dog;'])
358 set shortmess-=S
359 set hlsearch
360 END
361 call writefile(lines, 'Xsearchstatgd')
362
363 let buf = RunVimInTerminal('-S Xsearchstatgd', #{rows: 10})
364 call term_sendkeys(buf, "/dog\<CR>")
Bram Moolenaar0c711142021-11-12 10:30:04 +0000365 call VerifyScreenDump(buf, 'Test_searchstatgd_1', {})
366
367 call term_sendkeys(buf, "G0gD")
Bram Moolenaar0c711142021-11-12 10:30:04 +0000368 call VerifyScreenDump(buf, 'Test_searchstatgd_2', {})
369
370 call StopVimInTerminal(buf)
371 call delete('Xsearchstatgd')
372endfunc
373
374
375
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +0200376" vim: shiftwidth=2 sts=2 expandtab