blob: 7c2a19585dc48f516a8a17f95963c5be624ef5e0 [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]}))
30 call assert_equal(
31 \ #{current: 1, exact_match: 0, total: 10, incomplete: 0, maxcount: 99},
32 \ searchcount(#{pattern: 'fooooobar', pos: [4, 1, 0]}))
33 call assert_equal(
34 \ #{current: 1, exact_match: 0, total: 2, incomplete: 2, maxcount: 1},
35 \ searchcount(#{pattern: 'fooooobar', pos: [4, 1, 0], maxcount: 1}))
36 call assert_equal(
37 \ #{current: 0, exact_match: 0, total: 2, incomplete: 2, maxcount: 1},
38 \ searchcount(#{pattern: 'fooooobar', maxcount: 1}))
39
40 " match at second line
Bram Moolenaar984f0312019-05-24 13:11:47 +020041 let messages_before = execute('messages')
Bram Moolenaar9dfa3132019-05-04 21:08:40 +020042 let @/ = 'fo*\(bar\?\)\?'
43 let g:a = execute(':unsilent :norm! n')
44 let stat = '\[2/50\]'
45 let pat = escape(@/, '()*?'). '\s\+'
46 call assert_match(pat .. stat, g:a)
Bram Moolenaare8f5ec02020-06-01 17:28:35 +020047 call assert_equal(
48 \ #{current: 2, exact_match: 1, total: 50, incomplete: 0, maxcount: 99},
49 \ searchcount(#{recompute: 0}))
Bram Moolenaar984f0312019-05-24 13:11:47 +020050 " didn't get added to message history
51 call assert_equal(messages_before, execute('messages'))
Bram Moolenaar9dfa3132019-05-04 21:08:40 +020052
Bram Moolenaar984f0312019-05-24 13:11:47 +020053 " Match at last line
Bram Moolenaar9dfa3132019-05-04 21:08:40 +020054 call cursor(line('$')-2, 1)
55 let g:a = execute(':unsilent :norm! n')
56 let stat = '\[50/50\]'
57 call assert_match(pat .. stat, g:a)
Bram Moolenaare8f5ec02020-06-01 17:28:35 +020058 call assert_equal(
59 \ #{current: 50, exact_match: 1, total: 50, incomplete: 0, maxcount: 99},
60 \ searchcount(#{recompute: 0}))
Bram Moolenaar9dfa3132019-05-04 21:08:40 +020061
Bram Moolenaar984f0312019-05-24 13:11:47 +020062 " No search stat
Bram Moolenaar9dfa3132019-05-04 21:08:40 +020063 set shortmess+=S
64 call cursor(1, 1)
65 let stat = '\[2/50\]'
66 let g:a = execute(':unsilent :norm! n')
67 call assert_notmatch(pat .. stat, g:a)
Bram Moolenaare8f5ec02020-06-01 17:28:35 +020068 call writefile(getline(1, '$'), 'sample.txt')
69 " n does not update search stat
70 call assert_equal(
71 \ #{current: 50, exact_match: 1, total: 50, incomplete: 0, maxcount: 99},
72 \ searchcount(#{recompute: 0}))
73 call assert_equal(
74 \ #{current: 2, exact_match: 1, total: 50, incomplete: 0, maxcount: 99},
75 \ searchcount(#{recompute: v:true}))
Bram Moolenaar9dfa3132019-05-04 21:08:40 +020076 set shortmess-=S
77
Bram Moolenaar984f0312019-05-24 13:11:47 +020078 " Many matches
Bram Moolenaar9dfa3132019-05-04 21:08:40 +020079 call cursor(line('$')-2, 1)
80 let @/ = '.'
81 let pat = escape(@/, '()*?'). '\s\+'
82 let g:a = execute(':unsilent :norm! n')
83 let stat = '\[>99/>99\]'
84 call assert_match(pat .. stat, g:a)
Bram Moolenaare8f5ec02020-06-01 17:28:35 +020085 call assert_equal(
86 \ #{current: 100, exact_match: 0, total: 100, incomplete: 2, maxcount: 99},
87 \ searchcount(#{recompute: 0}))
88 call assert_equal(
89 \ #{current: 272, exact_match: 1, total: 280, incomplete: 0, maxcount: 0},
90 \ searchcount(#{recompute: v:true, maxcount: 0}))
91 call assert_equal(
92 \ #{current: 1, exact_match: 1, total: 280, incomplete: 0, maxcount: 0},
93 \ searchcount(#{recompute: 1, maxcount: 0, pos: [1, 1, 0]}))
Bram Moolenaardc6855a2019-05-18 19:26:29 +020094 call cursor(line('$'), 1)
95 let g:a = execute(':unsilent :norm! n')
Bram Moolenaar16b58ae2019-09-06 20:40:21 +020096 let stat = 'W \[1/>99\]'
Bram Moolenaardc6855a2019-05-18 19:26:29 +020097 call assert_match(pat .. stat, g:a)
Bram Moolenaare8f5ec02020-06-01 17:28:35 +020098 call assert_equal(
99 \ #{current: 1, exact_match: 1, total: 100, incomplete: 2, maxcount: 99},
100 \ searchcount(#{recompute: 0}))
101 call assert_equal(
102 \ #{current: 1, exact_match: 1, total: 280, incomplete: 0, maxcount: 0},
103 \ searchcount(#{recompute: 1, maxcount: 0}))
104 call assert_equal(
105 \ #{current: 271, exact_match: 1, total: 280, incomplete: 0, maxcount: 0},
106 \ searchcount(#{recompute: 1, maxcount: 0, pos: [line('$')-2, 1, 0]}))
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200107
Bram Moolenaar984f0312019-05-24 13:11:47 +0200108 " Many matches
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200109 call cursor(1, 1)
110 let g:a = execute(':unsilent :norm! n')
111 let stat = '\[2/>99\]'
112 call assert_match(pat .. stat, g:a)
Bram Moolenaardc6855a2019-05-18 19:26:29 +0200113 call cursor(1, 1)
114 let g:a = execute(':unsilent :norm! N')
Bram Moolenaar16b58ae2019-09-06 20:40:21 +0200115 let stat = 'W \[>99/>99\]'
Bram Moolenaardc6855a2019-05-18 19:26:29 +0200116 call assert_match(pat .. stat, g:a)
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200117
Bram Moolenaar984f0312019-05-24 13:11:47 +0200118 " right-left
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200119 if exists("+rightleft")
120 set rl
121 call cursor(1,1)
122 let @/ = 'foobar'
123 let pat = 'raboof/\s\+'
124 let g:a = execute(':unsilent :norm! n')
125 let stat = '\[20/2\]'
126 call assert_match(pat .. stat, g:a)
127 set norl
128 endif
129
Bram Moolenaar984f0312019-05-24 13:11:47 +0200130 " right-left bottom
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200131 if exists("+rightleft")
132 set rl
133 call cursor('$',1)
134 let pat = 'raboof?\s\+'
135 let g:a = execute(':unsilent :norm! N')
136 let stat = '\[20/20\]'
137 call assert_match(pat .. stat, g:a)
138 set norl
139 endif
140
Bram Moolenaar984f0312019-05-24 13:11:47 +0200141 " right-left back at top
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200142 if exists("+rightleft")
143 set rl
144 call cursor('$',1)
145 let pat = 'raboof/\s\+'
146 let g:a = execute(':unsilent :norm! n')
Bram Moolenaar16b58ae2019-09-06 20:40:21 +0200147 let stat = 'W \[20/1\]'
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200148 call assert_match(pat .. stat, g:a)
149 call assert_match('search hit BOTTOM, continuing at TOP', g:a)
150 set norl
151 endif
152
Bram Moolenaar984f0312019-05-24 13:11:47 +0200153 " normal, back at bottom
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200154 call cursor(1,1)
155 let @/ = 'foobar'
156 let pat = '?foobar\s\+'
157 let g:a = execute(':unsilent :norm! N')
Bram Moolenaar16b58ae2019-09-06 20:40:21 +0200158 let stat = 'W \[20/20\]'
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200159 call assert_match(pat .. stat, g:a)
160 call assert_match('search hit TOP, continuing at BOTTOM', g:a)
Bram Moolenaar16b58ae2019-09-06 20:40:21 +0200161 call assert_match('W \[20/20\]', Screenline(&lines))
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200162
Bram Moolenaar984f0312019-05-24 13:11:47 +0200163 " normal, no match
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200164 call cursor(1,1)
165 let @/ = 'zzzzzz'
166 let g:a = ''
167 try
168 let g:a = execute(':unsilent :norm! n')
169 catch /^Vim\%((\a\+)\)\=:E486/
170 let stat = ''
171 " error message is not redir'ed to g:a, it is empty
172 call assert_true(empty(g:a))
173 catch
174 call assert_false(1)
175 endtry
176
Bram Moolenaar8f46e4c2019-05-24 22:08:15 +0200177 " with count
178 call cursor(1, 1)
179 let @/ = 'fo*\(bar\?\)\?'
180 let g:a = execute(':unsilent :norm! 2n')
181 let stat = '\[3/50\]'
182 let pat = escape(@/, '()*?'). '\s\+'
183 call assert_match(pat .. stat, g:a)
184 let g:a = execute(':unsilent :norm! 2n')
185 let stat = '\[5/50\]'
186 call assert_match(pat .. stat, g:a)
187
188 " with offset
189 call cursor(1, 1)
190 call feedkeys("/fo*\\(bar\\?\\)\\?/+1\<cr>", 'tx')
191 let g:a = execute(':unsilent :norm! n')
192 let stat = '\[5/50\]'
193 let pat = escape(@/ .. '/+1', '()*?'). '\s\+'
194 call assert_match(pat .. stat, g:a)
195
Bram Moolenaar984f0312019-05-24 13:11:47 +0200196 " normal, n comes from a mapping
Bram Moolenaar9ce3fa82019-05-07 21:29:11 +0200197 " Need to move over more than 64 lines to trigger char_avail(.
198 nnoremap n nzv
199 call cursor(1,1)
200 call append(50, repeat(['foobar', 'foo', 'fooooobar', 'foba', 'foobar'], 10))
201 call setline(2, 'find this')
202 call setline(70, 'find this')
203 let @/ = 'find this'
204 let pat = '/find this\s\+'
205 let g:a = execute(':unsilent :norm n')
206 " g:a will contain several lines
207 let g:b = split(g:a, "\n")[-1]
208 let stat = '\[1/2\]'
209 call assert_match(pat .. stat, g:b)
210 unmap n
211
Bram Moolenaar984f0312019-05-24 13:11:47 +0200212 " normal, but silent
Bram Moolenaar9ce3fa82019-05-07 21:29:11 +0200213 call cursor(1,1)
214 let @/ = 'find this'
215 let pat = '/find this\s\+'
216 let g:a = execute(':norm! n')
217 let stat = '\[1/2\]'
218 call assert_notmatch(pat .. stat, g:a)
219
Bram Moolenaar19e8ac72019-09-03 22:23:38 +0200220 " normal, n comes from a silent mapping
221 " First test a normal mapping, then a silent mapping
222 call cursor(1,1)
223 nnoremap n n
224 let @/ = 'find this'
225 let pat = '/find this\s\+'
226 let g:a = execute(':unsilent :norm n')
227 let g:b = split(g:a, "\n")[-1]
228 let stat = '\[1/2\]'
229 call assert_match(pat .. stat, g:b)
230 nnoremap <silent> n n
231 call cursor(1,1)
232 let g:a = execute(':unsilent :norm n')
233 let g:b = split(g:a, "\n")[-1]
234 let stat = '\[1/2\]'
235 call assert_notmatch(pat .. stat, g:b)
236 call assert_match(stat, g:b)
Bram Moolenaar0f63ed32019-09-04 16:32:36 +0200237 " Test that the message is not truncated
238 " it would insert '...' into the output.
239 call assert_match('^\s\+' .. stat, g:b)
Bram Moolenaar19e8ac72019-09-03 22:23:38 +0200240 unmap n
241
Bram Moolenaare8f5ec02020-06-01 17:28:35 +0200242 " Time out
243 %delete _
244 call append(0, repeat(['foobar', 'foo', 'fooooobar', 'foba', 'foobar'], 100000))
245 call cursor(1, 1)
246 call assert_equal(1, searchcount(#{pattern: 'foo', maxcount: 0, timeout: 1}).incomplete)
247
Bram Moolenaar19e8ac72019-09-03 22:23:38 +0200248 " Clean up
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200249 set shortmess+=S
Bram Moolenaar19e8ac72019-09-03 22:23:38 +0200250 " close the window
Bram Moolenaar9dfa3132019-05-04 21:08:40 +0200251 bwipe!
252endfunc
Bram Moolenaar0f63ed32019-09-04 16:32:36 +0200253
Bram Moolenaar6cb07262020-05-29 22:49:43 +0200254func Test_search_stat_foldopen()
255 CheckScreendump
256
257 let lines =<< trim END
258 set shortmess-=S
259 setl foldenable foldmethod=indent foldopen-=search
260 call append(0, ['if', "\tfoo", "\tfoo", 'endif'])
261 let @/ = 'foo'
262 call cursor(1,1)
263 norm n
264 END
265 call writefile(lines, 'Xsearchstat1')
266
267 let buf = RunVimInTerminal('-S Xsearchstat1', #{rows: 10})
268 call TermWait(buf)
269 call VerifyScreenDump(buf, 'Test_searchstat_3', {})
270
271 call term_sendkeys(buf, "n")
272 call TermWait(buf)
273 call VerifyScreenDump(buf, 'Test_searchstat_3', {})
274
275 call term_sendkeys(buf, "n")
276 call TermWait(buf)
277 call VerifyScreenDump(buf, 'Test_searchstat_3', {})
278
279 call StopVimInTerminal(buf)
280 call delete('Xsearchstat1')
281endfunc
282
Bram Moolenaar0f63ed32019-09-04 16:32:36 +0200283func! Test_search_stat_screendump()
284 CheckScreendump
285
286 let lines =<< trim END
287 set shortmess-=S
288 " Append 50 lines with text to search for, "foobar" appears 20 times
289 call append(0, repeat(['foobar', 'foo', 'fooooobar', 'foba', 'foobar'], 20))
290 call setline(2, 'find this')
291 call setline(70, 'find this')
292 nnoremap n n
293 let @/ = 'find this'
294 call cursor(1,1)
295 norm n
296 END
297 call writefile(lines, 'Xsearchstat')
298 let buf = RunVimInTerminal('-S Xsearchstat', #{rows: 10})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +0200299 call TermWait(buf)
Bram Moolenaar0f63ed32019-09-04 16:32:36 +0200300 call VerifyScreenDump(buf, 'Test_searchstat_1', {})
301
302 call term_sendkeys(buf, ":nnoremap <silent> n n\<cr>")
303 call term_sendkeys(buf, "gg0n")
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +0200304 call TermWait(buf)
Bram Moolenaar0f63ed32019-09-04 16:32:36 +0200305 call VerifyScreenDump(buf, 'Test_searchstat_2', {})
306
307 call StopVimInTerminal(buf)
308 call delete('Xsearchstat')
309endfunc