blob: 85e4f866ef358470930cae39a871c2de8cdbee92 [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 call writefile(getline(1, '$'), 'sample.txt')
77 " n does not update search stat
78 call assert_equal(
79 \ #{current: 50, exact_match: 1, total: 50, incomplete: 0, maxcount: 99},
80 \ searchcount(#{recompute: 0}))
81 call assert_equal(
82 \ #{current: 2, exact_match: 1, total: 50, incomplete: 0, maxcount: 99},
83 \ searchcount(#{recompute: v:true}))
Bram Moolenaar9dfa3132019-05-04 21:08:40 +020084 set shortmess-=S
85
Bram Moolenaar984f0312019-05-24 13:11:47 +020086 " Many matches
Bram Moolenaar9dfa3132019-05-04 21:08:40 +020087 call cursor(line('$')-2, 1)
88 let @/ = '.'
89 let pat = escape(@/, '()*?'). '\s\+'
90 let g:a = execute(':unsilent :norm! n')
91 let stat = '\[>99/>99\]'
92 call assert_match(pat .. stat, g:a)
Bram Moolenaare8f5ec02020-06-01 17:28:35 +020093 call assert_equal(
94 \ #{current: 100, exact_match: 0, total: 100, incomplete: 2, maxcount: 99},
95 \ searchcount(#{recompute: 0}))
96 call assert_equal(
97 \ #{current: 272, exact_match: 1, total: 280, incomplete: 0, maxcount: 0},
Bram Moolenaarea6561a2020-06-01 21:32:45 +020098 \ searchcount(#{recompute: v:true, maxcount: 0, timeout: 200}))
Bram Moolenaare8f5ec02020-06-01 17:28:35 +020099 call assert_equal(
100 \ #{current: 1, exact_match: 1, total: 280, incomplete: 0, maxcount: 0},
Bram Moolenaarea6561a2020-06-01 21:32:45 +0200101 \ searchcount(#{recompute: 1, maxcount: 0, pos: [1, 1, 0], timeout: 200}))
Bram Moolenaardc6855a2019-05-18 19:26:29 +0200102 call cursor(line('$'), 1)
103 let g:a = execute(':unsilent :norm! n')
Bram Moolenaar16b58ae2019-09-06 20:40:21 +0200104 let stat = 'W \[1/>99\]'
Bram Moolenaardc6855a2019-05-18 19:26:29 +0200105 call assert_match(pat .. stat, g:a)
Bram Moolenaare8f5ec02020-06-01 17:28:35 +0200106 call assert_equal(
107 \ #{current: 1, exact_match: 1, total: 100, incomplete: 2, maxcount: 99},
108 \ searchcount(#{recompute: 0}))
109 call assert_equal(
110 \ #{current: 1, exact_match: 1, total: 280, incomplete: 0, maxcount: 0},
Bram Moolenaarea6561a2020-06-01 21:32:45 +0200111 \ searchcount(#{recompute: 1, maxcount: 0, timeout: 200}))
Bram Moolenaare8f5ec02020-06-01 17:28:35 +0200112 call assert_equal(
113 \ #{current: 271, exact_match: 1, total: 280, incomplete: 0, maxcount: 0},
Bram Moolenaarea6561a2020-06-01 21:32:45 +0200114 \ searchcount(#{recompute: 1, maxcount: 0, pos: [line('$')-2, 1, 0], timeout: 200}))
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200115
Bram Moolenaar984f0312019-05-24 13:11:47 +0200116 " Many matches
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200117 call cursor(1, 1)
118 let g:a = execute(':unsilent :norm! n')
119 let stat = '\[2/>99\]'
120 call assert_match(pat .. stat, g:a)
Bram Moolenaardc6855a2019-05-18 19:26:29 +0200121 call cursor(1, 1)
122 let g:a = execute(':unsilent :norm! N')
Bram Moolenaar16b58ae2019-09-06 20:40:21 +0200123 let stat = 'W \[>99/>99\]'
Bram Moolenaardc6855a2019-05-18 19:26:29 +0200124 call assert_match(pat .. stat, g:a)
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200125
Bram Moolenaar984f0312019-05-24 13:11:47 +0200126 " right-left
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200127 if exists("+rightleft")
128 set rl
129 call cursor(1,1)
130 let @/ = 'foobar'
131 let pat = 'raboof/\s\+'
132 let g:a = execute(':unsilent :norm! n')
133 let stat = '\[20/2\]'
134 call assert_match(pat .. stat, g:a)
135 set norl
136 endif
137
Bram Moolenaar984f0312019-05-24 13:11:47 +0200138 " right-left bottom
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200139 if exists("+rightleft")
140 set rl
141 call cursor('$',1)
142 let pat = 'raboof?\s\+'
143 let g:a = execute(':unsilent :norm! N')
144 let stat = '\[20/20\]'
145 call assert_match(pat .. stat, g:a)
146 set norl
147 endif
148
Bram Moolenaar984f0312019-05-24 13:11:47 +0200149 " right-left back at top
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200150 if exists("+rightleft")
151 set rl
152 call cursor('$',1)
153 let pat = 'raboof/\s\+'
154 let g:a = execute(':unsilent :norm! n')
Bram Moolenaar16b58ae2019-09-06 20:40:21 +0200155 let stat = 'W \[20/1\]'
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200156 call assert_match(pat .. stat, g:a)
157 call assert_match('search hit BOTTOM, continuing at TOP', g:a)
158 set norl
159 endif
160
Bram Moolenaar984f0312019-05-24 13:11:47 +0200161 " normal, back at bottom
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200162 call cursor(1,1)
163 let @/ = 'foobar'
164 let pat = '?foobar\s\+'
165 let g:a = execute(':unsilent :norm! N')
Bram Moolenaar16b58ae2019-09-06 20:40:21 +0200166 let stat = 'W \[20/20\]'
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200167 call assert_match(pat .. stat, g:a)
168 call assert_match('search hit TOP, continuing at BOTTOM', g:a)
Bram Moolenaar16b58ae2019-09-06 20:40:21 +0200169 call assert_match('W \[20/20\]', Screenline(&lines))
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200170
Bram Moolenaar984f0312019-05-24 13:11:47 +0200171 " normal, no match
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200172 call cursor(1,1)
173 let @/ = 'zzzzzz'
174 let g:a = ''
175 try
176 let g:a = execute(':unsilent :norm! n')
177 catch /^Vim\%((\a\+)\)\=:E486/
178 let stat = ''
179 " error message is not redir'ed to g:a, it is empty
180 call assert_true(empty(g:a))
181 catch
182 call assert_false(1)
183 endtry
184
Bram Moolenaar8f46e4c2019-05-24 22:08:15 +0200185 " with count
186 call cursor(1, 1)
187 let @/ = 'fo*\(bar\?\)\?'
188 let g:a = execute(':unsilent :norm! 2n')
189 let stat = '\[3/50\]'
190 let pat = escape(@/, '()*?'). '\s\+'
191 call assert_match(pat .. stat, g:a)
192 let g:a = execute(':unsilent :norm! 2n')
193 let stat = '\[5/50\]'
194 call assert_match(pat .. stat, g:a)
195
196 " with offset
197 call cursor(1, 1)
198 call feedkeys("/fo*\\(bar\\?\\)\\?/+1\<cr>", 'tx')
199 let g:a = execute(':unsilent :norm! n')
200 let stat = '\[5/50\]'
201 let pat = escape(@/ .. '/+1', '()*?'). '\s\+'
202 call assert_match(pat .. stat, g:a)
203
Bram Moolenaar984f0312019-05-24 13:11:47 +0200204 " normal, n comes from a mapping
Bram Moolenaar9ce3fa82019-05-07 21:29:11 +0200205 " Need to move over more than 64 lines to trigger char_avail(.
206 nnoremap n nzv
207 call cursor(1,1)
208 call append(50, repeat(['foobar', 'foo', 'fooooobar', 'foba', 'foobar'], 10))
209 call setline(2, 'find this')
210 call setline(70, 'find this')
211 let @/ = 'find this'
212 let pat = '/find this\s\+'
213 let g:a = execute(':unsilent :norm n')
214 " g:a will contain several lines
215 let g:b = split(g:a, "\n")[-1]
216 let stat = '\[1/2\]'
217 call assert_match(pat .. stat, g:b)
218 unmap n
219
Bram Moolenaar984f0312019-05-24 13:11:47 +0200220 " normal, but silent
Bram Moolenaar9ce3fa82019-05-07 21:29:11 +0200221 call cursor(1,1)
222 let @/ = 'find this'
223 let pat = '/find this\s\+'
224 let g:a = execute(':norm! n')
225 let stat = '\[1/2\]'
226 call assert_notmatch(pat .. stat, g:a)
227
Bram Moolenaar19e8ac72019-09-03 22:23:38 +0200228 " normal, n comes from a silent mapping
229 " First test a normal mapping, then a silent mapping
230 call cursor(1,1)
231 nnoremap n n
232 let @/ = 'find this'
233 let pat = '/find this\s\+'
234 let g:a = execute(':unsilent :norm n')
235 let g:b = split(g:a, "\n")[-1]
236 let stat = '\[1/2\]'
237 call assert_match(pat .. stat, g:b)
238 nnoremap <silent> n n
239 call cursor(1,1)
240 let g:a = execute(':unsilent :norm n')
241 let g:b = split(g:a, "\n")[-1]
242 let stat = '\[1/2\]'
243 call assert_notmatch(pat .. stat, g:b)
244 call assert_match(stat, g:b)
Bram Moolenaar0f63ed32019-09-04 16:32:36 +0200245 " Test that the message is not truncated
246 " it would insert '...' into the output.
247 call assert_match('^\s\+' .. stat, g:b)
Bram Moolenaar19e8ac72019-09-03 22:23:38 +0200248 unmap n
249
Bram Moolenaare8f5ec02020-06-01 17:28:35 +0200250 " Time out
251 %delete _
252 call append(0, repeat(['foobar', 'foo', 'fooooobar', 'foba', 'foobar'], 100000))
253 call cursor(1, 1)
254 call assert_equal(1, searchcount(#{pattern: 'foo', maxcount: 0, timeout: 1}).incomplete)
255
Bram Moolenaar19e8ac72019-09-03 22:23:38 +0200256 " Clean up
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200257 set shortmess+=S
Bram Moolenaar19e8ac72019-09-03 22:23:38 +0200258 " close the window
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200259 bwipe!
260endfunc
Bram Moolenaar0f63ed32019-09-04 16:32:36 +0200261
Bram Moolenaar14681622020-06-03 22:57:39 +0200262func Test_searchcount_fails()
263 call assert_fails('echo searchcount("boo!")', 'E715:')
264endfunc
265
Bram Moolenaar6cb07262020-05-29 22:49:43 +0200266func Test_search_stat_foldopen()
267 CheckScreendump
268
269 let lines =<< trim END
270 set shortmess-=S
271 setl foldenable foldmethod=indent foldopen-=search
272 call append(0, ['if', "\tfoo", "\tfoo", 'endif'])
273 let @/ = 'foo'
274 call cursor(1,1)
275 norm n
276 END
277 call writefile(lines, 'Xsearchstat1')
278
279 let buf = RunVimInTerminal('-S Xsearchstat1', #{rows: 10})
280 call TermWait(buf)
281 call VerifyScreenDump(buf, 'Test_searchstat_3', {})
282
283 call term_sendkeys(buf, "n")
284 call TermWait(buf)
285 call VerifyScreenDump(buf, 'Test_searchstat_3', {})
286
287 call term_sendkeys(buf, "n")
288 call TermWait(buf)
289 call VerifyScreenDump(buf, 'Test_searchstat_3', {})
290
291 call StopVimInTerminal(buf)
292 call delete('Xsearchstat1')
293endfunc
294
Bram Moolenaar0f63ed32019-09-04 16:32:36 +0200295func! Test_search_stat_screendump()
296 CheckScreendump
297
298 let lines =<< trim END
299 set shortmess-=S
300 " Append 50 lines with text to search for, "foobar" appears 20 times
301 call append(0, repeat(['foobar', 'foo', 'fooooobar', 'foba', 'foobar'], 20))
302 call setline(2, 'find this')
303 call setline(70, 'find this')
304 nnoremap n n
305 let @/ = 'find this'
306 call cursor(1,1)
307 norm n
308 END
309 call writefile(lines, 'Xsearchstat')
310 let buf = RunVimInTerminal('-S Xsearchstat', #{rows: 10})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +0200311 call TermWait(buf)
Bram Moolenaar0f63ed32019-09-04 16:32:36 +0200312 call VerifyScreenDump(buf, 'Test_searchstat_1', {})
313
314 call term_sendkeys(buf, ":nnoremap <silent> n n\<cr>")
315 call term_sendkeys(buf, "gg0n")
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +0200316 call TermWait(buf)
Bram Moolenaar0f63ed32019-09-04 16:32:36 +0200317 call VerifyScreenDump(buf, 'Test_searchstat_2', {})
318
319 call StopVimInTerminal(buf)
320 call delete('Xsearchstat')
321endfunc