blob: 70fbe01c0fc008678072d38f3b5ae58bfc939a7c [file] [log] [blame]
Bram Moolenaar14735512016-03-26 21:00:08 +01001" Tests for autocommands
2
Bram Moolenaar8c64a362018-03-23 22:39:31 +01003source shared.vim
Bram Moolenaar8c5a2782019-08-07 23:07:07 +02004source check.vim
Bram Moolenaarcadbe1b2019-09-22 21:50:09 +02005source term_util.vim
Bram Moolenaar8c64a362018-03-23 22:39:31 +01006
Bram Moolenaar1e115362019-01-09 23:01:02 +01007func s:cleanup_buffers() abort
Bram Moolenaarb3435b02016-09-29 20:54:59 +02008 for bnr in range(1, bufnr('$'))
9 if bufloaded(bnr) && bufnr('%') != bnr
10 execute 'bd! ' . bnr
11 endif
12 endfor
Bram Moolenaar04f62f82017-07-19 18:18:39 +020013endfunc
Bram Moolenaarb3435b02016-09-29 20:54:59 +020014
Bram Moolenaar14735512016-03-26 21:00:08 +010015func Test_vim_did_enter()
16 call assert_false(v:vim_did_enter)
17
18 " This script will never reach the main loop, can't check if v:vim_did_enter
19 " becomes one.
20endfunc
Bram Moolenaar40b1b542016-04-20 20:18:23 +020021
Bram Moolenaar75911162020-07-21 19:44:47 +020022" Test for the CursorHold autocmd
23func Test_CursorHold_autocmd()
24 CheckRunVimInTerminal
25 call writefile(['one', 'two', 'three'], 'Xfile')
26 let before =<< trim END
27 set updatetime=10
28 au CursorHold * call writefile([line('.')], 'Xoutput', 'a')
29 END
30 call writefile(before, 'Xinit')
31 let buf = RunVimInTerminal('-S Xinit Xfile', {})
32 call term_wait(buf)
33 call term_sendkeys(buf, "gg")
34 call term_wait(buf)
35 sleep 50m
36 call term_sendkeys(buf, "j")
37 call term_wait(buf)
38 sleep 50m
39 call term_sendkeys(buf, "j")
40 call term_wait(buf)
41 sleep 50m
42 call StopVimInTerminal(buf)
43
44 call assert_equal(['1', '2', '3'], readfile('Xoutput')[-3:-1])
45
46 call delete('Xinit')
47 call delete('Xoutput')
48 call delete('Xfile')
49endfunc
50
Bram Moolenaarc67e8922016-05-24 16:07:40 +020051if has('timers')
Bram Moolenaar97b00752019-05-12 13:07:14 +020052
Bram Moolenaarc67e8922016-05-24 16:07:40 +020053 func ExitInsertMode(id)
54 call feedkeys("\<Esc>")
55 endfunc
56
57 func Test_cursorhold_insert()
Bram Moolenaarf18c4db2016-09-08 22:10:06 +020058 " Need to move the cursor.
59 call feedkeys("ggG", "xt")
60
Bram Moolenaarc67e8922016-05-24 16:07:40 +020061 let g:triggered = 0
62 au CursorHoldI * let g:triggered += 1
63 set updatetime=20
64 call timer_start(100, 'ExitInsertMode')
65 call feedkeys('a', 'x!')
66 call assert_equal(1, g:triggered)
Bram Moolenaar26d98212019-01-27 22:32:55 +010067 unlet g:triggered
68 au! CursorHoldI
69 set updatetime&
70 endfunc
71
72 func Test_cursorhold_insert_with_timer_interrupt()
73 if !has('job')
74 return
75 endif
76 " Need to move the cursor.
77 call feedkeys("ggG", "xt")
78
79 " Confirm the timer invoked in exit_cb of the job doesn't disturb
80 " CursorHoldI event.
81 let g:triggered = 0
82 au CursorHoldI * let g:triggered += 1
83 set updatetime=500
84 call job_start(has('win32') ? 'cmd /c echo:' : 'echo',
Bram Moolenaar8d4ce562019-01-30 22:01:40 +010085 \ {'exit_cb': {-> timer_start(1000, 'ExitInsertMode')}})
Bram Moolenaar26d98212019-01-27 22:32:55 +010086 call feedkeys('a', 'x!')
87 call assert_equal(1, g:triggered)
88 unlet g:triggered
Bram Moolenaare99e8442016-07-26 20:43:40 +020089 au! CursorHoldI
Bram Moolenaaraeac9002016-09-06 22:15:08 +020090 set updatetime&
Bram Moolenaarc67e8922016-05-24 16:07:40 +020091 endfunc
92
93 func Test_cursorhold_insert_ctrl_x()
94 let g:triggered = 0
95 au CursorHoldI * let g:triggered += 1
96 set updatetime=20
97 call timer_start(100, 'ExitInsertMode')
98 " CursorHoldI does not trigger after CTRL-X
99 call feedkeys("a\<C-X>", 'x!')
100 call assert_equal(0, g:triggered)
Bram Moolenaar26d98212019-01-27 22:32:55 +0100101 unlet g:triggered
Bram Moolenaare99e8442016-07-26 20:43:40 +0200102 au! CursorHoldI
Bram Moolenaaraeac9002016-09-06 22:15:08 +0200103 set updatetime&
Bram Moolenaarc67e8922016-05-24 16:07:40 +0200104 endfunc
Bram Moolenaar97b00752019-05-12 13:07:14 +0200105
106 func Test_OptionSet_modeline()
107 call test_override('starting', 1)
108 au! OptionSet
109 augroup set_tabstop
110 au OptionSet tabstop call timer_start(1, {-> execute("echo 'Handler called'", "")})
111 augroup END
112 call writefile(['vim: set ts=7 sw=5 :', 'something'], 'XoptionsetModeline')
113 set modeline
114 let v:errmsg = ''
115 call assert_fails('split XoptionsetModeline', 'E12:')
116 call assert_equal(7, &ts)
117 call assert_equal('', v:errmsg)
118
119 augroup set_tabstop
120 au!
121 augroup END
122 bwipe!
123 set ts&
124 call delete('XoptionsetModeline')
125 call test_override('starting', 0)
126 endfunc
127
128endif "has('timers')
Bram Moolenaar40b1b542016-04-20 20:18:23 +0200129
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200130func Test_bufunload()
Bram Moolenaarc67e8922016-05-24 16:07:40 +0200131 augroup test_bufunload_group
132 autocmd!
133 autocmd BufUnload * call add(s:li, "bufunload")
134 autocmd BufDelete * call add(s:li, "bufdelete")
135 autocmd BufWipeout * call add(s:li, "bufwipeout")
136 augroup END
Bram Moolenaar40b1b542016-04-20 20:18:23 +0200137
Bram Moolenaarc67e8922016-05-24 16:07:40 +0200138 let s:li=[]
139 new
140 setlocal bufhidden=
141 bunload
142 call assert_equal(["bufunload", "bufdelete"], s:li)
Bram Moolenaar40b1b542016-04-20 20:18:23 +0200143
Bram Moolenaarc67e8922016-05-24 16:07:40 +0200144 let s:li=[]
145 new
146 setlocal bufhidden=delete
147 bunload
148 call assert_equal(["bufunload", "bufdelete"], s:li)
149
150 let s:li=[]
151 new
152 setlocal bufhidden=unload
153 bwipeout
154 call assert_equal(["bufunload", "bufdelete", "bufwipeout"], s:li)
155
Bram Moolenaare99e8442016-07-26 20:43:40 +0200156 au! test_bufunload_group
Bram Moolenaarc67e8922016-05-24 16:07:40 +0200157 augroup! test_bufunload_group
Bram Moolenaar40b1b542016-04-20 20:18:23 +0200158endfunc
Bram Moolenaar30445cb2016-07-09 15:21:02 +0200159
160" SEGV occurs in older versions. (At least 7.4.2005 or older)
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200161func Test_autocmd_bufunload_with_tabnext()
Bram Moolenaar30445cb2016-07-09 15:21:02 +0200162 tabedit
163 tabfirst
164
165 augroup test_autocmd_bufunload_with_tabnext_group
166 autocmd!
167 autocmd BufUnload <buffer> tabnext
168 augroup END
169
170 quit
171 call assert_equal(2, tabpagenr('$'))
172
Bram Moolenaare0ab94e2016-09-04 19:50:54 +0200173 autocmd! test_autocmd_bufunload_with_tabnext_group
Bram Moolenaar30445cb2016-07-09 15:21:02 +0200174 augroup! test_autocmd_bufunload_with_tabnext_group
175 tablast
176 quit
177endfunc
Bram Moolenaarc917da42016-07-19 22:31:36 +0200178
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200179func Test_autocmd_bufwinleave_with_tabfirst()
Bram Moolenaarf9e687e2016-09-04 21:33:09 +0200180 tabedit
181 augroup sample
182 autocmd!
183 autocmd BufWinLeave <buffer> tabfirst
184 augroup END
185 call setline(1, ['a', 'b', 'c'])
186 edit! a.txt
Bram Moolenaarf18c4db2016-09-08 22:10:06 +0200187 tabclose
Bram Moolenaarf9e687e2016-09-04 21:33:09 +0200188endfunc
189
Bram Moolenaare0ab94e2016-09-04 19:50:54 +0200190" SEGV occurs in older versions. (At least 7.4.2321 or older)
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200191func Test_autocmd_bufunload_avoiding_SEGV_01()
Bram Moolenaare0ab94e2016-09-04 19:50:54 +0200192 split aa.txt
193 let lastbuf = bufnr('$')
194
195 augroup test_autocmd_bufunload
196 autocmd!
197 exe 'autocmd BufUnload <buffer> ' . (lastbuf + 1) . 'bwipeout!'
198 augroup END
199
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +0200200 call assert_fails('edit bb.txt', ['E937:', 'E517:'])
Bram Moolenaare0ab94e2016-09-04 19:50:54 +0200201
202 autocmd! test_autocmd_bufunload
203 augroup! test_autocmd_bufunload
204 bwipe! aa.txt
205 bwipe! bb.txt
206endfunc
207
208" SEGV occurs in older versions. (At least 7.4.2321 or older)
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200209func Test_autocmd_bufunload_avoiding_SEGV_02()
Bram Moolenaare0ab94e2016-09-04 19:50:54 +0200210 setlocal buftype=nowrite
211 let lastbuf = bufnr('$')
212
213 augroup test_autocmd_bufunload
214 autocmd!
215 exe 'autocmd BufUnload <buffer> ' . (lastbuf + 1) . 'bwipeout!'
216 augroup END
217
218 normal! i1
219 call assert_fails('edit a.txt', 'E517:')
220 call feedkeys("\<CR>")
221
222 autocmd! test_autocmd_bufunload
223 augroup! test_autocmd_bufunload
224 bwipe! a.txt
225endfunc
226
Bram Moolenaarc917da42016-07-19 22:31:36 +0200227func Test_win_tab_autocmd()
228 let g:record = []
229
230 augroup testing
231 au WinNew * call add(g:record, 'WinNew')
232 au WinEnter * call add(g:record, 'WinEnter')
233 au WinLeave * call add(g:record, 'WinLeave')
234 au TabNew * call add(g:record, 'TabNew')
Bram Moolenaar12c11d52016-07-19 23:13:03 +0200235 au TabClosed * call add(g:record, 'TabClosed')
Bram Moolenaarc917da42016-07-19 22:31:36 +0200236 au TabEnter * call add(g:record, 'TabEnter')
237 au TabLeave * call add(g:record, 'TabLeave')
238 augroup END
239
240 split
241 tabnew
242 close
243 close
244
245 call assert_equal([
246 \ 'WinLeave', 'WinNew', 'WinEnter',
247 \ 'WinLeave', 'TabLeave', 'WinNew', 'WinEnter', 'TabNew', 'TabEnter',
Bram Moolenaar12c11d52016-07-19 23:13:03 +0200248 \ 'WinLeave', 'TabLeave', 'TabClosed', 'WinEnter', 'TabEnter',
Bram Moolenaarc917da42016-07-19 22:31:36 +0200249 \ 'WinLeave', 'WinEnter'
250 \ ], g:record)
251
Bram Moolenaar12c11d52016-07-19 23:13:03 +0200252 let g:record = []
253 tabnew somefile
254 tabnext
255 bwipe somefile
256
257 call assert_equal([
258 \ 'WinLeave', 'TabLeave', 'WinNew', 'WinEnter', 'TabNew', 'TabEnter',
259 \ 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter',
260 \ 'TabClosed'
261 \ ], g:record)
262
Bram Moolenaarc917da42016-07-19 22:31:36 +0200263 augroup testing
264 au!
265 augroup END
266 unlet g:record
267endfunc
Bram Moolenaare99e8442016-07-26 20:43:40 +0200268
269func s:AddAnAutocmd()
270 augroup vimBarTest
271 au BufReadCmd * echo 'hello'
272 augroup END
273 call assert_equal(3, len(split(execute('au vimBarTest'), "\n")))
274endfunc
275
276func Test_early_bar()
277 " test that a bar is recognized before the {event}
278 call s:AddAnAutocmd()
279 augroup vimBarTest | au! | augroup END
280 call assert_equal(1, len(split(execute('au vimBarTest'), "\n")))
281
282 call s:AddAnAutocmd()
283 augroup vimBarTest| au!| augroup END
284 call assert_equal(1, len(split(execute('au vimBarTest'), "\n")))
285
286 " test that a bar is recognized after the {event}
287 call s:AddAnAutocmd()
288 augroup vimBarTest| au!BufReadCmd| augroup END
289 call assert_equal(1, len(split(execute('au vimBarTest'), "\n")))
290
291 " test that a bar is recognized after the {group}
292 call s:AddAnAutocmd()
293 au! vimBarTest|echo 'hello'
294 call assert_equal(1, len(split(execute('au vimBarTest'), "\n")))
295endfunc
Bram Moolenaarf2c4c392016-07-29 20:50:24 +0200296
Bram Moolenaar5c809082016-09-01 16:21:48 +0200297func RemoveGroup()
298 autocmd! StartOK
299 augroup! StartOK
300endfunc
301
Bram Moolenaarf2c4c392016-07-29 20:50:24 +0200302func Test_augroup_warning()
303 augroup TheWarning
304 au VimEnter * echo 'entering'
305 augroup END
306 call assert_true(match(execute('au VimEnter'), "TheWarning.*VimEnter") >= 0)
307 redir => res
308 augroup! TheWarning
309 redir END
310 call assert_true(match(res, "W19:") >= 0)
311 call assert_true(match(execute('au VimEnter'), "-Deleted-.*VimEnter") >= 0)
312
313 " check "Another" does not take the pace of the deleted entry
314 augroup Another
315 augroup END
316 call assert_true(match(execute('au VimEnter'), "-Deleted-.*VimEnter") >= 0)
Bram Moolenaaraeac9002016-09-06 22:15:08 +0200317 augroup! Another
Bram Moolenaar5c809082016-09-01 16:21:48 +0200318
319 " no warning for postpone aucmd delete
320 augroup StartOK
321 au VimEnter * call RemoveGroup()
322 augroup END
323 call assert_true(match(execute('au VimEnter'), "StartOK.*VimEnter") >= 0)
324 redir => res
325 doautocmd VimEnter
326 redir END
327 call assert_true(match(res, "W19:") < 0)
Bram Moolenaarde653f02016-09-03 16:59:06 +0200328 au! VimEnter
Bram Moolenaarad48e6c2020-04-21 22:19:45 +0200329
330 call assert_fails('augroup!', 'E471:')
Bram Moolenaarf2c4c392016-07-29 20:50:24 +0200331endfunc
Bram Moolenaarb62cc362016-09-03 16:43:53 +0200332
Bram Moolenaar8d84ff12017-10-26 16:42:16 +0200333func Test_BufReadCmdHelp()
334 " This used to cause access to free memory
335 au BufReadCmd * e +h
336 help
337
Bram Moolenaar8d84ff12017-10-26 16:42:16 +0200338 au! BufReadCmd
339endfunc
340
341func Test_BufReadCmdHelpJump()
342 " This used to cause access to free memory
343 au BufReadCmd * e +h{
Bram Moolenaarcf1ba352017-10-27 00:55:04 +0200344 " } to fix highlighting
345 call assert_fails('help', 'E434:')
Bram Moolenaar8d84ff12017-10-26 16:42:16 +0200346
Bram Moolenaar8d84ff12017-10-26 16:42:16 +0200347 au! BufReadCmd
348endfunc
349
Bram Moolenaarb62cc362016-09-03 16:43:53 +0200350func Test_augroup_deleted()
Bram Moolenaarde653f02016-09-03 16:59:06 +0200351 " This caused a crash before E936 was introduced
Bram Moolenaarb62cc362016-09-03 16:43:53 +0200352 augroup x
Bram Moolenaarde653f02016-09-03 16:59:06 +0200353 call assert_fails('augroup! x', 'E936:')
354 au VimEnter * echo
355 augroup end
Bram Moolenaarb62cc362016-09-03 16:43:53 +0200356 augroup! x
Bram Moolenaarde653f02016-09-03 16:59:06 +0200357 call assert_true(match(execute('au VimEnter'), "-Deleted-.*VimEnter") >= 0)
358 au! VimEnter
Bram Moolenaarb62cc362016-09-03 16:43:53 +0200359endfunc
360
Bram Moolenaare0ab94e2016-09-04 19:50:54 +0200361" Tests for autocommands on :close command.
362" This used to be in test13.
363func Test_three_windows()
Bram Moolenaarb3435b02016-09-29 20:54:59 +0200364 " Clean up buffers, because in some cases this function fails.
365 call s:cleanup_buffers()
366
Bram Moolenaare0ab94e2016-09-04 19:50:54 +0200367 " Write three files and open them, each in a window.
368 " Then go to next window, with autocommand that deletes the previous one.
369 " Do this twice, writing the file.
370 e! Xtestje1
371 call setline(1, 'testje1')
372 w
373 sp Xtestje2
374 call setline(1, 'testje2')
375 w
376 sp Xtestje3
377 call setline(1, 'testje3')
378 w
379 wincmd w
380 au WinLeave Xtestje2 bwipe
381 wincmd w
382 call assert_equal('Xtestje1', expand('%'))
383
384 au WinLeave Xtestje1 bwipe Xtestje3
385 close
386 call assert_equal('Xtestje1', expand('%'))
387
388 " Test deleting the buffer on a Unload event. If this goes wrong there
389 " will be the ATTENTION prompt.
390 e Xtestje1
391 au!
392 au! BufUnload Xtestje1 bwipe
393 call assert_fails('e Xtestje3', 'E937:')
394 call assert_equal('Xtestje3', expand('%'))
395
396 e Xtestje2
397 sp Xtestje1
398 call assert_fails('e', 'E937:')
Bram Moolenaara997b452018-04-17 23:24:06 +0200399 call assert_equal('Xtestje1', expand('%'))
Bram Moolenaare0ab94e2016-09-04 19:50:54 +0200400
401 " Test changing buffers in a BufWipeout autocommand. If this goes wrong
402 " there are ml_line errors and/or a Crash.
403 au!
404 only
405 e Xanother
406 e Xtestje1
407 bwipe Xtestje2
408 bwipe Xtestje3
409 au BufWipeout Xtestje1 buf Xtestje1
410 bwipe
411 call assert_equal('Xanother', expand('%'))
412
413 only
414 help
415 wincmd w
416 1quit
417 call assert_equal('Xanother', expand('%'))
418
419 au!
Bram Moolenaar4520d442017-03-19 16:09:46 +0100420 enew
Bram Moolenaare0ab94e2016-09-04 19:50:54 +0200421 call delete('Xtestje1')
422 call delete('Xtestje2')
423 call delete('Xtestje3')
424endfunc
Bram Moolenaare13b9af2017-01-13 22:01:02 +0100425
426func Test_BufEnter()
427 au! BufEnter
428 au Bufenter * let val = val . '+'
429 let g:val = ''
430 split NewFile
431 call assert_equal('+', g:val)
432 bwipe!
433 call assert_equal('++', g:val)
434
435 " Also get BufEnter when editing a directory
436 call mkdir('Xdir')
437 split Xdir
438 call assert_equal('+++', g:val)
Bram Moolenaare94260f2017-03-21 15:50:12 +0100439
440 " On MS-Windows we can't edit the directory, make sure we wipe the right
441 " buffer.
442 bwipe! Xdir
Bram Moolenaare13b9af2017-01-13 22:01:02 +0100443
444 call delete('Xdir', 'd')
445 au! BufEnter
446endfunc
Bram Moolenaar8c752bd2017-03-19 17:09:56 +0100447
448" Closing a window might cause an endless loop
449" E814 for older Vims
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200450func Test_autocmd_bufwipe_in_SessLoadPost()
Bram Moolenaar1d68d9b2017-10-13 22:33:32 +0200451 edit Xtest
Bram Moolenaar8c752bd2017-03-19 17:09:56 +0100452 tabnew
Bram Moolenaar1d68d9b2017-10-13 22:33:32 +0200453 file Xsomething
Bram Moolenaar8c752bd2017-03-19 17:09:56 +0100454 set noswapfile
Bram Moolenaar8c752bd2017-03-19 17:09:56 +0100455 mksession!
456
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200457 let content =<< trim [CODE]
458 set nocp noswapfile
459 let v:swapchoice="e"
460 augroup test_autocmd_sessionload
461 autocmd!
462 autocmd SessionLoadPost * exe bufnr("Xsomething") . "bw!"
463 augroup END
464
465 func WriteErrors()
466 call writefile([execute("messages")], "Xerrors")
467 endfunc
468 au VimLeave * call WriteErrors()
469 [CODE]
470
Bram Moolenaar8c752bd2017-03-19 17:09:56 +0100471 call writefile(content, 'Xvimrc')
Bram Moolenaar93344c22019-08-14 21:12:05 +0200472 call system(GetVimCommand('Xvimrc') .. ' --not-a-term --noplugins -S Session.vim -c cq')
Bram Moolenaare94260f2017-03-21 15:50:12 +0100473 let errors = join(readfile('Xerrors'))
474 call assert_match('E814', errors)
Bram Moolenaar8c752bd2017-03-19 17:09:56 +0100475
Bram Moolenaar8c752bd2017-03-19 17:09:56 +0100476 set swapfile
Bram Moolenaare94260f2017-03-21 15:50:12 +0100477 for file in ['Session.vim', 'Xvimrc', 'Xerrors']
Bram Moolenaar8c752bd2017-03-19 17:09:56 +0100478 call delete(file)
479 endfor
480endfunc
481
482" SEGV occurs in older versions.
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200483func Test_autocmd_bufwipe_in_SessLoadPost2()
Bram Moolenaar8c752bd2017-03-19 17:09:56 +0100484 tabnew
485 set noswapfile
Bram Moolenaar8c752bd2017-03-19 17:09:56 +0100486 mksession!
487
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200488 let content =<< trim [CODE]
489 set nocp noswapfile
490 function! DeleteInactiveBufs()
491 tabfirst
492 let tabblist = []
493 for i in range(1, tabpagenr(''$''))
494 call extend(tabblist, tabpagebuflist(i))
495 endfor
496 for b in range(1, bufnr(''$''))
497 if bufexists(b) && buflisted(b) && (index(tabblist, b) == -1 || bufname(b) =~# ''^$'')
498 exec ''bwipeout '' . b
499 endif
500 endfor
501 echomsg "SessionLoadPost DONE"
502 endfunction
503 au SessionLoadPost * call DeleteInactiveBufs()
504
505 func WriteErrors()
506 call writefile([execute("messages")], "Xerrors")
507 endfunc
508 au VimLeave * call WriteErrors()
509 [CODE]
510
Bram Moolenaar8c752bd2017-03-19 17:09:56 +0100511 call writefile(content, 'Xvimrc')
Bram Moolenaar93344c22019-08-14 21:12:05 +0200512 call system(GetVimCommand('Xvimrc') .. ' --not-a-term --noplugins -S Session.vim -c cq')
Bram Moolenaare94260f2017-03-21 15:50:12 +0100513 let errors = join(readfile('Xerrors'))
514 " This probably only ever matches on unix.
515 call assert_notmatch('Caught deadly signal SEGV', errors)
516 call assert_match('SessionLoadPost DONE', errors)
Bram Moolenaar8c752bd2017-03-19 17:09:56 +0100517
Bram Moolenaar8c752bd2017-03-19 17:09:56 +0100518 set swapfile
Bram Moolenaare94260f2017-03-21 15:50:12 +0100519 for file in ['Session.vim', 'Xvimrc', 'Xerrors']
Bram Moolenaar8c752bd2017-03-19 17:09:56 +0100520 call delete(file)
521 endfor
522endfunc
Bram Moolenaarfaf29d72017-07-09 11:07:16 +0200523
524func Test_empty_doau()
525 doau \|
526endfunc
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200527
528func s:AutoCommandOptionSet(match)
Bram Moolenaard7c96872019-06-15 17:12:48 +0200529 let template = "Option: <%s>, OldVal: <%s>, OldValLocal: <%s>, OldValGlobal: <%s>, NewVal: <%s>, Scope: <%s>, Command: <%s>\n"
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200530 let item = remove(g:options, 0)
Bram Moolenaard7c96872019-06-15 17:12:48 +0200531 let expected = printf(template, item[0], item[1], item[2], item[3], item[4], item[5], item[6])
532 let actual = printf(template, a:match, v:option_old, v:option_oldlocal, v:option_oldglobal, v:option_new, v:option_type, v:option_command)
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200533 let g:opt = [expected, actual]
534 "call assert_equal(expected, actual)
535endfunc
536
537func Test_OptionSet()
Bram Moolenaar26d98212019-01-27 22:32:55 +0100538 if !has("eval") || !exists("+autochdir")
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200539 return
540 endif
541
Bram Moolenaar4a6fcf82017-10-12 21:29:22 +0200542 badd test_autocmd.vim
543
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200544 call test_override('starting', 1)
545 set nocp
546 au OptionSet * :call s:AutoCommandOptionSet(expand("<amatch>"))
547
548 " 1: Setting number option"
Bram Moolenaard7c96872019-06-15 17:12:48 +0200549 let g:options=[['number', 0, 0, 0, 1, 'global', 'set']]
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200550 set nu
551 call assert_equal([], g:options)
552 call assert_equal(g:opt[0], g:opt[1])
553
554 " 2: Setting local number option"
Bram Moolenaard7c96872019-06-15 17:12:48 +0200555 let g:options=[['number', 1, 1, '', 0, 'local', 'setlocal']]
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200556 setlocal nonu
557 call assert_equal([], g:options)
558 call assert_equal(g:opt[0], g:opt[1])
559
560 " 3: Setting global number option"
Bram Moolenaard7c96872019-06-15 17:12:48 +0200561 let g:options=[['number', 1, '', 1, 0, 'global', 'setglobal']]
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200562 setglobal nonu
563 call assert_equal([], g:options)
564 call assert_equal(g:opt[0], g:opt[1])
565
566 " 4: Setting local autoindent option"
Bram Moolenaard7c96872019-06-15 17:12:48 +0200567 let g:options=[['autoindent', 0, 0, '', 1, 'local', 'setlocal']]
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200568 setlocal ai
569 call assert_equal([], g:options)
570 call assert_equal(g:opt[0], g:opt[1])
571
572 " 5: Setting global autoindent option"
Bram Moolenaard7c96872019-06-15 17:12:48 +0200573 let g:options=[['autoindent', 0, '', 0, 1, 'global', 'setglobal']]
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200574 setglobal ai
575 call assert_equal([], g:options)
576 call assert_equal(g:opt[0], g:opt[1])
577
578 " 6: Setting global autoindent option"
Bram Moolenaard7c96872019-06-15 17:12:48 +0200579 let g:options=[['autoindent', 1, 1, 1, 0, 'global', 'set']]
580 set ai!
581 call assert_equal([], g:options)
582 call assert_equal(g:opt[0], g:opt[1])
583
584 " 6a: Setting global autoindent option"
585 let g:options=[['autoindent', 1, 1, 0, 0, 'global', 'set']]
586 noa setlocal ai
587 noa setglobal noai
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200588 set ai!
589 call assert_equal([], g:options)
590 call assert_equal(g:opt[0], g:opt[1])
591
592 " Should not print anything, use :noa
593 " 7: don't trigger OptionSet"
Bram Moolenaard7c96872019-06-15 17:12:48 +0200594 let g:options=[['invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid']]
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200595 noa set nonu
Bram Moolenaard7c96872019-06-15 17:12:48 +0200596 call assert_equal([['invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid']], g:options)
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200597 call assert_equal(g:opt[0], g:opt[1])
598
599 " 8: Setting several global list and number option"
Bram Moolenaard7c96872019-06-15 17:12:48 +0200600 let g:options=[['list', 0, 0, 0, 1, 'global', 'set'], ['number', 0, 0, 0, 1, 'global', 'set']]
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200601 set list nu
602 call assert_equal([], g:options)
603 call assert_equal(g:opt[0], g:opt[1])
604
605 " 9: don't trigger OptionSet"
Bram Moolenaard7c96872019-06-15 17:12:48 +0200606 let g:options=[['invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid'], ['invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid']]
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200607 noa set nolist nonu
Bram Moolenaard7c96872019-06-15 17:12:48 +0200608 call assert_equal([['invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid'], ['invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid']], g:options)
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200609 call assert_equal(g:opt[0], g:opt[1])
610
611 " 10: Setting global acd"
Bram Moolenaard7c96872019-06-15 17:12:48 +0200612 let g:options=[['autochdir', 0, 0, '', 1, 'local', 'setlocal']]
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200613 setlocal acd
614 call assert_equal([], g:options)
615 call assert_equal(g:opt[0], g:opt[1])
616
617 " 11: Setting global autoread (also sets local value)"
Bram Moolenaard7c96872019-06-15 17:12:48 +0200618 let g:options=[['autoread', 0, 0, 0, 1, 'global', 'set']]
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200619 set ar
620 call assert_equal([], g:options)
621 call assert_equal(g:opt[0], g:opt[1])
622
623 " 12: Setting local autoread"
Bram Moolenaard7c96872019-06-15 17:12:48 +0200624 let g:options=[['autoread', 1, 1, '', 1, 'local', 'setlocal']]
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200625 setlocal ar
626 call assert_equal([], g:options)
627 call assert_equal(g:opt[0], g:opt[1])
628
629 " 13: Setting global autoread"
Bram Moolenaard7c96872019-06-15 17:12:48 +0200630 let g:options=[['autoread', 1, '', 1, 0, 'global', 'setglobal']]
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200631 setglobal invar
632 call assert_equal([], g:options)
633 call assert_equal(g:opt[0], g:opt[1])
634
635 " 14: Setting option backspace through :let"
Bram Moolenaard7c96872019-06-15 17:12:48 +0200636 let g:options=[['backspace', '', '', '', 'eol,indent,start', 'global', 'set']]
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200637 let &bs="eol,indent,start"
638 call assert_equal([], g:options)
639 call assert_equal(g:opt[0], g:opt[1])
640
641 " 15: Setting option backspace through setbufvar()"
Bram Moolenaard7c96872019-06-15 17:12:48 +0200642 let g:options=[['backup', 0, 0, '', 1, 'local', 'setlocal']]
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200643 " try twice, first time, shouldn't trigger because option name is invalid,
644 " second time, it should trigger
Bram Moolenaar4a6fcf82017-10-12 21:29:22 +0200645 let bnum = bufnr('%')
646 call assert_fails("call setbufvar(bnum, '&l:bk', 1)", "E355")
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200647 " should trigger, use correct option name
Bram Moolenaar4a6fcf82017-10-12 21:29:22 +0200648 call setbufvar(bnum, '&backup', 1)
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200649 call assert_equal([], g:options)
650 call assert_equal(g:opt[0], g:opt[1])
651
652 " 16: Setting number option using setwinvar"
Bram Moolenaard7c96872019-06-15 17:12:48 +0200653 let g:options=[['number', 0, 0, '', 1, 'local', 'setlocal']]
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200654 call setwinvar(0, '&number', 1)
655 call assert_equal([], g:options)
656 call assert_equal(g:opt[0], g:opt[1])
657
658 " 17: Setting key option, shouldn't trigger"
Bram Moolenaard7c96872019-06-15 17:12:48 +0200659 let g:options=[['key', 'invalid', 'invalid1', 'invalid2', 'invalid3', 'invalid4', 'invalid5']]
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200660 setlocal key=blah
661 setlocal key=
Bram Moolenaard7c96872019-06-15 17:12:48 +0200662 call assert_equal([['key', 'invalid', 'invalid1', 'invalid2', 'invalid3', 'invalid4', 'invalid5']], g:options)
Bram Moolenaar04f62f82017-07-19 18:18:39 +0200663 call assert_equal(g:opt[0], g:opt[1])
664
Bram Moolenaard7c96872019-06-15 17:12:48 +0200665
666 " 18a: Setting string global option"
667 let oldval = &backupext
668 let g:options=[['backupext', oldval, oldval, oldval, 'foo', 'global', 'set']]
669 set backupext=foo
670 call assert_equal([], g:options)
671 call assert_equal(g:opt[0], g:opt[1])
672
673 " 18b: Resetting string global option"
674 let g:options=[['backupext', 'foo', 'foo', 'foo', oldval, 'global', 'set']]
675 set backupext&
676 call assert_equal([], g:options)
677 call assert_equal(g:opt[0], g:opt[1])
678
679 " 18c: Setting global string global option"
680 let g:options=[['backupext', oldval, '', oldval, 'bar', 'global', 'setglobal']]
681 setglobal backupext=bar
682 call assert_equal([], g:options)
683 call assert_equal(g:opt[0], g:opt[1])
684
685 " 18d: Setting local string global option"
686 " As this is a global option this sets the global value even though
687 " :setlocal is used!
688 noa set backupext& " Reset global and local value (without triggering autocmd)
689 let g:options=[['backupext', oldval, oldval, '', 'baz', 'local', 'setlocal']]
690 setlocal backupext=baz
691 call assert_equal([], g:options)
692 call assert_equal(g:opt[0], g:opt[1])
693
694 " 18e: Setting again string global option"
695 noa setglobal backupext=ext_global " Reset global and local value (without triggering autocmd)
696 noa setlocal backupext=ext_local " Sets the global(!) value!
697 let g:options=[['backupext', 'ext_local', 'ext_local', 'ext_local', 'fuu', 'global', 'set']]
698 set backupext=fuu
699 call assert_equal([], g:options)
700 call assert_equal(g:opt[0], g:opt[1])
701
702
703 " 19a: Setting string local-global (to buffer) option"
Bram Moolenaar8efa0262017-08-20 15:47:20 +0200704 let oldval = &tags
Bram Moolenaard7c96872019-06-15 17:12:48 +0200705 let g:options=[['tags', oldval, oldval, oldval, 'tagpath', 'global', 'set']]
Bram Moolenaar8efa0262017-08-20 15:47:20 +0200706 set tags=tagpath
707 call assert_equal([], g:options)
708 call assert_equal(g:opt[0], g:opt[1])
709
Bram Moolenaard7c96872019-06-15 17:12:48 +0200710 " 19b: Resetting string local-global (to buffer) option"
711 let g:options=[['tags', 'tagpath', 'tagpath', 'tagpath', oldval, 'global', 'set']]
Bram Moolenaar8efa0262017-08-20 15:47:20 +0200712 set tags&
713 call assert_equal([], g:options)
714 call assert_equal(g:opt[0], g:opt[1])
715
Bram Moolenaard7c96872019-06-15 17:12:48 +0200716 " 19c: Setting global string local-global (to buffer) option "
717 let g:options=[['tags', oldval, '', oldval, 'tagpath1', 'global', 'setglobal']]
718 setglobal tags=tagpath1
719 call assert_equal([], g:options)
720 call assert_equal(g:opt[0], g:opt[1])
721
722 " 19d: Setting local string local-global (to buffer) option"
723 let g:options=[['tags', 'tagpath1', 'tagpath1', '', 'tagpath2', 'local', 'setlocal']]
724 setlocal tags=tagpath2
725 call assert_equal([], g:options)
726 call assert_equal(g:opt[0], g:opt[1])
727
728 " 19e: Setting again string local-global (to buffer) option"
729 " Note: v:option_old is the old global value for local-global string options
730 " but the old local value for all other kinds of options.
731 noa setglobal tags=tag_global " Reset global and local value (without triggering autocmd)
732 noa setlocal tags=tag_local
733 let g:options=[['tags', 'tag_global', 'tag_local', 'tag_global', 'tagpath', 'global', 'set']]
734 set tags=tagpath
735 call assert_equal([], g:options)
736 call assert_equal(g:opt[0], g:opt[1])
737
738 " 19f: Setting string local-global (to buffer) option to an empty string"
739 " Note: v:option_old is the old global value for local-global string options
740 " but the old local value for all other kinds of options.
741 noa set tags=tag_global " Reset global and local value (without triggering autocmd)
742 noa setlocal tags= " empty string
743 let g:options=[['tags', 'tag_global', '', 'tag_global', 'tagpath', 'global', 'set']]
744 set tags=tagpath
745 call assert_equal([], g:options)
746 call assert_equal(g:opt[0], g:opt[1])
747
748
749 " 20a: Setting string local (to buffer) option"
750 let oldval = &spelllang
751 let g:options=[['spelllang', oldval, oldval, oldval, 'elvish,klingon', 'global', 'set']]
752 set spelllang=elvish,klingon
753 call assert_equal([], g:options)
754 call assert_equal(g:opt[0], g:opt[1])
755
756 " 20b: Resetting string local (to buffer) option"
757 let g:options=[['spelllang', 'elvish,klingon', 'elvish,klingon', 'elvish,klingon', oldval, 'global', 'set']]
758 set spelllang&
759 call assert_equal([], g:options)
760 call assert_equal(g:opt[0], g:opt[1])
761
762 " 20c: Setting global string local (to buffer) option"
763 let g:options=[['spelllang', oldval, '', oldval, 'elvish', 'global', 'setglobal']]
764 setglobal spelllang=elvish
765 call assert_equal([], g:options)
766 call assert_equal(g:opt[0], g:opt[1])
767
768 " 20d: Setting local string local (to buffer) option"
769 noa set spelllang& " Reset global and local value (without triggering autocmd)
770 let g:options=[['spelllang', oldval, oldval, '', 'klingon', 'local', 'setlocal']]
771 setlocal spelllang=klingon
772 call assert_equal([], g:options)
773 call assert_equal(g:opt[0], g:opt[1])
774
775 " 20e: Setting again string local (to buffer) option"
776 " Note: v:option_old is the old global value for local-global string options
777 " but the old local value for all other kinds of options.
778 noa setglobal spelllang=spellglobal " Reset global and local value (without triggering autocmd)
779 noa setlocal spelllang=spelllocal
780 let g:options=[['spelllang', 'spelllocal', 'spelllocal', 'spellglobal', 'foo', 'global', 'set']]
781 set spelllang=foo
782 call assert_equal([], g:options)
783 call assert_equal(g:opt[0], g:opt[1])
784
785
786 " 21a: Setting string local-global (to window) option"
787 let oldval = &statusline
788 let g:options=[['statusline', oldval, oldval, oldval, 'foo', 'global', 'set']]
789 set statusline=foo
790 call assert_equal([], g:options)
791 call assert_equal(g:opt[0], g:opt[1])
792
793 " 21b: Resetting string local-global (to window) option"
794 " Note: v:option_old is the old global value for local-global string options
795 " but the old local value for all other kinds of options.
796 let g:options=[['statusline', 'foo', 'foo', 'foo', oldval, 'global', 'set']]
797 set statusline&
798 call assert_equal([], g:options)
799 call assert_equal(g:opt[0], g:opt[1])
800
801 " 21c: Setting global string local-global (to window) option"
802 let g:options=[['statusline', oldval, '', oldval, 'bar', 'global', 'setglobal']]
803 setglobal statusline=bar
804 call assert_equal([], g:options)
805 call assert_equal(g:opt[0], g:opt[1])
806
807 " 21d: Setting local string local-global (to window) option"
808 noa set statusline& " Reset global and local value (without triggering autocmd)
809 let g:options=[['statusline', oldval, oldval, '', 'baz', 'local', 'setlocal']]
810 setlocal statusline=baz
811 call assert_equal([], g:options)
812 call assert_equal(g:opt[0], g:opt[1])
813
814 " 21e: Setting again string local-global (to window) option"
815 " Note: v:option_old is the old global value for local-global string options
816 " but the old local value for all other kinds of options.
817 noa setglobal statusline=bar " Reset global and local value (without triggering autocmd)
818 noa setlocal statusline=baz
819 let g:options=[['statusline', 'bar', 'baz', 'bar', 'foo', 'global', 'set']]
820 set statusline=foo
821 call assert_equal([], g:options)
822 call assert_equal(g:opt[0], g:opt[1])
823
824
825 " 22a: Setting string local (to window) option"
826 let oldval = &foldignore
827 let g:options=[['foldignore', oldval, oldval, oldval, 'fo', 'global', 'set']]
828 set foldignore=fo
829 call assert_equal([], g:options)
830 call assert_equal(g:opt[0], g:opt[1])
831
832 " 22b: Resetting string local (to window) option"
833 let g:options=[['foldignore', 'fo', 'fo', 'fo', oldval, 'global', 'set']]
834 set foldignore&
835 call assert_equal([], g:options)
836 call assert_equal(g:opt[0], g:opt[1])
837
838 " 22c: Setting global string local (to window) option"
839 let g:options=[['foldignore', oldval, '', oldval, 'bar', 'global', 'setglobal']]
840 setglobal foldignore=bar
841 call assert_equal([], g:options)
842 call assert_equal(g:opt[0], g:opt[1])
843
844 " 22d: Setting local string local (to window) option"
845 noa set foldignore& " Reset global and local value (without triggering autocmd)
846 let g:options=[['foldignore', oldval, oldval, '', 'baz', 'local', 'setlocal']]
847 setlocal foldignore=baz
848 call assert_equal([], g:options)
849 call assert_equal(g:opt[0], g:opt[1])
850
851 " 22e: Setting again string local (to window) option"
852 noa setglobal foldignore=glob " Reset global and local value (without triggering autocmd)
853 noa setlocal foldignore=loc
854 let g:options=[['foldignore', 'loc', 'loc', 'glob', 'fo', 'global', 'set']]
855 set foldignore=fo
856 call assert_equal([], g:options)
857 call assert_equal(g:opt[0], g:opt[1])
858
859
860 " 23a: Setting global number local option"
861 noa setglobal cmdheight=8 " Reset global and local value (without triggering autocmd)
862 noa setlocal cmdheight=1 " Sets the global(!) value!
863 let g:options=[['cmdheight', '1', '', '1', '2', 'global', 'setglobal']]
864 setglobal cmdheight=2
865 call assert_equal([], g:options)
866 call assert_equal(g:opt[0], g:opt[1])
867
868 " 23b: Setting local number global option"
869 noa setglobal cmdheight=8 " Reset global and local value (without triggering autocmd)
870 noa setlocal cmdheight=1 " Sets the global(!) value!
871 let g:options=[['cmdheight', '1', '1', '', '2', 'local', 'setlocal']]
872 setlocal cmdheight=2
873 call assert_equal([], g:options)
874 call assert_equal(g:opt[0], g:opt[1])
875
876 " 23c: Setting again number global option"
877 noa setglobal cmdheight=8 " Reset global and local value (without triggering autocmd)
878 noa setlocal cmdheight=1 " Sets the global(!) value!
879 let g:options=[['cmdheight', '1', '1', '1', '2', 'global', 'set']]
880 set cmdheight=2
881 call assert_equal([], g:options)
882 call assert_equal(g:opt[0], g:opt[1])
883
884 " 23d: Setting again number global option"
885 noa set cmdheight=8 " Reset global and local value (without triggering autocmd)
886 let g:options=[['cmdheight', '8', '8', '8', '2', 'global', 'set']]
887 set cmdheight=2
888 call assert_equal([], g:options)
889 call assert_equal(g:opt[0], g:opt[1])
890
891
892 " 24a: Setting global number global-local (to buffer) option"
893 noa setglobal undolevels=8 " Reset global and local value (without triggering autocmd)
894 noa setlocal undolevels=1
895 let g:options=[['undolevels', '8', '', '8', '2', 'global', 'setglobal']]
896 setglobal undolevels=2
897 call assert_equal([], g:options)
898 call assert_equal(g:opt[0], g:opt[1])
899
900 " 24b: Setting local number global-local (to buffer) option"
901 noa setglobal undolevels=8 " Reset global and local value (without triggering autocmd)
902 noa setlocal undolevels=1
903 let g:options=[['undolevels', '1', '1', '', '2', 'local', 'setlocal']]
904 setlocal undolevels=2
905 call assert_equal([], g:options)
906 call assert_equal(g:opt[0], g:opt[1])
907
908 " 24c: Setting again number global-local (to buffer) option"
909 noa setglobal undolevels=8 " Reset global and local value (without triggering autocmd)
910 noa setlocal undolevels=1
911 let g:options=[['undolevels', '1', '1', '8', '2', 'global', 'set']]
912 set undolevels=2
913 call assert_equal([], g:options)
914 call assert_equal(g:opt[0], g:opt[1])
915
916 " 24d: Setting again global number global-local (to buffer) option"
917 noa set undolevels=8 " Reset global and local value (without triggering autocmd)
918 let g:options=[['undolevels', '8', '8', '8', '2', 'global', 'set']]
919 set undolevels=2
920 call assert_equal([], g:options)
921 call assert_equal(g:opt[0], g:opt[1])
922
923
924 " 25a: Setting global number local (to buffer) option"
925 noa setglobal wrapmargin=8 " Reset global and local value (without triggering autocmd)
926 noa setlocal wrapmargin=1
927 let g:options=[['wrapmargin', '8', '', '8', '2', 'global', 'setglobal']]
928 setglobal wrapmargin=2
929 call assert_equal([], g:options)
930 call assert_equal(g:opt[0], g:opt[1])
931
932 " 25b: Setting local number local (to buffer) option"
933 noa setglobal wrapmargin=8 " Reset global and local value (without triggering autocmd)
934 noa setlocal wrapmargin=1
935 let g:options=[['wrapmargin', '1', '1', '', '2', 'local', 'setlocal']]
936 setlocal wrapmargin=2
937 call assert_equal([], g:options)
938 call assert_equal(g:opt[0], g:opt[1])
939
940 " 25c: Setting again number local (to buffer) option"
941 noa setglobal wrapmargin=8 " Reset global and local value (without triggering autocmd)
942 noa setlocal wrapmargin=1
943 let g:options=[['wrapmargin', '1', '1', '8', '2', 'global', 'set']]
944 set wrapmargin=2
945 call assert_equal([], g:options)
946 call assert_equal(g:opt[0], g:opt[1])
947
948 " 25d: Setting again global number local (to buffer) option"
949 noa set wrapmargin=8 " Reset global and local value (without triggering autocmd)
950 let g:options=[['wrapmargin', '8', '8', '8', '2', 'global', 'set']]
951 set wrapmargin=2
952 call assert_equal([], g:options)
953 call assert_equal(g:opt[0], g:opt[1])
954
955
956 " 26: Setting number global-local (to window) option.
957 " Such option does currently not exist.
958
959
960 " 27a: Setting global number local (to window) option"
961 noa setglobal foldcolumn=8 " Reset global and local value (without triggering autocmd)
962 noa setlocal foldcolumn=1
963 let g:options=[['foldcolumn', '8', '', '8', '2', 'global', 'setglobal']]
964 setglobal foldcolumn=2
965 call assert_equal([], g:options)
966 call assert_equal(g:opt[0], g:opt[1])
967
968 " 27b: Setting local number local (to window) option"
969 noa setglobal foldcolumn=8 " Reset global and local value (without triggering autocmd)
970 noa setlocal foldcolumn=1
971 let g:options=[['foldcolumn', '1', '1', '', '2', 'local', 'setlocal']]
972 setlocal foldcolumn=2
973 call assert_equal([], g:options)
974 call assert_equal(g:opt[0], g:opt[1])
975
976 " 27c: Setting again number local (to window) option"
977 noa setglobal foldcolumn=8 " Reset global and local value (without triggering autocmd)
978 noa setlocal foldcolumn=1
979 let g:options=[['foldcolumn', '1', '1', '8', '2', 'global', 'set']]
980 set foldcolumn=2
981 call assert_equal([], g:options)
982 call assert_equal(g:opt[0], g:opt[1])
983
984 " 27d: Ssettin again global number local (to window) option"
985 noa set foldcolumn=8 " Reset global and local value (without triggering autocmd)
986 let g:options=[['foldcolumn', '8', '8', '8', '2', 'global', 'set']]
987 set foldcolumn=2
988 call assert_equal([], g:options)
989 call assert_equal(g:opt[0], g:opt[1])
990
991
992 " 28a: Setting global boolean global option"
993 noa setglobal nowrapscan " Reset global and local value (without triggering autocmd)
994 noa setlocal wrapscan " Sets the global(!) value!
995 let g:options=[['wrapscan', '1', '', '1', '0', 'global', 'setglobal']]
996 setglobal nowrapscan
997 call assert_equal([], g:options)
998 call assert_equal(g:opt[0], g:opt[1])
999
1000 " 28b: Setting local boolean global option"
1001 noa setglobal nowrapscan " Reset global and local value (without triggering autocmd)
1002 noa setlocal wrapscan " Sets the global(!) value!
1003 let g:options=[['wrapscan', '1', '1', '', '0', 'local', 'setlocal']]
1004 setlocal nowrapscan
1005 call assert_equal([], g:options)
1006 call assert_equal(g:opt[0], g:opt[1])
1007
1008 " 28c: Setting again boolean global option"
1009 noa setglobal nowrapscan " Reset global and local value (without triggering autocmd)
1010 noa setlocal wrapscan " Sets the global(!) value!
1011 let g:options=[['wrapscan', '1', '1', '1', '0', 'global', 'set']]
1012 set nowrapscan
1013 call assert_equal([], g:options)
1014 call assert_equal(g:opt[0], g:opt[1])
1015
1016 " 28d: Setting again global boolean global option"
1017 noa set nowrapscan " Reset global and local value (without triggering autocmd)
1018 let g:options=[['wrapscan', '0', '0', '0', '1', 'global', 'set']]
1019 set wrapscan
1020 call assert_equal([], g:options)
1021 call assert_equal(g:opt[0], g:opt[1])
1022
1023
1024 " 29a: Setting global boolean global-local (to buffer) option"
1025 noa setglobal noautoread " Reset global and local value (without triggering autocmd)
1026 noa setlocal autoread
1027 let g:options=[['autoread', '0', '', '0', '1', 'global', 'setglobal']]
1028 setglobal autoread
1029 call assert_equal([], g:options)
1030 call assert_equal(g:opt[0], g:opt[1])
1031
1032 " 29b: Setting local boolean global-local (to buffer) option"
1033 noa setglobal noautoread " Reset global and local value (without triggering autocmd)
1034 noa setlocal autoread
1035 let g:options=[['autoread', '1', '1', '', '0', 'local', 'setlocal']]
1036 setlocal noautoread
1037 call assert_equal([], g:options)
1038 call assert_equal(g:opt[0], g:opt[1])
1039
1040 " 29c: Setting again boolean global-local (to buffer) option"
1041 noa setglobal noautoread " Reset global and local value (without triggering autocmd)
1042 noa setlocal autoread
1043 let g:options=[['autoread', '1', '1', '0', '1', 'global', 'set']]
1044 set autoread
1045 call assert_equal([], g:options)
1046 call assert_equal(g:opt[0], g:opt[1])
1047
1048 " 29d: Setting again global boolean global-local (to buffer) option"
1049 noa set noautoread " Reset global and local value (without triggering autocmd)
1050 let g:options=[['autoread', '0', '0', '0', '1', 'global', 'set']]
1051 set autoread
1052 call assert_equal([], g:options)
1053 call assert_equal(g:opt[0], g:opt[1])
1054
1055
1056 " 30a: Setting global boolean local (to buffer) option"
1057 noa setglobal nocindent " Reset global and local value (without triggering autocmd)
1058 noa setlocal cindent
1059 let g:options=[['cindent', '0', '', '0', '1', 'global', 'setglobal']]
1060 setglobal cindent
1061 call assert_equal([], g:options)
1062 call assert_equal(g:opt[0], g:opt[1])
1063
1064 " 30b: Setting local boolean local (to buffer) option"
1065 noa setglobal nocindent " Reset global and local value (without triggering autocmd)
1066 noa setlocal cindent
1067 let g:options=[['cindent', '1', '1', '', '0', 'local', 'setlocal']]
1068 setlocal nocindent
1069 call assert_equal([], g:options)
1070 call assert_equal(g:opt[0], g:opt[1])
1071
1072 " 30c: Setting again boolean local (to buffer) option"
1073 noa setglobal nocindent " Reset global and local value (without triggering autocmd)
1074 noa setlocal cindent
1075 let g:options=[['cindent', '1', '1', '0', '1', 'global', 'set']]
1076 set cindent
1077 call assert_equal([], g:options)
1078 call assert_equal(g:opt[0], g:opt[1])
1079
1080 " 30d: Setting again global boolean local (to buffer) option"
1081 noa set nocindent " Reset global and local value (without triggering autocmd)
1082 let g:options=[['cindent', '0', '0', '0', '1', 'global', 'set']]
1083 set cindent
1084 call assert_equal([], g:options)
1085 call assert_equal(g:opt[0], g:opt[1])
1086
1087
1088 " 31: Setting boolean global-local (to window) option
1089 " Currently no such option exists.
1090
1091
1092 " 32a: Setting global boolean local (to window) option"
1093 noa setglobal nocursorcolumn " Reset global and local value (without triggering autocmd)
1094 noa setlocal cursorcolumn
1095 let g:options=[['cursorcolumn', '0', '', '0', '1', 'global', 'setglobal']]
1096 setglobal cursorcolumn
1097 call assert_equal([], g:options)
1098 call assert_equal(g:opt[0], g:opt[1])
1099
1100 " 32b: Setting local boolean local (to window) option"
1101 noa setglobal nocursorcolumn " Reset global and local value (without triggering autocmd)
1102 noa setlocal cursorcolumn
1103 let g:options=[['cursorcolumn', '1', '1', '', '0', 'local', 'setlocal']]
1104 setlocal nocursorcolumn
1105 call assert_equal([], g:options)
1106 call assert_equal(g:opt[0], g:opt[1])
1107
1108 " 32c: Setting again boolean local (to window) option"
1109 noa setglobal nocursorcolumn " Reset global and local value (without triggering autocmd)
1110 noa setlocal cursorcolumn
1111 let g:options=[['cursorcolumn', '1', '1', '0', '1', 'global', 'set']]
1112 set cursorcolumn
1113 call assert_equal([], g:options)
1114 call assert_equal(g:opt[0], g:opt[1])
1115
1116 " 32d: Setting again global boolean local (to window) option"
1117 noa set nocursorcolumn " Reset global and local value (without triggering autocmd)
1118 let g:options=[['cursorcolumn', '0', '0', '0', '1', 'global', 'set']]
1119 set cursorcolumn
1120 call assert_equal([], g:options)
1121 call assert_equal(g:opt[0], g:opt[1])
1122
1123
Bram Moolenaar1bc353b2019-09-01 14:45:28 +02001124 " 33: Test autocommands when an option value is converted internally.
Bram Moolenaard7c96872019-06-15 17:12:48 +02001125 noa set backspace=1 " Reset global and local value (without triggering autocmd)
1126 let g:options=[['backspace', 'indent,eol', 'indent,eol', 'indent,eol', '2', 'global', 'set']]
1127 set backspace=2
1128 call assert_equal([], g:options)
1129 call assert_equal(g:opt[0], g:opt[1])
1130
1131
Bram Moolenaar04f62f82017-07-19 18:18:39 +02001132 " Cleanup
1133 au! OptionSet
Bram Moolenaar0331faf2019-06-15 18:40:37 +02001134 " set tags&
Bram Moolenaard7c96872019-06-15 17:12:48 +02001135 for opt in ['nu', 'ai', 'acd', 'ar', 'bs', 'backup', 'cul', 'cp', 'backupext', 'tags', 'spelllang', 'statusline', 'foldignore', 'cmdheight', 'undolevels', 'wrapmargin', 'foldcolumn', 'wrapscan', 'autoread', 'cindent', 'cursorcolumn']
Bram Moolenaar91d2e782018-08-07 19:05:01 +02001136 exe printf(":set %s&vim", opt)
Bram Moolenaar04f62f82017-07-19 18:18:39 +02001137 endfor
1138 call test_override('starting', 0)
1139 delfunc! AutoCommandOptionSet
1140endfunc
1141
1142func Test_OptionSet_diffmode()
1143 call test_override('starting', 1)
Bram Moolenaar26d98212019-01-27 22:32:55 +01001144 " 18: Changing an option when entering diff mode
Bram Moolenaar04f62f82017-07-19 18:18:39 +02001145 new
1146 au OptionSet diff :let &l:cul=v:option_new
1147
1148 call setline(1, ['buffer 1', 'line2', 'line3', 'line4'])
1149 call assert_equal(0, &l:cul)
1150 diffthis
1151 call assert_equal(1, &l:cul)
1152
1153 vnew
1154 call setline(1, ['buffer 2', 'line 2', 'line 3', 'line4'])
1155 call assert_equal(0, &l:cul)
1156 diffthis
1157 call assert_equal(1, &l:cul)
1158
1159 diffoff
1160 call assert_equal(0, &l:cul)
1161 call assert_equal(1, getwinvar(2, '&l:cul'))
1162 bw!
1163
1164 call assert_equal(1, &l:cul)
1165 diffoff!
1166 call assert_equal(0, &l:cul)
1167 call assert_equal(0, getwinvar(1, '&l:cul'))
1168 bw!
1169
1170 " Cleanup
1171 au! OptionSet
1172 call test_override('starting', 0)
1173endfunc
1174
1175func Test_OptionSet_diffmode_close()
1176 call test_override('starting', 1)
1177 " 19: Try to close the current window when entering diff mode
1178 " should not segfault
1179 new
1180 au OptionSet diff close
1181
1182 call setline(1, ['buffer 1', 'line2', 'line3', 'line4'])
1183 call assert_fails(':diffthis', 'E788')
1184 call assert_equal(1, &diff)
1185 vnew
1186 call setline(1, ['buffer 2', 'line 2', 'line 3', 'line4'])
1187 call assert_fails(':diffthis', 'E788')
1188 call assert_equal(1, &diff)
Bram Moolenaara9aa86f2019-11-10 21:25:45 +01001189 set diffopt-=closeoff
Bram Moolenaar04f62f82017-07-19 18:18:39 +02001190 bw!
1191 call assert_fails(':diffoff!', 'E788')
1192 bw!
1193
1194 " Cleanup
1195 au! OptionSet
1196 call test_override('starting', 0)
1197 "delfunc! AutoCommandOptionSet
1198endfunc
Bram Moolenaar4a137b42017-08-04 22:37:11 +02001199
1200" Test for Bufleave autocommand that deletes the buffer we are about to edit.
1201func Test_BufleaveWithDelete()
1202 new | edit Xfile1
1203
1204 augroup test_bufleavewithdelete
1205 autocmd!
1206 autocmd BufLeave Xfile1 bwipe Xfile2
1207 augroup END
1208
1209 call assert_fails('edit Xfile2', 'E143:')
1210 call assert_equal('Xfile1', bufname('%'))
1211
1212 autocmd! test_bufleavewithdelete BufLeave Xfile1
1213 augroup! test_bufleavewithdelete
1214
1215 new
1216 bwipe! Xfile1
1217endfunc
Bram Moolenaar4a6fcf82017-10-12 21:29:22 +02001218
1219" Test for autocommand that changes the buffer list, when doing ":ball".
1220func Test_Acmd_BufAll()
1221 enew!
1222 %bwipe!
1223 call writefile(['Test file Xxx1'], 'Xxx1')
1224 call writefile(['Test file Xxx2'], 'Xxx2')
1225 call writefile(['Test file Xxx3'], 'Xxx3')
1226
1227 " Add three files to the buffer list
1228 split Xxx1
1229 close
1230 split Xxx2
1231 close
1232 split Xxx3
1233 close
1234
1235 " Wipe the buffer when the buffer is opened
1236 au BufReadPost Xxx2 bwipe
1237
1238 call append(0, 'Test file Xxx4')
1239 ball
1240
1241 call assert_equal(2, winnr('$'))
1242 call assert_equal('Xxx1', bufname(winbufnr(winnr('$'))))
1243 wincmd t
1244
1245 au! BufReadPost
1246 %bwipe!
1247 call delete('Xxx1')
1248 call delete('Xxx2')
1249 call delete('Xxx3')
1250 enew! | only
1251endfunc
1252
1253" Test for autocommand that changes current buffer on BufEnter event.
1254" Check if modelines are interpreted for the correct buffer.
1255func Test_Acmd_BufEnter()
1256 %bwipe!
1257 call writefile(['start of test file Xxx1',
1258 \ "\<Tab>this is a test",
1259 \ 'end of test file Xxx1'], 'Xxx1')
1260 call writefile(['start of test file Xxx2',
1261 \ 'vim: set noai :',
1262 \ "\<Tab>this is a test",
1263 \ 'end of test file Xxx2'], 'Xxx2')
1264
1265 au BufEnter Xxx2 brew
1266 set ai modeline modelines=3
1267 edit Xxx1
1268 " edit Xxx2, autocmd will do :brew
1269 edit Xxx2
1270 exe "normal G?this is a\<CR>"
1271 " Append text with autoindent to this file
1272 normal othis should be auto-indented
1273 call assert_equal("\<Tab>this should be auto-indented", getline('.'))
1274 call assert_equal(3, line('.'))
1275 " Remove autocmd and edit Xxx2 again
1276 au! BufEnter Xxx2
1277 buf! Xxx2
1278 exe "normal G?this is a\<CR>"
1279 " append text without autoindent to Xxx
1280 normal othis should be in column 1
1281 call assert_equal("this should be in column 1", getline('.'))
1282 call assert_equal(4, line('.'))
1283
1284 %bwipe!
1285 call delete('Xxx1')
1286 call delete('Xxx2')
1287 set ai&vim modeline&vim modelines&vim
1288endfunc
1289
1290" Test for issue #57
1291" do not move cursor on <c-o> when autoindent is set
1292func Test_ai_CTRL_O()
1293 enew!
1294 set ai
1295 let save_fo = &fo
1296 set fo+=r
1297 exe "normal o# abcdef\<Esc>2hi\<CR>\<C-O>d0\<Esc>"
1298 exe "normal o# abcdef\<Esc>2hi\<C-O>d0\<Esc>"
1299 call assert_equal(['# abc', 'def', 'def'], getline(2, 4))
1300
1301 set ai&vim
1302 let &fo = save_fo
1303 enew!
1304endfunc
1305
1306" Test for autocommand that deletes the current buffer on BufLeave event.
1307" Also test deleting the last buffer, should give a new, empty buffer.
1308func Test_BufLeave_Wipe()
1309 %bwipe!
1310 let content = ['start of test file Xxx',
1311 \ 'this is a test',
1312 \ 'end of test file Xxx']
1313 call writefile(content, 'Xxx1')
1314 call writefile(content, 'Xxx2')
1315
1316 au BufLeave Xxx2 bwipe
1317 edit Xxx1
1318 split Xxx2
1319 " delete buffer Xxx2, we should be back to Xxx1
1320 bwipe
1321 call assert_equal('Xxx1', bufname('%'))
1322 call assert_equal(1, winnr('$'))
1323
1324 " Create an alternate buffer
1325 %write! test.out
1326 call assert_equal('test.out', bufname('#'))
1327 " delete alternate buffer
1328 bwipe test.out
1329 call assert_equal('Xxx1', bufname('%'))
1330 call assert_equal('', bufname('#'))
1331
1332 au BufLeave Xxx1 bwipe
1333 " delete current buffer, get an empty one
1334 bwipe!
1335 call assert_equal(1, line('$'))
1336 call assert_equal('', bufname('%'))
Bram Moolenaarb2c87502017-10-14 21:15:58 +02001337 let g:bufinfo = getbufinfo()
1338 call assert_equal(1, len(g:bufinfo))
Bram Moolenaar4a6fcf82017-10-12 21:29:22 +02001339
1340 call delete('Xxx1')
1341 call delete('Xxx2')
Bram Moolenaar53f0c962017-10-22 14:23:59 +02001342 call delete('test.out')
Bram Moolenaar4a6fcf82017-10-12 21:29:22 +02001343 %bwipe
1344 au! BufLeave
Bram Moolenaarb2c87502017-10-14 21:15:58 +02001345
1346 " check that bufinfo doesn't contain a pointer to freed memory
1347 call test_garbagecollect_now()
Bram Moolenaar4a6fcf82017-10-12 21:29:22 +02001348endfunc
Bram Moolenaar87ffb5c2017-10-19 12:37:42 +02001349
1350func Test_QuitPre()
1351 edit Xfoo
1352 let winid = win_getid(winnr())
1353 split Xbar
1354 au! QuitPre * let g:afile = expand('<afile>')
1355 " Close the other window, <afile> should be correct.
1356 exe win_id2win(winid) . 'q'
1357 call assert_equal('Xfoo', g:afile)
1358
1359 unlet g:afile
1360 bwipe Xfoo
1361 bwipe Xbar
1362endfunc
Bram Moolenaarfafcf0d2017-10-19 18:35:51 +02001363
1364func Test_Cmdline()
Bram Moolenaar153b7042018-01-31 15:48:32 +01001365 au! CmdlineChanged : let g:text = getcmdline()
1366 let g:text = 0
1367 call feedkeys(":echom 'hello'\<CR>", 'xt')
1368 call assert_equal("echom 'hello'", g:text)
1369 au! CmdlineChanged
1370
1371 au! CmdlineChanged : let g:entered = expand('<afile>')
1372 let g:entered = 0
1373 call feedkeys(":echom 'hello'\<CR>", 'xt')
1374 call assert_equal(':', g:entered)
1375 au! CmdlineChanged
1376
Bram Moolenaarfafcf0d2017-10-19 18:35:51 +02001377 au! CmdlineEnter : let g:entered = expand('<afile>')
1378 au! CmdlineLeave : let g:left = expand('<afile>')
1379 let g:entered = 0
1380 let g:left = 0
1381 call feedkeys(":echo 'hello'\<CR>", 'xt')
1382 call assert_equal(':', g:entered)
1383 call assert_equal(':', g:left)
1384 au! CmdlineEnter
1385 au! CmdlineLeave
1386
Bram Moolenaara4baf5b2018-04-22 13:27:44 +02001387 let save_shellslash = &shellslash
1388 set noshellslash
Bram Moolenaarfafcf0d2017-10-19 18:35:51 +02001389 au! CmdlineEnter / let g:entered = expand('<afile>')
1390 au! CmdlineLeave / let g:left = expand('<afile>')
1391 let g:entered = 0
1392 let g:left = 0
Bram Moolenaar53f0c962017-10-22 14:23:59 +02001393 new
1394 call setline(1, 'hello')
1395 call feedkeys("/hello\<CR>", 'xt')
Bram Moolenaarfafcf0d2017-10-19 18:35:51 +02001396 call assert_equal('/', g:entered)
1397 call assert_equal('/', g:left)
Bram Moolenaar53f0c962017-10-22 14:23:59 +02001398 bwipe!
Bram Moolenaarfafcf0d2017-10-19 18:35:51 +02001399 au! CmdlineEnter
1400 au! CmdlineLeave
Bram Moolenaara4baf5b2018-04-22 13:27:44 +02001401 let &shellslash = save_shellslash
Bram Moolenaarfafcf0d2017-10-19 18:35:51 +02001402endfunc
Bram Moolenaar53f0c962017-10-22 14:23:59 +02001403
1404" Test for BufWritePre autocommand that deletes or unloads the buffer.
1405func Test_BufWritePre()
1406 %bwipe
1407 au BufWritePre Xxx1 bunload
1408 au BufWritePre Xxx2 bwipe
1409
1410 call writefile(['start of Xxx1', 'test', 'end of Xxx1'], 'Xxx1')
1411 call writefile(['start of Xxx2', 'test', 'end of Xxx2'], 'Xxx2')
1412
1413 edit Xtest
1414 e! Xxx2
1415 bdel Xtest
1416 e Xxx1
1417 " write it, will unload it and give an error msg
1418 call assert_fails('w', 'E203')
1419 call assert_equal('Xxx2', bufname('%'))
1420 edit Xtest
1421 e! Xxx2
1422 bwipe Xtest
1423 " write it, will delete the buffer and give an error msg
1424 call assert_fails('w', 'E203')
1425 call assert_equal('Xxx1', bufname('%'))
1426 au! BufWritePre
1427 call delete('Xxx1')
1428 call delete('Xxx2')
1429endfunc
1430
1431" Test for BufUnload autocommand that unloads all the other buffers
1432func Test_bufunload_all()
1433 call writefile(['Test file Xxx1'], 'Xxx1')"
1434 call writefile(['Test file Xxx2'], 'Xxx2')"
1435
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001436 let content =<< trim [CODE]
1437 func UnloadAllBufs()
1438 let i = 1
1439 while i <= bufnr('$')
1440 if i != bufnr('%') && bufloaded(i)
1441 exe i . 'bunload'
1442 endif
1443 let i += 1
1444 endwhile
1445 endfunc
1446 au BufUnload * call UnloadAllBufs()
1447 au VimLeave * call writefile(['Test Finished'], 'Xout')
1448 edit Xxx1
1449 split Xxx2
1450 q
1451 [CODE]
1452
Bram Moolenaar53f0c962017-10-22 14:23:59 +02001453 call writefile(content, 'Xtest')
1454
1455 call delete('Xout')
Bram Moolenaar93344c22019-08-14 21:12:05 +02001456 call system(GetVimCommandClean() .. ' -N --not-a-term -S Xtest')
Bram Moolenaar53f0c962017-10-22 14:23:59 +02001457 call assert_true(filereadable('Xout'))
1458
1459 call delete('Xxx1')
1460 call delete('Xxx2')
1461 call delete('Xtest')
1462 call delete('Xout')
1463endfunc
1464
1465" Some tests for buffer-local autocommands
1466func Test_buflocal_autocmd()
1467 let g:bname = ''
1468 edit xx
1469 au BufLeave <buffer> let g:bname = expand("%")
1470 " here, autocommand for xx should trigger.
1471 " but autocommand shall not apply to buffer named <buffer>.
1472 edit somefile
1473 call assert_equal('xx', g:bname)
1474 let g:bname = ''
1475 " here, autocommand shall be auto-deleted
1476 bwipe xx
1477 " autocmd should not trigger
1478 edit xx
1479 call assert_equal('', g:bname)
1480 " autocmd should not trigger
1481 edit somefile
1482 call assert_equal('', g:bname)
1483 enew
1484 unlet g:bname
1485endfunc
Bram Moolenaar430dc5d2017-11-02 21:04:47 +01001486
1487" Test for "*Cmd" autocommands
1488func Test_Cmd_Autocmds()
1489 call writefile(['start of Xxx', "\tabc2", 'end of Xxx'], 'Xxx')
1490
1491 enew!
1492 au BufReadCmd XtestA 0r Xxx|$del
1493 edit XtestA " will read text of Xxd instead
1494 call assert_equal('start of Xxx', getline(1))
1495
1496 au BufWriteCmd XtestA call append(line("$"), "write")
1497 write " will append a line to the file
1498 call assert_equal('write', getline('$'))
1499 call assert_fails('read XtestA', 'E484') " should not read anything
1500 call assert_equal('write', getline(4))
1501
1502 " now we have:
1503 " 1 start of Xxx
1504 " 2 abc2
1505 " 3 end of Xxx
1506 " 4 write
1507
1508 au FileReadCmd XtestB '[r Xxx
1509 2r XtestB " will read Xxx below line 2 instead
1510 call assert_equal('start of Xxx', getline(3))
1511
1512 " now we have:
1513 " 1 start of Xxx
1514 " 2 abc2
1515 " 3 start of Xxx
1516 " 4 abc2
1517 " 5 end of Xxx
1518 " 6 end of Xxx
1519 " 7 write
1520
1521 au FileWriteCmd XtestC '[,']copy $
1522 normal 4GA1
1523 4,5w XtestC " will copy lines 4 and 5 to the end
1524 call assert_equal("\tabc21", getline(8))
1525 call assert_fails('r XtestC', 'E484') " should not read anything
1526 call assert_equal("end of Xxx", getline(9))
1527
1528 " now we have:
1529 " 1 start of Xxx
1530 " 2 abc2
1531 " 3 start of Xxx
1532 " 4 abc21
1533 " 5 end of Xxx
1534 " 6 end of Xxx
1535 " 7 write
1536 " 8 abc21
1537 " 9 end of Xxx
1538
1539 let g:lines = []
1540 au FileAppendCmd XtestD call extend(g:lines, getline(line("'["), line("']")))
1541 w >>XtestD " will add lines to 'lines'
1542 call assert_equal(9, len(g:lines))
1543 call assert_fails('$r XtestD', 'E484') " should not read anything
1544 call assert_equal(9, line('$'))
1545 call assert_equal('end of Xxx', getline('$'))
1546
1547 au BufReadCmd XtestE 0r Xxx|$del
1548 sp XtestE " split window with test.out
1549 call assert_equal('end of Xxx', getline(3))
1550
1551 let g:lines = []
1552 exe "normal 2Goasdf\<Esc>\<C-W>\<C-W>"
1553 au BufWriteCmd XtestE call extend(g:lines, getline(0, '$'))
1554 wall " will write other window to 'lines'
1555 call assert_equal(4, len(g:lines), g:lines)
1556 call assert_equal('asdf', g:lines[2])
1557
1558 au! BufReadCmd
1559 au! BufWriteCmd
1560 au! FileReadCmd
1561 au! FileWriteCmd
1562 au! FileAppendCmd
1563 %bwipe!
1564 call delete('Xxx')
1565 enew!
1566endfunc
Bram Moolenaaraace2152017-11-05 16:23:10 +01001567
Bram Moolenaar0fff4412020-03-29 16:06:29 +02001568func s:ReadFile()
1569 setl noswapfile nomodified
1570 let filename = resolve(expand("<afile>:p"))
1571 execute 'read' fnameescape(filename)
1572 1d_
1573 exe 'file' fnameescape(filename)
1574 setl buftype=acwrite
1575endfunc
1576
1577func s:WriteFile()
1578 let filename = resolve(expand("<afile>:p"))
1579 setl buftype=
1580 noautocmd execute 'write' fnameescape(filename)
1581 setl buftype=acwrite
1582 setl nomodified
1583endfunc
1584
1585func Test_BufReadCmd()
1586 autocmd BufReadCmd *.test call s:ReadFile()
1587 autocmd BufWriteCmd *.test call s:WriteFile()
1588
1589 call writefile(['one', 'two', 'three'], 'Xcmd.test')
1590 edit Xcmd.test
1591 call assert_match('Xcmd.test" line 1 of 3', execute('file'))
1592 normal! Gofour
1593 write
1594 call assert_equal(['one', 'two', 'three', 'four'], readfile('Xcmd.test'))
1595
1596 bwipe!
1597 call delete('Xcmd.test')
1598 au! BufReadCmd
1599 au! BufWriteCmd
1600endfunc
1601
Bram Moolenaaraace2152017-11-05 16:23:10 +01001602func SetChangeMarks(start, end)
1603 exe a:start. 'mark ['
1604 exe a:end. 'mark ]'
1605endfunc
1606
1607" Verify the effects of autocmds on '[ and ']
1608func Test_change_mark_in_autocmds()
1609 edit! Xtest
1610 call feedkeys("ia\<CR>b\<CR>c\<CR>d\<C-g>u", 'xtn')
1611
1612 call SetChangeMarks(2, 3)
1613 write
1614 call assert_equal([1, 4], [line("'["), line("']")])
1615
1616 call SetChangeMarks(2, 3)
1617 au BufWritePre * call assert_equal([1, 4], [line("'["), line("']")])
1618 write
1619 au! BufWritePre
1620
1621 if executable('cat')
1622 write XtestFilter
1623 write >> XtestFilter
1624
1625 call SetChangeMarks(2, 3)
1626 " Marks are set to the entire range of the write
1627 au FilterWritePre * call assert_equal([1, 4], [line("'["), line("']")])
1628 " '[ is adjusted to just before the line that will receive the filtered
1629 " data
1630 au FilterReadPre * call assert_equal([4, 4], [line("'["), line("']")])
1631 " The filtered data is read into the buffer, and the source lines are
1632 " still present, so the range is after the source lines
1633 au FilterReadPost * call assert_equal([5, 12], [line("'["), line("']")])
1634 %!cat XtestFilter
1635 " After the filtered data is read, the original lines are deleted
1636 call assert_equal([1, 8], [line("'["), line("']")])
1637 au! FilterWritePre,FilterReadPre,FilterReadPost
1638 undo
1639
1640 call SetChangeMarks(1, 4)
1641 au FilterWritePre * call assert_equal([2, 3], [line("'["), line("']")])
1642 au FilterReadPre * call assert_equal([3, 3], [line("'["), line("']")])
1643 au FilterReadPost * call assert_equal([4, 11], [line("'["), line("']")])
1644 2,3!cat XtestFilter
1645 call assert_equal([2, 9], [line("'["), line("']")])
1646 au! FilterWritePre,FilterReadPre,FilterReadPost
1647 undo
1648
1649 call delete('XtestFilter')
1650 endif
1651
1652 call SetChangeMarks(1, 4)
1653 au FileWritePre * call assert_equal([2, 3], [line("'["), line("']")])
1654 2,3write Xtest2
1655 au! FileWritePre
1656
1657 call SetChangeMarks(2, 3)
1658 au FileAppendPre * call assert_equal([1, 4], [line("'["), line("']")])
1659 write >> Xtest2
1660 au! FileAppendPre
1661
1662 call SetChangeMarks(1, 4)
1663 au FileAppendPre * call assert_equal([2, 3], [line("'["), line("']")])
1664 2,3write >> Xtest2
1665 au! FileAppendPre
1666
1667 call SetChangeMarks(1, 1)
1668 au FileReadPre * call assert_equal([3, 1], [line("'["), line("']")])
1669 au FileReadPost * call assert_equal([4, 11], [line("'["), line("']")])
1670 3read Xtest2
1671 au! FileReadPre,FileReadPost
1672 undo
1673
1674 call SetChangeMarks(4, 4)
1675 " When the line is 0, it's adjusted to 1
1676 au FileReadPre * call assert_equal([1, 4], [line("'["), line("']")])
1677 au FileReadPost * call assert_equal([1, 8], [line("'["), line("']")])
1678 0read Xtest2
1679 au! FileReadPre,FileReadPost
1680 undo
1681
1682 call SetChangeMarks(4, 4)
1683 " When the line is 0, it's adjusted to 1
1684 au FileReadPre * call assert_equal([1, 4], [line("'["), line("']")])
1685 au FileReadPost * call assert_equal([2, 9], [line("'["), line("']")])
1686 1read Xtest2
1687 au! FileReadPre,FileReadPost
1688 undo
1689
1690 bwipe!
1691 call delete('Xtest')
1692 call delete('Xtest2')
1693endfunc
1694
1695func Test_Filter_noshelltemp()
1696 if !executable('cat')
1697 return
1698 endif
1699
1700 enew!
1701 call setline(1, ['a', 'b', 'c', 'd'])
1702
1703 let shelltemp = &shelltemp
1704 set shelltemp
1705
1706 let g:filter_au = 0
1707 au FilterWritePre * let g:filter_au += 1
1708 au FilterReadPre * let g:filter_au += 1
1709 au FilterReadPost * let g:filter_au += 1
1710 %!cat
1711 call assert_equal(3, g:filter_au)
1712
1713 if has('filterpipe')
1714 set noshelltemp
1715
1716 let g:filter_au = 0
1717 au FilterWritePre * let g:filter_au += 1
1718 au FilterReadPre * let g:filter_au += 1
1719 au FilterReadPost * let g:filter_au += 1
1720 %!cat
1721 call assert_equal(0, g:filter_au)
1722 endif
1723
1724 au! FilterWritePre,FilterReadPre,FilterReadPost
1725 let &shelltemp = shelltemp
1726 bwipe!
1727endfunc
Bram Moolenaar7e1652c2017-12-16 18:27:02 +01001728
1729func Test_TextYankPost()
1730 enew!
1731 call setline(1, ['foo'])
1732
1733 let g:event = []
1734 au TextYankPost * let g:event = copy(v:event)
1735
1736 call assert_equal({}, v:event)
1737 call assert_fails('let v:event = {}', 'E46:')
1738 call assert_fails('let v:event.mykey = 0', 'E742:')
1739
1740 norm "ayiw
1741 call assert_equal(
Bram Moolenaar37d16732020-06-12 22:09:01 +02001742 \{'regcontents': ['foo'], 'regname': 'a', 'operator': 'y', 'regtype': 'v', 'visual': v:false},
Bram Moolenaar7e1652c2017-12-16 18:27:02 +01001743 \g:event)
1744 norm y_
1745 call assert_equal(
Bram Moolenaar37d16732020-06-12 22:09:01 +02001746 \{'regcontents': ['foo'], 'regname': '', 'operator': 'y', 'regtype': 'V', 'visual': v:false},
1747 \g:event)
1748 norm Vy
1749 call assert_equal(
1750 \{'regcontents': ['foo'], 'regname': '', 'operator': 'y', 'regtype': 'V', 'visual': v:true},
Bram Moolenaar7e1652c2017-12-16 18:27:02 +01001751 \g:event)
1752 call feedkeys("\<C-V>y", 'x')
1753 call assert_equal(
Bram Moolenaar37d16732020-06-12 22:09:01 +02001754 \{'regcontents': ['f'], 'regname': '', 'operator': 'y', 'regtype': "\x161", 'visual': v:true},
Bram Moolenaar7e1652c2017-12-16 18:27:02 +01001755 \g:event)
1756 norm "xciwbar
1757 call assert_equal(
Bram Moolenaar37d16732020-06-12 22:09:01 +02001758 \{'regcontents': ['foo'], 'regname': 'x', 'operator': 'c', 'regtype': 'v', 'visual': v:false},
Bram Moolenaar7e1652c2017-12-16 18:27:02 +01001759 \g:event)
1760 norm "bdiw
1761 call assert_equal(
Bram Moolenaar37d16732020-06-12 22:09:01 +02001762 \{'regcontents': ['bar'], 'regname': 'b', 'operator': 'd', 'regtype': 'v', 'visual': v:false},
Bram Moolenaar7e1652c2017-12-16 18:27:02 +01001763 \g:event)
1764
1765 call assert_equal({}, v:event)
1766
1767 au! TextYankPost
1768 unlet g:event
1769 bwipe!
1770endfunc
Bram Moolenaar9bca8052017-12-18 12:37:55 +01001771
1772func Test_nocatch_wipe_all_buffers()
1773 " Real nasty autocommand: wipe all buffers on any event.
1774 au * * bwipe *
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +02001775 call assert_fails('next x', ['E94:', 'E517:'])
Bram Moolenaar9bca8052017-12-18 12:37:55 +01001776 bwipe
1777 au!
1778endfunc
Bram Moolenaar4fb921e2017-12-18 15:33:00 +01001779
1780func Test_nocatch_wipe_dummy_buffer()
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01001781 if has('quickfix')
1782 " Nasty autocommand: wipe buffer on any event.
1783 au * x bwipe
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +02001784 call assert_fails('lv½ /x', 'E937')
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01001785 au!
1786 endif
Bram Moolenaar4fb921e2017-12-18 15:33:00 +01001787endfunc
Bram Moolenaarb7407d32018-02-03 17:36:27 +01001788
1789function s:Before_test_dirchanged()
1790 augroup test_dirchanged
1791 autocmd!
1792 augroup END
1793 let s:li = []
1794 let s:dir_this = getcwd()
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02001795 let s:dir_foo = s:dir_this . '/Xfoo'
Bram Moolenaar2caad3f2018-12-16 15:38:02 +01001796 call mkdir(s:dir_foo)
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02001797 let s:dir_bar = s:dir_this . '/Xbar'
Bram Moolenaar2caad3f2018-12-16 15:38:02 +01001798 call mkdir(s:dir_bar)
Bram Moolenaarb7407d32018-02-03 17:36:27 +01001799endfunc
1800
1801function s:After_test_dirchanged()
Bram Moolenaar3503d7c2019-11-09 20:10:17 +01001802 call chdir(s:dir_this)
Bram Moolenaar2caad3f2018-12-16 15:38:02 +01001803 call delete(s:dir_foo, 'd')
1804 call delete(s:dir_bar, 'd')
Bram Moolenaarb7407d32018-02-03 17:36:27 +01001805 augroup test_dirchanged
1806 autocmd!
1807 augroup END
1808endfunc
1809
1810function Test_dirchanged_global()
1811 call s:Before_test_dirchanged()
1812 autocmd test_dirchanged DirChanged global call add(s:li, "cd:")
1813 autocmd test_dirchanged DirChanged global call add(s:li, expand("<afile>"))
Bram Moolenaar3503d7c2019-11-09 20:10:17 +01001814 call chdir(s:dir_foo)
Bram Moolenaar2caad3f2018-12-16 15:38:02 +01001815 call assert_equal(["cd:", s:dir_foo], s:li)
Bram Moolenaar3503d7c2019-11-09 20:10:17 +01001816 call chdir(s:dir_foo)
Bram Moolenaar2caad3f2018-12-16 15:38:02 +01001817 call assert_equal(["cd:", s:dir_foo], s:li)
Bram Moolenaar3503d7c2019-11-09 20:10:17 +01001818 exe 'lcd ' .. fnameescape(s:dir_bar)
Bram Moolenaar2caad3f2018-12-16 15:38:02 +01001819 call assert_equal(["cd:", s:dir_foo], s:li)
Bram Moolenaarb7407d32018-02-03 17:36:27 +01001820 call s:After_test_dirchanged()
1821endfunc
1822
1823function Test_dirchanged_local()
1824 call s:Before_test_dirchanged()
1825 autocmd test_dirchanged DirChanged window call add(s:li, "lcd:")
1826 autocmd test_dirchanged DirChanged window call add(s:li, expand("<afile>"))
Bram Moolenaar3503d7c2019-11-09 20:10:17 +01001827 call chdir(s:dir_foo)
Bram Moolenaarb7407d32018-02-03 17:36:27 +01001828 call assert_equal([], s:li)
Bram Moolenaar3503d7c2019-11-09 20:10:17 +01001829 exe 'lcd ' .. fnameescape(s:dir_bar)
Bram Moolenaar2caad3f2018-12-16 15:38:02 +01001830 call assert_equal(["lcd:", s:dir_bar], s:li)
Bram Moolenaar3503d7c2019-11-09 20:10:17 +01001831 exe 'lcd ' .. fnameescape(s:dir_bar)
Bram Moolenaar2caad3f2018-12-16 15:38:02 +01001832 call assert_equal(["lcd:", s:dir_bar], s:li)
Bram Moolenaarb7407d32018-02-03 17:36:27 +01001833 call s:After_test_dirchanged()
1834endfunc
1835
1836function Test_dirchanged_auto()
Bram Moolenaarec48a9c2018-02-03 20:11:40 +01001837 if !exists('+autochdir')
1838 return
1839 endif
Bram Moolenaarb7407d32018-02-03 17:36:27 +01001840 call s:Before_test_dirchanged()
1841 call test_autochdir()
1842 autocmd test_dirchanged DirChanged auto call add(s:li, "auto:")
1843 autocmd test_dirchanged DirChanged auto call add(s:li, expand("<afile>"))
1844 set acd
Bram Moolenaar3503d7c2019-11-09 20:10:17 +01001845 cd ..
Bram Moolenaarb7407d32018-02-03 17:36:27 +01001846 call assert_equal([], s:li)
Bram Moolenaar2caad3f2018-12-16 15:38:02 +01001847 exe 'edit ' . s:dir_foo . '/Xfile'
1848 call assert_equal(s:dir_foo, getcwd())
1849 call assert_equal(["auto:", s:dir_foo], s:li)
Bram Moolenaarb7407d32018-02-03 17:36:27 +01001850 set noacd
1851 bwipe!
1852 call s:After_test_dirchanged()
1853endfunc
Bram Moolenaar5a093432018-02-10 18:15:19 +01001854
1855" Test TextChangedI and TextChangedP
1856func Test_ChangedP()
1857 new
1858 call setline(1, ['foo', 'bar', 'foobar'])
1859 call test_override("char_avail", 1)
1860 set complete=. completeopt=menuone
1861
1862 func! TextChangedAutocmd(char)
1863 let g:autocmd .= a:char
1864 endfunc
1865
1866 au! TextChanged <buffer> :call TextChangedAutocmd('N')
1867 au! TextChangedI <buffer> :call TextChangedAutocmd('I')
1868 au! TextChangedP <buffer> :call TextChangedAutocmd('P')
1869
1870 call cursor(3, 1)
1871 let g:autocmd = ''
1872 call feedkeys("o\<esc>", 'tnix')
1873 call assert_equal('I', g:autocmd)
1874
1875 let g:autocmd = ''
1876 call feedkeys("Sf", 'tnix')
1877 call assert_equal('II', g:autocmd)
1878
1879 let g:autocmd = ''
1880 call feedkeys("Sf\<C-N>", 'tnix')
1881 call assert_equal('IIP', g:autocmd)
1882
1883 let g:autocmd = ''
1884 call feedkeys("Sf\<C-N>\<C-N>", 'tnix')
1885 call assert_equal('IIPP', g:autocmd)
1886
1887 let g:autocmd = ''
1888 call feedkeys("Sf\<C-N>\<C-N>\<C-N>", 'tnix')
1889 call assert_equal('IIPPP', g:autocmd)
1890
1891 let g:autocmd = ''
1892 call feedkeys("Sf\<C-N>\<C-N>\<C-N>\<C-N>", 'tnix')
1893 call assert_equal('IIPPPP', g:autocmd)
1894
1895 call assert_equal(['foo', 'bar', 'foobar', 'foo'], getline(1, '$'))
1896 " TODO: how should it handle completeopt=noinsert,noselect?
1897
1898 " CleanUp
1899 call test_override("char_avail", 0)
1900 au! TextChanged
1901 au! TextChangedI
1902 au! TextChangedP
1903 delfu TextChangedAutocmd
1904 unlet! g:autocmd
1905 set complete&vim completeopt&vim
1906
1907 bw!
1908endfunc
Bram Moolenaar8c64a362018-03-23 22:39:31 +01001909
Bram Moolenaar91d2e782018-08-07 19:05:01 +02001910let g:setline_handled = v:false
Bram Moolenaar1e115362019-01-09 23:01:02 +01001911func SetLineOne()
Bram Moolenaar91d2e782018-08-07 19:05:01 +02001912 if !g:setline_handled
1913 call setline(1, "(x)")
1914 let g:setline_handled = v:true
1915 endif
1916endfunc
1917
1918func Test_TextChangedI_with_setline()
1919 new
1920 call test_override('char_avail', 1)
1921 autocmd TextChangedI <buffer> call SetLineOne()
1922 call feedkeys("i(\<CR>\<Esc>", 'tx')
1923 call assert_equal('(', getline(1))
1924 call assert_equal('x)', getline(2))
1925 undo
Bram Moolenaar91d2e782018-08-07 19:05:01 +02001926 call assert_equal('', getline(1))
Bram Moolenaar9fa95062018-08-08 22:08:32 +02001927 call assert_equal('', getline(2))
Bram Moolenaar91d2e782018-08-07 19:05:01 +02001928
1929 call test_override('starting', 0)
1930 bwipe!
1931endfunc
1932
Bram Moolenaar8c64a362018-03-23 22:39:31 +01001933func Test_Changed_FirstTime()
Bram Moolenaar8c5a2782019-08-07 23:07:07 +02001934 CheckFeature terminal
1935 CheckNotGui
Bram Moolenaar3cdcb092020-03-18 19:18:10 +01001936 " Starting a terminal to run Vim is always considered flaky.
Bram Moolenaar30d53e22020-03-18 21:10:44 +01001937 let g:test_is_flaky = 1
Bram Moolenaar8c5a2782019-08-07 23:07:07 +02001938
Bram Moolenaar8c64a362018-03-23 22:39:31 +01001939 " Prepare file for TextChanged event.
1940 call writefile([''], 'Xchanged.txt')
1941 let buf = term_start([GetVimProg(), '--clean', '-c', 'set noswapfile'], {'term_rows': 3})
1942 call assert_equal('running', term_getstatus(buf))
Bram Moolenaar1834d372018-03-29 17:40:46 +02001943 " Wait for the ruler (in the status line) to be shown.
Bram Moolenaaraa5df7e2019-02-03 14:53:10 +01001944 " In ConPTY, there is additional character which is drawn up to the width of
1945 " the screen.
1946 if has('conpty')
1947 call WaitForAssert({-> assert_match('\<All.*$', term_getline(buf, 3))})
1948 else
1949 call WaitForAssert({-> assert_match('\<All$', term_getline(buf, 3))})
1950 endif
Bram Moolenaar8c64a362018-03-23 22:39:31 +01001951 " It's only adding autocmd, so that no event occurs.
1952 call term_sendkeys(buf, ":au! TextChanged <buffer> call writefile(['No'], 'Xchanged.txt')\<cr>")
1953 call term_sendkeys(buf, "\<C-\\>\<C-N>:qa!\<cr>")
Bram Moolenaar50182fa2018-04-28 21:34:40 +02001954 call WaitForAssert({-> assert_equal('finished', term_getstatus(buf))})
Bram Moolenaar8c64a362018-03-23 22:39:31 +01001955 call assert_equal([''], readfile('Xchanged.txt'))
1956
1957 " clean up
1958 call delete('Xchanged.txt')
1959 bwipe!
1960endfunc
Bram Moolenaar0566e892019-01-24 19:37:40 +01001961
Bram Moolenaareb93f3f2019-04-04 15:04:56 +02001962func Test_autocmd_nested()
1963 let g:did_nested = 0
1964 augroup Testing
1965 au WinNew * edit somefile
1966 au BufNew * let g:did_nested = 1
1967 augroup END
1968 split
1969 call assert_equal(0, g:did_nested)
1970 close
1971 bwipe! somefile
1972
1973 " old nested argument still works
1974 augroup Testing
1975 au!
1976 au WinNew * nested edit somefile
1977 au BufNew * let g:did_nested = 1
1978 augroup END
1979 split
1980 call assert_equal(1, g:did_nested)
1981 close
1982 bwipe! somefile
1983
1984 " New ++nested argument works
1985 augroup Testing
1986 au!
1987 au WinNew * ++nested edit somefile
1988 au BufNew * let g:did_nested = 1
1989 augroup END
1990 split
1991 call assert_equal(1, g:did_nested)
1992 close
1993 bwipe! somefile
1994
1995 augroup Testing
1996 au!
1997 augroup END
1998
1999 call assert_fails('au WinNew * ++nested ++nested echo bad', 'E983:')
2000 call assert_fails('au WinNew * nested nested echo bad', 'E983:')
2001endfunc
2002
2003func Test_autocmd_once()
2004 " Without ++once WinNew triggers twice
2005 let g:did_split = 0
2006 augroup Testing
2007 au WinNew * let g:did_split += 1
2008 augroup END
2009 split
2010 split
2011 call assert_equal(2, g:did_split)
2012 call assert_true(exists('#WinNew'))
2013 close
2014 close
2015
2016 " With ++once WinNew triggers once
2017 let g:did_split = 0
2018 augroup Testing
2019 au!
2020 au WinNew * ++once let g:did_split += 1
2021 augroup END
2022 split
2023 split
2024 call assert_equal(1, g:did_split)
2025 call assert_false(exists('#WinNew'))
2026 close
2027 close
2028
2029 call assert_fails('au WinNew * ++once ++once echo bad', 'E983:')
2030endfunc
2031
Bram Moolenaara68e5952019-04-25 22:22:01 +02002032func Test_autocmd_bufreadpre()
2033 new
2034 let b:bufreadpre = 1
Bram Moolenaarab505b12020-03-23 19:28:44 +01002035 call append(0, range(1000))
Bram Moolenaara68e5952019-04-25 22:22:01 +02002036 w! XAutocmdBufReadPre.txt
2037 autocmd BufReadPre <buffer> :let b:bufreadpre += 1
Bram Moolenaarab505b12020-03-23 19:28:44 +01002038 norm! 500gg
Bram Moolenaara68e5952019-04-25 22:22:01 +02002039 sp
Bram Moolenaarab505b12020-03-23 19:28:44 +01002040 norm! 1000gg
Bram Moolenaara68e5952019-04-25 22:22:01 +02002041 wincmd p
2042 let g:wsv1 = winsaveview()
2043 wincmd p
2044 let g:wsv2 = winsaveview()
2045 " triggers BufReadPre, should not move the cursor in either window
2046 " The topline may change one line in a large window.
2047 edit
2048 call assert_inrange(g:wsv2.topline - 1, g:wsv2.topline + 1, winsaveview().topline)
2049 call assert_equal(g:wsv2.lnum, winsaveview().lnum)
2050 call assert_equal(2, b:bufreadpre)
2051 wincmd p
2052 call assert_equal(g:wsv1.topline, winsaveview().topline)
2053 call assert_equal(g:wsv1.lnum, winsaveview().lnum)
2054 call assert_equal(2, b:bufreadpre)
2055 " Now set the cursor position in an BufReadPre autocommand
2056 " (even though the position will be invalid, this should make Vim reset the
2057 " cursor position in the other window.
2058 wincmd p
2059 set cpo+=g
2060 " won't do anything, but try to set the cursor on an invalid lnum
2061 autocmd BufReadPre <buffer> :norm! 70gg
2062 " triggers BufReadPre, should not move the cursor in either window
2063 e
2064 call assert_equal(1, winsaveview().topline)
2065 call assert_equal(1, winsaveview().lnum)
2066 call assert_equal(3, b:bufreadpre)
2067 wincmd p
2068 call assert_equal(g:wsv1.topline, winsaveview().topline)
2069 call assert_equal(g:wsv1.lnum, winsaveview().lnum)
2070 call assert_equal(3, b:bufreadpre)
2071 close
2072 close
2073 call delete('XAutocmdBufReadPre.txt')
2074 set cpo-=g
2075endfunc
2076
Bram Moolenaar5e66b422019-01-24 21:58:10 +01002077" FileChangedShell tested in test_filechanged.vim
Bram Moolenaar69ea5872019-04-25 20:29:00 +02002078
2079" Tests for the following autocommands:
2080" - FileWritePre writing a compressed file
2081" - FileReadPost reading a compressed file
2082" - BufNewFile reading a file template
2083" - BufReadPre decompressing the file to be read
2084" - FilterReadPre substituting characters in the temp file
2085" - FilterReadPost substituting characters after filtering
2086" - FileReadPre set options for decompression
2087" - FileReadPost decompress the file
2088func Test_ReadWrite_Autocmds()
2089 " Run this test only on Unix-like systems and if gzip is available
2090 if !has('unix') || !executable("gzip")
2091 return
2092 endif
2093
2094 " Make $GZIP empty, "-v" would cause trouble.
2095 let $GZIP = ""
2096
2097 " Use a FileChangedShell autocommand to avoid a prompt for 'Xtestfile.gz'
2098 " being modified outside of Vim (noticed on Solaris).
2099 au FileChangedShell * echo 'caught FileChangedShell'
2100
2101 " Test for the FileReadPost, FileWritePre and FileWritePost autocmds
2102 augroup Test1
2103 au!
2104 au FileWritePre *.gz '[,']!gzip
2105 au FileWritePost *.gz undo
2106 au FileReadPost *.gz '[,']!gzip -d
2107 augroup END
2108
2109 new
2110 set bin
2111 call append(0, [
2112 \ 'line 2 Abcdefghijklmnopqrstuvwxyz',
2113 \ 'line 3 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
2114 \ 'line 4 Abcdefghijklmnopqrstuvwxyz',
2115 \ 'line 5 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
2116 \ 'line 6 Abcdefghijklmnopqrstuvwxyz',
2117 \ 'line 7 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
2118 \ 'line 8 Abcdefghijklmnopqrstuvwxyz',
2119 \ 'line 9 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
2120 \ 'line 10 Abcdefghijklmnopqrstuvwxyz'
2121 \ ])
2122 1,9write! Xtestfile.gz
2123 enew! | close
2124
2125 new
2126 " Read and decompress the testfile
2127 0read Xtestfile.gz
2128 call assert_equal([
2129 \ 'line 2 Abcdefghijklmnopqrstuvwxyz',
2130 \ 'line 3 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
2131 \ 'line 4 Abcdefghijklmnopqrstuvwxyz',
2132 \ 'line 5 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
2133 \ 'line 6 Abcdefghijklmnopqrstuvwxyz',
2134 \ 'line 7 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
2135 \ 'line 8 Abcdefghijklmnopqrstuvwxyz',
2136 \ 'line 9 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
2137 \ 'line 10 Abcdefghijklmnopqrstuvwxyz'
2138 \ ], getline(1, 9))
2139 enew! | close
2140
2141 augroup Test1
2142 au!
2143 augroup END
2144
2145 " Test for the FileAppendPre and FileAppendPost autocmds
2146 augroup Test2
2147 au!
2148 au BufNewFile *.c read Xtest.c
2149 au FileAppendPre *.out '[,']s/new/NEW/
2150 au FileAppendPost *.out !cat Xtest.c >> test.out
2151 augroup END
2152
2153 call writefile(['/*', ' * Here is a new .c file', ' */'], 'Xtest.c')
2154 new foo.c " should load Xtest.c
2155 call assert_equal(['/*', ' * Here is a new .c file', ' */'], getline(2, 4))
2156 w! >> test.out " append it to the output file
2157
2158 let contents = readfile('test.out')
2159 call assert_equal(' * Here is a NEW .c file', contents[2])
2160 call assert_equal(' * Here is a new .c file', contents[5])
2161
2162 call delete('test.out')
2163 enew! | close
2164 augroup Test2
2165 au!
2166 augroup END
2167
2168 " Test for the BufReadPre and BufReadPost autocmds
2169 augroup Test3
2170 au!
2171 " setup autocommands to decompress before reading and re-compress
2172 " afterwards
2173 au BufReadPre *.gz exe '!gzip -d ' . shellescape(expand("<afile>"))
2174 au BufReadPre *.gz call rename(expand("<afile>:r"), expand("<afile>"))
2175 au BufReadPost *.gz call rename(expand("<afile>"), expand("<afile>:r"))
2176 au BufReadPost *.gz exe '!gzip ' . shellescape(expand("<afile>:r"))
2177 augroup END
2178
2179 e! Xtestfile.gz " Edit compressed file
2180 call assert_equal([
2181 \ 'line 2 Abcdefghijklmnopqrstuvwxyz',
2182 \ 'line 3 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
2183 \ 'line 4 Abcdefghijklmnopqrstuvwxyz',
2184 \ 'line 5 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
2185 \ 'line 6 Abcdefghijklmnopqrstuvwxyz',
2186 \ 'line 7 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
2187 \ 'line 8 Abcdefghijklmnopqrstuvwxyz',
2188 \ 'line 9 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
2189 \ 'line 10 Abcdefghijklmnopqrstuvwxyz'
2190 \ ], getline(1, 9))
2191
2192 w! >> test.out " Append it to the output file
2193
2194 augroup Test3
2195 au!
2196 augroup END
2197
2198 " Test for the FilterReadPre and FilterReadPost autocmds.
2199 set shelltemp " need temp files here
2200 augroup Test4
2201 au!
2202 au FilterReadPre *.out call rename(expand("<afile>"), expand("<afile>") . ".t")
2203 au FilterReadPre *.out exe 'silent !sed s/e/E/ ' . shellescape(expand("<afile>")) . ".t >" . shellescape(expand("<afile>"))
2204 au FilterReadPre *.out exe 'silent !rm ' . shellescape(expand("<afile>")) . '.t'
2205 au FilterReadPost *.out '[,']s/x/X/g
2206 augroup END
2207
2208 e! test.out " Edit the output file
2209 1,$!cat
2210 call assert_equal([
2211 \ 'linE 2 AbcdefghijklmnopqrstuvwXyz',
2212 \ 'linE 3 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
2213 \ 'linE 4 AbcdefghijklmnopqrstuvwXyz',
2214 \ 'linE 5 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
2215 \ 'linE 6 AbcdefghijklmnopqrstuvwXyz',
2216 \ 'linE 7 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
2217 \ 'linE 8 AbcdefghijklmnopqrstuvwXyz',
2218 \ 'linE 9 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
2219 \ 'linE 10 AbcdefghijklmnopqrstuvwXyz'
2220 \ ], getline(1, 9))
2221 call assert_equal([
2222 \ 'line 2 Abcdefghijklmnopqrstuvwxyz',
2223 \ 'line 3 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
2224 \ 'line 4 Abcdefghijklmnopqrstuvwxyz',
2225 \ 'line 5 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
2226 \ 'line 6 Abcdefghijklmnopqrstuvwxyz',
2227 \ 'line 7 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
2228 \ 'line 8 Abcdefghijklmnopqrstuvwxyz',
2229 \ 'line 9 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
2230 \ 'line 10 Abcdefghijklmnopqrstuvwxyz'
2231 \ ], readfile('test.out'))
2232
2233 augroup Test4
2234 au!
2235 augroup END
2236 set shelltemp&vim
2237
2238 " Test for the FileReadPre and FileReadPost autocmds.
2239 augroup Test5
2240 au!
2241 au FileReadPre *.gz exe 'silent !gzip -d ' . shellescape(expand("<afile>"))
2242 au FileReadPre *.gz call rename(expand("<afile>:r"), expand("<afile>"))
2243 au FileReadPost *.gz '[,']s/l/L/
2244 augroup END
2245
2246 new
2247 0r Xtestfile.gz " Read compressed file
2248 call assert_equal([
2249 \ 'Line 2 Abcdefghijklmnopqrstuvwxyz',
2250 \ 'Line 3 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
2251 \ 'Line 4 Abcdefghijklmnopqrstuvwxyz',
2252 \ 'Line 5 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
2253 \ 'Line 6 Abcdefghijklmnopqrstuvwxyz',
2254 \ 'Line 7 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
2255 \ 'Line 8 Abcdefghijklmnopqrstuvwxyz',
2256 \ 'Line 9 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
2257 \ 'Line 10 Abcdefghijklmnopqrstuvwxyz'
2258 \ ], getline(1, 9))
2259 call assert_equal([
2260 \ 'line 2 Abcdefghijklmnopqrstuvwxyz',
2261 \ 'line 3 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
2262 \ 'line 4 Abcdefghijklmnopqrstuvwxyz',
2263 \ 'line 5 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
2264 \ 'line 6 Abcdefghijklmnopqrstuvwxyz',
2265 \ 'line 7 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
2266 \ 'line 8 Abcdefghijklmnopqrstuvwxyz',
2267 \ 'line 9 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
2268 \ 'line 10 Abcdefghijklmnopqrstuvwxyz'
2269 \ ], readfile('Xtestfile.gz'))
2270
2271 augroup Test5
2272 au!
2273 augroup END
2274
2275 au! FileChangedShell
2276 call delete('Xtestfile.gz')
2277 call delete('Xtest.c')
2278 call delete('test.out')
2279endfunc
Bram Moolenaar23b51392019-05-09 21:38:43 +02002280
2281func Test_throw_in_BufWritePre()
2282 new
2283 call setline(1, ['one', 'two', 'three'])
2284 call assert_false(filereadable('Xthefile'))
2285 augroup throwing
2286 au BufWritePre X* throw 'do not write'
2287 augroup END
2288 try
2289 w Xthefile
2290 catch
2291 let caught = 1
2292 endtry
2293 call assert_equal(1, caught)
2294 call assert_false(filereadable('Xthefile'))
2295
2296 bwipe!
2297 au! throwing
2298endfunc
Bram Moolenaarcadbe1b2019-09-22 21:50:09 +02002299
2300func Test_autocmd_SafeState()
2301 CheckRunVimInTerminal
2302
2303 let lines =<< trim END
2304 let g:safe = 0
2305 let g:again = ''
2306 au SafeState * let g:safe += 1
2307 au SafeStateAgain * let g:again ..= 'x'
2308 func CallTimer()
2309 call timer_start(10, {id -> execute('let g:again ..= "t"')})
2310 endfunc
2311 END
2312 call writefile(lines, 'XSafeState')
2313 let buf = RunVimInTerminal('-S XSafeState', #{rows: 6})
2314
Bram Moolenaar8fb1b472020-02-23 16:16:26 +01002315 " Sometimes we loop to handle a K_IGNORE, SafeState may be trigered once or
2316 " more often.
Bram Moolenaarcadbe1b2019-09-22 21:50:09 +02002317 call term_sendkeys(buf, ":echo g:safe\<CR>")
Bram Moolenaar8fb1b472020-02-23 16:16:26 +01002318 call WaitForAssert({-> assert_match('^\d ', term_getline(buf, 6))}, 1000)
Bram Moolenaarcadbe1b2019-09-22 21:50:09 +02002319
Bram Moolenaar8fb1b472020-02-23 16:16:26 +01002320 " SafeStateAgain should be invoked at least three times
Bram Moolenaarcadbe1b2019-09-22 21:50:09 +02002321 call term_sendkeys(buf, ":echo g:again\<CR>")
Bram Moolenaar8fb1b472020-02-23 16:16:26 +01002322 call WaitForAssert({-> assert_match('^xxx', term_getline(buf, 6))}, 1000)
Bram Moolenaarcadbe1b2019-09-22 21:50:09 +02002323
2324 call term_sendkeys(buf, ":let g:again = ''\<CR>:call CallTimer()\<CR>")
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02002325 call TermWait(buf, 50)
Bram Moolenaar0f6629a2019-09-22 23:24:13 +02002326 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02002327 call TermWait(buf, 50)
Bram Moolenaarcadbe1b2019-09-22 21:50:09 +02002328 call term_sendkeys(buf, ":echo g:again\<CR>")
2329 call WaitForAssert({-> assert_match('xtx', term_getline(buf, 6))}, 1000)
2330
2331 call StopVimInTerminal(buf)
2332 call delete('XSafeState')
2333endfunc
Bram Moolenaar23324a02019-10-01 17:39:04 +02002334
2335func Test_autocmd_CmdWinEnter()
2336 CheckRunVimInTerminal
2337 " There is not cmdwin switch, so
2338 " test for cmdline_hist
2339 " (both are available with small builds)
2340 CheckFeature cmdline_hist
2341 let lines =<< trim END
2342 let b:dummy_var = 'This is a dummy'
2343 autocmd CmdWinEnter * quit
2344 let winnr = winnr('$')
2345 END
2346 let filename='XCmdWinEnter'
2347 call writefile(lines, filename)
2348 let buf = RunVimInTerminal('-S '.filename, #{rows: 6})
2349
2350 call term_sendkeys(buf, "q:")
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02002351 call TermWait(buf)
Bram Moolenaar23324a02019-10-01 17:39:04 +02002352 call term_sendkeys(buf, ":echo b:dummy_var\<cr>")
Bram Moolenaar353c3512020-03-15 14:19:26 +01002353 call WaitForAssert({-> assert_match('^This is a dummy', term_getline(buf, 6))}, 2000)
Bram Moolenaar23324a02019-10-01 17:39:04 +02002354 call term_sendkeys(buf, ":echo &buftype\<cr>")
2355 call WaitForAssert({-> assert_notmatch('^nofile', term_getline(buf, 6))}, 1000)
2356 call term_sendkeys(buf, ":echo winnr\<cr>")
2357 call WaitForAssert({-> assert_match('^1', term_getline(buf, 6))}, 1000)
2358
2359 " clean up
2360 call StopVimInTerminal(buf)
2361 call delete(filename)
2362endfunc
Bram Moolenaarec66c412019-10-11 21:19:13 +02002363
2364func Test_autocmd_was_using_freed_memory()
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01002365 CheckFeature quickfix
2366
Bram Moolenaarec66c412019-10-11 21:19:13 +02002367 pedit xx
2368 n x
2369 au WinEnter * quit
2370 split
2371 au! WinEnter
2372endfunc
Bram Moolenaarf4a1d1c2019-11-16 13:50:25 +01002373
2374func Test_BufWrite_lockmarks()
2375 edit! Xtest
2376 call setline(1, ['a', 'b', 'c', 'd'])
2377
2378 " :lockmarks preserves the marks
2379 call SetChangeMarks(2, 3)
2380 lockmarks write
2381 call assert_equal([2, 3], [line("'["), line("']")])
2382
2383 " *WritePre autocmds get the correct line range, but lockmarks preserves the
2384 " original values for the user
2385 augroup lockmarks
2386 au!
2387 au BufWritePre,FilterWritePre * call assert_equal([1, 4], [line("'["), line("']")])
2388 au FileWritePre * call assert_equal([3, 4], [line("'["), line("']")])
2389 augroup END
2390
2391 lockmarks write
2392 call assert_equal([2, 3], [line("'["), line("']")])
2393
2394 if executable('cat')
2395 lockmarks %!cat
2396 call assert_equal([2, 3], [line("'["), line("']")])
2397 endif
2398
2399 lockmarks 3,4write Xtest2
2400 call assert_equal([2, 3], [line("'["), line("']")])
2401
2402 au! lockmarks
2403 augroup! lockmarks
2404 call delete('Xtest')
2405 call delete('Xtest2')
2406endfunc
Bram Moolenaarce6db022020-01-07 20:11:42 +01002407
2408func Test_FileType_spell()
2409 if !isdirectory('/tmp')
2410 throw "Skipped: requires /tmp directory"
2411 endif
2412
2413 " this was crashing with an invalid free()
2414 setglobal spellfile=/tmp/en.utf-8.add
2415 augroup crash
2416 autocmd!
2417 autocmd BufNewFile,BufReadPost crashfile setf somefiletype
2418 autocmd BufNewFile,BufReadPost crashfile set ft=anotherfiletype
2419 autocmd FileType anotherfiletype setlocal spell
2420 augroup END
2421 func! NoCrash() abort
2422 edit /tmp/crashfile
2423 endfunc
2424 call NoCrash()
2425
2426 au! crash
2427 setglobal spellfile=
2428endfunc
Bram Moolenaarbc2b71d2020-02-17 21:33:30 +01002429
Bram Moolenaar406cd902020-02-18 21:54:41 +01002430" Test closing a window or editing another buffer from a FileChangedRO handler
2431" in a readonly buffer
2432func Test_FileChangedRO_winclose()
2433 augroup FileChangedROTest
2434 au!
2435 autocmd FileChangedRO * quit
2436 augroup END
2437 new
2438 set readonly
2439 call assert_fails('normal i', 'E788:')
2440 close
2441 augroup! FileChangedROTest
2442
2443 augroup FileChangedROTest
2444 au!
2445 autocmd FileChangedRO * edit Xfile
2446 augroup END
2447 new
2448 set readonly
2449 call assert_fails('normal i', 'E788:')
2450 close
2451 augroup! FileChangedROTest
2452endfunc
2453
Bram Moolenaar0c81d1b2020-02-22 22:45:55 +01002454func LogACmd()
2455 call add(g:logged, line('$'))
2456endfunc
2457
2458func Test_TermChanged()
Bram Moolenaard28e0b32020-02-22 23:08:52 +01002459 CheckNotGui
2460
Bram Moolenaar0c81d1b2020-02-22 22:45:55 +01002461 enew!
2462 tabnew
2463 call setline(1, ['a', 'b', 'c', 'd'])
2464 $
2465 au TermChanged * call LogACmd()
2466 let g:logged = []
2467 let term_save = &term
2468 set term=xterm
2469 call assert_equal([1, 4], g:logged)
2470
2471 au! TermChanged
2472 let &term = term_save
2473 bwipe!
2474endfunc
2475
Bram Moolenaare3284872020-03-19 13:55:03 +01002476" Test for FileReadCmd autocmd
2477func Test_autocmd_FileReadCmd()
2478 func ReadFileCmd()
2479 call append(line('$'), "v:cmdarg = " .. v:cmdarg)
2480 endfunc
2481 augroup FileReadCmdTest
2482 au!
2483 au FileReadCmd Xtest call ReadFileCmd()
2484 augroup END
2485
2486 new
2487 read ++bin Xtest
2488 read ++nobin Xtest
2489 read ++edit Xtest
2490 read ++bad=keep Xtest
2491 read ++bad=drop Xtest
2492 read ++bad=- Xtest
2493 read ++ff=unix Xtest
2494 read ++ff=dos Xtest
2495 read ++ff=mac Xtest
2496 read ++enc=utf-8 Xtest
2497
2498 call assert_equal(['',
2499 \ 'v:cmdarg = ++bin',
2500 \ 'v:cmdarg = ++nobin',
2501 \ 'v:cmdarg = ++edit',
2502 \ 'v:cmdarg = ++bad=keep',
2503 \ 'v:cmdarg = ++bad=drop',
2504 \ 'v:cmdarg = ++bad=-',
2505 \ 'v:cmdarg = ++ff=unix',
2506 \ 'v:cmdarg = ++ff=dos',
2507 \ 'v:cmdarg = ++ff=mac',
2508 \ 'v:cmdarg = ++enc=utf-8'], getline(1, '$'))
2509
2510 close!
2511 augroup FileReadCmdTest
2512 au!
2513 augroup END
2514 delfunc ReadFileCmd
2515endfunc
2516
Bram Moolenaaree4e0c12020-04-06 21:35:05 +02002517" Test for passing invalid arguments to autocmd
2518func Test_autocmd_invalid_args()
2519 " Additional character after * for event
2520 call assert_fails('autocmd *a Xfile set ff=unix', 'E215:')
2521 augroup Test
2522 augroup END
2523 " Invalid autocmd event
2524 call assert_fails('autocmd Bufabc Xfile set ft=vim', 'E216:')
2525 " Invalid autocmd event in a autocmd group
2526 call assert_fails('autocmd Test Bufabc Xfile set ft=vim', 'E216:')
2527 augroup! Test
2528 " Execute all autocmds
2529 call assert_fails('doautocmd * BufEnter', 'E217:')
2530 call assert_fails('augroup! x1a2b3', 'E367:')
2531 call assert_fails('autocmd BufNew <buffer=999> pwd', 'E680:')
2532endfunc
2533
2534" Test for deep nesting of autocmds
2535func Test_autocmd_deep_nesting()
2536 autocmd BufEnter Xfile doautocmd BufEnter Xfile
2537 call assert_fails('doautocmd BufEnter Xfile', 'E218:')
2538 autocmd! BufEnter Xfile
2539endfunc
2540
Bram Moolenaarbe5ee862020-06-10 20:56:58 +02002541" Tests for SigUSR1 autocmd event, which is only available on posix systems.
2542func Test_autocmd_sigusr1()
2543 CheckUnix
2544
2545 let g:sigusr1_passed = 0
2546 au SigUSR1 * let g:sigusr1_passed = 1
2547 call system('/bin/kill -s usr1 ' . getpid())
2548 call WaitForAssert({-> assert_true(g:sigusr1_passed)})
2549
2550 au! SigUSR1
2551 unlet g:sigusr1_passed
2552endfunc
2553
Bram Moolenaarb340bae2020-06-15 19:51:56 +02002554" Test for BufReadPre autocmd deleting the file
2555func Test_BufReadPre_delfile()
2556 augroup TestAuCmd
2557 au!
2558 autocmd BufReadPre Xfile call delete('Xfile')
2559 augroup END
2560 call writefile([], 'Xfile')
2561 call assert_fails('new Xfile', 'E200:')
2562 call assert_equal('Xfile', @%)
2563 call assert_equal(1, &readonly)
2564 call delete('Xfile')
2565 augroup TestAuCmd
2566 au!
2567 augroup END
2568 close!
2569endfunc
2570
2571" Test for BufReadPre autocmd changing the current buffer
2572func Test_BufReadPre_changebuf()
2573 augroup TestAuCmd
2574 au!
2575 autocmd BufReadPre Xfile edit Xsomeotherfile
2576 augroup END
2577 call writefile([], 'Xfile')
2578 call assert_fails('new Xfile', 'E201:')
2579 call assert_equal('Xsomeotherfile', @%)
2580 call assert_equal(1, &readonly)
2581 call delete('Xfile')
2582 augroup TestAuCmd
2583 au!
2584 augroup END
2585 close!
2586endfunc
2587
2588" Test for BufWipeouti autocmd changing the current buffer when reading a file
2589" in an empty buffer with 'f' flag in 'cpo'
2590func Test_BufDelete_changebuf()
2591 new
2592 augroup TestAuCmd
2593 au!
2594 autocmd BufWipeout * let bufnr = bufadd('somefile') | exe "b " .. bufnr
2595 augroup END
2596 let save_cpo = &cpo
2597 set cpo+=f
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +02002598 call assert_fails('r Xfile', ['E812:', 'E484:'])
Bram Moolenaarb340bae2020-06-15 19:51:56 +02002599 call assert_equal('somefile', @%)
2600 let &cpo = save_cpo
2601 augroup TestAuCmd
2602 au!
2603 augroup END
2604 close!
2605endfunc
2606
Bram Moolenaar0fe937f2020-06-16 22:42:04 +02002607" Test for the temporary internal window used to execute autocmds
2608func Test_autocmd_window()
2609 %bw!
2610 edit one.txt
2611 tabnew two.txt
2612 let g:blist = []
Bram Moolenaar832adf92020-06-25 19:01:36 +02002613 augroup aucmd_win_test1
Bram Moolenaar0fe937f2020-06-16 22:42:04 +02002614 au!
2615 au BufEnter * call add(g:blist, [expand('<afile>'),
2616 \ win_gettype(bufwinnr(expand('<afile>')))])
2617 augroup END
2618
2619 doautoall BufEnter
Bram Moolenaar40a019f2020-06-17 21:41:35 +02002620 call assert_equal([['one.txt', 'autocmd'], ['two.txt', '']], g:blist)
Bram Moolenaar0fe937f2020-06-16 22:42:04 +02002621
Bram Moolenaar832adf92020-06-25 19:01:36 +02002622 augroup aucmd_win_test1
Bram Moolenaar0fe937f2020-06-16 22:42:04 +02002623 au!
2624 augroup END
Bram Moolenaar832adf92020-06-25 19:01:36 +02002625 augroup! aucmd_win_test1
2626 %bw!
2627endfunc
2628
2629" Test for trying to close the temporary window used for executing an autocmd
2630func Test_close_autocmd_window()
2631 %bw!
2632 edit one.txt
2633 tabnew two.txt
2634 augroup aucmd_win_test2
2635 au!
2636 au BufEnter * if expand('<afile>') == 'one.txt' | 1close | endif
2637 augroup END
2638
2639 call assert_fails('doautoall BufEnter', 'E813:')
2640
2641 augroup aucmd_win_test2
2642 au!
2643 augroup END
2644 augroup! aucmd_win_test2
Bram Moolenaarcf844172020-06-26 19:44:06 +02002645 %bwipe!
2646endfunc
2647
2648" Test for trying to close the tab that has the temporary window for exeucing
2649" an autocmd.
2650func Test_close_autocmd_tab()
2651 edit one.txt
2652 tabnew two.txt
2653 augroup aucmd_win_test
2654 au!
2655 au BufEnter * if expand('<afile>') == 'one.txt' | tabfirst | tabonly | endif
2656 augroup END
2657
2658 call assert_fails('doautoall BufEnter', 'E813:')
2659
2660 tabonly
2661 augroup aucmd_win_test
2662 au!
2663 augroup END
2664 augroup! aucmd_win_test
2665 %bwipe!
Bram Moolenaar0fe937f2020-06-16 22:42:04 +02002666endfunc
2667
Bram Moolenaarbc2b71d2020-02-17 21:33:30 +01002668" vim: shiftwidth=2 sts=2 expandtab