xref: /vim-8.2.3635/src/testdir/test_autocmd.vim (revision b8e642f7)
11473551aSBram Moolenaar" Tests for autocommands
21473551aSBram Moolenaar
38c64a36eSBram Moolenaarsource shared.vim
48c5a278fSBram Moolenaarsource check.vim
5cadbe1b1SBram Moolenaarsource term_util.vim
68c64a36eSBram Moolenaar
71e115360SBram Moolenaarfunc s:cleanup_buffers() abort
8b3435b0aSBram Moolenaar  for bnr in range(1, bufnr('$'))
9b3435b0aSBram Moolenaar    if bufloaded(bnr) && bufnr('%') != bnr
10b3435b0aSBram Moolenaar      execute 'bd! ' . bnr
11b3435b0aSBram Moolenaar    endif
12b3435b0aSBram Moolenaar  endfor
1304f62f88SBram Moolenaarendfunc
14b3435b0aSBram Moolenaar
151473551aSBram Moolenaarfunc Test_vim_did_enter()
161473551aSBram Moolenaar  call assert_false(v:vim_did_enter)
171473551aSBram Moolenaar
181473551aSBram Moolenaar  " This script will never reach the main loop, can't check if v:vim_did_enter
191473551aSBram Moolenaar  " becomes one.
201473551aSBram Moolenaarendfunc
2140b1b544SBram Moolenaar
227591116aSBram Moolenaar" Test for the CursorHold autocmd
237591116aSBram Moolenaarfunc Test_CursorHold_autocmd()
247591116aSBram Moolenaar  CheckRunVimInTerminal
257591116aSBram Moolenaar  call writefile(['one', 'two', 'three'], 'Xfile')
267591116aSBram Moolenaar  let before =<< trim END
277591116aSBram Moolenaar    set updatetime=10
287591116aSBram Moolenaar    au CursorHold * call writefile([line('.')], 'Xoutput', 'a')
297591116aSBram Moolenaar  END
307591116aSBram Moolenaar  call writefile(before, 'Xinit')
317591116aSBram Moolenaar  let buf = RunVimInTerminal('-S Xinit Xfile', {})
3217f67547SBram Moolenaar  call term_sendkeys(buf, "G")
3362cd26a2SBram Moolenaar  call term_wait(buf, 50)
347591116aSBram Moolenaar  call term_sendkeys(buf, "gg")
357591116aSBram Moolenaar  call term_wait(buf)
3617f67547SBram Moolenaar  call WaitForAssert({-> assert_equal(['1'], readfile('Xoutput')[-1:-1])})
377591116aSBram Moolenaar  call term_sendkeys(buf, "j")
387591116aSBram Moolenaar  call term_wait(buf)
3917f67547SBram Moolenaar  call WaitForAssert({-> assert_equal(['1', '2'], readfile('Xoutput')[-2:-1])})
407591116aSBram Moolenaar  call term_sendkeys(buf, "j")
417591116aSBram Moolenaar  call term_wait(buf)
4217f67547SBram Moolenaar  call WaitForAssert({-> assert_equal(['1', '2', '3'], readfile('Xoutput')[-3:-1])})
437591116aSBram Moolenaar  call StopVimInTerminal(buf)
447591116aSBram Moolenaar
457591116aSBram Moolenaar  call delete('Xinit')
467591116aSBram Moolenaar  call delete('Xoutput')
477591116aSBram Moolenaar  call delete('Xfile')
487591116aSBram Moolenaarendfunc
497591116aSBram Moolenaar
50c67e8921SBram Moolenaarif has('timers')
5197b0075bSBram Moolenaar
5240b1b544SBram Moolenaar  func ExitInsertMode(id)
5340b1b544SBram Moolenaar    call feedkeys("\<Esc>")
5440b1b544SBram Moolenaar  endfunc
5540b1b544SBram Moolenaar
5640b1b544SBram Moolenaar  func Test_cursorhold_insert()
57f18c4dbbSBram Moolenaar    " Need to move the cursor.
58f18c4dbbSBram Moolenaar    call feedkeys("ggG", "xt")
59f18c4dbbSBram Moolenaar
6040b1b544SBram Moolenaar    let g:triggered = 0
6140b1b544SBram Moolenaar    au CursorHoldI * let g:triggered += 1
6240b1b544SBram Moolenaar    set updatetime=20
6392bb83e4SBram Moolenaar    call timer_start(200, 'ExitInsertMode')
6440b1b544SBram Moolenaar    call feedkeys('a', 'x!')
6540b1b544SBram Moolenaar    call assert_equal(1, g:triggered)
6626d98218SBram Moolenaar    unlet g:triggered
6726d98218SBram Moolenaar    au! CursorHoldI
6826d98218SBram Moolenaar    set updatetime&
6926d98218SBram Moolenaar  endfunc
7026d98218SBram Moolenaar
7126d98218SBram Moolenaar  func Test_cursorhold_insert_with_timer_interrupt()
726d91bcb4SBram Moolenaar    CheckFeature job
7326d98218SBram Moolenaar    " Need to move the cursor.
7426d98218SBram Moolenaar    call feedkeys("ggG", "xt")
7526d98218SBram Moolenaar
7626d98218SBram Moolenaar    " Confirm the timer invoked in exit_cb of the job doesn't disturb
7726d98218SBram Moolenaar    " CursorHoldI event.
7826d98218SBram Moolenaar    let g:triggered = 0
7926d98218SBram Moolenaar    au CursorHoldI * let g:triggered += 1
8062cd26a2SBram Moolenaar    set updatetime=100
8126d98218SBram Moolenaar    call job_start(has('win32') ? 'cmd /c echo:' : 'echo',
8262cd26a2SBram Moolenaar          \ {'exit_cb': {-> timer_start(200, 'ExitInsertMode')}})
8326d98218SBram Moolenaar    call feedkeys('a', 'x!')
8426d98218SBram Moolenaar    call assert_equal(1, g:triggered)
8526d98218SBram Moolenaar    unlet g:triggered
86e99e8449SBram Moolenaar    au! CursorHoldI
87aeac9006SBram Moolenaar    set updatetime&
8840b1b544SBram Moolenaar  endfunc
8940b1b544SBram Moolenaar
9040b1b544SBram Moolenaar  func Test_cursorhold_insert_ctrl_x()
9140b1b544SBram Moolenaar    let g:triggered = 0
9240b1b544SBram Moolenaar    au CursorHoldI * let g:triggered += 1
9340b1b544SBram Moolenaar    set updatetime=20
9440b1b544SBram Moolenaar    call timer_start(100, 'ExitInsertMode')
9540b1b544SBram Moolenaar    " CursorHoldI does not trigger after CTRL-X
9640b1b544SBram Moolenaar    call feedkeys("a\<C-X>", 'x!')
9740b1b544SBram Moolenaar    call assert_equal(0, g:triggered)
9826d98218SBram Moolenaar    unlet g:triggered
99e99e8449SBram Moolenaar    au! CursorHoldI
100aeac9006SBram Moolenaar    set updatetime&
10140b1b544SBram Moolenaar  endfunc
10297b0075bSBram Moolenaar
1035a9357d0SBram Moolenaar  func Test_cursorhold_insert_ctrl_g_U()
1045a9357d0SBram Moolenaar    au CursorHoldI * :
1055a9357d0SBram Moolenaar    set updatetime=20
1065a9357d0SBram Moolenaar    new
1075a9357d0SBram Moolenaar    call timer_start(100, { -> feedkeys("\<Left>foo\<Esc>", 't') })
1085a9357d0SBram Moolenaar    call feedkeys("i()\<C-g>U", 'tx!')
1095a9357d0SBram Moolenaar    sleep 200m
1105a9357d0SBram Moolenaar    call assert_equal('(foo)', getline(1))
1115a9357d0SBram Moolenaar    undo
1125a9357d0SBram Moolenaar    call assert_equal('', getline(1))
1135a9357d0SBram Moolenaar
1145a9357d0SBram Moolenaar    bwipe!
1155a9357d0SBram Moolenaar    au! CursorHoldI
1165a9357d0SBram Moolenaar    set updatetime&
1175a9357d0SBram Moolenaar  endfunc
1185a9357d0SBram Moolenaar
11997b0075bSBram Moolenaar  func Test_OptionSet_modeline()
12097b0075bSBram Moolenaar    call test_override('starting', 1)
12197b0075bSBram Moolenaar    au! OptionSet
12297b0075bSBram Moolenaar    augroup set_tabstop
12397b0075bSBram Moolenaar      au OptionSet tabstop call timer_start(1, {-> execute("echo 'Handler called'", "")})
12497b0075bSBram Moolenaar    augroup END
12597b0075bSBram Moolenaar    call writefile(['vim: set ts=7 sw=5 :', 'something'], 'XoptionsetModeline')
12697b0075bSBram Moolenaar    set modeline
12797b0075bSBram Moolenaar    let v:errmsg = ''
12897b0075bSBram Moolenaar    call assert_fails('split XoptionsetModeline', 'E12:')
12997b0075bSBram Moolenaar    call assert_equal(7, &ts)
13097b0075bSBram Moolenaar    call assert_equal('', v:errmsg)
13197b0075bSBram Moolenaar
13297b0075bSBram Moolenaar    augroup set_tabstop
13397b0075bSBram Moolenaar      au!
13497b0075bSBram Moolenaar    augroup END
13597b0075bSBram Moolenaar    bwipe!
13697b0075bSBram Moolenaar    set ts&
13797b0075bSBram Moolenaar    call delete('XoptionsetModeline')
13897b0075bSBram Moolenaar    call test_override('starting', 0)
13997b0075bSBram Moolenaar  endfunc
14097b0075bSBram Moolenaar
14197b0075bSBram Moolenaarendif "has('timers')
142c67e8921SBram Moolenaar
14304f62f88SBram Moolenaarfunc Test_bufunload()
144c67e8921SBram Moolenaar  augroup test_bufunload_group
145c67e8921SBram Moolenaar    autocmd!
146c67e8921SBram Moolenaar    autocmd BufUnload * call add(s:li, "bufunload")
147c67e8921SBram Moolenaar    autocmd BufDelete * call add(s:li, "bufdelete")
148c67e8921SBram Moolenaar    autocmd BufWipeout * call add(s:li, "bufwipeout")
149c67e8921SBram Moolenaar  augroup END
150c67e8921SBram Moolenaar
151c67e8921SBram Moolenaar  let s:li = []
152c67e8921SBram Moolenaar  new
153c67e8921SBram Moolenaar  setlocal bufhidden=
154c67e8921SBram Moolenaar  bunload
155c67e8921SBram Moolenaar  call assert_equal(["bufunload", "bufdelete"], s:li)
156c67e8921SBram Moolenaar
157c67e8921SBram Moolenaar  let s:li = []
158c67e8921SBram Moolenaar  new
159c67e8921SBram Moolenaar  setlocal bufhidden=delete
160c67e8921SBram Moolenaar  bunload
161c67e8921SBram Moolenaar  call assert_equal(["bufunload", "bufdelete"], s:li)
162c67e8921SBram Moolenaar
163c67e8921SBram Moolenaar  let s:li = []
164c67e8921SBram Moolenaar  new
165c67e8921SBram Moolenaar  setlocal bufhidden=unload
166c67e8921SBram Moolenaar  bwipeout
167c67e8921SBram Moolenaar  call assert_equal(["bufunload", "bufdelete", "bufwipeout"], s:li)
168c67e8921SBram Moolenaar
169e99e8449SBram Moolenaar  au! test_bufunload_group
170c67e8921SBram Moolenaar  augroup! test_bufunload_group
171c67e8921SBram Moolenaarendfunc
17230445cb6SBram Moolenaar
17330445cb6SBram Moolenaar" SEGV occurs in older versions.  (At least 7.4.2005 or older)
17404f62f88SBram Moolenaarfunc Test_autocmd_bufunload_with_tabnext()
17530445cb6SBram Moolenaar  tabedit
17630445cb6SBram Moolenaar  tabfirst
17730445cb6SBram Moolenaar
17830445cb6SBram Moolenaar  augroup test_autocmd_bufunload_with_tabnext_group
17930445cb6SBram Moolenaar    autocmd!
18030445cb6SBram Moolenaar    autocmd BufUnload <buffer> tabnext
18130445cb6SBram Moolenaar  augroup END
18230445cb6SBram Moolenaar
18330445cb6SBram Moolenaar  quit
18430445cb6SBram Moolenaar  call assert_equal(2, tabpagenr('$'))
18530445cb6SBram Moolenaar
186e0ab94e7SBram Moolenaar  autocmd! test_autocmd_bufunload_with_tabnext_group
18730445cb6SBram Moolenaar  augroup! test_autocmd_bufunload_with_tabnext_group
18830445cb6SBram Moolenaar  tablast
18930445cb6SBram Moolenaar  quit
19030445cb6SBram Moolenaarendfunc
191c917da4bSBram Moolenaar
1925ed58c7bSBram Moolenaarfunc Test_argdelete_in_next()
1935ed58c7bSBram Moolenaar  au BufNew,BufEnter,BufLeave,BufWinEnter * argdel
1945ed58c7bSBram Moolenaar  call assert_fails('next a b', 'E1156:')
1955ed58c7bSBram Moolenaar  au! BufNew,BufEnter,BufLeave,BufWinEnter *
1965ed58c7bSBram Moolenaarendfunc
1975ed58c7bSBram Moolenaar
19804f62f88SBram Moolenaarfunc Test_autocmd_bufwinleave_with_tabfirst()
199f9e687e0SBram Moolenaar  tabedit
200f9e687e0SBram Moolenaar  augroup sample
201f9e687e0SBram Moolenaar    autocmd!
202f9e687e0SBram Moolenaar    autocmd BufWinLeave <buffer> tabfirst
203f9e687e0SBram Moolenaar  augroup END
204f9e687e0SBram Moolenaar  call setline(1, ['a', 'b', 'c'])
205f9e687e0SBram Moolenaar  edit! a.txt
206f18c4dbbSBram Moolenaar  tabclose
207f9e687e0SBram Moolenaarendfunc
208f9e687e0SBram Moolenaar
209e0ab94e7SBram Moolenaar" SEGV occurs in older versions.  (At least 7.4.2321 or older)
21004f62f88SBram Moolenaarfunc Test_autocmd_bufunload_avoiding_SEGV_01()
211e0ab94e7SBram Moolenaar  split aa.txt
212e0ab94e7SBram Moolenaar  let lastbuf = bufnr('$')
213e0ab94e7SBram Moolenaar
214e0ab94e7SBram Moolenaar  augroup test_autocmd_bufunload
215e0ab94e7SBram Moolenaar    autocmd!
216e0ab94e7SBram Moolenaar    exe 'autocmd BufUnload <buffer> ' . (lastbuf + 1) . 'bwipeout!'
217e0ab94e7SBram Moolenaar  augroup END
218e0ab94e7SBram Moolenaar
21928ee892aSBram Moolenaar  call assert_fails('edit bb.txt', 'E937:')
220e0ab94e7SBram Moolenaar
221e0ab94e7SBram Moolenaar  autocmd! test_autocmd_bufunload
222e0ab94e7SBram Moolenaar  augroup! test_autocmd_bufunload
223e0ab94e7SBram Moolenaar  bwipe! aa.txt
224e0ab94e7SBram Moolenaar  bwipe! bb.txt
225e0ab94e7SBram Moolenaarendfunc
226e0ab94e7SBram Moolenaar
227e0ab94e7SBram Moolenaar" SEGV occurs in older versions.  (At least 7.4.2321 or older)
22804f62f88SBram Moolenaarfunc Test_autocmd_bufunload_avoiding_SEGV_02()
229e0ab94e7SBram Moolenaar  setlocal buftype=nowrite
230e0ab94e7SBram Moolenaar  let lastbuf = bufnr('$')
231e0ab94e7SBram Moolenaar
232e0ab94e7SBram Moolenaar  augroup test_autocmd_bufunload
233e0ab94e7SBram Moolenaar    autocmd!
234e0ab94e7SBram Moolenaar    exe 'autocmd BufUnload <buffer> ' . (lastbuf + 1) . 'bwipeout!'
235e0ab94e7SBram Moolenaar  augroup END
236e0ab94e7SBram Moolenaar
237e0ab94e7SBram Moolenaar  normal! i1
238e0ab94e7SBram Moolenaar  call assert_fails('edit a.txt', 'E517:')
239e0ab94e7SBram Moolenaar
240e0ab94e7SBram Moolenaar  autocmd! test_autocmd_bufunload
241e0ab94e7SBram Moolenaar  augroup! test_autocmd_bufunload
242e0ab94e7SBram Moolenaar  bwipe! a.txt
243e0ab94e7SBram Moolenaarendfunc
244e0ab94e7SBram Moolenaar
2451cfb9bb5SBram Moolenaarfunc Test_autocmd_dummy_wipeout()
2461cfb9bb5SBram Moolenaar  " prepare files
2471cfb9bb5SBram Moolenaar  call writefile([''], 'Xdummywipetest1.txt')
2481cfb9bb5SBram Moolenaar  call writefile([''], 'Xdummywipetest2.txt')
2491cfb9bb5SBram Moolenaar  augroup test_bufunload_group
2501cfb9bb5SBram Moolenaar    autocmd!
2511cfb9bb5SBram Moolenaar    autocmd BufUnload * call add(s:li, "bufunload")
2521cfb9bb5SBram Moolenaar    autocmd BufDelete * call add(s:li, "bufdelete")
2531cfb9bb5SBram Moolenaar    autocmd BufWipeout * call add(s:li, "bufwipeout")
2541cfb9bb5SBram Moolenaar  augroup END
2551cfb9bb5SBram Moolenaar
2561cfb9bb5SBram Moolenaar  let s:li = []
2571cfb9bb5SBram Moolenaar  split Xdummywipetest1.txt
2581cfb9bb5SBram Moolenaar  silent! vimgrep /notmatched/ Xdummywipetest*
2591cfb9bb5SBram Moolenaar  call assert_equal(["bufunload", "bufwipeout"], s:li)
2601cfb9bb5SBram Moolenaar
2611cfb9bb5SBram Moolenaar  bwipeout
2621cfb9bb5SBram Moolenaar  call delete('Xdummywipetest1.txt')
2631cfb9bb5SBram Moolenaar  call delete('Xdummywipetest2.txt')
2641cfb9bb5SBram Moolenaar  au! test_bufunload_group
2651cfb9bb5SBram Moolenaar  augroup! test_bufunload_group
2661cfb9bb5SBram Moolenaarendfunc
2671cfb9bb5SBram Moolenaar
268c917da4bSBram Moolenaarfunc Test_win_tab_autocmd()
269c917da4bSBram Moolenaar  let g:record = []
270c917da4bSBram Moolenaar
271c917da4bSBram Moolenaar  augroup testing
272c917da4bSBram Moolenaar    au WinNew * call add(g:record, 'WinNew')
27323beefedSnaohiro ono    au WinClosed * call add(g:record, 'WinClosed')
274c917da4bSBram Moolenaar    au WinEnter * call add(g:record, 'WinEnter')
275c917da4bSBram Moolenaar    au WinLeave * call add(g:record, 'WinLeave')
276c917da4bSBram Moolenaar    au TabNew * call add(g:record, 'TabNew')
27712c11d55SBram Moolenaar    au TabClosed * call add(g:record, 'TabClosed')
278c917da4bSBram Moolenaar    au TabEnter * call add(g:record, 'TabEnter')
279c917da4bSBram Moolenaar    au TabLeave * call add(g:record, 'TabLeave')
280c917da4bSBram Moolenaar  augroup END
281c917da4bSBram Moolenaar
282c917da4bSBram Moolenaar  split
283c917da4bSBram Moolenaar  tabnew
284c917da4bSBram Moolenaar  close
285c917da4bSBram Moolenaar  close
286c917da4bSBram Moolenaar
287c917da4bSBram Moolenaar  call assert_equal([
288c917da4bSBram Moolenaar	\ 'WinLeave', 'WinNew', 'WinEnter',
289c917da4bSBram Moolenaar	\ 'WinLeave', 'TabLeave', 'WinNew', 'WinEnter', 'TabNew', 'TabEnter',
29023beefedSnaohiro ono	\ 'WinLeave', 'TabLeave', 'WinClosed', 'TabClosed', 'WinEnter', 'TabEnter',
29123beefedSnaohiro ono	\ 'WinLeave', 'WinClosed', 'WinEnter'
292c917da4bSBram Moolenaar	\ ], g:record)
293c917da4bSBram Moolenaar
29412c11d55SBram Moolenaar  let g:record = []
29512c11d55SBram Moolenaar  tabnew somefile
29612c11d55SBram Moolenaar  tabnext
29712c11d55SBram Moolenaar  bwipe somefile
29812c11d55SBram Moolenaar
29912c11d55SBram Moolenaar  call assert_equal([
30012c11d55SBram Moolenaar	\ 'WinLeave', 'TabLeave', 'WinNew', 'WinEnter', 'TabNew', 'TabEnter',
30112c11d55SBram Moolenaar	\ 'WinLeave', 'TabLeave', 'WinEnter', 'TabEnter',
30223beefedSnaohiro ono	\ 'WinClosed', 'TabClosed'
30312c11d55SBram Moolenaar	\ ], g:record)
30412c11d55SBram Moolenaar
305c917da4bSBram Moolenaar  augroup testing
306c917da4bSBram Moolenaar    au!
307c917da4bSBram Moolenaar  augroup END
308c917da4bSBram Moolenaar  unlet g:record
309c917da4bSBram Moolenaarendfunc
310e99e8449SBram Moolenaar
31123beefedSnaohiro onofunc Test_WinClosed()
31223beefedSnaohiro ono  " Test that the pattern is matched against the closed window's ID, and both
31323beefedSnaohiro ono  " <amatch> and <afile> are set to it.
31423beefedSnaohiro ono  new
31523beefedSnaohiro ono  let winid = win_getid()
31623beefedSnaohiro ono  let g:matched = v:false
31723beefedSnaohiro ono  augroup test-WinClosed
31823beefedSnaohiro ono    autocmd!
31923beefedSnaohiro ono    execute 'autocmd WinClosed' winid 'let g:matched = v:true'
32023beefedSnaohiro ono    autocmd WinClosed * let g:amatch = str2nr(expand('<amatch>'))
32123beefedSnaohiro ono    autocmd WinClosed * let g:afile = str2nr(expand('<afile>'))
32223beefedSnaohiro ono  augroup END
32323beefedSnaohiro ono  close
32423beefedSnaohiro ono  call assert_true(g:matched)
32523beefedSnaohiro ono  call assert_equal(winid, g:amatch)
32623beefedSnaohiro ono  call assert_equal(winid, g:afile)
32723beefedSnaohiro ono
32823beefedSnaohiro ono  " Test that WinClosed is non-recursive.
32923beefedSnaohiro ono  new
33023beefedSnaohiro ono  new
33123beefedSnaohiro ono  call assert_equal(3, winnr('$'))
33223beefedSnaohiro ono  let g:triggered = 0
33323beefedSnaohiro ono  augroup test-WinClosed
33423beefedSnaohiro ono    autocmd!
33523beefedSnaohiro ono    autocmd WinClosed * let g:triggered += 1
33623beefedSnaohiro ono    autocmd WinClosed * 2 wincmd c
33723beefedSnaohiro ono  augroup END
33823beefedSnaohiro ono  close
33923beefedSnaohiro ono  call assert_equal(1, winnr('$'))
34023beefedSnaohiro ono  call assert_equal(1, g:triggered)
34123beefedSnaohiro ono
34223beefedSnaohiro ono  autocmd! test-WinClosed
34323beefedSnaohiro ono  augroup! test-WinClosed
34423beefedSnaohiro ono  unlet g:matched
34523beefedSnaohiro ono  unlet g:amatch
34623beefedSnaohiro ono  unlet g:afile
34723beefedSnaohiro ono  unlet g:triggered
34823beefedSnaohiro onoendfunc
34923beefedSnaohiro ono
350e99e8449SBram Moolenaarfunc s:AddAnAutocmd()
351e99e8449SBram Moolenaar  augroup vimBarTest
352e99e8449SBram Moolenaar    au BufReadCmd * echo 'hello'
353e99e8449SBram Moolenaar  augroup END
354e99e8449SBram Moolenaar  call assert_equal(3, len(split(execute('au vimBarTest'), "\n")))
355e99e8449SBram Moolenaarendfunc
356e99e8449SBram Moolenaar
357e99e8449SBram Moolenaarfunc Test_early_bar()
358e99e8449SBram Moolenaar  " test that a bar is recognized before the {event}
359e99e8449SBram Moolenaar  call s:AddAnAutocmd()
360*b8e642f7SBram Moolenaar  augroup vimBarTest | au! | let done = 77 | augroup END
361e99e8449SBram Moolenaar  call assert_equal(1, len(split(execute('au vimBarTest'), "\n")))
362*b8e642f7SBram Moolenaar  call assert_equal(77, done)
363e99e8449SBram Moolenaar
364e99e8449SBram Moolenaar  call s:AddAnAutocmd()
365*b8e642f7SBram Moolenaar  augroup vimBarTest| au!| let done = 88 | augroup END
366e99e8449SBram Moolenaar  call assert_equal(1, len(split(execute('au vimBarTest'), "\n")))
367*b8e642f7SBram Moolenaar  call assert_equal(88, done)
368e99e8449SBram Moolenaar
369e99e8449SBram Moolenaar  " test that a bar is recognized after the {event}
370e99e8449SBram Moolenaar  call s:AddAnAutocmd()
371*b8e642f7SBram Moolenaar  augroup vimBarTest| au!BufReadCmd| let done = 99 | augroup END
372e99e8449SBram Moolenaar  call assert_equal(1, len(split(execute('au vimBarTest'), "\n")))
373*b8e642f7SBram Moolenaar  call assert_equal(99, done)
374e99e8449SBram Moolenaar
375e99e8449SBram Moolenaar  " test that a bar is recognized after the {group}
376e99e8449SBram Moolenaar  call s:AddAnAutocmd()
377e99e8449SBram Moolenaar  au! vimBarTest|echo 'hello'
378e99e8449SBram Moolenaar  call assert_equal(1, len(split(execute('au vimBarTest'), "\n")))
379e99e8449SBram Moolenaarendfunc
380f2c4c391SBram Moolenaar
3815c80908cSBram Moolenaarfunc RemoveGroup()
3825c80908cSBram Moolenaar  autocmd! StartOK
3835c80908cSBram Moolenaar  augroup! StartOK
3845c80908cSBram Moolenaarendfunc
3855c80908cSBram Moolenaar
386f2c4c391SBram Moolenaarfunc Test_augroup_warning()
387f2c4c391SBram Moolenaar  augroup TheWarning
388f2c4c391SBram Moolenaar    au VimEnter * echo 'entering'
389f2c4c391SBram Moolenaar  augroup END
3905dc4e2f8SBram Moolenaar  call assert_match("TheWarning.*VimEnter", execute('au VimEnter'))
391f2c4c391SBram Moolenaar  redir => res
392f2c4c391SBram Moolenaar  augroup! TheWarning
393f2c4c391SBram Moolenaar  redir END
3945dc4e2f8SBram Moolenaar  call assert_match("W19:", res)
3955dc4e2f8SBram Moolenaar  call assert_match("-Deleted-.*VimEnter", execute('au VimEnter'))
396f2c4c391SBram Moolenaar
397f2c4c391SBram Moolenaar  " check "Another" does not take the pace of the deleted entry
398f2c4c391SBram Moolenaar  augroup Another
399f2c4c391SBram Moolenaar  augroup END
4005dc4e2f8SBram Moolenaar  call assert_match("-Deleted-.*VimEnter", execute('au VimEnter'))
401aeac9006SBram Moolenaar  augroup! Another
4025c80908cSBram Moolenaar
4035c80908cSBram Moolenaar  " no warning for postpone aucmd delete
4045c80908cSBram Moolenaar  augroup StartOK
4055c80908cSBram Moolenaar    au VimEnter * call RemoveGroup()
4065c80908cSBram Moolenaar  augroup END
4075dc4e2f8SBram Moolenaar  call assert_match("StartOK.*VimEnter", execute('au VimEnter'))
4085c80908cSBram Moolenaar  redir => res
4095c80908cSBram Moolenaar  doautocmd VimEnter
4105c80908cSBram Moolenaar  redir END
4115dc4e2f8SBram Moolenaar  call assert_notmatch("W19:", res)
412de653f08SBram Moolenaar  au! VimEnter
413ad48e6c1SBram Moolenaar
414ad48e6c1SBram Moolenaar  call assert_fails('augroup!', 'E471:')
415f2c4c391SBram Moolenaarendfunc
416b62cc36aSBram Moolenaar
4178d84ff1aSBram Moolenaarfunc Test_BufReadCmdHelp()
4188d84ff1aSBram Moolenaar  " This used to cause access to free memory
4198d84ff1aSBram Moolenaar  au BufReadCmd * e +h
4208d84ff1aSBram Moolenaar  help
4218d84ff1aSBram Moolenaar
4228d84ff1aSBram Moolenaar  au! BufReadCmd
4238d84ff1aSBram Moolenaarendfunc
4248d84ff1aSBram Moolenaar
4258d84ff1aSBram Moolenaarfunc Test_BufReadCmdHelpJump()
4268d84ff1aSBram Moolenaar  " This used to cause access to free memory
4278d84ff1aSBram Moolenaar  au BufReadCmd * e +h{
428cf1ba35fSBram Moolenaar  " } to fix highlighting
429cf1ba35fSBram Moolenaar  call assert_fails('help', 'E434:')
4308d84ff1aSBram Moolenaar
4318d84ff1aSBram Moolenaar  au! BufReadCmd
4328d84ff1aSBram Moolenaarendfunc
4338d84ff1aSBram Moolenaar
434b62cc36aSBram Moolenaarfunc Test_augroup_deleted()
435de653f08SBram Moolenaar  " This caused a crash before E936 was introduced
436b62cc36aSBram Moolenaar  augroup x
437de653f08SBram Moolenaar    call assert_fails('augroup! x', 'E936:')
438b62cc36aSBram Moolenaar    au VimEnter * echo
439de653f08SBram Moolenaar  augroup end
440de653f08SBram Moolenaar  augroup! x
4415dc4e2f8SBram Moolenaar  call assert_match("-Deleted-.*VimEnter", execute('au VimEnter'))
442de653f08SBram Moolenaar  au! VimEnter
443b62cc36aSBram Moolenaarendfunc
444b62cc36aSBram Moolenaar
445e0ab94e7SBram Moolenaar" Tests for autocommands on :close command.
446e0ab94e7SBram Moolenaar" This used to be in test13.
447e0ab94e7SBram Moolenaarfunc Test_three_windows()
448b3435b0aSBram Moolenaar  " Clean up buffers, because in some cases this function fails.
449b3435b0aSBram Moolenaar  call s:cleanup_buffers()
450b3435b0aSBram Moolenaar
451e0ab94e7SBram Moolenaar  " Write three files and open them, each in a window.
452e0ab94e7SBram Moolenaar  " Then go to next window, with autocommand that deletes the previous one.
453e0ab94e7SBram Moolenaar  " Do this twice, writing the file.
454e0ab94e7SBram Moolenaar  e! Xtestje1
455e0ab94e7SBram Moolenaar  call setline(1, 'testje1')
456e0ab94e7SBram Moolenaar  w
457e0ab94e7SBram Moolenaar  sp Xtestje2
458e0ab94e7SBram Moolenaar  call setline(1, 'testje2')
459e0ab94e7SBram Moolenaar  w
460e0ab94e7SBram Moolenaar  sp Xtestje3
461e0ab94e7SBram Moolenaar  call setline(1, 'testje3')
462e0ab94e7SBram Moolenaar  w
463e0ab94e7SBram Moolenaar  wincmd w
464e0ab94e7SBram Moolenaar  au WinLeave Xtestje2 bwipe
465e0ab94e7SBram Moolenaar  wincmd w
466e0ab94e7SBram Moolenaar  call assert_equal('Xtestje1', expand('%'))
467e0ab94e7SBram Moolenaar
468e0ab94e7SBram Moolenaar  au WinLeave Xtestje1 bwipe Xtestje3
469e0ab94e7SBram Moolenaar  close
470e0ab94e7SBram Moolenaar  call assert_equal('Xtestje1', expand('%'))
471e0ab94e7SBram Moolenaar
472e0ab94e7SBram Moolenaar  " Test deleting the buffer on a Unload event.  If this goes wrong there
473e0ab94e7SBram Moolenaar  " will be the ATTENTION prompt.
474e0ab94e7SBram Moolenaar  e Xtestje1
475e0ab94e7SBram Moolenaar  au!
476e0ab94e7SBram Moolenaar  au! BufUnload Xtestje1 bwipe
477e0ab94e7SBram Moolenaar  call assert_fails('e Xtestje3', 'E937:')
478e0ab94e7SBram Moolenaar  call assert_equal('Xtestje3', expand('%'))
479e0ab94e7SBram Moolenaar
480e0ab94e7SBram Moolenaar  e Xtestje2
481e0ab94e7SBram Moolenaar  sp Xtestje1
482e0ab94e7SBram Moolenaar  call assert_fails('e', 'E937:')
483a997b45cSBram Moolenaar  call assert_equal('Xtestje1', expand('%'))
484e0ab94e7SBram Moolenaar
485e0ab94e7SBram Moolenaar  " Test changing buffers in a BufWipeout autocommand.  If this goes wrong
486e0ab94e7SBram Moolenaar  " there are ml_line errors and/or a Crash.
487e0ab94e7SBram Moolenaar  au!
488e0ab94e7SBram Moolenaar  only
489e0ab94e7SBram Moolenaar  e Xanother
490e0ab94e7SBram Moolenaar  e Xtestje1
491e0ab94e7SBram Moolenaar  bwipe Xtestje2
492e0ab94e7SBram Moolenaar  bwipe Xtestje3
493e0ab94e7SBram Moolenaar  au BufWipeout Xtestje1 buf Xtestje1
494e0ab94e7SBram Moolenaar  bwipe
495e0ab94e7SBram Moolenaar  call assert_equal('Xanother', expand('%'))
496e0ab94e7SBram Moolenaar
497e0ab94e7SBram Moolenaar  only
498e0ab94e7SBram Moolenaar  help
499e0ab94e7SBram Moolenaar  wincmd w
500e0ab94e7SBram Moolenaar  1quit
501e0ab94e7SBram Moolenaar  call assert_equal('Xanother', expand('%'))
502e0ab94e7SBram Moolenaar
503e0ab94e7SBram Moolenaar  au!
5044520d440SBram Moolenaar  enew
505e0ab94e7SBram Moolenaar  call delete('Xtestje1')
506e0ab94e7SBram Moolenaar  call delete('Xtestje2')
507e0ab94e7SBram Moolenaar  call delete('Xtestje3')
508e0ab94e7SBram Moolenaarendfunc
509e13b9afeSBram Moolenaar
510e13b9afeSBram Moolenaarfunc Test_BufEnter()
511e13b9afeSBram Moolenaar  au! BufEnter
512e13b9afeSBram Moolenaar  au Bufenter * let val = val . '+'
513e13b9afeSBram Moolenaar  let g:val = ''
514e13b9afeSBram Moolenaar  split NewFile
515e13b9afeSBram Moolenaar  call assert_equal('+', g:val)
516e13b9afeSBram Moolenaar  bwipe!
517e13b9afeSBram Moolenaar  call assert_equal('++', g:val)
518e13b9afeSBram Moolenaar
519e13b9afeSBram Moolenaar  " Also get BufEnter when editing a directory
520e13b9afeSBram Moolenaar  call mkdir('Xdir')
521e13b9afeSBram Moolenaar  split Xdir
522e13b9afeSBram Moolenaar  call assert_equal('+++', g:val)
523e94260f3SBram Moolenaar
524e94260f3SBram Moolenaar  " On MS-Windows we can't edit the directory, make sure we wipe the right
525e94260f3SBram Moolenaar  " buffer.
526e94260f3SBram Moolenaar  bwipe! Xdir
527e13b9afeSBram Moolenaar
528e13b9afeSBram Moolenaar  call delete('Xdir', 'd')
529e13b9afeSBram Moolenaar  au! BufEnter
530e13b9afeSBram Moolenaarendfunc
5318c752bd6SBram Moolenaar
5328c752bd6SBram Moolenaar" Closing a window might cause an endless loop
5338c752bd6SBram Moolenaar" E814 for older Vims
53404f62f88SBram Moolenaarfunc Test_autocmd_bufwipe_in_SessLoadPost()
5351d68d9b2SBram Moolenaar  edit Xtest
5368c752bd6SBram Moolenaar  tabnew
5371d68d9b2SBram Moolenaar  file Xsomething
5388c752bd6SBram Moolenaar  set noswapfile
5398c752bd6SBram Moolenaar  mksession!
5408c752bd6SBram Moolenaar
541c79745a8SBram Moolenaar  let content =<< trim [CODE]
54262cd26a2SBram Moolenaar    call test_override('ui_delay', 10)
543c79745a8SBram Moolenaar    set nocp noswapfile
544c79745a8SBram Moolenaar    let v:swapchoice = "e"
545c79745a8SBram Moolenaar    augroup test_autocmd_sessionload
546c79745a8SBram Moolenaar    autocmd!
547c79745a8SBram Moolenaar    autocmd SessionLoadPost * exe bufnr("Xsomething") . "bw!"
548c79745a8SBram Moolenaar    augroup END
549c79745a8SBram Moolenaar
550c79745a8SBram Moolenaar    func WriteErrors()
551c79745a8SBram Moolenaar      call writefile([execute("messages")], "Xerrors")
552c79745a8SBram Moolenaar    endfunc
553c79745a8SBram Moolenaar    au VimLeave * call WriteErrors()
554c79745a8SBram Moolenaar  [CODE]
555c79745a8SBram Moolenaar
5568c752bd6SBram Moolenaar  call writefile(content, 'Xvimrc')
55793344c2dSBram Moolenaar  call system(GetVimCommand('Xvimrc') .. ' --not-a-term --noplugins -S Session.vim -c cq')
558e94260f3SBram Moolenaar  let errors = join(readfile('Xerrors'))
559e2e4075fSBram Moolenaar  call assert_match('E814:', errors)
5608c752bd6SBram Moolenaar
5618c752bd6SBram Moolenaar  set swapfile
562e94260f3SBram Moolenaar  for file in ['Session.vim', 'Xvimrc', 'Xerrors']
5638c752bd6SBram Moolenaar    call delete(file)
5648c752bd6SBram Moolenaar  endfor
5658c752bd6SBram Moolenaarendfunc
5668c752bd6SBram Moolenaar
567797e63b9SBram Moolenaar" Using :blast and :ball for many events caused a crash, because b_nwindows was
568797e63b9SBram Moolenaar" not incremented correctly.
569797e63b9SBram Moolenaarfunc Test_autocmd_blast_badd()
570797e63b9SBram Moolenaar  let content =<< trim [CODE]
571797e63b9SBram Moolenaar      au BufNew,BufAdd,BufWinEnter,BufEnter,BufLeave,BufWinLeave,BufUnload,VimEnter foo* blast
572797e63b9SBram Moolenaar      edit foo1
573797e63b9SBram Moolenaar      au BufNew,BufAdd,BufWinEnter,BufEnter,BufLeave,BufWinLeave,BufUnload,VimEnter foo* ball
574797e63b9SBram Moolenaar      edit foo2
575797e63b9SBram Moolenaar      call writefile(['OK'], 'Xerrors')
576797e63b9SBram Moolenaar      qall
577797e63b9SBram Moolenaar  [CODE]
578797e63b9SBram Moolenaar
579797e63b9SBram Moolenaar  call writefile(content, 'XblastBall')
580797e63b9SBram Moolenaar  call system(GetVimCommand() .. ' --clean -S XblastBall')
581797e63b9SBram Moolenaar  call assert_match('OK', readfile('Xerrors')->join())
582797e63b9SBram Moolenaar
583797e63b9SBram Moolenaar  call delete('XblastBall')
584797e63b9SBram Moolenaar  call delete('Xerrors')
585797e63b9SBram Moolenaarendfunc
586797e63b9SBram Moolenaar
5878c752bd6SBram Moolenaar" SEGV occurs in older versions.
58804f62f88SBram Moolenaarfunc Test_autocmd_bufwipe_in_SessLoadPost2()
5898c752bd6SBram Moolenaar  tabnew
5908c752bd6SBram Moolenaar  set noswapfile
5918c752bd6SBram Moolenaar  mksession!
5928c752bd6SBram Moolenaar
593c79745a8SBram Moolenaar  let content =<< trim [CODE]
594c79745a8SBram Moolenaar    set nocp noswapfile
595c79745a8SBram Moolenaar    function! DeleteInactiveBufs()
596c79745a8SBram Moolenaar      tabfirst
597c79745a8SBram Moolenaar      let tabblist = []
598c79745a8SBram Moolenaar      for i in range(1, tabpagenr(''$''))
599c79745a8SBram Moolenaar        call extend(tabblist, tabpagebuflist(i))
600c79745a8SBram Moolenaar      endfor
601c79745a8SBram Moolenaar      for b in range(1, bufnr(''$''))
602c79745a8SBram Moolenaar        if bufexists(b) && buflisted(b) && (index(tabblist, b) == -1 || bufname(b) =~# ''^$'')
603c79745a8SBram Moolenaar          exec ''bwipeout '' . b
604c79745a8SBram Moolenaar        endif
605c79745a8SBram Moolenaar      endfor
606c79745a8SBram Moolenaar      echomsg "SessionLoadPost DONE"
607c79745a8SBram Moolenaar    endfunction
608c79745a8SBram Moolenaar    au SessionLoadPost * call DeleteInactiveBufs()
609c79745a8SBram Moolenaar
610c79745a8SBram Moolenaar    func WriteErrors()
611c79745a8SBram Moolenaar      call writefile([execute("messages")], "Xerrors")
612c79745a8SBram Moolenaar    endfunc
613c79745a8SBram Moolenaar    au VimLeave * call WriteErrors()
614c79745a8SBram Moolenaar  [CODE]
615c79745a8SBram Moolenaar
6168c752bd6SBram Moolenaar  call writefile(content, 'Xvimrc')
61793344c2dSBram Moolenaar  call system(GetVimCommand('Xvimrc') .. ' --not-a-term --noplugins -S Session.vim -c cq')
618e94260f3SBram Moolenaar  let errors = join(readfile('Xerrors'))
619e94260f3SBram Moolenaar  " This probably only ever matches on unix.
620e94260f3SBram Moolenaar  call assert_notmatch('Caught deadly signal SEGV', errors)
621e94260f3SBram Moolenaar  call assert_match('SessionLoadPost DONE', errors)
6228c752bd6SBram Moolenaar
6238c752bd6SBram Moolenaar  set swapfile
624e94260f3SBram Moolenaar  for file in ['Session.vim', 'Xvimrc', 'Xerrors']
6258c752bd6SBram Moolenaar    call delete(file)
6268c752bd6SBram Moolenaar  endfor
6278c752bd6SBram Moolenaarendfunc
628faf29d7fSBram Moolenaar
629faf29d7fSBram Moolenaarfunc Test_empty_doau()
630faf29d7fSBram Moolenaar  doau \|
631faf29d7fSBram Moolenaarendfunc
63204f62f88SBram Moolenaar
63304f62f88SBram Moolenaarfunc s:AutoCommandOptionSet(match)
634d7c96879SBram Moolenaar  let template = "Option: <%s>, OldVal: <%s>, OldValLocal: <%s>, OldValGlobal: <%s>, NewVal: <%s>, Scope: <%s>, Command: <%s>\n"
63504f62f88SBram Moolenaar  let item     = remove(g:options, 0)
636d7c96879SBram Moolenaar  let expected = printf(template, item[0], item[1], item[2], item[3], item[4], item[5], item[6])
637d7c96879SBram Moolenaar  let actual   = printf(template, a:match, v:option_old, v:option_oldlocal, v:option_oldglobal, v:option_new, v:option_type, v:option_command)
63804f62f88SBram Moolenaar  let g:opt    = [expected, actual]
63904f62f88SBram Moolenaar  "call assert_equal(expected, actual)
64004f62f88SBram Moolenaarendfunc
64104f62f88SBram Moolenaar
64204f62f88SBram Moolenaarfunc Test_OptionSet()
6436d91bcb4SBram Moolenaar  CheckOption autochdir
64404f62f88SBram Moolenaar
6454a6fcf80SBram Moolenaar  badd test_autocmd.vim
6464a6fcf80SBram Moolenaar
64704f62f88SBram Moolenaar  call test_override('starting', 1)
64804f62f88SBram Moolenaar  set nocp
64904f62f88SBram Moolenaar  au OptionSet * :call s:AutoCommandOptionSet(expand("<amatch>"))
65004f62f88SBram Moolenaar
65104f62f88SBram Moolenaar  " 1: Setting number option"
652d7c96879SBram Moolenaar  let g:options = [['number', 0, 0, 0, 1, 'global', 'set']]
65304f62f88SBram Moolenaar  set nu
65404f62f88SBram Moolenaar  call assert_equal([], g:options)
65504f62f88SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
65604f62f88SBram Moolenaar
65704f62f88SBram Moolenaar  " 2: Setting local number option"
658d7c96879SBram Moolenaar  let g:options = [['number', 1, 1, '', 0, 'local', 'setlocal']]
65904f62f88SBram Moolenaar  setlocal nonu
66004f62f88SBram Moolenaar  call assert_equal([], g:options)
66104f62f88SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
66204f62f88SBram Moolenaar
66304f62f88SBram Moolenaar  " 3: Setting global number option"
664d7c96879SBram Moolenaar  let g:options = [['number', 1, '', 1, 0, 'global', 'setglobal']]
66504f62f88SBram Moolenaar  setglobal nonu
66604f62f88SBram Moolenaar  call assert_equal([], g:options)
66704f62f88SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
66804f62f88SBram Moolenaar
66904f62f88SBram Moolenaar  " 4: Setting local autoindent option"
670d7c96879SBram Moolenaar  let g:options = [['autoindent', 0, 0, '', 1, 'local', 'setlocal']]
67104f62f88SBram Moolenaar  setlocal ai
67204f62f88SBram Moolenaar  call assert_equal([], g:options)
67304f62f88SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
67404f62f88SBram Moolenaar
67504f62f88SBram Moolenaar  " 5: Setting global autoindent option"
676d7c96879SBram Moolenaar  let g:options = [['autoindent', 0, '', 0, 1, 'global', 'setglobal']]
67704f62f88SBram Moolenaar  setglobal ai
67804f62f88SBram Moolenaar  call assert_equal([], g:options)
67904f62f88SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
68004f62f88SBram Moolenaar
68104f62f88SBram Moolenaar  " 6: Setting global autoindent option"
682d7c96879SBram Moolenaar  let g:options = [['autoindent', 1, 1, 1, 0, 'global', 'set']]
683d7c96879SBram Moolenaar  set ai!
684d7c96879SBram Moolenaar  call assert_equal([], g:options)
685d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
686d7c96879SBram Moolenaar
687d7c96879SBram Moolenaar  " 6a: Setting global autoindent option"
688d7c96879SBram Moolenaar  let g:options = [['autoindent', 1, 1, 0, 0, 'global', 'set']]
689d7c96879SBram Moolenaar  noa setlocal ai
690d7c96879SBram Moolenaar  noa setglobal noai
69104f62f88SBram Moolenaar  set ai!
69204f62f88SBram Moolenaar  call assert_equal([], g:options)
69304f62f88SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
69404f62f88SBram Moolenaar
69504f62f88SBram Moolenaar  " Should not print anything, use :noa
69604f62f88SBram Moolenaar  " 7: don't trigger OptionSet"
697d7c96879SBram Moolenaar  let g:options = [['invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid']]
69804f62f88SBram Moolenaar  noa set nonu
699d7c96879SBram Moolenaar  call assert_equal([['invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid']], g:options)
70004f62f88SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
70104f62f88SBram Moolenaar
70204f62f88SBram Moolenaar  " 8: Setting several global list and number option"
703d7c96879SBram Moolenaar  let g:options = [['list', 0, 0, 0, 1, 'global', 'set'], ['number', 0, 0, 0, 1, 'global', 'set']]
70404f62f88SBram Moolenaar  set list nu
70504f62f88SBram Moolenaar  call assert_equal([], g:options)
70604f62f88SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
70704f62f88SBram Moolenaar
70804f62f88SBram Moolenaar  " 9: don't trigger OptionSet"
709d7c96879SBram Moolenaar  let g:options = [['invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid'], ['invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid']]
71004f62f88SBram Moolenaar  noa set nolist nonu
711d7c96879SBram Moolenaar  call assert_equal([['invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid'], ['invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid', 'invalid']], g:options)
71204f62f88SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
71304f62f88SBram Moolenaar
71404f62f88SBram Moolenaar  " 10: Setting global acd"
715d7c96879SBram Moolenaar  let g:options = [['autochdir', 0, 0, '', 1, 'local', 'setlocal']]
71604f62f88SBram Moolenaar  setlocal acd
71704f62f88SBram Moolenaar  call assert_equal([], g:options)
71804f62f88SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
71904f62f88SBram Moolenaar
72004f62f88SBram Moolenaar  " 11: Setting global autoread (also sets local value)"
721d7c96879SBram Moolenaar  let g:options = [['autoread', 0, 0, 0, 1, 'global', 'set']]
72204f62f88SBram Moolenaar  set ar
72304f62f88SBram Moolenaar  call assert_equal([], g:options)
72404f62f88SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
72504f62f88SBram Moolenaar
72604f62f88SBram Moolenaar  " 12: Setting local autoread"
727d7c96879SBram Moolenaar  let g:options = [['autoread', 1, 1, '', 1, 'local', 'setlocal']]
72804f62f88SBram Moolenaar  setlocal ar
72904f62f88SBram Moolenaar  call assert_equal([], g:options)
73004f62f88SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
73104f62f88SBram Moolenaar
73204f62f88SBram Moolenaar  " 13: Setting global autoread"
733d7c96879SBram Moolenaar  let g:options = [['autoread', 1, '', 1, 0, 'global', 'setglobal']]
73404f62f88SBram Moolenaar  setglobal invar
73504f62f88SBram Moolenaar  call assert_equal([], g:options)
73604f62f88SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
73704f62f88SBram Moolenaar
73804f62f88SBram Moolenaar  " 14: Setting option backspace through :let"
739d7c96879SBram Moolenaar  let g:options = [['backspace', '', '', '', 'eol,indent,start', 'global', 'set']]
74004f62f88SBram Moolenaar  let &bs = "eol,indent,start"
74104f62f88SBram Moolenaar  call assert_equal([], g:options)
74204f62f88SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
74304f62f88SBram Moolenaar
74404f62f88SBram Moolenaar  " 15: Setting option backspace through setbufvar()"
745d7c96879SBram Moolenaar  let g:options = [['backup', 0, 0, '', 1, 'local', 'setlocal']]
74604f62f88SBram Moolenaar  " try twice, first time, shouldn't trigger because option name is invalid,
74704f62f88SBram Moolenaar  " second time, it should trigger
7484a6fcf80SBram Moolenaar  let bnum = bufnr('%')
749e2e4075fSBram Moolenaar  call assert_fails("call setbufvar(bnum, '&l:bk', 1)", 'E355:')
75004f62f88SBram Moolenaar  " should trigger, use correct option name
7514a6fcf80SBram Moolenaar  call setbufvar(bnum, '&backup', 1)
75204f62f88SBram Moolenaar  call assert_equal([], g:options)
75304f62f88SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
75404f62f88SBram Moolenaar
75504f62f88SBram Moolenaar  " 16: Setting number option using setwinvar"
756d7c96879SBram Moolenaar  let g:options = [['number', 0, 0, '', 1, 'local', 'setlocal']]
75704f62f88SBram Moolenaar  call setwinvar(0, '&number', 1)
75804f62f88SBram Moolenaar  call assert_equal([], g:options)
75904f62f88SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
76004f62f88SBram Moolenaar
76104f62f88SBram Moolenaar  " 17: Setting key option, shouldn't trigger"
762d7c96879SBram Moolenaar  let g:options = [['key', 'invalid', 'invalid1', 'invalid2', 'invalid3', 'invalid4', 'invalid5']]
76304f62f88SBram Moolenaar  setlocal key=blah
76404f62f88SBram Moolenaar  setlocal key=
765d7c96879SBram Moolenaar  call assert_equal([['key', 'invalid', 'invalid1', 'invalid2', 'invalid3', 'invalid4', 'invalid5']], g:options)
76604f62f88SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
76704f62f88SBram Moolenaar
768d7c96879SBram Moolenaar
769d7c96879SBram Moolenaar  " 18a: Setting string global option"
770d7c96879SBram Moolenaar  let oldval = &backupext
771d7c96879SBram Moolenaar  let g:options = [['backupext', oldval, oldval, oldval, 'foo', 'global', 'set']]
772d7c96879SBram Moolenaar  set backupext=foo
773d7c96879SBram Moolenaar  call assert_equal([], g:options)
774d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
775d7c96879SBram Moolenaar
776d7c96879SBram Moolenaar  " 18b: Resetting string global option"
777d7c96879SBram Moolenaar  let g:options = [['backupext', 'foo', 'foo', 'foo', oldval, 'global', 'set']]
778d7c96879SBram Moolenaar  set backupext&
779d7c96879SBram Moolenaar  call assert_equal([], g:options)
780d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
781d7c96879SBram Moolenaar
782d7c96879SBram Moolenaar  " 18c: Setting global string global option"
783d7c96879SBram Moolenaar  let g:options = [['backupext', oldval, '', oldval, 'bar', 'global', 'setglobal']]
784d7c96879SBram Moolenaar  setglobal backupext=bar
785d7c96879SBram Moolenaar  call assert_equal([], g:options)
786d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
787d7c96879SBram Moolenaar
788d7c96879SBram Moolenaar  " 18d: Setting local string global option"
789d7c96879SBram Moolenaar  " As this is a global option this sets the global value even though
790d7c96879SBram Moolenaar  " :setlocal is used!
791d7c96879SBram Moolenaar  noa set backupext& " Reset global and local value (without triggering autocmd)
792d7c96879SBram Moolenaar  let g:options = [['backupext', oldval, oldval, '', 'baz', 'local', 'setlocal']]
793d7c96879SBram Moolenaar  setlocal backupext=baz
794d7c96879SBram Moolenaar  call assert_equal([], g:options)
795d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
796d7c96879SBram Moolenaar
797d7c96879SBram Moolenaar  " 18e: Setting again string global option"
798d7c96879SBram Moolenaar  noa setglobal backupext=ext_global " Reset global and local value (without triggering autocmd)
799d7c96879SBram Moolenaar  noa setlocal backupext=ext_local " Sets the global(!) value!
800d7c96879SBram Moolenaar  let g:options = [['backupext', 'ext_local', 'ext_local', 'ext_local', 'fuu', 'global', 'set']]
801d7c96879SBram Moolenaar  set backupext=fuu
802d7c96879SBram Moolenaar  call assert_equal([], g:options)
803d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
804d7c96879SBram Moolenaar
805d7c96879SBram Moolenaar
806b811de5dSzeertzjq  " 19a: Setting string global-local (to buffer) option"
8078efa026aSBram Moolenaar  let oldval = &tags
808d7c96879SBram Moolenaar  let g:options = [['tags', oldval, oldval, oldval, 'tagpath', 'global', 'set']]
8098efa026aSBram Moolenaar  set tags=tagpath
8108efa026aSBram Moolenaar  call assert_equal([], g:options)
8118efa026aSBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
8128efa026aSBram Moolenaar
813b811de5dSzeertzjq  " 19b: Resetting string global-local (to buffer) option"
814d7c96879SBram Moolenaar  let g:options = [['tags', 'tagpath', 'tagpath', 'tagpath', oldval, 'global', 'set']]
8158efa026aSBram Moolenaar  set tags&
8168efa026aSBram Moolenaar  call assert_equal([], g:options)
8178efa026aSBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
8188efa026aSBram Moolenaar
819b811de5dSzeertzjq  " 19c: Setting global string global-local (to buffer) option "
820d7c96879SBram Moolenaar  let g:options = [['tags', oldval, '', oldval, 'tagpath1', 'global', 'setglobal']]
821d7c96879SBram Moolenaar  setglobal tags=tagpath1
822d7c96879SBram Moolenaar  call assert_equal([], g:options)
823d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
824d7c96879SBram Moolenaar
825b811de5dSzeertzjq  " 19d: Setting local string global-local (to buffer) option"
826d7c96879SBram Moolenaar  let g:options = [['tags', 'tagpath1', 'tagpath1', '', 'tagpath2', 'local', 'setlocal']]
827d7c96879SBram Moolenaar  setlocal tags=tagpath2
828d7c96879SBram Moolenaar  call assert_equal([], g:options)
829d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
830d7c96879SBram Moolenaar
831b811de5dSzeertzjq  " 19e: Setting again string global-local (to buffer) option"
832b811de5dSzeertzjq  " Note: v:option_old is the old global value for global-local string options
833d7c96879SBram Moolenaar  " but the old local value for all other kinds of options.
834d7c96879SBram Moolenaar  noa setglobal tags=tag_global " Reset global and local value (without triggering autocmd)
835d7c96879SBram Moolenaar  noa setlocal tags=tag_local
836d7c96879SBram Moolenaar  let g:options = [['tags', 'tag_global', 'tag_local', 'tag_global', 'tagpath', 'global', 'set']]
837d7c96879SBram Moolenaar  set tags=tagpath
838d7c96879SBram Moolenaar  call assert_equal([], g:options)
839d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
840d7c96879SBram Moolenaar
841b811de5dSzeertzjq  " 19f: Setting string global-local (to buffer) option to an empty string"
842b811de5dSzeertzjq  " Note: v:option_old is the old global value for global-local string options
843d7c96879SBram Moolenaar  " but the old local value for all other kinds of options.
844d7c96879SBram Moolenaar  noa set tags=tag_global " Reset global and local value (without triggering autocmd)
845d7c96879SBram Moolenaar  noa setlocal tags= " empty string
846d7c96879SBram Moolenaar  let g:options = [['tags', 'tag_global', '', 'tag_global', 'tagpath', 'global', 'set']]
847d7c96879SBram Moolenaar  set tags=tagpath
848d7c96879SBram Moolenaar  call assert_equal([], g:options)
849d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
850d7c96879SBram Moolenaar
851d7c96879SBram Moolenaar
852d7c96879SBram Moolenaar  " 20a: Setting string local (to buffer) option"
853d7c96879SBram Moolenaar  let oldval = &spelllang
854d7c96879SBram Moolenaar  let g:options = [['spelllang', oldval, oldval, oldval, 'elvish,klingon', 'global', 'set']]
855d7c96879SBram Moolenaar  set spelllang=elvish,klingon
856d7c96879SBram Moolenaar  call assert_equal([], g:options)
857d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
858d7c96879SBram Moolenaar
859d7c96879SBram Moolenaar  " 20b: Resetting string local (to buffer) option"
860d7c96879SBram Moolenaar  let g:options = [['spelllang', 'elvish,klingon', 'elvish,klingon', 'elvish,klingon', oldval, 'global', 'set']]
861d7c96879SBram Moolenaar  set spelllang&
862d7c96879SBram Moolenaar  call assert_equal([], g:options)
863d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
864d7c96879SBram Moolenaar
865d7c96879SBram Moolenaar  " 20c: Setting global string local (to buffer) option"
866d7c96879SBram Moolenaar  let g:options = [['spelllang', oldval, '', oldval, 'elvish', 'global', 'setglobal']]
867d7c96879SBram Moolenaar  setglobal spelllang=elvish
868d7c96879SBram Moolenaar  call assert_equal([], g:options)
869d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
870d7c96879SBram Moolenaar
871d7c96879SBram Moolenaar  " 20d: Setting local string local (to buffer) option"
872d7c96879SBram Moolenaar  noa set spelllang& " Reset global and local value (without triggering autocmd)
873d7c96879SBram Moolenaar  let g:options = [['spelllang', oldval, oldval, '', 'klingon', 'local', 'setlocal']]
874d7c96879SBram Moolenaar  setlocal spelllang=klingon
875d7c96879SBram Moolenaar  call assert_equal([], g:options)
876d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
877d7c96879SBram Moolenaar
878d7c96879SBram Moolenaar  " 20e: Setting again string local (to buffer) option"
879b811de5dSzeertzjq  " Note: v:option_old is the old global value for global-local string options
880d7c96879SBram Moolenaar  " but the old local value for all other kinds of options.
881d7c96879SBram Moolenaar  noa setglobal spelllang=spellglobal " Reset global and local value (without triggering autocmd)
882d7c96879SBram Moolenaar  noa setlocal spelllang=spelllocal
883d7c96879SBram Moolenaar  let g:options = [['spelllang', 'spelllocal', 'spelllocal', 'spellglobal', 'foo', 'global', 'set']]
884d7c96879SBram Moolenaar  set spelllang=foo
885d7c96879SBram Moolenaar  call assert_equal([], g:options)
886d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
887d7c96879SBram Moolenaar
888d7c96879SBram Moolenaar
889b811de5dSzeertzjq  " 21a: Setting string global-local (to window) option"
890d7c96879SBram Moolenaar  let oldval = &statusline
891d7c96879SBram Moolenaar  let g:options = [['statusline', oldval, oldval, oldval, 'foo', 'global', 'set']]
892d7c96879SBram Moolenaar  set statusline=foo
893d7c96879SBram Moolenaar  call assert_equal([], g:options)
894d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
895d7c96879SBram Moolenaar
896b811de5dSzeertzjq  " 21b: Resetting string global-local (to window) option"
897b811de5dSzeertzjq  " Note: v:option_old is the old global value for global-local string options
898d7c96879SBram Moolenaar  " but the old local value for all other kinds of options.
899d7c96879SBram Moolenaar  let g:options = [['statusline', 'foo', 'foo', 'foo', oldval, 'global', 'set']]
900d7c96879SBram Moolenaar  set statusline&
901d7c96879SBram Moolenaar  call assert_equal([], g:options)
902d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
903d7c96879SBram Moolenaar
904b811de5dSzeertzjq  " 21c: Setting global string global-local (to window) option"
905d7c96879SBram Moolenaar  let g:options = [['statusline', oldval, '', oldval, 'bar', 'global', 'setglobal']]
906d7c96879SBram Moolenaar  setglobal statusline=bar
907d7c96879SBram Moolenaar  call assert_equal([], g:options)
908d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
909d7c96879SBram Moolenaar
910b811de5dSzeertzjq  " 21d: Setting local string global-local (to window) option"
911d7c96879SBram Moolenaar  noa set statusline& " Reset global and local value (without triggering autocmd)
912d7c96879SBram Moolenaar  let g:options = [['statusline', oldval, oldval, '', 'baz', 'local', 'setlocal']]
913d7c96879SBram Moolenaar  setlocal statusline=baz
914d7c96879SBram Moolenaar  call assert_equal([], g:options)
915d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
916d7c96879SBram Moolenaar
917b811de5dSzeertzjq  " 21e: Setting again string global-local (to window) option"
918b811de5dSzeertzjq  " Note: v:option_old is the old global value for global-local string options
919d7c96879SBram Moolenaar  " but the old local value for all other kinds of options.
920d7c96879SBram Moolenaar  noa setglobal statusline=bar " Reset global and local value (without triggering autocmd)
921d7c96879SBram Moolenaar  noa setlocal statusline=baz
922d7c96879SBram Moolenaar  let g:options = [['statusline', 'bar', 'baz', 'bar', 'foo', 'global', 'set']]
923d7c96879SBram Moolenaar  set statusline=foo
924d7c96879SBram Moolenaar  call assert_equal([], g:options)
925d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
926d7c96879SBram Moolenaar
927d7c96879SBram Moolenaar
928d7c96879SBram Moolenaar  " 22a: Setting string local (to window) option"
929d7c96879SBram Moolenaar  let oldval = &foldignore
930d7c96879SBram Moolenaar  let g:options = [['foldignore', oldval, oldval, oldval, 'fo', 'global', 'set']]
931d7c96879SBram Moolenaar  set foldignore=fo
932d7c96879SBram Moolenaar  call assert_equal([], g:options)
933d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
934d7c96879SBram Moolenaar
935d7c96879SBram Moolenaar  " 22b: Resetting string local (to window) option"
936d7c96879SBram Moolenaar  let g:options = [['foldignore', 'fo', 'fo', 'fo', oldval, 'global', 'set']]
937d7c96879SBram Moolenaar  set foldignore&
938d7c96879SBram Moolenaar  call assert_equal([], g:options)
939d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
940d7c96879SBram Moolenaar
941d7c96879SBram Moolenaar  " 22c: Setting global string local (to window) option"
942d7c96879SBram Moolenaar  let g:options = [['foldignore', oldval, '', oldval, 'bar', 'global', 'setglobal']]
943d7c96879SBram Moolenaar  setglobal foldignore=bar
944d7c96879SBram Moolenaar  call assert_equal([], g:options)
945d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
946d7c96879SBram Moolenaar
947d7c96879SBram Moolenaar  " 22d: Setting local string local (to window) option"
948d7c96879SBram Moolenaar  noa set foldignore& " Reset global and local value (without triggering autocmd)
949d7c96879SBram Moolenaar  let g:options = [['foldignore', oldval, oldval, '', 'baz', 'local', 'setlocal']]
950d7c96879SBram Moolenaar  setlocal foldignore=baz
951d7c96879SBram Moolenaar  call assert_equal([], g:options)
952d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
953d7c96879SBram Moolenaar
954d7c96879SBram Moolenaar  " 22e: Setting again string local (to window) option"
955d7c96879SBram Moolenaar  noa setglobal foldignore=glob " Reset global and local value (without triggering autocmd)
956d7c96879SBram Moolenaar  noa setlocal foldignore=loc
957d7c96879SBram Moolenaar  let g:options = [['foldignore', 'loc', 'loc', 'glob', 'fo', 'global', 'set']]
958d7c96879SBram Moolenaar  set foldignore=fo
959d7c96879SBram Moolenaar  call assert_equal([], g:options)
960d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
961d7c96879SBram Moolenaar
962d7c96879SBram Moolenaar
963b811de5dSzeertzjq  " 23a: Setting global number global option"
964d7c96879SBram Moolenaar  noa setglobal cmdheight=8 " Reset global and local value (without triggering autocmd)
965d7c96879SBram Moolenaar  noa setlocal cmdheight=1 " Sets the global(!) value!
966d7c96879SBram Moolenaar  let g:options = [['cmdheight', '1', '', '1', '2', 'global', 'setglobal']]
967d7c96879SBram Moolenaar  setglobal cmdheight=2
968d7c96879SBram Moolenaar  call assert_equal([], g:options)
969d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
970d7c96879SBram Moolenaar
971d7c96879SBram Moolenaar  " 23b: Setting local number global option"
972d7c96879SBram Moolenaar  noa setglobal cmdheight=8 " Reset global and local value (without triggering autocmd)
973d7c96879SBram Moolenaar  noa setlocal cmdheight=1 " Sets the global(!) value!
974d7c96879SBram Moolenaar  let g:options = [['cmdheight', '1', '1', '', '2', 'local', 'setlocal']]
975d7c96879SBram Moolenaar  setlocal cmdheight=2
976d7c96879SBram Moolenaar  call assert_equal([], g:options)
977d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
978d7c96879SBram Moolenaar
979d7c96879SBram Moolenaar  " 23c: Setting again number global option"
980d7c96879SBram Moolenaar  noa setglobal cmdheight=8 " Reset global and local value (without triggering autocmd)
981d7c96879SBram Moolenaar  noa setlocal cmdheight=1 " Sets the global(!) value!
982d7c96879SBram Moolenaar  let g:options = [['cmdheight', '1', '1', '1', '2', 'global', 'set']]
983d7c96879SBram Moolenaar  set cmdheight=2
984d7c96879SBram Moolenaar  call assert_equal([], g:options)
985d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
986d7c96879SBram Moolenaar
987d7c96879SBram Moolenaar  " 23d: Setting again number global option"
988d7c96879SBram Moolenaar  noa set cmdheight=8 " Reset global and local value (without triggering autocmd)
989d7c96879SBram Moolenaar  let g:options = [['cmdheight', '8', '8', '8', '2', 'global', 'set']]
990d7c96879SBram Moolenaar  set cmdheight=2
991d7c96879SBram Moolenaar  call assert_equal([], g:options)
992d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
993d7c96879SBram Moolenaar
994d7c96879SBram Moolenaar
995d7c96879SBram Moolenaar  " 24a: Setting global number global-local (to buffer) option"
996d7c96879SBram Moolenaar  noa setglobal undolevels=8 " Reset global and local value (without triggering autocmd)
997d7c96879SBram Moolenaar  noa setlocal undolevels=1
998d7c96879SBram Moolenaar  let g:options = [['undolevels', '8', '', '8', '2', 'global', 'setglobal']]
999d7c96879SBram Moolenaar  setglobal undolevels=2
1000d7c96879SBram Moolenaar  call assert_equal([], g:options)
1001d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
1002d7c96879SBram Moolenaar
1003d7c96879SBram Moolenaar  " 24b: Setting local number global-local (to buffer) option"
1004d7c96879SBram Moolenaar  noa setglobal undolevels=8 " Reset global and local value (without triggering autocmd)
1005d7c96879SBram Moolenaar  noa setlocal undolevels=1
1006d7c96879SBram Moolenaar  let g:options = [['undolevels', '1', '1', '', '2', 'local', 'setlocal']]
1007d7c96879SBram Moolenaar  setlocal undolevels=2
1008d7c96879SBram Moolenaar  call assert_equal([], g:options)
1009d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
1010d7c96879SBram Moolenaar
1011d7c96879SBram Moolenaar  " 24c: Setting again number global-local (to buffer) option"
1012d7c96879SBram Moolenaar  noa setglobal undolevels=8 " Reset global and local value (without triggering autocmd)
1013d7c96879SBram Moolenaar  noa setlocal undolevels=1
1014d7c96879SBram Moolenaar  let g:options = [['undolevels', '1', '1', '8', '2', 'global', 'set']]
1015d7c96879SBram Moolenaar  set undolevels=2
1016d7c96879SBram Moolenaar  call assert_equal([], g:options)
1017d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
1018d7c96879SBram Moolenaar
1019d7c96879SBram Moolenaar  " 24d: Setting again global number global-local (to buffer) option"
1020d7c96879SBram Moolenaar  noa set undolevels=8 " Reset global and local value (without triggering autocmd)
1021d7c96879SBram Moolenaar  let g:options = [['undolevels', '8', '8', '8', '2', 'global', 'set']]
1022d7c96879SBram Moolenaar  set undolevels=2
1023d7c96879SBram Moolenaar  call assert_equal([], g:options)
1024d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
1025d7c96879SBram Moolenaar
1026d7c96879SBram Moolenaar
1027d7c96879SBram Moolenaar  " 25a: Setting global number local (to buffer) option"
1028d7c96879SBram Moolenaar  noa setglobal wrapmargin=8 " Reset global and local value (without triggering autocmd)
1029d7c96879SBram Moolenaar  noa setlocal wrapmargin=1
1030d7c96879SBram Moolenaar  let g:options = [['wrapmargin', '8', '', '8', '2', 'global', 'setglobal']]
1031d7c96879SBram Moolenaar  setglobal wrapmargin=2
1032d7c96879SBram Moolenaar  call assert_equal([], g:options)
1033d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
1034d7c96879SBram Moolenaar
1035d7c96879SBram Moolenaar  " 25b: Setting local number local (to buffer) option"
1036d7c96879SBram Moolenaar  noa setglobal wrapmargin=8 " Reset global and local value (without triggering autocmd)
1037d7c96879SBram Moolenaar  noa setlocal wrapmargin=1
1038d7c96879SBram Moolenaar  let g:options = [['wrapmargin', '1', '1', '', '2', 'local', 'setlocal']]
1039d7c96879SBram Moolenaar  setlocal wrapmargin=2
1040d7c96879SBram Moolenaar  call assert_equal([], g:options)
1041d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
1042d7c96879SBram Moolenaar
1043d7c96879SBram Moolenaar  " 25c: Setting again number local (to buffer) option"
1044d7c96879SBram Moolenaar  noa setglobal wrapmargin=8 " Reset global and local value (without triggering autocmd)
1045d7c96879SBram Moolenaar  noa setlocal wrapmargin=1
1046d7c96879SBram Moolenaar  let g:options = [['wrapmargin', '1', '1', '8', '2', 'global', 'set']]
1047d7c96879SBram Moolenaar  set wrapmargin=2
1048d7c96879SBram Moolenaar  call assert_equal([], g:options)
1049d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
1050d7c96879SBram Moolenaar
1051d7c96879SBram Moolenaar  " 25d: Setting again global number local (to buffer) option"
1052d7c96879SBram Moolenaar  noa set wrapmargin=8 " Reset global and local value (without triggering autocmd)
1053d7c96879SBram Moolenaar  let g:options = [['wrapmargin', '8', '8', '8', '2', 'global', 'set']]
1054d7c96879SBram Moolenaar  set wrapmargin=2
1055d7c96879SBram Moolenaar  call assert_equal([], g:options)
1056d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
1057d7c96879SBram Moolenaar
1058d7c96879SBram Moolenaar
1059d7c96879SBram Moolenaar  " 26: Setting number global-local (to window) option.
1060d7c96879SBram Moolenaar  " Such option does currently not exist.
1061d7c96879SBram Moolenaar
1062d7c96879SBram Moolenaar
1063d7c96879SBram Moolenaar  " 27a: Setting global number local (to window) option"
1064d7c96879SBram Moolenaar  noa setglobal foldcolumn=8 " Reset global and local value (without triggering autocmd)
1065d7c96879SBram Moolenaar  noa setlocal foldcolumn=1
1066d7c96879SBram Moolenaar  let g:options = [['foldcolumn', '8', '', '8', '2', 'global', 'setglobal']]
1067d7c96879SBram Moolenaar  setglobal foldcolumn=2
1068d7c96879SBram Moolenaar  call assert_equal([], g:options)
1069d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
1070d7c96879SBram Moolenaar
1071d7c96879SBram Moolenaar  " 27b: Setting local number local (to window) option"
1072d7c96879SBram Moolenaar  noa setglobal foldcolumn=8 " Reset global and local value (without triggering autocmd)
1073d7c96879SBram Moolenaar  noa setlocal foldcolumn=1
1074d7c96879SBram Moolenaar  let g:options = [['foldcolumn', '1', '1', '', '2', 'local', 'setlocal']]
1075d7c96879SBram Moolenaar  setlocal foldcolumn=2
1076d7c96879SBram Moolenaar  call assert_equal([], g:options)
1077d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
1078d7c96879SBram Moolenaar
1079d7c96879SBram Moolenaar  " 27c: Setting again number local (to window) option"
1080d7c96879SBram Moolenaar  noa setglobal foldcolumn=8 " Reset global and local value (without triggering autocmd)
1081d7c96879SBram Moolenaar  noa setlocal foldcolumn=1
1082d7c96879SBram Moolenaar  let g:options = [['foldcolumn', '1', '1', '8', '2', 'global', 'set']]
1083d7c96879SBram Moolenaar  set foldcolumn=2
1084d7c96879SBram Moolenaar  call assert_equal([], g:options)
1085d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
1086d7c96879SBram Moolenaar
1087b811de5dSzeertzjq  " 27d: Setting again global number local (to window) option"
1088d7c96879SBram Moolenaar  noa set foldcolumn=8 " Reset global and local value (without triggering autocmd)
1089d7c96879SBram Moolenaar  let g:options = [['foldcolumn', '8', '8', '8', '2', 'global', 'set']]
1090d7c96879SBram Moolenaar  set foldcolumn=2
1091d7c96879SBram Moolenaar  call assert_equal([], g:options)
1092d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
1093d7c96879SBram Moolenaar
1094d7c96879SBram Moolenaar
1095d7c96879SBram Moolenaar  " 28a: Setting global boolean global option"
1096d7c96879SBram Moolenaar  noa setglobal nowrapscan " Reset global and local value (without triggering autocmd)
1097d7c96879SBram Moolenaar  noa setlocal wrapscan " Sets the global(!) value!
1098d7c96879SBram Moolenaar  let g:options = [['wrapscan', '1', '', '1', '0', 'global', 'setglobal']]
1099d7c96879SBram Moolenaar  setglobal nowrapscan
1100d7c96879SBram Moolenaar  call assert_equal([], g:options)
1101d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
1102d7c96879SBram Moolenaar
1103d7c96879SBram Moolenaar  " 28b: Setting local boolean global option"
1104d7c96879SBram Moolenaar  noa setglobal nowrapscan " Reset global and local value (without triggering autocmd)
1105d7c96879SBram Moolenaar  noa setlocal wrapscan " Sets the global(!) value!
1106d7c96879SBram Moolenaar  let g:options = [['wrapscan', '1', '1', '', '0', 'local', 'setlocal']]
1107d7c96879SBram Moolenaar  setlocal nowrapscan
1108d7c96879SBram Moolenaar  call assert_equal([], g:options)
1109d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
1110d7c96879SBram Moolenaar
1111d7c96879SBram Moolenaar  " 28c: Setting again boolean global option"
1112d7c96879SBram Moolenaar  noa setglobal nowrapscan " Reset global and local value (without triggering autocmd)
1113d7c96879SBram Moolenaar  noa setlocal wrapscan " Sets the global(!) value!
1114d7c96879SBram Moolenaar  let g:options = [['wrapscan', '1', '1', '1', '0', 'global', 'set']]
1115d7c96879SBram Moolenaar  set nowrapscan
1116d7c96879SBram Moolenaar  call assert_equal([], g:options)
1117d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
1118d7c96879SBram Moolenaar
1119d7c96879SBram Moolenaar  " 28d: Setting again global boolean global option"
1120d7c96879SBram Moolenaar  noa set nowrapscan " Reset global and local value (without triggering autocmd)
1121d7c96879SBram Moolenaar  let g:options = [['wrapscan', '0', '0', '0', '1', 'global', 'set']]
1122d7c96879SBram Moolenaar  set wrapscan
1123d7c96879SBram Moolenaar  call assert_equal([], g:options)
1124d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
1125d7c96879SBram Moolenaar
1126d7c96879SBram Moolenaar
1127d7c96879SBram Moolenaar  " 29a: Setting global boolean global-local (to buffer) option"
1128d7c96879SBram Moolenaar  noa setglobal noautoread " Reset global and local value (without triggering autocmd)
1129d7c96879SBram Moolenaar  noa setlocal autoread
1130d7c96879SBram Moolenaar  let g:options = [['autoread', '0', '', '0', '1', 'global', 'setglobal']]
1131d7c96879SBram Moolenaar  setglobal autoread
1132d7c96879SBram Moolenaar  call assert_equal([], g:options)
1133d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
1134d7c96879SBram Moolenaar
1135d7c96879SBram Moolenaar  " 29b: Setting local boolean global-local (to buffer) option"
1136d7c96879SBram Moolenaar  noa setglobal noautoread " Reset global and local value (without triggering autocmd)
1137d7c96879SBram Moolenaar  noa setlocal autoread
1138d7c96879SBram Moolenaar  let g:options = [['autoread', '1', '1', '', '0', 'local', 'setlocal']]
1139d7c96879SBram Moolenaar  setlocal noautoread
1140d7c96879SBram Moolenaar  call assert_equal([], g:options)
1141d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
1142d7c96879SBram Moolenaar
1143d7c96879SBram Moolenaar  " 29c: Setting again boolean global-local (to buffer) option"
1144d7c96879SBram Moolenaar  noa setglobal noautoread " Reset global and local value (without triggering autocmd)
1145d7c96879SBram Moolenaar  noa setlocal autoread
1146d7c96879SBram Moolenaar  let g:options = [['autoread', '1', '1', '0', '1', 'global', 'set']]
1147d7c96879SBram Moolenaar  set autoread
1148d7c96879SBram Moolenaar  call assert_equal([], g:options)
1149d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
1150d7c96879SBram Moolenaar
1151d7c96879SBram Moolenaar  " 29d: Setting again global boolean global-local (to buffer) option"
1152d7c96879SBram Moolenaar  noa set noautoread " Reset global and local value (without triggering autocmd)
1153d7c96879SBram Moolenaar  let g:options = [['autoread', '0', '0', '0', '1', 'global', 'set']]
1154d7c96879SBram Moolenaar  set autoread
1155d7c96879SBram Moolenaar  call assert_equal([], g:options)
1156d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
1157d7c96879SBram Moolenaar
1158d7c96879SBram Moolenaar
1159d7c96879SBram Moolenaar  " 30a: Setting global boolean local (to buffer) option"
1160d7c96879SBram Moolenaar  noa setglobal nocindent " Reset global and local value (without triggering autocmd)
1161d7c96879SBram Moolenaar  noa setlocal cindent
1162d7c96879SBram Moolenaar  let g:options = [['cindent', '0', '', '0', '1', 'global', 'setglobal']]
1163d7c96879SBram Moolenaar  setglobal cindent
1164d7c96879SBram Moolenaar  call assert_equal([], g:options)
1165d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
1166d7c96879SBram Moolenaar
1167d7c96879SBram Moolenaar  " 30b: Setting local boolean local (to buffer) option"
1168d7c96879SBram Moolenaar  noa setglobal nocindent " Reset global and local value (without triggering autocmd)
1169d7c96879SBram Moolenaar  noa setlocal cindent
1170d7c96879SBram Moolenaar  let g:options = [['cindent', '1', '1', '', '0', 'local', 'setlocal']]
1171d7c96879SBram Moolenaar  setlocal nocindent
1172d7c96879SBram Moolenaar  call assert_equal([], g:options)
1173d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
1174d7c96879SBram Moolenaar
1175d7c96879SBram Moolenaar  " 30c: Setting again boolean local (to buffer) option"
1176d7c96879SBram Moolenaar  noa setglobal nocindent " Reset global and local value (without triggering autocmd)
1177d7c96879SBram Moolenaar  noa setlocal cindent
1178d7c96879SBram Moolenaar  let g:options = [['cindent', '1', '1', '0', '1', 'global', 'set']]
1179d7c96879SBram Moolenaar  set cindent
1180d7c96879SBram Moolenaar  call assert_equal([], g:options)
1181d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
1182d7c96879SBram Moolenaar
1183d7c96879SBram Moolenaar  " 30d: Setting again global boolean local (to buffer) option"
1184d7c96879SBram Moolenaar  noa set nocindent " Reset global and local value (without triggering autocmd)
1185d7c96879SBram Moolenaar  let g:options = [['cindent', '0', '0', '0', '1', 'global', 'set']]
1186d7c96879SBram Moolenaar  set cindent
1187d7c96879SBram Moolenaar  call assert_equal([], g:options)
1188d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
1189d7c96879SBram Moolenaar
1190d7c96879SBram Moolenaar
1191d7c96879SBram Moolenaar  " 31: Setting boolean global-local (to window) option
1192d7c96879SBram Moolenaar  " Currently no such option exists.
1193d7c96879SBram Moolenaar
1194d7c96879SBram Moolenaar
1195d7c96879SBram Moolenaar  " 32a: Setting global boolean local (to window) option"
1196d7c96879SBram Moolenaar  noa setglobal nocursorcolumn " Reset global and local value (without triggering autocmd)
1197d7c96879SBram Moolenaar  noa setlocal cursorcolumn
1198d7c96879SBram Moolenaar  let g:options = [['cursorcolumn', '0', '', '0', '1', 'global', 'setglobal']]
1199d7c96879SBram Moolenaar  setglobal cursorcolumn
1200d7c96879SBram Moolenaar  call assert_equal([], g:options)
1201d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
1202d7c96879SBram Moolenaar
1203d7c96879SBram Moolenaar  " 32b: Setting local boolean local (to window) option"
1204d7c96879SBram Moolenaar  noa setglobal nocursorcolumn " Reset global and local value (without triggering autocmd)
1205d7c96879SBram Moolenaar  noa setlocal cursorcolumn
1206d7c96879SBram Moolenaar  let g:options = [['cursorcolumn', '1', '1', '', '0', 'local', 'setlocal']]
1207d7c96879SBram Moolenaar  setlocal nocursorcolumn
1208d7c96879SBram Moolenaar  call assert_equal([], g:options)
1209d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
1210d7c96879SBram Moolenaar
1211d7c96879SBram Moolenaar  " 32c: Setting again boolean local (to window) option"
1212d7c96879SBram Moolenaar  noa setglobal nocursorcolumn " Reset global and local value (without triggering autocmd)
1213d7c96879SBram Moolenaar  noa setlocal cursorcolumn
1214d7c96879SBram Moolenaar  let g:options = [['cursorcolumn', '1', '1', '0', '1', 'global', 'set']]
1215d7c96879SBram Moolenaar  set cursorcolumn
1216d7c96879SBram Moolenaar  call assert_equal([], g:options)
1217d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
1218d7c96879SBram Moolenaar
1219d7c96879SBram Moolenaar  " 32d: Setting again global boolean local (to window) option"
1220d7c96879SBram Moolenaar  noa set nocursorcolumn " Reset global and local value (without triggering autocmd)
1221d7c96879SBram Moolenaar  let g:options = [['cursorcolumn', '0', '0', '0', '1', 'global', 'set']]
1222d7c96879SBram Moolenaar  set cursorcolumn
1223d7c96879SBram Moolenaar  call assert_equal([], g:options)
1224d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
1225d7c96879SBram Moolenaar
1226d7c96879SBram Moolenaar
12271bc353b6SBram Moolenaar  " 33: Test autocommands when an option value is converted internally.
1228d7c96879SBram Moolenaar  noa set backspace=1 " Reset global and local value (without triggering autocmd)
1229d7c96879SBram Moolenaar  let g:options = [['backspace', 'indent,eol', 'indent,eol', 'indent,eol', '2', 'global', 'set']]
1230d7c96879SBram Moolenaar  set backspace=2
1231d7c96879SBram Moolenaar  call assert_equal([], g:options)
1232d7c96879SBram Moolenaar  call assert_equal(g:opt[0], g:opt[1])
1233d7c96879SBram Moolenaar
1234d7c96879SBram Moolenaar
123504f62f88SBram Moolenaar  " Cleanup
123604f62f88SBram Moolenaar  au! OptionSet
12370331faf7SBram Moolenaar  " set tags&
1238d7c96879SBram Moolenaar  for opt in ['nu', 'ai', 'acd', 'ar', 'bs', 'backup', 'cul', 'cp', 'backupext', 'tags', 'spelllang', 'statusline', 'foldignore', 'cmdheight', 'undolevels', 'wrapmargin', 'foldcolumn', 'wrapscan', 'autoread', 'cindent', 'cursorcolumn']
123991d2e783SBram Moolenaar    exe printf(":set %s&vim", opt)
124004f62f88SBram Moolenaar  endfor
124104f62f88SBram Moolenaar  call test_override('starting', 0)
124204f62f88SBram Moolenaar  delfunc! AutoCommandOptionSet
124304f62f88SBram Moolenaarendfunc
124404f62f88SBram Moolenaar
124504f62f88SBram Moolenaarfunc Test_OptionSet_diffmode()
124604f62f88SBram Moolenaar  call test_override('starting', 1)
124726d98218SBram Moolenaar  " 18: Changing an option when entering diff mode
124804f62f88SBram Moolenaar  new
124904f62f88SBram Moolenaar  au OptionSet diff :let &l:cul = v:option_new
125004f62f88SBram Moolenaar
125104f62f88SBram Moolenaar  call setline(1, ['buffer 1', 'line2', 'line3', 'line4'])
125204f62f88SBram Moolenaar  call assert_equal(0, &l:cul)
125304f62f88SBram Moolenaar  diffthis
125404f62f88SBram Moolenaar  call assert_equal(1, &l:cul)
125504f62f88SBram Moolenaar
125604f62f88SBram Moolenaar  vnew
125704f62f88SBram Moolenaar  call setline(1, ['buffer 2', 'line 2', 'line 3', 'line4'])
125804f62f88SBram Moolenaar  call assert_equal(0, &l:cul)
125904f62f88SBram Moolenaar  diffthis
126004f62f88SBram Moolenaar  call assert_equal(1, &l:cul)
126104f62f88SBram Moolenaar
126204f62f88SBram Moolenaar  diffoff
126304f62f88SBram Moolenaar  call assert_equal(0, &l:cul)
126404f62f88SBram Moolenaar  call assert_equal(1, getwinvar(2, '&l:cul'))
126504f62f88SBram Moolenaar  bw!
126604f62f88SBram Moolenaar
126704f62f88SBram Moolenaar  call assert_equal(1, &l:cul)
126804f62f88SBram Moolenaar  diffoff!
126904f62f88SBram Moolenaar  call assert_equal(0, &l:cul)
127004f62f88SBram Moolenaar  call assert_equal(0, getwinvar(1, '&l:cul'))
127104f62f88SBram Moolenaar  bw!
127204f62f88SBram Moolenaar
127304f62f88SBram Moolenaar  " Cleanup
127404f62f88SBram Moolenaar  au! OptionSet
127504f62f88SBram Moolenaar  call test_override('starting', 0)
127604f62f88SBram Moolenaarendfunc
127704f62f88SBram Moolenaar
127804f62f88SBram Moolenaarfunc Test_OptionSet_diffmode_close()
127904f62f88SBram Moolenaar  call test_override('starting', 1)
128004f62f88SBram Moolenaar  " 19: Try to close the current window when entering diff mode
128104f62f88SBram Moolenaar  " should not segfault
128204f62f88SBram Moolenaar  new
128304f62f88SBram Moolenaar  au OptionSet diff close
128404f62f88SBram Moolenaar
128504f62f88SBram Moolenaar  call setline(1, ['buffer 1', 'line2', 'line3', 'line4'])
1286e2e4075fSBram Moolenaar  call assert_fails(':diffthis', 'E788:')
128704f62f88SBram Moolenaar  call assert_equal(1, &diff)
128804f62f88SBram Moolenaar  vnew
128904f62f88SBram Moolenaar  call setline(1, ['buffer 2', 'line 2', 'line 3', 'line4'])
1290e2e4075fSBram Moolenaar  call assert_fails(':diffthis', 'E788:')
129104f62f88SBram Moolenaar  call assert_equal(1, &diff)
1292a9aa86ffSBram Moolenaar  set diffopt-=closeoff
129304f62f88SBram Moolenaar  bw!
1294e2e4075fSBram Moolenaar  call assert_fails(':diffoff!', 'E788:')
129504f62f88SBram Moolenaar  bw!
129604f62f88SBram Moolenaar
129704f62f88SBram Moolenaar  " Cleanup
129804f62f88SBram Moolenaar  au! OptionSet
129904f62f88SBram Moolenaar  call test_override('starting', 0)
130004f62f88SBram Moolenaar  "delfunc! AutoCommandOptionSet
130104f62f88SBram Moolenaarendfunc
13024a137b45SBram Moolenaar
13034a137b45SBram Moolenaar" Test for Bufleave autocommand that deletes the buffer we are about to edit.
13044a137b45SBram Moolenaarfunc Test_BufleaveWithDelete()
13054a137b45SBram Moolenaar  new | edit Xfile1
13064a137b45SBram Moolenaar
13074a137b45SBram Moolenaar  augroup test_bufleavewithdelete
13084a137b45SBram Moolenaar      autocmd!
13094a137b45SBram Moolenaar      autocmd BufLeave Xfile1 bwipe Xfile2
13104a137b45SBram Moolenaar  augroup END
13114a137b45SBram Moolenaar
13124a137b45SBram Moolenaar  call assert_fails('edit Xfile2', 'E143:')
13134a137b45SBram Moolenaar  call assert_equal('Xfile1', bufname('%'))
13144a137b45SBram Moolenaar
13154a137b45SBram Moolenaar  autocmd! test_bufleavewithdelete BufLeave Xfile1
13164a137b45SBram Moolenaar  augroup! test_bufleavewithdelete
13174a137b45SBram Moolenaar
13184a137b45SBram Moolenaar  new
13194a137b45SBram Moolenaar  bwipe! Xfile1
13204a137b45SBram Moolenaarendfunc
13214a6fcf80SBram Moolenaar
13224a6fcf80SBram Moolenaar" Test for autocommand that changes the buffer list, when doing ":ball".
13234a6fcf80SBram Moolenaarfunc Test_Acmd_BufAll()
13244a6fcf80SBram Moolenaar  enew!
13254a6fcf80SBram Moolenaar  %bwipe!
13264a6fcf80SBram Moolenaar  call writefile(['Test file Xxx1'], 'Xxx1')
13274a6fcf80SBram Moolenaar  call writefile(['Test file Xxx2'], 'Xxx2')
13284a6fcf80SBram Moolenaar  call writefile(['Test file Xxx3'], 'Xxx3')
13294a6fcf80SBram Moolenaar
13304a6fcf80SBram Moolenaar  " Add three files to the buffer list
13314a6fcf80SBram Moolenaar  split Xxx1
13324a6fcf80SBram Moolenaar  close
13334a6fcf80SBram Moolenaar  split Xxx2
13344a6fcf80SBram Moolenaar  close
13354a6fcf80SBram Moolenaar  split Xxx3
13364a6fcf80SBram Moolenaar  close
13374a6fcf80SBram Moolenaar
13384a6fcf80SBram Moolenaar  " Wipe the buffer when the buffer is opened
13394a6fcf80SBram Moolenaar  au BufReadPost Xxx2 bwipe
13404a6fcf80SBram Moolenaar
13414a6fcf80SBram Moolenaar  call append(0, 'Test file Xxx4')
13424a6fcf80SBram Moolenaar  ball
13434a6fcf80SBram Moolenaar
13444a6fcf80SBram Moolenaar  call assert_equal(2, winnr('$'))
13454a6fcf80SBram Moolenaar  call assert_equal('Xxx1', bufname(winbufnr(winnr('$'))))
13464a6fcf80SBram Moolenaar  wincmd t
13474a6fcf80SBram Moolenaar
13484a6fcf80SBram Moolenaar  au! BufReadPost
13494a6fcf80SBram Moolenaar  %bwipe!
13504a6fcf80SBram Moolenaar  call delete('Xxx1')
13514a6fcf80SBram Moolenaar  call delete('Xxx2')
13524a6fcf80SBram Moolenaar  call delete('Xxx3')
13534a6fcf80SBram Moolenaar  enew! | only
13544a6fcf80SBram Moolenaarendfunc
13554a6fcf80SBram Moolenaar
13564a6fcf80SBram Moolenaar" Test for autocommand that changes current buffer on BufEnter event.
13574a6fcf80SBram Moolenaar" Check if modelines are interpreted for the correct buffer.
13584a6fcf80SBram Moolenaarfunc Test_Acmd_BufEnter()
13594a6fcf80SBram Moolenaar  %bwipe!
13604a6fcf80SBram Moolenaar  call writefile(['start of test file Xxx1',
13614a6fcf80SBram Moolenaar	      \ "\<Tab>this is a test",
13624a6fcf80SBram Moolenaar	      \ 'end of test file Xxx1'], 'Xxx1')
13634a6fcf80SBram Moolenaar  call writefile(['start of test file Xxx2',
13644a6fcf80SBram Moolenaar	      \ 'vim: set noai :',
13654a6fcf80SBram Moolenaar	      \ "\<Tab>this is a test",
13664a6fcf80SBram Moolenaar	      \ 'end of test file Xxx2'], 'Xxx2')
13674a6fcf80SBram Moolenaar
13684a6fcf80SBram Moolenaar  au BufEnter Xxx2 brew
13694a6fcf80SBram Moolenaar  set ai modeline modelines=3
13704a6fcf80SBram Moolenaar  edit Xxx1
13714a6fcf80SBram Moolenaar  " edit Xxx2, autocmd will do :brew
13724a6fcf80SBram Moolenaar  edit Xxx2
13734a6fcf80SBram Moolenaar  exe "normal G?this is a\<CR>"
13744a6fcf80SBram Moolenaar  " Append text with autoindent to this file
13754a6fcf80SBram Moolenaar  normal othis should be auto-indented
13764a6fcf80SBram Moolenaar  call assert_equal("\<Tab>this should be auto-indented", getline('.'))
13774a6fcf80SBram Moolenaar  call assert_equal(3, line('.'))
13784a6fcf80SBram Moolenaar  " Remove autocmd and edit Xxx2 again
13794a6fcf80SBram Moolenaar  au! BufEnter Xxx2
13804a6fcf80SBram Moolenaar  buf! Xxx2
13814a6fcf80SBram Moolenaar  exe "normal G?this is a\<CR>"
13824a6fcf80SBram Moolenaar  " append text without autoindent to Xxx
13834a6fcf80SBram Moolenaar  normal othis should be in column 1
13844a6fcf80SBram Moolenaar  call assert_equal("this should be in column 1", getline('.'))
13854a6fcf80SBram Moolenaar  call assert_equal(4, line('.'))
13864a6fcf80SBram Moolenaar
13874a6fcf80SBram Moolenaar  %bwipe!
13884a6fcf80SBram Moolenaar  call delete('Xxx1')
13894a6fcf80SBram Moolenaar  call delete('Xxx2')
13904a6fcf80SBram Moolenaar  set ai&vim modeline&vim modelines&vim
13914a6fcf80SBram Moolenaarendfunc
13924a6fcf80SBram Moolenaar
13934a6fcf80SBram Moolenaar" Test for issue #57
13944a6fcf80SBram Moolenaar" do not move cursor on <c-o> when autoindent is set
13954a6fcf80SBram Moolenaarfunc Test_ai_CTRL_O()
13964a6fcf80SBram Moolenaar  enew!
13974a6fcf80SBram Moolenaar  set ai
13984a6fcf80SBram Moolenaar  let save_fo = &fo
13994a6fcf80SBram Moolenaar  set fo+=r
14004a6fcf80SBram Moolenaar  exe "normal o# abcdef\<Esc>2hi\<CR>\<C-O>d0\<Esc>"
14014a6fcf80SBram Moolenaar  exe "normal o# abcdef\<Esc>2hi\<C-O>d0\<Esc>"
14024a6fcf80SBram Moolenaar  call assert_equal(['# abc', 'def', 'def'], getline(2, 4))
14034a6fcf80SBram Moolenaar
14044a6fcf80SBram Moolenaar  set ai&vim
14054a6fcf80SBram Moolenaar  let &fo = save_fo
14064a6fcf80SBram Moolenaar  enew!
14074a6fcf80SBram Moolenaarendfunc
14084a6fcf80SBram Moolenaar
14094a6fcf80SBram Moolenaar" Test for autocommand that deletes the current buffer on BufLeave event.
14104a6fcf80SBram Moolenaar" Also test deleting the last buffer, should give a new, empty buffer.
14114a6fcf80SBram Moolenaarfunc Test_BufLeave_Wipe()
14124a6fcf80SBram Moolenaar  %bwipe!
14134a6fcf80SBram Moolenaar  let content = ['start of test file Xxx',
14144a6fcf80SBram Moolenaar	      \ 'this is a test',
14154a6fcf80SBram Moolenaar	      \ 'end of test file Xxx']
14164a6fcf80SBram Moolenaar  call writefile(content, 'Xxx1')
14174a6fcf80SBram Moolenaar  call writefile(content, 'Xxx2')
14184a6fcf80SBram Moolenaar
14194a6fcf80SBram Moolenaar  au BufLeave Xxx2 bwipe
14204a6fcf80SBram Moolenaar  edit Xxx1
14214a6fcf80SBram Moolenaar  split Xxx2
14224a6fcf80SBram Moolenaar  " delete buffer Xxx2, we should be back to Xxx1
14234a6fcf80SBram Moolenaar  bwipe
14244a6fcf80SBram Moolenaar  call assert_equal('Xxx1', bufname('%'))
14254a6fcf80SBram Moolenaar  call assert_equal(1, winnr('$'))
14264a6fcf80SBram Moolenaar
14274a6fcf80SBram Moolenaar  " Create an alternate buffer
14284a6fcf80SBram Moolenaar  %write! test.out
14294a6fcf80SBram Moolenaar  call assert_equal('test.out', bufname('#'))
14304a6fcf80SBram Moolenaar  " delete alternate buffer
14314a6fcf80SBram Moolenaar  bwipe test.out
14324a6fcf80SBram Moolenaar  call assert_equal('Xxx1', bufname('%'))
14334a6fcf80SBram Moolenaar  call assert_equal('', bufname('#'))
14344a6fcf80SBram Moolenaar
14354a6fcf80SBram Moolenaar  au BufLeave Xxx1 bwipe
14364a6fcf80SBram Moolenaar  " delete current buffer, get an empty one
14374a6fcf80SBram Moolenaar  bwipe!
14384a6fcf80SBram Moolenaar  call assert_equal(1, line('$'))
14394a6fcf80SBram Moolenaar  call assert_equal('', bufname('%'))
1440b2c8750cSBram Moolenaar  let g:bufinfo = getbufinfo()
1441b2c8750cSBram Moolenaar  call assert_equal(1, len(g:bufinfo))
14424a6fcf80SBram Moolenaar
14434a6fcf80SBram Moolenaar  call delete('Xxx1')
14444a6fcf80SBram Moolenaar  call delete('Xxx2')
144553f0c962SBram Moolenaar  call delete('test.out')
14464a6fcf80SBram Moolenaar  %bwipe
14474a6fcf80SBram Moolenaar  au! BufLeave
1448b2c8750cSBram Moolenaar
1449b2c8750cSBram Moolenaar  " check that bufinfo doesn't contain a pointer to freed memory
1450b2c8750cSBram Moolenaar  call test_garbagecollect_now()
14514a6fcf80SBram Moolenaarendfunc
145287ffb5c1SBram Moolenaar
145387ffb5c1SBram Moolenaarfunc Test_QuitPre()
145487ffb5c1SBram Moolenaar  edit Xfoo
145587ffb5c1SBram Moolenaar  let winid = win_getid(winnr())
145687ffb5c1SBram Moolenaar  split Xbar
145787ffb5c1SBram Moolenaar  au! QuitPre * let g:afile = expand('<afile>')
145887ffb5c1SBram Moolenaar  " Close the other window, <afile> should be correct.
145987ffb5c1SBram Moolenaar  exe win_id2win(winid) . 'q'
146087ffb5c1SBram Moolenaar  call assert_equal('Xfoo', g:afile)
146187ffb5c1SBram Moolenaar
146287ffb5c1SBram Moolenaar  unlet g:afile
146387ffb5c1SBram Moolenaar  bwipe Xfoo
146487ffb5c1SBram Moolenaar  bwipe Xbar
146587ffb5c1SBram Moolenaarendfunc
1466fafcf0ddSBram Moolenaar
1467fafcf0ddSBram Moolenaarfunc Test_Cmdline()
1468153b704eSBram Moolenaar  au! CmdlineChanged : let g:text = getcmdline()
1469153b704eSBram Moolenaar  let g:text = 0
1470153b704eSBram Moolenaar  call feedkeys(":echom 'hello'\<CR>", 'xt')
1471153b704eSBram Moolenaar  call assert_equal("echom 'hello'", g:text)
1472153b704eSBram Moolenaar  au! CmdlineChanged
1473153b704eSBram Moolenaar
1474153b704eSBram Moolenaar  au! CmdlineChanged : let g:entered = expand('<afile>')
1475153b704eSBram Moolenaar  let g:entered = 0
1476153b704eSBram Moolenaar  call feedkeys(":echom 'hello'\<CR>", 'xt')
1477153b704eSBram Moolenaar  call assert_equal(':', g:entered)
1478153b704eSBram Moolenaar  au! CmdlineChanged
1479153b704eSBram Moolenaar
1480fafcf0ddSBram Moolenaar  au! CmdlineEnter : let g:entered = expand('<afile>')
1481fafcf0ddSBram Moolenaar  au! CmdlineLeave : let g:left = expand('<afile>')
1482fafcf0ddSBram Moolenaar  let g:entered = 0
1483fafcf0ddSBram Moolenaar  let g:left = 0
1484fafcf0ddSBram Moolenaar  call feedkeys(":echo 'hello'\<CR>", 'xt')
1485fafcf0ddSBram Moolenaar  call assert_equal(':', g:entered)
1486fafcf0ddSBram Moolenaar  call assert_equal(':', g:left)
1487fafcf0ddSBram Moolenaar  au! CmdlineEnter
1488fafcf0ddSBram Moolenaar  au! CmdlineLeave
1489fafcf0ddSBram Moolenaar
1490a4baf5b3SBram Moolenaar  let save_shellslash = &shellslash
1491a4baf5b3SBram Moolenaar  set noshellslash
1492fafcf0ddSBram Moolenaar  au! CmdlineEnter / let g:entered = expand('<afile>')
1493fafcf0ddSBram Moolenaar  au! CmdlineLeave / let g:left = expand('<afile>')
1494fafcf0ddSBram Moolenaar  let g:entered = 0
1495fafcf0ddSBram Moolenaar  let g:left = 0
149653f0c962SBram Moolenaar  new
149753f0c962SBram Moolenaar  call setline(1, 'hello')
149853f0c962SBram Moolenaar  call feedkeys("/hello\<CR>", 'xt')
1499fafcf0ddSBram Moolenaar  call assert_equal('/', g:entered)
1500fafcf0ddSBram Moolenaar  call assert_equal('/', g:left)
150153f0c962SBram Moolenaar  bwipe!
1502fafcf0ddSBram Moolenaar  au! CmdlineEnter
1503fafcf0ddSBram Moolenaar  au! CmdlineLeave
1504a4baf5b3SBram Moolenaar  let &shellslash = save_shellslash
1505fafcf0ddSBram Moolenaarendfunc
150653f0c962SBram Moolenaar
150753f0c962SBram Moolenaar" Test for BufWritePre autocommand that deletes or unloads the buffer.
150853f0c962SBram Moolenaarfunc Test_BufWritePre()
150953f0c962SBram Moolenaar  %bwipe
151053f0c962SBram Moolenaar  au BufWritePre Xxx1 bunload
151153f0c962SBram Moolenaar  au BufWritePre Xxx2 bwipe
151253f0c962SBram Moolenaar
151353f0c962SBram Moolenaar  call writefile(['start of Xxx1', 'test', 'end of Xxx1'], 'Xxx1')
151453f0c962SBram Moolenaar  call writefile(['start of Xxx2', 'test', 'end of Xxx2'], 'Xxx2')
151553f0c962SBram Moolenaar
151653f0c962SBram Moolenaar  edit Xtest
151753f0c962SBram Moolenaar  e! Xxx2
151853f0c962SBram Moolenaar  bdel Xtest
151953f0c962SBram Moolenaar  e Xxx1
152053f0c962SBram Moolenaar  " write it, will unload it and give an error msg
1521e2e4075fSBram Moolenaar  call assert_fails('w', 'E203:')
152253f0c962SBram Moolenaar  call assert_equal('Xxx2', bufname('%'))
152353f0c962SBram Moolenaar  edit Xtest
152453f0c962SBram Moolenaar  e! Xxx2
152553f0c962SBram Moolenaar  bwipe Xtest
152653f0c962SBram Moolenaar  " write it, will delete the buffer and give an error msg
1527e2e4075fSBram Moolenaar  call assert_fails('w', 'E203:')
152853f0c962SBram Moolenaar  call assert_equal('Xxx1', bufname('%'))
152953f0c962SBram Moolenaar  au! BufWritePre
153053f0c962SBram Moolenaar  call delete('Xxx1')
153153f0c962SBram Moolenaar  call delete('Xxx2')
153253f0c962SBram Moolenaarendfunc
153353f0c962SBram Moolenaar
153453f0c962SBram Moolenaar" Test for BufUnload autocommand that unloads all the other buffers
153553f0c962SBram Moolenaarfunc Test_bufunload_all()
1536f08b0eb8SBram Moolenaar  let g:test_is_flaky = 1
153753f0c962SBram Moolenaar  call writefile(['Test file Xxx1'], 'Xxx1')"
153853f0c962SBram Moolenaar  call writefile(['Test file Xxx2'], 'Xxx2')"
153953f0c962SBram Moolenaar
1540c79745a8SBram Moolenaar  let content =<< trim [CODE]
1541c79745a8SBram Moolenaar    func UnloadAllBufs()
1542c79745a8SBram Moolenaar      let i = 1
1543c79745a8SBram Moolenaar      while i <= bufnr('$')
1544c79745a8SBram Moolenaar        if i != bufnr('%') && bufloaded(i)
1545c79745a8SBram Moolenaar          exe  i . 'bunload'
1546c79745a8SBram Moolenaar        endif
1547c79745a8SBram Moolenaar        let i += 1
1548c79745a8SBram Moolenaar      endwhile
1549c79745a8SBram Moolenaar    endfunc
1550c79745a8SBram Moolenaar    au BufUnload * call UnloadAllBufs()
1551c79745a8SBram Moolenaar    au VimLeave * call writefile(['Test Finished'], 'Xout')
1552c79745a8SBram Moolenaar    edit Xxx1
1553c79745a8SBram Moolenaar    split Xxx2
1554c79745a8SBram Moolenaar    q
1555c79745a8SBram Moolenaar  [CODE]
1556c79745a8SBram Moolenaar
155753f0c962SBram Moolenaar  call writefile(content, 'Xtest')
155853f0c962SBram Moolenaar
155953f0c962SBram Moolenaar  call delete('Xout')
156093344c2dSBram Moolenaar  call system(GetVimCommandClean() .. ' -N --not-a-term -S Xtest')
156153f0c962SBram Moolenaar  call assert_true(filereadable('Xout'))
156253f0c962SBram Moolenaar
156353f0c962SBram Moolenaar  call delete('Xxx1')
156453f0c962SBram Moolenaar  call delete('Xxx2')
156553f0c962SBram Moolenaar  call delete('Xtest')
156653f0c962SBram Moolenaar  call delete('Xout')
156753f0c962SBram Moolenaarendfunc
156853f0c962SBram Moolenaar
156953f0c962SBram Moolenaar" Some tests for buffer-local autocommands
157053f0c962SBram Moolenaarfunc Test_buflocal_autocmd()
157153f0c962SBram Moolenaar  let g:bname = ''
157253f0c962SBram Moolenaar  edit xx
157353f0c962SBram Moolenaar  au BufLeave <buffer> let g:bname = expand("%")
157453f0c962SBram Moolenaar  " here, autocommand for xx should trigger.
157553f0c962SBram Moolenaar  " but autocommand shall not apply to buffer named <buffer>.
157653f0c962SBram Moolenaar  edit somefile
157753f0c962SBram Moolenaar  call assert_equal('xx', g:bname)
157853f0c962SBram Moolenaar  let g:bname = ''
157953f0c962SBram Moolenaar  " here, autocommand shall be auto-deleted
158053f0c962SBram Moolenaar  bwipe xx
158153f0c962SBram Moolenaar  " autocmd should not trigger
158253f0c962SBram Moolenaar  edit xx
158353f0c962SBram Moolenaar  call assert_equal('', g:bname)
158453f0c962SBram Moolenaar  " autocmd should not trigger
158553f0c962SBram Moolenaar  edit somefile
158653f0c962SBram Moolenaar  call assert_equal('', g:bname)
158753f0c962SBram Moolenaar  enew
158853f0c962SBram Moolenaar  unlet g:bname
158953f0c962SBram Moolenaarendfunc
1590430dc5d3SBram Moolenaar
1591430dc5d3SBram Moolenaar" Test for "*Cmd" autocommands
1592430dc5d3SBram Moolenaarfunc Test_Cmd_Autocmds()
1593430dc5d3SBram Moolenaar  call writefile(['start of Xxx', "\tabc2", 'end of Xxx'], 'Xxx')
1594430dc5d3SBram Moolenaar
1595430dc5d3SBram Moolenaar  enew!
1596430dc5d3SBram Moolenaar  au BufReadCmd XtestA 0r Xxx|$del
1597430dc5d3SBram Moolenaar  edit XtestA			" will read text of Xxd instead
1598430dc5d3SBram Moolenaar  call assert_equal('start of Xxx', getline(1))
1599430dc5d3SBram Moolenaar
1600430dc5d3SBram Moolenaar  au BufWriteCmd XtestA call append(line("$"), "write")
1601430dc5d3SBram Moolenaar  write				" will append a line to the file
1602430dc5d3SBram Moolenaar  call assert_equal('write', getline('$'))
1603e2e4075fSBram Moolenaar  call assert_fails('read XtestA', 'E484:')	" should not read anything
1604430dc5d3SBram Moolenaar  call assert_equal('write', getline(4))
1605430dc5d3SBram Moolenaar
1606430dc5d3SBram Moolenaar  " now we have:
1607430dc5d3SBram Moolenaar  " 1	start of Xxx
1608430dc5d3SBram Moolenaar  " 2		abc2
1609430dc5d3SBram Moolenaar  " 3	end of Xxx
1610430dc5d3SBram Moolenaar  " 4	write
1611430dc5d3SBram Moolenaar
1612430dc5d3SBram Moolenaar  au FileReadCmd XtestB '[r Xxx
1613430dc5d3SBram Moolenaar  2r XtestB			" will read Xxx below line 2 instead
1614430dc5d3SBram Moolenaar  call assert_equal('start of Xxx', getline(3))
1615430dc5d3SBram Moolenaar
1616430dc5d3SBram Moolenaar  " now we have:
1617430dc5d3SBram Moolenaar  " 1	start of Xxx
1618430dc5d3SBram Moolenaar  " 2		abc2
1619430dc5d3SBram Moolenaar  " 3	start of Xxx
1620430dc5d3SBram Moolenaar  " 4		abc2
1621430dc5d3SBram Moolenaar  " 5	end of Xxx
1622430dc5d3SBram Moolenaar  " 6	end of Xxx
1623430dc5d3SBram Moolenaar  " 7	write
1624430dc5d3SBram Moolenaar
1625430dc5d3SBram Moolenaar  au FileWriteCmd XtestC '[,']copy $
1626430dc5d3SBram Moolenaar  normal 4GA1
1627430dc5d3SBram Moolenaar  4,5w XtestC			" will copy lines 4 and 5 to the end
1628430dc5d3SBram Moolenaar  call assert_equal("\tabc21", getline(8))
1629e2e4075fSBram Moolenaar  call assert_fails('r XtestC', 'E484:')	" should not read anything
1630430dc5d3SBram Moolenaar  call assert_equal("end of Xxx", getline(9))
1631430dc5d3SBram Moolenaar
1632430dc5d3SBram Moolenaar  " now we have:
1633430dc5d3SBram Moolenaar  " 1	start of Xxx
1634430dc5d3SBram Moolenaar  " 2		abc2
1635430dc5d3SBram Moolenaar  " 3	start of Xxx
1636430dc5d3SBram Moolenaar  " 4		abc21
1637430dc5d3SBram Moolenaar  " 5	end of Xxx
1638430dc5d3SBram Moolenaar  " 6	end of Xxx
1639430dc5d3SBram Moolenaar  " 7	write
1640430dc5d3SBram Moolenaar  " 8		abc21
1641430dc5d3SBram Moolenaar  " 9	end of Xxx
1642430dc5d3SBram Moolenaar
1643430dc5d3SBram Moolenaar  let g:lines = []
1644430dc5d3SBram Moolenaar  au FileAppendCmd XtestD call extend(g:lines, getline(line("'["), line("']")))
1645430dc5d3SBram Moolenaar  w >>XtestD			" will add lines to 'lines'
1646430dc5d3SBram Moolenaar  call assert_equal(9, len(g:lines))
1647e2e4075fSBram Moolenaar  call assert_fails('$r XtestD', 'E484:')	" should not read anything
1648430dc5d3SBram Moolenaar  call assert_equal(9, line('$'))
1649430dc5d3SBram Moolenaar  call assert_equal('end of Xxx', getline('$'))
1650430dc5d3SBram Moolenaar
1651430dc5d3SBram Moolenaar  au BufReadCmd XtestE 0r Xxx|$del
1652430dc5d3SBram Moolenaar  sp XtestE			" split window with test.out
1653430dc5d3SBram Moolenaar  call assert_equal('end of Xxx', getline(3))
1654430dc5d3SBram Moolenaar
1655430dc5d3SBram Moolenaar  let g:lines = []
1656430dc5d3SBram Moolenaar  exe "normal 2Goasdf\<Esc>\<C-W>\<C-W>"
1657430dc5d3SBram Moolenaar  au BufWriteCmd XtestE call extend(g:lines, getline(0, '$'))
1658430dc5d3SBram Moolenaar  wall				" will write other window to 'lines'
1659430dc5d3SBram Moolenaar  call assert_equal(4, len(g:lines), g:lines)
1660430dc5d3SBram Moolenaar  call assert_equal('asdf', g:lines[2])
1661430dc5d3SBram Moolenaar
1662430dc5d3SBram Moolenaar  au! BufReadCmd
1663430dc5d3SBram Moolenaar  au! BufWriteCmd
1664430dc5d3SBram Moolenaar  au! FileReadCmd
1665430dc5d3SBram Moolenaar  au! FileWriteCmd
1666430dc5d3SBram Moolenaar  au! FileAppendCmd
1667430dc5d3SBram Moolenaar  %bwipe!
1668430dc5d3SBram Moolenaar  call delete('Xxx')
1669430dc5d3SBram Moolenaar  enew!
1670430dc5d3SBram Moolenaarendfunc
1671aace2158SBram Moolenaar
16720fff4415SBram Moolenaarfunc s:ReadFile()
16730fff4415SBram Moolenaar  setl noswapfile nomodified
16740fff4415SBram Moolenaar  let filename = resolve(expand("<afile>:p"))
16750fff4415SBram Moolenaar  execute 'read' fnameescape(filename)
16760fff4415SBram Moolenaar  1d_
16770fff4415SBram Moolenaar  exe 'file' fnameescape(filename)
16780fff4415SBram Moolenaar  setl buftype=acwrite
16790fff4415SBram Moolenaarendfunc
16800fff4415SBram Moolenaar
16810fff4415SBram Moolenaarfunc s:WriteFile()
16820fff4415SBram Moolenaar  let filename = resolve(expand("<afile>:p"))
16830fff4415SBram Moolenaar  setl buftype=
16840fff4415SBram Moolenaar  noautocmd execute 'write' fnameescape(filename)
16850fff4415SBram Moolenaar  setl buftype=acwrite
16860fff4415SBram Moolenaar  setl nomodified
16870fff4415SBram Moolenaarendfunc
16880fff4415SBram Moolenaar
16890fff4415SBram Moolenaarfunc Test_BufReadCmd()
16900fff4415SBram Moolenaar  autocmd BufReadCmd *.test call s:ReadFile()
16910fff4415SBram Moolenaar  autocmd BufWriteCmd *.test call s:WriteFile()
16920fff4415SBram Moolenaar
16930fff4415SBram Moolenaar  call writefile(['one', 'two', 'three'], 'Xcmd.test')
16940fff4415SBram Moolenaar  edit Xcmd.test
16950fff4415SBram Moolenaar  call assert_match('Xcmd.test" line 1 of 3', execute('file'))
16960fff4415SBram Moolenaar  normal! Gofour
16970fff4415SBram Moolenaar  write
16980fff4415SBram Moolenaar  call assert_equal(['one', 'two', 'three', 'four'], readfile('Xcmd.test'))
16990fff4415SBram Moolenaar
17000fff4415SBram Moolenaar  bwipe!
17010fff4415SBram Moolenaar  call delete('Xcmd.test')
17020fff4415SBram Moolenaar  au! BufReadCmd
17030fff4415SBram Moolenaar  au! BufWriteCmd
17040fff4415SBram Moolenaarendfunc
17050fff4415SBram Moolenaar
1706aace2158SBram Moolenaarfunc SetChangeMarks(start, end)
170797c6943eSBram Moolenaar  exe a:start .. 'mark ['
170897c6943eSBram Moolenaar  exe a:end .. 'mark ]'
1709aace2158SBram Moolenaarendfunc
1710aace2158SBram Moolenaar
1711aace2158SBram Moolenaar" Verify the effects of autocmds on '[ and ']
1712aace2158SBram Moolenaarfunc Test_change_mark_in_autocmds()
1713aace2158SBram Moolenaar  edit! Xtest
171497c6943eSBram Moolenaar  call feedkeys("ia\<CR>b\<CR>c\<CR>d\<C-g>u\<Esc>", 'xtn')
1715aace2158SBram Moolenaar
1716aace2158SBram Moolenaar  call SetChangeMarks(2, 3)
1717aace2158SBram Moolenaar  write
1718aace2158SBram Moolenaar  call assert_equal([1, 4], [line("'["), line("']")])
1719aace2158SBram Moolenaar
1720aace2158SBram Moolenaar  call SetChangeMarks(2, 3)
1721aace2158SBram Moolenaar  au BufWritePre * call assert_equal([1, 4], [line("'["), line("']")])
1722aace2158SBram Moolenaar  write
1723aace2158SBram Moolenaar  au! BufWritePre
1724aace2158SBram Moolenaar
172514ddd226SBram Moolenaar  if has('unix')
1726aace2158SBram Moolenaar    write XtestFilter
1727aace2158SBram Moolenaar    write >> XtestFilter
1728aace2158SBram Moolenaar
1729aace2158SBram Moolenaar    call SetChangeMarks(2, 3)
1730aace2158SBram Moolenaar    " Marks are set to the entire range of the write
1731aace2158SBram Moolenaar    au FilterWritePre * call assert_equal([1, 4], [line("'["), line("']")])
1732aace2158SBram Moolenaar    " '[ is adjusted to just before the line that will receive the filtered
1733aace2158SBram Moolenaar    " data
1734aace2158SBram Moolenaar    au FilterReadPre * call assert_equal([4, 4], [line("'["), line("']")])
1735aace2158SBram Moolenaar    " The filtered data is read into the buffer, and the source lines are
1736aace2158SBram Moolenaar    " still present, so the range is after the source lines
1737aace2158SBram Moolenaar    au FilterReadPost * call assert_equal([5, 12], [line("'["), line("']")])
1738aace2158SBram Moolenaar    %!cat XtestFilter
1739aace2158SBram Moolenaar    " After the filtered data is read, the original lines are deleted
1740aace2158SBram Moolenaar    call assert_equal([1, 8], [line("'["), line("']")])
1741aace2158SBram Moolenaar    au! FilterWritePre,FilterReadPre,FilterReadPost
1742aace2158SBram Moolenaar    undo
1743aace2158SBram Moolenaar
1744aace2158SBram Moolenaar    call SetChangeMarks(1, 4)
1745aace2158SBram Moolenaar    au FilterWritePre * call assert_equal([2, 3], [line("'["), line("']")])
1746aace2158SBram Moolenaar    au FilterReadPre * call assert_equal([3, 3], [line("'["), line("']")])
1747aace2158SBram Moolenaar    au FilterReadPost * call assert_equal([4, 11], [line("'["), line("']")])
1748aace2158SBram Moolenaar    2,3!cat XtestFilter
1749aace2158SBram Moolenaar    call assert_equal([2, 9], [line("'["), line("']")])
1750aace2158SBram Moolenaar    au! FilterWritePre,FilterReadPre,FilterReadPost
1751aace2158SBram Moolenaar    undo
1752aace2158SBram Moolenaar
1753aace2158SBram Moolenaar    call delete('XtestFilter')
1754aace2158SBram Moolenaar  endif
1755aace2158SBram Moolenaar
1756aace2158SBram Moolenaar  call SetChangeMarks(1, 4)
1757aace2158SBram Moolenaar  au FileWritePre * call assert_equal([2, 3], [line("'["), line("']")])
1758aace2158SBram Moolenaar  2,3write Xtest2
1759aace2158SBram Moolenaar  au! FileWritePre
1760aace2158SBram Moolenaar
1761aace2158SBram Moolenaar  call SetChangeMarks(2, 3)
1762aace2158SBram Moolenaar  au FileAppendPre * call assert_equal([1, 4], [line("'["), line("']")])
1763aace2158SBram Moolenaar  write >> Xtest2
1764aace2158SBram Moolenaar  au! FileAppendPre
1765aace2158SBram Moolenaar
1766aace2158SBram Moolenaar  call SetChangeMarks(1, 4)
1767aace2158SBram Moolenaar  au FileAppendPre * call assert_equal([2, 3], [line("'["), line("']")])
1768aace2158SBram Moolenaar  2,3write >> Xtest2
1769aace2158SBram Moolenaar  au! FileAppendPre
1770aace2158SBram Moolenaar
1771aace2158SBram Moolenaar  call SetChangeMarks(1, 1)
1772aace2158SBram Moolenaar  au FileReadPre * call assert_equal([3, 1], [line("'["), line("']")])
1773aace2158SBram Moolenaar  au FileReadPost * call assert_equal([4, 11], [line("'["), line("']")])
1774aace2158SBram Moolenaar  3read Xtest2
1775aace2158SBram Moolenaar  au! FileReadPre,FileReadPost
1776aace2158SBram Moolenaar  undo
1777aace2158SBram Moolenaar
1778aace2158SBram Moolenaar  call SetChangeMarks(4, 4)
1779aace2158SBram Moolenaar  " When the line is 0, it's adjusted to 1
1780aace2158SBram Moolenaar  au FileReadPre * call assert_equal([1, 4], [line("'["), line("']")])
1781aace2158SBram Moolenaar  au FileReadPost * call assert_equal([1, 8], [line("'["), line("']")])
1782aace2158SBram Moolenaar  0read Xtest2
1783aace2158SBram Moolenaar  au! FileReadPre,FileReadPost
1784aace2158SBram Moolenaar  undo
1785aace2158SBram Moolenaar
1786aace2158SBram Moolenaar  call SetChangeMarks(4, 4)
1787aace2158SBram Moolenaar  " When the line is 0, it's adjusted to 1
1788aace2158SBram Moolenaar  au FileReadPre * call assert_equal([1, 4], [line("'["), line("']")])
1789aace2158SBram Moolenaar  au FileReadPost * call assert_equal([2, 9], [line("'["), line("']")])
1790aace2158SBram Moolenaar  1read Xtest2
1791aace2158SBram Moolenaar  au! FileReadPre,FileReadPost
1792aace2158SBram Moolenaar  undo
1793aace2158SBram Moolenaar
1794aace2158SBram Moolenaar  bwipe!
1795aace2158SBram Moolenaar  call delete('Xtest')
1796aace2158SBram Moolenaar  call delete('Xtest2')
1797aace2158SBram Moolenaarendfunc
1798aace2158SBram Moolenaar
1799aace2158SBram Moolenaarfunc Test_Filter_noshelltemp()
1800aeb313f3SBram Moolenaar  CheckExecutable cat
1801aace2158SBram Moolenaar
1802aace2158SBram Moolenaar  enew!
1803aace2158SBram Moolenaar  call setline(1, ['a', 'b', 'c', 'd'])
1804aace2158SBram Moolenaar
1805aace2158SBram Moolenaar  let shelltemp = &shelltemp
1806aace2158SBram Moolenaar  set shelltemp
1807aace2158SBram Moolenaar
1808aace2158SBram Moolenaar  let g:filter_au = 0
1809aace2158SBram Moolenaar  au FilterWritePre * let g:filter_au += 1
1810aace2158SBram Moolenaar  au FilterReadPre * let g:filter_au += 1
1811aace2158SBram Moolenaar  au FilterReadPost * let g:filter_au += 1
1812aace2158SBram Moolenaar  %!cat
1813aace2158SBram Moolenaar  call assert_equal(3, g:filter_au)
1814aace2158SBram Moolenaar
1815aace2158SBram Moolenaar  if has('filterpipe')
1816aace2158SBram Moolenaar    set noshelltemp
1817aace2158SBram Moolenaar
1818aace2158SBram Moolenaar    let g:filter_au = 0
1819aace2158SBram Moolenaar    au FilterWritePre * let g:filter_au += 1
1820aace2158SBram Moolenaar    au FilterReadPre * let g:filter_au += 1
1821aace2158SBram Moolenaar    au FilterReadPost * let g:filter_au += 1
1822aace2158SBram Moolenaar    %!cat
1823aace2158SBram Moolenaar    call assert_equal(0, g:filter_au)
1824aace2158SBram Moolenaar  endif
1825aace2158SBram Moolenaar
1826aace2158SBram Moolenaar  au! FilterWritePre,FilterReadPre,FilterReadPost
1827aace2158SBram Moolenaar  let &shelltemp = shelltemp
1828aace2158SBram Moolenaar  bwipe!
1829aace2158SBram Moolenaarendfunc
18307e1652c6SBram Moolenaar
18317e1652c6SBram Moolenaarfunc Test_TextYankPost()
18327e1652c6SBram Moolenaar  enew!
18337e1652c6SBram Moolenaar  call setline(1, ['foo'])
18347e1652c6SBram Moolenaar
18357e1652c6SBram Moolenaar  let g:event = []
18367e1652c6SBram Moolenaar  au TextYankPost * let g:event = copy(v:event)
18377e1652c6SBram Moolenaar
18387e1652c6SBram Moolenaar  call assert_equal({}, v:event)
18397e1652c6SBram Moolenaar  call assert_fails('let v:event = {}', 'E46:')
18407e1652c6SBram Moolenaar  call assert_fails('let v:event.mykey = 0', 'E742:')
18417e1652c6SBram Moolenaar
18427e1652c6SBram Moolenaar  norm "ayiw
18437e1652c6SBram Moolenaar  call assert_equal(
184437d1673cSBram Moolenaar    \{'regcontents': ['foo'], 'regname': 'a', 'operator': 'y', 'regtype': 'v', 'visual': v:false},
18457e1652c6SBram Moolenaar    \g:event)
18467e1652c6SBram Moolenaar  norm y_
18477e1652c6SBram Moolenaar  call assert_equal(
184837d1673cSBram Moolenaar    \{'regcontents': ['foo'], 'regname': '',  'operator': 'y', 'regtype': 'V', 'visual': v:false},
184937d1673cSBram Moolenaar    \g:event)
185037d1673cSBram Moolenaar  norm Vy
185137d1673cSBram Moolenaar  call assert_equal(
185237d1673cSBram Moolenaar    \{'regcontents': ['foo'], 'regname': '',  'operator': 'y', 'regtype': 'V', 'visual': v:true},
18537e1652c6SBram Moolenaar    \g:event)
18547e1652c6SBram Moolenaar  call feedkeys("\<C-V>y", 'x')
18557e1652c6SBram Moolenaar  call assert_equal(
185637d1673cSBram Moolenaar    \{'regcontents': ['f'], 'regname': '',  'operator': 'y', 'regtype': "\x161", 'visual': v:true},
18577e1652c6SBram Moolenaar    \g:event)
18587e1652c6SBram Moolenaar  norm "xciwbar
18597e1652c6SBram Moolenaar  call assert_equal(
186037d1673cSBram Moolenaar    \{'regcontents': ['foo'], 'regname': 'x', 'operator': 'c', 'regtype': 'v', 'visual': v:false},
18617e1652c6SBram Moolenaar    \g:event)
18627e1652c6SBram Moolenaar  norm "bdiw
18637e1652c6SBram Moolenaar  call assert_equal(
186437d1673cSBram Moolenaar    \{'regcontents': ['bar'], 'regname': 'b', 'operator': 'd', 'regtype': 'v', 'visual': v:false},
18657e1652c6SBram Moolenaar    \g:event)
18667e1652c6SBram Moolenaar
18677e1652c6SBram Moolenaar  call assert_equal({}, v:event)
18687e1652c6SBram Moolenaar
1869fccbf068SBram Moolenaar  if has('clipboard_working') && !has('gui_running')
1870fccbf068SBram Moolenaar    " Test that when the visual selection is automatically copied to clipboard
1871fccbf068SBram Moolenaar    " register a TextYankPost is emitted
1872fccbf068SBram Moolenaar    call setline(1, ['foobar'])
1873fccbf068SBram Moolenaar
1874fccbf068SBram Moolenaar    let @* = ''
1875fccbf068SBram Moolenaar    set clipboard=autoselect
1876fccbf068SBram Moolenaar    exe "norm! ggviw\<Esc>"
1877fccbf068SBram Moolenaar    call assert_equal(
1878fccbf068SBram Moolenaar        \{'regcontents': ['foobar'], 'regname': '*', 'operator': 'y', 'regtype': 'v', 'visual': v:true},
1879fccbf068SBram Moolenaar        \g:event)
1880fccbf068SBram Moolenaar
1881fccbf068SBram Moolenaar    let @+ = ''
1882fccbf068SBram Moolenaar    set clipboard=autoselectplus
1883fccbf068SBram Moolenaar    exe "norm! ggviw\<Esc>"
1884fccbf068SBram Moolenaar    call assert_equal(
1885fccbf068SBram Moolenaar        \{'regcontents': ['foobar'], 'regname': '+', 'operator': 'y', 'regtype': 'v', 'visual': v:true},
1886fccbf068SBram Moolenaar        \g:event)
1887fccbf068SBram Moolenaar
1888fccbf068SBram Moolenaar    set clipboard&vim
1889fccbf068SBram Moolenaar  endif
1890fccbf068SBram Moolenaar
18917e1652c6SBram Moolenaar  au! TextYankPost
18927e1652c6SBram Moolenaar  unlet g:event
18937e1652c6SBram Moolenaar  bwipe!
18947e1652c6SBram Moolenaarendfunc
18959bca805eSBram Moolenaar
18969a046fd0SBram Moolenaarfunc Test_autocommand_all_events()
18979a046fd0SBram Moolenaar  call assert_fails('au * * bwipe', 'E1155:')
18989a046fd0SBram Moolenaar  call assert_fails('au * x bwipe', 'E1155:')
18994fb921e3SBram Moolenaarendfunc
1900b7407d3fSBram Moolenaar
1901b7407d3fSBram Moolenaarfunction s:Before_test_dirchanged()
1902b7407d3fSBram Moolenaar  augroup test_dirchanged
1903b7407d3fSBram Moolenaar    autocmd!
1904b7407d3fSBram Moolenaar  augroup END
1905b7407d3fSBram Moolenaar  let s:li = []
1906b7407d3fSBram Moolenaar  let s:dir_this = getcwd()
19076a2c5a7dSBram Moolenaar  let s:dir_foo = s:dir_this . '/Xfoo'
19082caad3fbSBram Moolenaar  call mkdir(s:dir_foo)
19096a2c5a7dSBram Moolenaar  let s:dir_bar = s:dir_this . '/Xbar'
19102caad3fbSBram Moolenaar  call mkdir(s:dir_bar)
1911b7407d3fSBram Moolenaarendfunc
1912b7407d3fSBram Moolenaar
1913b7407d3fSBram Moolenaarfunction s:After_test_dirchanged()
19143503d7c9SBram Moolenaar  call chdir(s:dir_this)
19152caad3fbSBram Moolenaar  call delete(s:dir_foo, 'd')
19162caad3fbSBram Moolenaar  call delete(s:dir_bar, 'd')
1917b7407d3fSBram Moolenaar  augroup test_dirchanged
1918b7407d3fSBram Moolenaar    autocmd!
1919b7407d3fSBram Moolenaar  augroup END
1920b7407d3fSBram Moolenaarendfunc
1921b7407d3fSBram Moolenaar
1922b7407d3fSBram Moolenaarfunction Test_dirchanged_global()
1923b7407d3fSBram Moolenaar  call s:Before_test_dirchanged()
1924b7407d3fSBram Moolenaar  autocmd test_dirchanged DirChanged global call add(s:li, "cd:")
1925b7407d3fSBram Moolenaar  autocmd test_dirchanged DirChanged global call add(s:li, expand("<afile>"))
19263503d7c9SBram Moolenaar  call chdir(s:dir_foo)
19272caad3fbSBram Moolenaar  call assert_equal(["cd:", s:dir_foo], s:li)
19283503d7c9SBram Moolenaar  call chdir(s:dir_foo)
19292caad3fbSBram Moolenaar  call assert_equal(["cd:", s:dir_foo], s:li)
19303503d7c9SBram Moolenaar  exe 'lcd ' .. fnameescape(s:dir_bar)
19312caad3fbSBram Moolenaar  call assert_equal(["cd:", s:dir_foo], s:li)
1932b7407d3fSBram Moolenaar  call s:After_test_dirchanged()
1933b7407d3fSBram Moolenaarendfunc
1934b7407d3fSBram Moolenaar
1935b7407d3fSBram Moolenaarfunction Test_dirchanged_local()
1936b7407d3fSBram Moolenaar  call s:Before_test_dirchanged()
1937b7407d3fSBram Moolenaar  autocmd test_dirchanged DirChanged window call add(s:li, "lcd:")
1938b7407d3fSBram Moolenaar  autocmd test_dirchanged DirChanged window call add(s:li, expand("<afile>"))
19393503d7c9SBram Moolenaar  call chdir(s:dir_foo)
1940b7407d3fSBram Moolenaar  call assert_equal([], s:li)
19413503d7c9SBram Moolenaar  exe 'lcd ' .. fnameescape(s:dir_bar)
19422caad3fbSBram Moolenaar  call assert_equal(["lcd:", s:dir_bar], s:li)
19433503d7c9SBram Moolenaar  exe 'lcd ' .. fnameescape(s:dir_bar)
19442caad3fbSBram Moolenaar  call assert_equal(["lcd:", s:dir_bar], s:li)
1945b7407d3fSBram Moolenaar  call s:After_test_dirchanged()
1946b7407d3fSBram Moolenaarendfunc
1947b7407d3fSBram Moolenaar
1948b7407d3fSBram Moolenaarfunction Test_dirchanged_auto()
19496d91bcb4SBram Moolenaar  CheckOption autochdir
1950b7407d3fSBram Moolenaar  call s:Before_test_dirchanged()
1951b7407d3fSBram Moolenaar  call test_autochdir()
1952b7407d3fSBram Moolenaar  autocmd test_dirchanged DirChanged auto call add(s:li, "auto:")
1953b7407d3fSBram Moolenaar  autocmd test_dirchanged DirChanged auto call add(s:li, expand("<afile>"))
1954b7407d3fSBram Moolenaar  set acd
19553503d7c9SBram Moolenaar  cd ..
1956b7407d3fSBram Moolenaar  call assert_equal([], s:li)
19572caad3fbSBram Moolenaar  exe 'edit ' . s:dir_foo . '/Xfile'
19582caad3fbSBram Moolenaar  call assert_equal(s:dir_foo, getcwd())
19592caad3fbSBram Moolenaar  call assert_equal(["auto:", s:dir_foo], s:li)
1960b7407d3fSBram Moolenaar  set noacd
1961b7407d3fSBram Moolenaar  bwipe!
1962b7407d3fSBram Moolenaar  call s:After_test_dirchanged()
1963b7407d3fSBram Moolenaarendfunc
19645a093437SBram Moolenaar
19655a093437SBram Moolenaar" Test TextChangedI and TextChangedP
19665a093437SBram Moolenaarfunc Test_ChangedP()
19675a093437SBram Moolenaar  new
19685a093437SBram Moolenaar  call setline(1, ['foo', 'bar', 'foobar'])
19695a093437SBram Moolenaar  call test_override("char_avail", 1)
19705a093437SBram Moolenaar  set complete=. completeopt=menuone
19715a093437SBram Moolenaar
19725a093437SBram Moolenaar  func! TextChangedAutocmd(char)
19735a093437SBram Moolenaar    let g:autocmd .= a:char
19745a093437SBram Moolenaar  endfunc
19755a093437SBram Moolenaar
1976db3b4464SChristian Brabandt  " TextChanged will not be triggered, only check that it isn't.
19775a093437SBram Moolenaar  au! TextChanged <buffer> :call TextChangedAutocmd('N')
19785a093437SBram Moolenaar  au! TextChangedI <buffer> :call TextChangedAutocmd('I')
19795a093437SBram Moolenaar  au! TextChangedP <buffer> :call TextChangedAutocmd('P')
19805a093437SBram Moolenaar
19815a093437SBram Moolenaar  call cursor(3, 1)
19825a093437SBram Moolenaar  let g:autocmd = ''
19835a093437SBram Moolenaar  call feedkeys("o\<esc>", 'tnix')
19845a093437SBram Moolenaar  call assert_equal('I', g:autocmd)
19855a093437SBram Moolenaar
19865a093437SBram Moolenaar  let g:autocmd = ''
19875a093437SBram Moolenaar  call feedkeys("Sf", 'tnix')
19885a093437SBram Moolenaar  call assert_equal('II', g:autocmd)
19895a093437SBram Moolenaar
19905a093437SBram Moolenaar  let g:autocmd = ''
19915a093437SBram Moolenaar  call feedkeys("Sf\<C-N>", 'tnix')
19925a093437SBram Moolenaar  call assert_equal('IIP', g:autocmd)
19935a093437SBram Moolenaar
19945a093437SBram Moolenaar  let g:autocmd = ''
19955a093437SBram Moolenaar  call feedkeys("Sf\<C-N>\<C-N>", 'tnix')
19965a093437SBram Moolenaar  call assert_equal('IIPP', g:autocmd)
19975a093437SBram Moolenaar
19985a093437SBram Moolenaar  let g:autocmd = ''
19995a093437SBram Moolenaar  call feedkeys("Sf\<C-N>\<C-N>\<C-N>", 'tnix')
20005a093437SBram Moolenaar  call assert_equal('IIPPP', g:autocmd)
20015a093437SBram Moolenaar
20025a093437SBram Moolenaar  let g:autocmd = ''
20035a093437SBram Moolenaar  call feedkeys("Sf\<C-N>\<C-N>\<C-N>\<C-N>", 'tnix')
20045a093437SBram Moolenaar  call assert_equal('IIPPPP', g:autocmd)
20055a093437SBram Moolenaar
20065a093437SBram Moolenaar  call assert_equal(['foo', 'bar', 'foobar', 'foo'], getline(1, '$'))
20075a093437SBram Moolenaar  " TODO: how should it handle completeopt=noinsert,noselect?
20085a093437SBram Moolenaar
20095a093437SBram Moolenaar  " CleanUp
20105a093437SBram Moolenaar  call test_override("char_avail", 0)
20115a093437SBram Moolenaar  au! TextChanged
20125a093437SBram Moolenaar  au! TextChangedI
20135a093437SBram Moolenaar  au! TextChangedP
20145a093437SBram Moolenaar  delfu TextChangedAutocmd
20155a093437SBram Moolenaar  unlet! g:autocmd
20165a093437SBram Moolenaar  set complete&vim completeopt&vim
20175a093437SBram Moolenaar
20185a093437SBram Moolenaar  bw!
20195a093437SBram Moolenaarendfunc
20208c64a36eSBram Moolenaar
202191d2e783SBram Moolenaarlet g:setline_handled = v:false
20221e115360SBram Moolenaarfunc SetLineOne()
202391d2e783SBram Moolenaar  if !g:setline_handled
202491d2e783SBram Moolenaar    call setline(1, "(x)")
202591d2e783SBram Moolenaar    let g:setline_handled = v:true
202691d2e783SBram Moolenaar  endif
202791d2e783SBram Moolenaarendfunc
202891d2e783SBram Moolenaar
202991d2e783SBram Moolenaarfunc Test_TextChangedI_with_setline()
203091d2e783SBram Moolenaar  new
203191d2e783SBram Moolenaar  call test_override('char_avail', 1)
203291d2e783SBram Moolenaar  autocmd TextChangedI <buffer> call SetLineOne()
203391d2e783SBram Moolenaar  call feedkeys("i(\<CR>\<Esc>", 'tx')
203491d2e783SBram Moolenaar  call assert_equal('(', getline(1))
203591d2e783SBram Moolenaar  call assert_equal('x)', getline(2))
203691d2e783SBram Moolenaar  undo
203791d2e783SBram Moolenaar  call assert_equal('', getline(1))
20389fa95068SBram Moolenaar  call assert_equal('', getline(2))
203991d2e783SBram Moolenaar
204091d2e783SBram Moolenaar  call test_override('starting', 0)
204191d2e783SBram Moolenaar  bwipe!
204291d2e783SBram Moolenaarendfunc
204391d2e783SBram Moolenaar
20448c64a36eSBram Moolenaarfunc Test_Changed_FirstTime()
20458c5a278fSBram Moolenaar  CheckFeature terminal
20468c5a278fSBram Moolenaar  CheckNotGui
20473cdcb090SBram Moolenaar  " Starting a terminal to run Vim is always considered flaky.
204830d53e2cSBram Moolenaar  let g:test_is_flaky = 1
20498c5a278fSBram Moolenaar
20508c64a36eSBram Moolenaar  " Prepare file for TextChanged event.
20518c64a36eSBram Moolenaar  call writefile([''], 'Xchanged.txt')
20528c64a36eSBram Moolenaar  let buf = term_start([GetVimProg(), '--clean', '-c', 'set noswapfile'], {'term_rows': 3})
20538c64a36eSBram Moolenaar  call assert_equal('running', term_getstatus(buf))
20541834d373SBram Moolenaar  " Wait for the ruler (in the status line) to be shown.
2055aa5df7e3SBram Moolenaar  " In ConPTY, there is additional character which is drawn up to the width of
2056aa5df7e3SBram Moolenaar  " the screen.
2057aa5df7e3SBram Moolenaar  if has('conpty')
2058aa5df7e3SBram Moolenaar    call WaitForAssert({-> assert_match('\<All.*$', term_getline(buf, 3))})
2059aa5df7e3SBram Moolenaar  else
206050182fa8SBram Moolenaar    call WaitForAssert({-> assert_match('\<All$', term_getline(buf, 3))})
2061aa5df7e3SBram Moolenaar  endif
20628c64a36eSBram Moolenaar  " It's only adding autocmd, so that no event occurs.
20638c64a36eSBram Moolenaar  call term_sendkeys(buf, ":au! TextChanged <buffer> call writefile(['No'], 'Xchanged.txt')\<cr>")
20648c64a36eSBram Moolenaar  call term_sendkeys(buf, "\<C-\\>\<C-N>:qa!\<cr>")
206550182fa8SBram Moolenaar  call WaitForAssert({-> assert_equal('finished', term_getstatus(buf))})
20668c64a36eSBram Moolenaar  call assert_equal([''], readfile('Xchanged.txt'))
20678c64a36eSBram Moolenaar
20688c64a36eSBram Moolenaar  " clean up
20698c64a36eSBram Moolenaar  call delete('Xchanged.txt')
20708c64a36eSBram Moolenaar  bwipe!
20718c64a36eSBram Moolenaarendfunc
20720566e891SBram Moolenaar
2073eb93f3f0SBram Moolenaarfunc Test_autocmd_nested()
2074eb93f3f0SBram Moolenaar  let g:did_nested = 0
2075eb93f3f0SBram Moolenaar  augroup Testing
2076eb93f3f0SBram Moolenaar    au WinNew * edit somefile
2077eb93f3f0SBram Moolenaar    au BufNew * let g:did_nested = 1
2078eb93f3f0SBram Moolenaar  augroup END
2079eb93f3f0SBram Moolenaar  split
2080eb93f3f0SBram Moolenaar  call assert_equal(0, g:did_nested)
2081eb93f3f0SBram Moolenaar  close
2082eb93f3f0SBram Moolenaar  bwipe! somefile
2083eb93f3f0SBram Moolenaar
2084eb93f3f0SBram Moolenaar  " old nested argument still works
2085eb93f3f0SBram Moolenaar  augroup Testing
2086eb93f3f0SBram Moolenaar    au!
2087eb93f3f0SBram Moolenaar    au WinNew * nested edit somefile
2088eb93f3f0SBram Moolenaar    au BufNew * let g:did_nested = 1
2089eb93f3f0SBram Moolenaar  augroup END
2090eb93f3f0SBram Moolenaar  split
2091eb93f3f0SBram Moolenaar  call assert_equal(1, g:did_nested)
2092eb93f3f0SBram Moolenaar  close
2093eb93f3f0SBram Moolenaar  bwipe! somefile
2094eb93f3f0SBram Moolenaar
2095eb93f3f0SBram Moolenaar  " New ++nested argument works
2096eb93f3f0SBram Moolenaar  augroup Testing
2097eb93f3f0SBram Moolenaar    au!
2098eb93f3f0SBram Moolenaar    au WinNew * ++nested edit somefile
2099eb93f3f0SBram Moolenaar    au BufNew * let g:did_nested = 1
2100eb93f3f0SBram Moolenaar  augroup END
2101eb93f3f0SBram Moolenaar  split
2102eb93f3f0SBram Moolenaar  call assert_equal(1, g:did_nested)
2103eb93f3f0SBram Moolenaar  close
2104eb93f3f0SBram Moolenaar  bwipe! somefile
2105eb93f3f0SBram Moolenaar
2106eb93f3f0SBram Moolenaar  augroup Testing
2107eb93f3f0SBram Moolenaar    au!
2108eb93f3f0SBram Moolenaar  augroup END
2109eb93f3f0SBram Moolenaar
2110eb93f3f0SBram Moolenaar  call assert_fails('au WinNew * ++nested ++nested echo bad', 'E983:')
2111eb93f3f0SBram Moolenaar  call assert_fails('au WinNew * nested nested echo bad', 'E983:')
2112eb93f3f0SBram Moolenaarendfunc
2113eb93f3f0SBram Moolenaar
2114eb93f3f0SBram Moolenaarfunc Test_autocmd_once()
2115eb93f3f0SBram Moolenaar  " Without ++once WinNew triggers twice
2116eb93f3f0SBram Moolenaar  let g:did_split = 0
2117eb93f3f0SBram Moolenaar  augroup Testing
2118eb93f3f0SBram Moolenaar    au WinNew * let g:did_split += 1
2119eb93f3f0SBram Moolenaar  augroup END
2120eb93f3f0SBram Moolenaar  split
2121eb93f3f0SBram Moolenaar  split
2122eb93f3f0SBram Moolenaar  call assert_equal(2, g:did_split)
2123eb93f3f0SBram Moolenaar  call assert_true(exists('#WinNew'))
2124eb93f3f0SBram Moolenaar  close
2125eb93f3f0SBram Moolenaar  close
2126eb93f3f0SBram Moolenaar
2127eb93f3f0SBram Moolenaar  " With ++once WinNew triggers once
2128eb93f3f0SBram Moolenaar  let g:did_split = 0
2129eb93f3f0SBram Moolenaar  augroup Testing
2130eb93f3f0SBram Moolenaar    au!
2131eb93f3f0SBram Moolenaar    au WinNew * ++once let g:did_split += 1
2132eb93f3f0SBram Moolenaar  augroup END
2133eb93f3f0SBram Moolenaar  split
2134eb93f3f0SBram Moolenaar  split
2135eb93f3f0SBram Moolenaar  call assert_equal(1, g:did_split)
2136eb93f3f0SBram Moolenaar  call assert_false(exists('#WinNew'))
2137eb93f3f0SBram Moolenaar  close
2138eb93f3f0SBram Moolenaar  close
2139eb93f3f0SBram Moolenaar
2140eb93f3f0SBram Moolenaar  call assert_fails('au WinNew * ++once ++once echo bad', 'E983:')
2141eb93f3f0SBram Moolenaarendfunc
2142eb93f3f0SBram Moolenaar
2143a68e5959SBram Moolenaarfunc Test_autocmd_bufreadpre()
2144a68e5959SBram Moolenaar  new
2145a68e5959SBram Moolenaar  let b:bufreadpre = 1
2146ab505b1aSBram Moolenaar  call append(0, range(1000))
2147a68e5959SBram Moolenaar  w! XAutocmdBufReadPre.txt
2148a68e5959SBram Moolenaar  autocmd BufReadPre <buffer> :let b:bufreadpre += 1
2149ab505b1aSBram Moolenaar  norm! 500gg
2150a68e5959SBram Moolenaar  sp
2151ab505b1aSBram Moolenaar  norm! 1000gg
2152a68e5959SBram Moolenaar  wincmd p
2153a68e5959SBram Moolenaar  let g:wsv1 = winsaveview()
2154a68e5959SBram Moolenaar  wincmd p
2155a68e5959SBram Moolenaar  let g:wsv2 = winsaveview()
2156a68e5959SBram Moolenaar  " triggers BufReadPre, should not move the cursor in either window
2157a68e5959SBram Moolenaar  " The topline may change one line in a large window.
2158a68e5959SBram Moolenaar  edit
2159a68e5959SBram Moolenaar  call assert_inrange(g:wsv2.topline - 1, g:wsv2.topline + 1, winsaveview().topline)
2160a68e5959SBram Moolenaar  call assert_equal(g:wsv2.lnum, winsaveview().lnum)
2161a68e5959SBram Moolenaar  call assert_equal(2, b:bufreadpre)
2162a68e5959SBram Moolenaar  wincmd p
2163a68e5959SBram Moolenaar  call assert_equal(g:wsv1.topline, winsaveview().topline)
2164a68e5959SBram Moolenaar  call assert_equal(g:wsv1.lnum, winsaveview().lnum)
2165a68e5959SBram Moolenaar  call assert_equal(2, b:bufreadpre)
2166a68e5959SBram Moolenaar  " Now set the cursor position in an BufReadPre autocommand
2167a68e5959SBram Moolenaar  " (even though the position will be invalid, this should make Vim reset the
2168a68e5959SBram Moolenaar  " cursor position in the other window.
2169a68e5959SBram Moolenaar  wincmd p
2170a68e5959SBram Moolenaar  set cpo+=g
2171a68e5959SBram Moolenaar  " won't do anything, but try to set the cursor on an invalid lnum
2172a68e5959SBram Moolenaar  autocmd BufReadPre <buffer> :norm! 70gg
2173a68e5959SBram Moolenaar  " triggers BufReadPre, should not move the cursor in either window
2174a68e5959SBram Moolenaar  e
2175a68e5959SBram Moolenaar  call assert_equal(1, winsaveview().topline)
2176a68e5959SBram Moolenaar  call assert_equal(1, winsaveview().lnum)
2177a68e5959SBram Moolenaar  call assert_equal(3, b:bufreadpre)
2178a68e5959SBram Moolenaar  wincmd p
2179a68e5959SBram Moolenaar  call assert_equal(g:wsv1.topline, winsaveview().topline)
2180a68e5959SBram Moolenaar  call assert_equal(g:wsv1.lnum, winsaveview().lnum)
2181a68e5959SBram Moolenaar  call assert_equal(3, b:bufreadpre)
2182a68e5959SBram Moolenaar  close
2183a68e5959SBram Moolenaar  close
2184a68e5959SBram Moolenaar  call delete('XAutocmdBufReadPre.txt')
2185a68e5959SBram Moolenaar  set cpo-=g
2186a68e5959SBram Moolenaarendfunc
2187a68e5959SBram Moolenaar
21885e66b42aSBram Moolenaar" FileChangedShell tested in test_filechanged.vim
218969ea5872SBram Moolenaar
219069ea5872SBram Moolenaar" Tests for the following autocommands:
219169ea5872SBram Moolenaar" - FileWritePre	writing a compressed file
219269ea5872SBram Moolenaar" - FileReadPost	reading a compressed file
219369ea5872SBram Moolenaar" - BufNewFile		reading a file template
219469ea5872SBram Moolenaar" - BufReadPre		decompressing the file to be read
219569ea5872SBram Moolenaar" - FilterReadPre	substituting characters in the temp file
219669ea5872SBram Moolenaar" - FilterReadPost	substituting characters after filtering
219769ea5872SBram Moolenaar" - FileReadPre		set options for decompression
219869ea5872SBram Moolenaar" - FileReadPost	decompress the file
219969ea5872SBram Moolenaarfunc Test_ReadWrite_Autocmds()
220069ea5872SBram Moolenaar  " Run this test only on Unix-like systems and if gzip is available
22016d91bcb4SBram Moolenaar  CheckUnix
22026d91bcb4SBram Moolenaar  CheckExecutable gzip
220369ea5872SBram Moolenaar
220469ea5872SBram Moolenaar  " Make $GZIP empty, "-v" would cause trouble.
220569ea5872SBram Moolenaar  let $GZIP = ""
220669ea5872SBram Moolenaar
220769ea5872SBram Moolenaar  " Use a FileChangedShell autocommand to avoid a prompt for 'Xtestfile.gz'
220869ea5872SBram Moolenaar  " being modified outside of Vim (noticed on Solaris).
220969ea5872SBram Moolenaar  au FileChangedShell * echo 'caught FileChangedShell'
221069ea5872SBram Moolenaar
221169ea5872SBram Moolenaar  " Test for the FileReadPost, FileWritePre and FileWritePost autocmds
221269ea5872SBram Moolenaar  augroup Test1
221369ea5872SBram Moolenaar    au!
221469ea5872SBram Moolenaar    au FileWritePre    *.gz   '[,']!gzip
221569ea5872SBram Moolenaar    au FileWritePost   *.gz   undo
221669ea5872SBram Moolenaar    au FileReadPost    *.gz   '[,']!gzip -d
221769ea5872SBram Moolenaar  augroup END
221869ea5872SBram Moolenaar
221969ea5872SBram Moolenaar  new
222069ea5872SBram Moolenaar  set bin
222169ea5872SBram Moolenaar  call append(0, [
222269ea5872SBram Moolenaar	      \ 'line 2	Abcdefghijklmnopqrstuvwxyz',
222369ea5872SBram Moolenaar	      \ 'line 3	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
222469ea5872SBram Moolenaar	      \ 'line 4	Abcdefghijklmnopqrstuvwxyz',
222569ea5872SBram Moolenaar	      \ 'line 5	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
222669ea5872SBram Moolenaar	      \ 'line 6	Abcdefghijklmnopqrstuvwxyz',
222769ea5872SBram Moolenaar	      \ 'line 7	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
222869ea5872SBram Moolenaar	      \ 'line 8	Abcdefghijklmnopqrstuvwxyz',
222969ea5872SBram Moolenaar	      \ 'line 9	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
223069ea5872SBram Moolenaar	      \ 'line 10 Abcdefghijklmnopqrstuvwxyz'
223169ea5872SBram Moolenaar	      \ ])
223269ea5872SBram Moolenaar  1,9write! Xtestfile.gz
223369ea5872SBram Moolenaar  enew! | close
223469ea5872SBram Moolenaar
223569ea5872SBram Moolenaar  new
223669ea5872SBram Moolenaar  " Read and decompress the testfile
223769ea5872SBram Moolenaar  0read Xtestfile.gz
223869ea5872SBram Moolenaar  call assert_equal([
223969ea5872SBram Moolenaar	      \ 'line 2	Abcdefghijklmnopqrstuvwxyz',
224069ea5872SBram Moolenaar	      \ 'line 3	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
224169ea5872SBram Moolenaar	      \ 'line 4	Abcdefghijklmnopqrstuvwxyz',
224269ea5872SBram Moolenaar	      \ 'line 5	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
224369ea5872SBram Moolenaar	      \ 'line 6	Abcdefghijklmnopqrstuvwxyz',
224469ea5872SBram Moolenaar	      \ 'line 7	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
224569ea5872SBram Moolenaar	      \ 'line 8	Abcdefghijklmnopqrstuvwxyz',
224669ea5872SBram Moolenaar	      \ 'line 9	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
224769ea5872SBram Moolenaar	      \ 'line 10 Abcdefghijklmnopqrstuvwxyz'
224869ea5872SBram Moolenaar	      \ ], getline(1, 9))
224969ea5872SBram Moolenaar  enew! | close
225069ea5872SBram Moolenaar
225169ea5872SBram Moolenaar  augroup Test1
225269ea5872SBram Moolenaar    au!
225369ea5872SBram Moolenaar  augroup END
225469ea5872SBram Moolenaar
225569ea5872SBram Moolenaar  " Test for the FileAppendPre and FileAppendPost autocmds
225669ea5872SBram Moolenaar  augroup Test2
225769ea5872SBram Moolenaar    au!
225869ea5872SBram Moolenaar    au BufNewFile      *.c    read Xtest.c
225969ea5872SBram Moolenaar    au FileAppendPre   *.out  '[,']s/new/NEW/
226069ea5872SBram Moolenaar    au FileAppendPost  *.out  !cat Xtest.c >> test.out
226169ea5872SBram Moolenaar  augroup END
226269ea5872SBram Moolenaar
226369ea5872SBram Moolenaar  call writefile(['/*', ' * Here is a new .c file', ' */'], 'Xtest.c')
226469ea5872SBram Moolenaar  new foo.c			" should load Xtest.c
226569ea5872SBram Moolenaar  call assert_equal(['/*', ' * Here is a new .c file', ' */'], getline(2, 4))
226669ea5872SBram Moolenaar  w! >> test.out		" append it to the output file
226769ea5872SBram Moolenaar
226869ea5872SBram Moolenaar  let contents = readfile('test.out')
226969ea5872SBram Moolenaar  call assert_equal(' * Here is a NEW .c file', contents[2])
227069ea5872SBram Moolenaar  call assert_equal(' * Here is a new .c file', contents[5])
227169ea5872SBram Moolenaar
227269ea5872SBram Moolenaar  call delete('test.out')
227369ea5872SBram Moolenaar  enew! | close
227469ea5872SBram Moolenaar  augroup Test2
227569ea5872SBram Moolenaar    au!
227669ea5872SBram Moolenaar  augroup END
227769ea5872SBram Moolenaar
227869ea5872SBram Moolenaar  " Test for the BufReadPre and BufReadPost autocmds
227969ea5872SBram Moolenaar  augroup Test3
228069ea5872SBram Moolenaar    au!
228169ea5872SBram Moolenaar    " setup autocommands to decompress before reading and re-compress
228269ea5872SBram Moolenaar    " afterwards
228369ea5872SBram Moolenaar    au BufReadPre  *.gz  exe '!gzip -d ' . shellescape(expand("<afile>"))
228469ea5872SBram Moolenaar    au BufReadPre  *.gz  call rename(expand("<afile>:r"), expand("<afile>"))
228569ea5872SBram Moolenaar    au BufReadPost *.gz  call rename(expand("<afile>"), expand("<afile>:r"))
228669ea5872SBram Moolenaar    au BufReadPost *.gz  exe '!gzip ' . shellescape(expand("<afile>:r"))
228769ea5872SBram Moolenaar  augroup END
228869ea5872SBram Moolenaar
228969ea5872SBram Moolenaar  e! Xtestfile.gz		" Edit compressed file
229069ea5872SBram Moolenaar  call assert_equal([
229169ea5872SBram Moolenaar	      \ 'line 2	Abcdefghijklmnopqrstuvwxyz',
229269ea5872SBram Moolenaar	      \ 'line 3	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
229369ea5872SBram Moolenaar	      \ 'line 4	Abcdefghijklmnopqrstuvwxyz',
229469ea5872SBram Moolenaar	      \ 'line 5	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
229569ea5872SBram Moolenaar	      \ 'line 6	Abcdefghijklmnopqrstuvwxyz',
229669ea5872SBram Moolenaar	      \ 'line 7	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
229769ea5872SBram Moolenaar	      \ 'line 8	Abcdefghijklmnopqrstuvwxyz',
229869ea5872SBram Moolenaar	      \ 'line 9	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
229969ea5872SBram Moolenaar	      \ 'line 10 Abcdefghijklmnopqrstuvwxyz'
230069ea5872SBram Moolenaar	      \ ], getline(1, 9))
230169ea5872SBram Moolenaar
230269ea5872SBram Moolenaar  w! >> test.out		" Append it to the output file
230369ea5872SBram Moolenaar
230469ea5872SBram Moolenaar  augroup Test3
230569ea5872SBram Moolenaar    au!
230669ea5872SBram Moolenaar  augroup END
230769ea5872SBram Moolenaar
230869ea5872SBram Moolenaar  " Test for the FilterReadPre and FilterReadPost autocmds.
230969ea5872SBram Moolenaar  set shelltemp			" need temp files here
231069ea5872SBram Moolenaar  augroup Test4
231169ea5872SBram Moolenaar    au!
231269ea5872SBram Moolenaar    au FilterReadPre   *.out  call rename(expand("<afile>"), expand("<afile>") . ".t")
231369ea5872SBram Moolenaar    au FilterReadPre   *.out  exe 'silent !sed s/e/E/ ' . shellescape(expand("<afile>")) . ".t >" . shellescape(expand("<afile>"))
231469ea5872SBram Moolenaar    au FilterReadPre   *.out  exe 'silent !rm ' . shellescape(expand("<afile>")) . '.t'
231569ea5872SBram Moolenaar    au FilterReadPost  *.out  '[,']s/x/X/g
231669ea5872SBram Moolenaar  augroup END
231769ea5872SBram Moolenaar
231869ea5872SBram Moolenaar  e! test.out			" Edit the output file
231969ea5872SBram Moolenaar  1,$!cat
232069ea5872SBram Moolenaar  call assert_equal([
232169ea5872SBram Moolenaar	      \ 'linE 2	AbcdefghijklmnopqrstuvwXyz',
232269ea5872SBram Moolenaar	      \ 'linE 3	XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
232369ea5872SBram Moolenaar	      \ 'linE 4	AbcdefghijklmnopqrstuvwXyz',
232469ea5872SBram Moolenaar	      \ 'linE 5	XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
232569ea5872SBram Moolenaar	      \ 'linE 6	AbcdefghijklmnopqrstuvwXyz',
232669ea5872SBram Moolenaar	      \ 'linE 7	XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
232769ea5872SBram Moolenaar	      \ 'linE 8	AbcdefghijklmnopqrstuvwXyz',
232869ea5872SBram Moolenaar	      \ 'linE 9	XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
232969ea5872SBram Moolenaar	      \ 'linE 10 AbcdefghijklmnopqrstuvwXyz'
233069ea5872SBram Moolenaar	      \ ], getline(1, 9))
233169ea5872SBram Moolenaar  call assert_equal([
233269ea5872SBram Moolenaar	      \ 'line 2	Abcdefghijklmnopqrstuvwxyz',
233369ea5872SBram Moolenaar	      \ 'line 3	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
233469ea5872SBram Moolenaar	      \ 'line 4	Abcdefghijklmnopqrstuvwxyz',
233569ea5872SBram Moolenaar	      \ 'line 5	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
233669ea5872SBram Moolenaar	      \ 'line 6	Abcdefghijklmnopqrstuvwxyz',
233769ea5872SBram Moolenaar	      \ 'line 7	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
233869ea5872SBram Moolenaar	      \ 'line 8	Abcdefghijklmnopqrstuvwxyz',
233969ea5872SBram Moolenaar	      \ 'line 9	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
234069ea5872SBram Moolenaar	      \ 'line 10 Abcdefghijklmnopqrstuvwxyz'
234169ea5872SBram Moolenaar	      \ ], readfile('test.out'))
234269ea5872SBram Moolenaar
234369ea5872SBram Moolenaar  augroup Test4
234469ea5872SBram Moolenaar    au!
234569ea5872SBram Moolenaar  augroup END
234669ea5872SBram Moolenaar  set shelltemp&vim
234769ea5872SBram Moolenaar
234869ea5872SBram Moolenaar  " Test for the FileReadPre and FileReadPost autocmds.
234969ea5872SBram Moolenaar  augroup Test5
235069ea5872SBram Moolenaar    au!
235169ea5872SBram Moolenaar    au FileReadPre *.gz exe 'silent !gzip -d ' . shellescape(expand("<afile>"))
235269ea5872SBram Moolenaar    au FileReadPre *.gz call rename(expand("<afile>:r"), expand("<afile>"))
235369ea5872SBram Moolenaar    au FileReadPost *.gz '[,']s/l/L/
235469ea5872SBram Moolenaar  augroup END
235569ea5872SBram Moolenaar
235669ea5872SBram Moolenaar  new
235769ea5872SBram Moolenaar  0r Xtestfile.gz		" Read compressed file
235869ea5872SBram Moolenaar  call assert_equal([
235969ea5872SBram Moolenaar	      \ 'Line 2	Abcdefghijklmnopqrstuvwxyz',
236069ea5872SBram Moolenaar	      \ 'Line 3	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
236169ea5872SBram Moolenaar	      \ 'Line 4	Abcdefghijklmnopqrstuvwxyz',
236269ea5872SBram Moolenaar	      \ 'Line 5	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
236369ea5872SBram Moolenaar	      \ 'Line 6	Abcdefghijklmnopqrstuvwxyz',
236469ea5872SBram Moolenaar	      \ 'Line 7	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
236569ea5872SBram Moolenaar	      \ 'Line 8	Abcdefghijklmnopqrstuvwxyz',
236669ea5872SBram Moolenaar	      \ 'Line 9	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
236769ea5872SBram Moolenaar	      \ 'Line 10 Abcdefghijklmnopqrstuvwxyz'
236869ea5872SBram Moolenaar	      \ ], getline(1, 9))
236969ea5872SBram Moolenaar  call assert_equal([
237069ea5872SBram Moolenaar	      \ 'line 2	Abcdefghijklmnopqrstuvwxyz',
237169ea5872SBram Moolenaar	      \ 'line 3	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
237269ea5872SBram Moolenaar	      \ 'line 4	Abcdefghijklmnopqrstuvwxyz',
237369ea5872SBram Moolenaar	      \ 'line 5	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
237469ea5872SBram Moolenaar	      \ 'line 6	Abcdefghijklmnopqrstuvwxyz',
237569ea5872SBram Moolenaar	      \ 'line 7	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
237669ea5872SBram Moolenaar	      \ 'line 8	Abcdefghijklmnopqrstuvwxyz',
237769ea5872SBram Moolenaar	      \ 'line 9	xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
237869ea5872SBram Moolenaar	      \ 'line 10 Abcdefghijklmnopqrstuvwxyz'
237969ea5872SBram Moolenaar	      \ ], readfile('Xtestfile.gz'))
238069ea5872SBram Moolenaar
238169ea5872SBram Moolenaar  augroup Test5
238269ea5872SBram Moolenaar    au!
238369ea5872SBram Moolenaar  augroup END
238469ea5872SBram Moolenaar
238569ea5872SBram Moolenaar  au! FileChangedShell
238669ea5872SBram Moolenaar  call delete('Xtestfile.gz')
238769ea5872SBram Moolenaar  call delete('Xtest.c')
238869ea5872SBram Moolenaar  call delete('test.out')
238969ea5872SBram Moolenaarendfunc
239023b51392SBram Moolenaar
239123b51392SBram Moolenaarfunc Test_throw_in_BufWritePre()
239223b51392SBram Moolenaar  new
239323b51392SBram Moolenaar  call setline(1, ['one', 'two', 'three'])
239423b51392SBram Moolenaar  call assert_false(filereadable('Xthefile'))
239523b51392SBram Moolenaar  augroup throwing
239623b51392SBram Moolenaar    au BufWritePre X* throw 'do not write'
239723b51392SBram Moolenaar  augroup END
239823b51392SBram Moolenaar  try
239923b51392SBram Moolenaar    w Xthefile
240023b51392SBram Moolenaar  catch
240123b51392SBram Moolenaar    let caught = 1
240223b51392SBram Moolenaar  endtry
240323b51392SBram Moolenaar  call assert_equal(1, caught)
240423b51392SBram Moolenaar  call assert_false(filereadable('Xthefile'))
240523b51392SBram Moolenaar
240623b51392SBram Moolenaar  bwipe!
240723b51392SBram Moolenaar  au! throwing
240823b51392SBram Moolenaarendfunc
2409cadbe1b1SBram Moolenaar
241040fa12aeSBram Moolenaarfunc Test_autocmd_in_try_block()
241140fa12aeSBram Moolenaar  call mkdir('Xdir')
241240fa12aeSBram Moolenaar  au BufEnter * let g:fname = expand('%')
241340fa12aeSBram Moolenaar  try
241440fa12aeSBram Moolenaar    edit Xdir/
241540fa12aeSBram Moolenaar  endtry
241640fa12aeSBram Moolenaar  call assert_match('Xdir', g:fname)
241740fa12aeSBram Moolenaar
241840fa12aeSBram Moolenaar  unlet g:fname
241940fa12aeSBram Moolenaar  au! BufEnter
242040fa12aeSBram Moolenaar  call delete('Xdir', 'rf')
242140fa12aeSBram Moolenaarendfunc
242240fa12aeSBram Moolenaar
2423cadbe1b1SBram Moolenaarfunc Test_autocmd_SafeState()
2424cadbe1b1SBram Moolenaar  CheckRunVimInTerminal
2425f08b0eb8SBram Moolenaar  let g:test_is_flaky = 1
2426cadbe1b1SBram Moolenaar
2427cadbe1b1SBram Moolenaar  let lines =<< trim END
2428cadbe1b1SBram Moolenaar	let g:safe = 0
2429cadbe1b1SBram Moolenaar	let g:again = ''
2430cadbe1b1SBram Moolenaar	au SafeState * let g:safe += 1
2431cadbe1b1SBram Moolenaar	au SafeStateAgain * let g:again ..= 'x'
2432cadbe1b1SBram Moolenaar	func CallTimer()
2433cadbe1b1SBram Moolenaar	  call timer_start(10, {id -> execute('let g:again ..= "t"')})
2434cadbe1b1SBram Moolenaar	endfunc
2435cadbe1b1SBram Moolenaar  END
2436cadbe1b1SBram Moolenaar  call writefile(lines, 'XSafeState')
2437cadbe1b1SBram Moolenaar  let buf = RunVimInTerminal('-S XSafeState', #{rows: 6})
2438cadbe1b1SBram Moolenaar
24398e7d6223SBram Moolenaar  " Sometimes we loop to handle a K_IGNORE, SafeState may be triggered once or
24408fb1b47aSBram Moolenaar  " more often.
2441cadbe1b1SBram Moolenaar  call term_sendkeys(buf, ":echo g:safe\<CR>")
24428fb1b47aSBram Moolenaar  call WaitForAssert({-> assert_match('^\d ', term_getline(buf, 6))}, 1000)
2443cadbe1b1SBram Moolenaar
24448fb1b47aSBram Moolenaar  " SafeStateAgain should be invoked at least three times
2445cadbe1b1SBram Moolenaar  call term_sendkeys(buf, ":echo g:again\<CR>")
24468fb1b47aSBram Moolenaar  call WaitForAssert({-> assert_match('^xxx', term_getline(buf, 6))}, 1000)
2447cadbe1b1SBram Moolenaar
2448cadbe1b1SBram Moolenaar  call term_sendkeys(buf, ":let g:again = ''\<CR>:call CallTimer()\<CR>")
24496a2c5a7dSBram Moolenaar  call TermWait(buf, 50)
24500f6629a0SBram Moolenaar  call term_sendkeys(buf, ":\<CR>")
24516a2c5a7dSBram Moolenaar  call TermWait(buf, 50)
2452cadbe1b1SBram Moolenaar  call term_sendkeys(buf, ":echo g:again\<CR>")
2453cadbe1b1SBram Moolenaar  call WaitForAssert({-> assert_match('xtx', term_getline(buf, 6))}, 1000)
2454cadbe1b1SBram Moolenaar
2455cadbe1b1SBram Moolenaar  call StopVimInTerminal(buf)
2456cadbe1b1SBram Moolenaar  call delete('XSafeState')
2457cadbe1b1SBram Moolenaarendfunc
245823324a0bSBram Moolenaar
245923324a0bSBram Moolenaarfunc Test_autocmd_CmdWinEnter()
246023324a0bSBram Moolenaar  CheckRunVimInTerminal
246121829c5fSBram Moolenaar  CheckFeature cmdwin
246221829c5fSBram Moolenaar
246323324a0bSBram Moolenaar  let lines =<< trim END
2464125ffd21SEgor Zvorykin    augroup vimHints | au! | augroup END
246523324a0bSBram Moolenaar    let b:dummy_var = 'This is a dummy'
246623324a0bSBram Moolenaar    autocmd CmdWinEnter * quit
246723324a0bSBram Moolenaar    let winnr = winnr('$')
246823324a0bSBram Moolenaar  END
246923324a0bSBram Moolenaar  let filename = 'XCmdWinEnter'
247023324a0bSBram Moolenaar  call writefile(lines, filename)
247123324a0bSBram Moolenaar  let buf = RunVimInTerminal('-S '.filename, #{rows: 6})
247223324a0bSBram Moolenaar
247323324a0bSBram Moolenaar  call term_sendkeys(buf, "q:")
24746a2c5a7dSBram Moolenaar  call TermWait(buf)
247523324a0bSBram Moolenaar  call term_sendkeys(buf, ":echo b:dummy_var\<cr>")
2476353c351bSBram Moolenaar  call WaitForAssert({-> assert_match('^This is a dummy', term_getline(buf, 6))}, 2000)
247723324a0bSBram Moolenaar  call term_sendkeys(buf, ":echo &buftype\<cr>")
247823324a0bSBram Moolenaar  call WaitForAssert({-> assert_notmatch('^nofile', term_getline(buf, 6))}, 1000)
247923324a0bSBram Moolenaar  call term_sendkeys(buf, ":echo winnr\<cr>")
248023324a0bSBram Moolenaar  call WaitForAssert({-> assert_match('^1', term_getline(buf, 6))}, 1000)
248123324a0bSBram Moolenaar
248223324a0bSBram Moolenaar  " clean up
248323324a0bSBram Moolenaar  call StopVimInTerminal(buf)
248423324a0bSBram Moolenaar  call delete(filename)
248523324a0bSBram Moolenaarendfunc
2486ec66c41dSBram Moolenaar
2487ec66c41dSBram Moolenaarfunc Test_autocmd_was_using_freed_memory()
24885a4c3082SBram Moolenaar  CheckFeature quickfix
24895a4c3082SBram Moolenaar
2490ec66c41dSBram Moolenaar  pedit xx
2491ec66c41dSBram Moolenaar  n x
249292bb83e4SBram Moolenaar  augroup winenter
249392bb83e4SBram Moolenaar    au WinEnter * if winnr('$') > 2 | quit | endif
249492bb83e4SBram Moolenaar  augroup END
2495ec66c41dSBram Moolenaar  split
249692bb83e4SBram Moolenaar
249792bb83e4SBram Moolenaar  augroup winenter
2498ec66c41dSBram Moolenaar    au! WinEnter
249992bb83e4SBram Moolenaar  augroup END
250092bb83e4SBram Moolenaar
250192bb83e4SBram Moolenaar  bwipe xx
250292bb83e4SBram Moolenaar  bwipe x
250392bb83e4SBram Moolenaar  pclose
2504ec66c41dSBram Moolenaarendfunc
2505f4a1d1c0SBram Moolenaar
2506f4a1d1c0SBram Moolenaarfunc Test_BufWrite_lockmarks()
2507f08b0eb8SBram Moolenaar  let g:test_is_flaky = 1
2508f4a1d1c0SBram Moolenaar  edit! Xtest
2509f4a1d1c0SBram Moolenaar  call setline(1, ['a', 'b', 'c', 'd'])
2510f4a1d1c0SBram Moolenaar
2511f4a1d1c0SBram Moolenaar  " :lockmarks preserves the marks
2512f4a1d1c0SBram Moolenaar  call SetChangeMarks(2, 3)
2513f4a1d1c0SBram Moolenaar  lockmarks write
2514f4a1d1c0SBram Moolenaar  call assert_equal([2, 3], [line("'["), line("']")])
2515f4a1d1c0SBram Moolenaar
2516f4a1d1c0SBram Moolenaar  " *WritePre autocmds get the correct line range, but lockmarks preserves the
2517f4a1d1c0SBram Moolenaar  " original values for the user
2518f4a1d1c0SBram Moolenaar  augroup lockmarks
2519f4a1d1c0SBram Moolenaar    au!
2520f4a1d1c0SBram Moolenaar    au BufWritePre,FilterWritePre * call assert_equal([1, 4], [line("'["), line("']")])
2521f4a1d1c0SBram Moolenaar    au FileWritePre * call assert_equal([3, 4], [line("'["), line("']")])
2522f4a1d1c0SBram Moolenaar  augroup END
2523f4a1d1c0SBram Moolenaar
2524f4a1d1c0SBram Moolenaar  lockmarks write
2525f4a1d1c0SBram Moolenaar  call assert_equal([2, 3], [line("'["), line("']")])
2526f4a1d1c0SBram Moolenaar
2527f4a1d1c0SBram Moolenaar  if executable('cat')
2528f4a1d1c0SBram Moolenaar    lockmarks %!cat
2529f4a1d1c0SBram Moolenaar    call assert_equal([2, 3], [line("'["), line("']")])
2530f4a1d1c0SBram Moolenaar  endif
2531f4a1d1c0SBram Moolenaar
2532f4a1d1c0SBram Moolenaar  lockmarks 3,4write Xtest2
2533f4a1d1c0SBram Moolenaar  call assert_equal([2, 3], [line("'["), line("']")])
2534f4a1d1c0SBram Moolenaar
2535f4a1d1c0SBram Moolenaar  au! lockmarks
2536f4a1d1c0SBram Moolenaar  augroup! lockmarks
2537f4a1d1c0SBram Moolenaar  call delete('Xtest')
2538f4a1d1c0SBram Moolenaar  call delete('Xtest2')
2539f4a1d1c0SBram Moolenaarendfunc
2540ce6db027SBram Moolenaar
2541ce6db027SBram Moolenaarfunc Test_FileType_spell()
2542ce6db027SBram Moolenaar  if !isdirectory('/tmp')
2543ce6db027SBram Moolenaar    throw "Skipped: requires /tmp directory"
2544ce6db027SBram Moolenaar  endif
2545ce6db027SBram Moolenaar
2546ce6db027SBram Moolenaar  " this was crashing with an invalid free()
2547ce6db027SBram Moolenaar  setglobal spellfile=/tmp/en.utf-8.add
2548ce6db027SBram Moolenaar  augroup crash
2549ce6db027SBram Moolenaar    autocmd!
2550ce6db027SBram Moolenaar    autocmd BufNewFile,BufReadPost crashfile setf somefiletype
2551ce6db027SBram Moolenaar    autocmd BufNewFile,BufReadPost crashfile set ft=anotherfiletype
2552ce6db027SBram Moolenaar    autocmd FileType anotherfiletype setlocal spell
2553ce6db027SBram Moolenaar  augroup END
2554ce6db027SBram Moolenaar  func! NoCrash() abort
2555ce6db027SBram Moolenaar    edit /tmp/crashfile
2556ce6db027SBram Moolenaar  endfunc
2557ce6db027SBram Moolenaar  call NoCrash()
2558ce6db027SBram Moolenaar
2559ce6db027SBram Moolenaar  au! crash
2560ce6db027SBram Moolenaar  setglobal spellfile=
2561ce6db027SBram Moolenaarendfunc
2562bc2b71d4SBram Moolenaar
2563406cd90fSBram Moolenaar" Test closing a window or editing another buffer from a FileChangedRO handler
2564406cd90fSBram Moolenaar" in a readonly buffer
2565406cd90fSBram Moolenaarfunc Test_FileChangedRO_winclose()
256662cd26a2SBram Moolenaar  call test_override('ui_delay', 10)
256762cd26a2SBram Moolenaar
2568406cd90fSBram Moolenaar  augroup FileChangedROTest
2569406cd90fSBram Moolenaar    au!
2570406cd90fSBram Moolenaar    autocmd FileChangedRO * quit
2571406cd90fSBram Moolenaar  augroup END
2572406cd90fSBram Moolenaar  new
2573406cd90fSBram Moolenaar  set readonly
2574406cd90fSBram Moolenaar  call assert_fails('normal i', 'E788:')
2575406cd90fSBram Moolenaar  close
2576406cd90fSBram Moolenaar  augroup! FileChangedROTest
2577406cd90fSBram Moolenaar
2578406cd90fSBram Moolenaar  augroup FileChangedROTest
2579406cd90fSBram Moolenaar    au!
2580406cd90fSBram Moolenaar    autocmd FileChangedRO * edit Xfile
2581406cd90fSBram Moolenaar  augroup END
2582406cd90fSBram Moolenaar  new
2583406cd90fSBram Moolenaar  set readonly
2584406cd90fSBram Moolenaar  call assert_fails('normal i', 'E788:')
2585406cd90fSBram Moolenaar  close
2586406cd90fSBram Moolenaar  augroup! FileChangedROTest
258762cd26a2SBram Moolenaar  call test_override('ALL', 0)
2588406cd90fSBram Moolenaarendfunc
2589406cd90fSBram Moolenaar
25900c81d1b1SBram Moolenaarfunc LogACmd()
25910c81d1b1SBram Moolenaar  call add(g:logged, line('$'))
25920c81d1b1SBram Moolenaarendfunc
25930c81d1b1SBram Moolenaar
25940c81d1b1SBram Moolenaarfunc Test_TermChanged()
2595d28e0b36SBram Moolenaar  CheckNotGui
2596d28e0b36SBram Moolenaar
25970c81d1b1SBram Moolenaar  enew!
25980c81d1b1SBram Moolenaar  tabnew
25990c81d1b1SBram Moolenaar  call setline(1, ['a', 'b', 'c', 'd'])
26000c81d1b1SBram Moolenaar  $
26010c81d1b1SBram Moolenaar  au TermChanged * call LogACmd()
26020c81d1b1SBram Moolenaar  let g:logged = []
26030c81d1b1SBram Moolenaar  let term_save = &term
26040c81d1b1SBram Moolenaar  set term=xterm
26050c81d1b1SBram Moolenaar  call assert_equal([1, 4], g:logged)
26060c81d1b1SBram Moolenaar
26070c81d1b1SBram Moolenaar  au! TermChanged
26080c81d1b1SBram Moolenaar  let &term = term_save
26090c81d1b1SBram Moolenaar  bwipe!
26100c81d1b1SBram Moolenaarendfunc
26110c81d1b1SBram Moolenaar
2612e3284878SBram Moolenaar" Test for FileReadCmd autocmd
2613e3284878SBram Moolenaarfunc Test_autocmd_FileReadCmd()
2614e3284878SBram Moolenaar  func ReadFileCmd()
2615e3284878SBram Moolenaar    call append(line('$'), "v:cmdarg = " .. v:cmdarg)
2616e3284878SBram Moolenaar  endfunc
2617e3284878SBram Moolenaar  augroup FileReadCmdTest
2618e3284878SBram Moolenaar    au!
2619e3284878SBram Moolenaar    au FileReadCmd Xtest call ReadFileCmd()
2620e3284878SBram Moolenaar  augroup END
2621e3284878SBram Moolenaar
2622e3284878SBram Moolenaar  new
2623e3284878SBram Moolenaar  read ++bin Xtest
2624e3284878SBram Moolenaar  read ++nobin Xtest
2625e3284878SBram Moolenaar  read ++edit Xtest
2626e3284878SBram Moolenaar  read ++bad=keep Xtest
2627e3284878SBram Moolenaar  read ++bad=drop Xtest
2628e3284878SBram Moolenaar  read ++bad=- Xtest
2629e3284878SBram Moolenaar  read ++ff=unix Xtest
2630e3284878SBram Moolenaar  read ++ff=dos Xtest
2631e3284878SBram Moolenaar  read ++ff=mac Xtest
2632e3284878SBram Moolenaar  read ++enc=utf-8 Xtest
2633e3284878SBram Moolenaar
2634e3284878SBram Moolenaar  call assert_equal(['',
2635e3284878SBram Moolenaar        \ 'v:cmdarg =  ++bin',
2636e3284878SBram Moolenaar        \ 'v:cmdarg =  ++nobin',
2637e3284878SBram Moolenaar        \ 'v:cmdarg =  ++edit',
2638e3284878SBram Moolenaar        \ 'v:cmdarg =  ++bad=keep',
2639e3284878SBram Moolenaar        \ 'v:cmdarg =  ++bad=drop',
2640e3284878SBram Moolenaar        \ 'v:cmdarg =  ++bad=-',
2641e3284878SBram Moolenaar        \ 'v:cmdarg =  ++ff=unix',
2642e3284878SBram Moolenaar        \ 'v:cmdarg =  ++ff=dos',
2643e3284878SBram Moolenaar        \ 'v:cmdarg =  ++ff=mac',
2644e3284878SBram Moolenaar        \ 'v:cmdarg =  ++enc=utf-8'], getline(1, '$'))
2645e3284878SBram Moolenaar
2646e3284878SBram Moolenaar  close!
2647e3284878SBram Moolenaar  augroup FileReadCmdTest
2648e3284878SBram Moolenaar    au!
2649e3284878SBram Moolenaar  augroup END
2650e3284878SBram Moolenaar  delfunc ReadFileCmd
2651e3284878SBram Moolenaarendfunc
2652e3284878SBram Moolenaar
2653ee4e0c1eSBram Moolenaar" Test for passing invalid arguments to autocmd
2654ee4e0c1eSBram Moolenaarfunc Test_autocmd_invalid_args()
2655ee4e0c1eSBram Moolenaar  " Additional character after * for event
2656ee4e0c1eSBram Moolenaar  call assert_fails('autocmd *a Xfile set ff=unix', 'E215:')
2657ee4e0c1eSBram Moolenaar  augroup Test
2658ee4e0c1eSBram Moolenaar  augroup END
2659ee4e0c1eSBram Moolenaar  " Invalid autocmd event
2660ee4e0c1eSBram Moolenaar  call assert_fails('autocmd Bufabc Xfile set ft=vim', 'E216:')
2661ee4e0c1eSBram Moolenaar  " Invalid autocmd event in a autocmd group
2662ee4e0c1eSBram Moolenaar  call assert_fails('autocmd Test Bufabc Xfile set ft=vim', 'E216:')
2663ee4e0c1eSBram Moolenaar  augroup! Test
2664ee4e0c1eSBram Moolenaar  " Execute all autocmds
2665ee4e0c1eSBram Moolenaar  call assert_fails('doautocmd * BufEnter', 'E217:')
2666ee4e0c1eSBram Moolenaar  call assert_fails('augroup! x1a2b3', 'E367:')
2667ee4e0c1eSBram Moolenaar  call assert_fails('autocmd BufNew <buffer=999> pwd', 'E680:')
2668531be47aSBram Moolenaar  call assert_fails('autocmd BufNew \) set ff=unix', 'E55:')
2669ee4e0c1eSBram Moolenaarendfunc
2670ee4e0c1eSBram Moolenaar
2671ee4e0c1eSBram Moolenaar" Test for deep nesting of autocmds
2672ee4e0c1eSBram Moolenaarfunc Test_autocmd_deep_nesting()
2673ee4e0c1eSBram Moolenaar  autocmd BufEnter Xfile doautocmd BufEnter Xfile
2674ee4e0c1eSBram Moolenaar  call assert_fails('doautocmd BufEnter Xfile', 'E218:')
2675ee4e0c1eSBram Moolenaar  autocmd! BufEnter Xfile
2676ee4e0c1eSBram Moolenaarendfunc
2677ee4e0c1eSBram Moolenaar
2678be5ee868SBram Moolenaar" Tests for SigUSR1 autocmd event, which is only available on posix systems.
2679be5ee868SBram Moolenaarfunc Test_autocmd_sigusr1()
2680be5ee868SBram Moolenaar  CheckUnix
268162cd26a2SBram Moolenaar  CheckExecutable /bin/kill
2682be5ee868SBram Moolenaar
2683be5ee868SBram Moolenaar  let g:sigusr1_passed = 0
2684be5ee868SBram Moolenaar  au SigUSR1 * let g:sigusr1_passed = 1
2685be5ee868SBram Moolenaar  call system('/bin/kill -s usr1 ' . getpid())
2686be5ee868SBram Moolenaar  call WaitForAssert({-> assert_true(g:sigusr1_passed)})
2687be5ee868SBram Moolenaar
2688be5ee868SBram Moolenaar  au! SigUSR1
2689be5ee868SBram Moolenaar  unlet g:sigusr1_passed
2690be5ee868SBram Moolenaarendfunc
2691be5ee868SBram Moolenaar
2692b340baedSBram Moolenaar" Test for BufReadPre autocmd deleting the file
2693b340baedSBram Moolenaarfunc Test_BufReadPre_delfile()
2694b340baedSBram Moolenaar  augroup TestAuCmd
2695b340baedSBram Moolenaar    au!
2696b340baedSBram Moolenaar    autocmd BufReadPre Xfile call delete('Xfile')
2697b340baedSBram Moolenaar  augroup END
2698b340baedSBram Moolenaar  call writefile([], 'Xfile')
2699b340baedSBram Moolenaar  call assert_fails('new Xfile', 'E200:')
2700b340baedSBram Moolenaar  call assert_equal('Xfile', @%)
2701b340baedSBram Moolenaar  call assert_equal(1, &readonly)
2702b340baedSBram Moolenaar  call delete('Xfile')
2703b340baedSBram Moolenaar  augroup TestAuCmd
2704b340baedSBram Moolenaar    au!
2705b340baedSBram Moolenaar  augroup END
2706b340baedSBram Moolenaar  close!
2707b340baedSBram Moolenaarendfunc
2708b340baedSBram Moolenaar
2709b340baedSBram Moolenaar" Test for BufReadPre autocmd changing the current buffer
2710b340baedSBram Moolenaarfunc Test_BufReadPre_changebuf()
2711b340baedSBram Moolenaar  augroup TestAuCmd
2712b340baedSBram Moolenaar    au!
2713b340baedSBram Moolenaar    autocmd BufReadPre Xfile edit Xsomeotherfile
2714b340baedSBram Moolenaar  augroup END
2715b340baedSBram Moolenaar  call writefile([], 'Xfile')
2716b340baedSBram Moolenaar  call assert_fails('new Xfile', 'E201:')
2717b340baedSBram Moolenaar  call assert_equal('Xsomeotherfile', @%)
2718b340baedSBram Moolenaar  call assert_equal(1, &readonly)
2719b340baedSBram Moolenaar  call delete('Xfile')
2720b340baedSBram Moolenaar  augroup TestAuCmd
2721b340baedSBram Moolenaar    au!
2722b340baedSBram Moolenaar  augroup END
2723b340baedSBram Moolenaar  close!
2724b340baedSBram Moolenaarendfunc
2725b340baedSBram Moolenaar
2726b340baedSBram Moolenaar" Test for BufWipeouti autocmd changing the current buffer when reading a file
2727b340baedSBram Moolenaar" in an empty buffer with 'f' flag in 'cpo'
2728b340baedSBram Moolenaarfunc Test_BufDelete_changebuf()
2729b340baedSBram Moolenaar  new
2730b340baedSBram Moolenaar  augroup TestAuCmd
2731b340baedSBram Moolenaar    au!
2732b340baedSBram Moolenaar    autocmd BufWipeout * let bufnr = bufadd('somefile') | exe "b " .. bufnr
2733b340baedSBram Moolenaar  augroup END
2734b340baedSBram Moolenaar  let save_cpo = &cpo
2735b340baedSBram Moolenaar  set cpo+=f
27369b7bf9e9SBram Moolenaar  call assert_fails('r Xfile', ['E812:', 'E484:'])
2737b340baedSBram Moolenaar  call assert_equal('somefile', @%)
2738b340baedSBram Moolenaar  let &cpo = save_cpo
2739b340baedSBram Moolenaar  augroup TestAuCmd
2740b340baedSBram Moolenaar    au!
2741b340baedSBram Moolenaar  augroup END
2742b340baedSBram Moolenaar  close!
2743b340baedSBram Moolenaarendfunc
2744b340baedSBram Moolenaar
27450fe937fdSBram Moolenaar" Test for the temporary internal window used to execute autocmds
27460fe937fdSBram Moolenaarfunc Test_autocmd_window()
27470fe937fdSBram Moolenaar  %bw!
27480fe937fdSBram Moolenaar  edit one.txt
27490fe937fdSBram Moolenaar  tabnew two.txt
275041cd8033SBram Moolenaar  vnew three.txt
275141cd8033SBram Moolenaar  tabnew four.txt
275241cd8033SBram Moolenaar  tabprevious
27530fe937fdSBram Moolenaar  let g:blist = []
2754832adf9bSBram Moolenaar  augroup aucmd_win_test1
27550fe937fdSBram Moolenaar    au!
27560fe937fdSBram Moolenaar    au BufEnter * call add(g:blist, [expand('<afile>'),
27570fe937fdSBram Moolenaar          \ win_gettype(bufwinnr(expand('<afile>')))])
27580fe937fdSBram Moolenaar  augroup END
27590fe937fdSBram Moolenaar
27600fe937fdSBram Moolenaar  doautoall BufEnter
276141cd8033SBram Moolenaar  call assert_equal([
276241cd8033SBram Moolenaar        \ ['one.txt', 'autocmd'],
276341cd8033SBram Moolenaar        \ ['two.txt', ''],
276441cd8033SBram Moolenaar        \ ['four.txt', 'autocmd'],
276541cd8033SBram Moolenaar        \ ['three.txt', ''],
276641cd8033SBram Moolenaar        \ ], g:blist)
27670fe937fdSBram Moolenaar
2768832adf9bSBram Moolenaar  augroup aucmd_win_test1
27690fe937fdSBram Moolenaar    au!
27700fe937fdSBram Moolenaar  augroup END
2771832adf9bSBram Moolenaar  augroup! aucmd_win_test1
2772832adf9bSBram Moolenaar  %bw!
2773832adf9bSBram Moolenaarendfunc
2774832adf9bSBram Moolenaar
2775832adf9bSBram Moolenaar" Test for trying to close the temporary window used for executing an autocmd
2776832adf9bSBram Moolenaarfunc Test_close_autocmd_window()
2777832adf9bSBram Moolenaar  %bw!
2778832adf9bSBram Moolenaar  edit one.txt
2779832adf9bSBram Moolenaar  tabnew two.txt
2780832adf9bSBram Moolenaar  augroup aucmd_win_test2
2781832adf9bSBram Moolenaar    au!
2782832adf9bSBram Moolenaar    au BufEnter * if expand('<afile>') == 'one.txt' | 1close | endif
2783832adf9bSBram Moolenaar  augroup END
2784832adf9bSBram Moolenaar
2785832adf9bSBram Moolenaar  call assert_fails('doautoall BufEnter', 'E813:')
2786832adf9bSBram Moolenaar
2787832adf9bSBram Moolenaar  augroup aucmd_win_test2
2788832adf9bSBram Moolenaar    au!
2789832adf9bSBram Moolenaar  augroup END
2790832adf9bSBram Moolenaar  augroup! aucmd_win_test2
2791cf844170SBram Moolenaar  %bwipe!
2792cf844170SBram Moolenaarendfunc
2793cf844170SBram Moolenaar
2794cf844170SBram Moolenaar" Test for trying to close the tab that has the temporary window for exeucing
2795cf844170SBram Moolenaar" an autocmd.
2796cf844170SBram Moolenaarfunc Test_close_autocmd_tab()
2797cf844170SBram Moolenaar  edit one.txt
2798cf844170SBram Moolenaar  tabnew two.txt
2799cf844170SBram Moolenaar   augroup aucmd_win_test
2800cf844170SBram Moolenaar    au!
2801cf844170SBram Moolenaar    au BufEnter * if expand('<afile>') == 'one.txt' | tabfirst | tabonly | endif
2802cf844170SBram Moolenaar  augroup END
2803cf844170SBram Moolenaar
2804cf844170SBram Moolenaar  call assert_fails('doautoall BufEnter', 'E813:')
2805cf844170SBram Moolenaar
2806cf844170SBram Moolenaar  tabonly
2807cf844170SBram Moolenaar  augroup aucmd_win_test
2808cf844170SBram Moolenaar    au!
2809cf844170SBram Moolenaar  augroup END
2810cf844170SBram Moolenaar  augroup! aucmd_win_test
2811cf844170SBram Moolenaar  %bwipe!
28120fe937fdSBram Moolenaarendfunc
28130fe937fdSBram Moolenaar
28146bcb877eSBram Moolenaar" This was using freed memory.
28156bcb877eSBram Moolenaarfunc Test_BufNew_arglocal()
28166bcb877eSBram Moolenaar  arglocal
28176bcb877eSBram Moolenaar  au BufNew * arglocal
28186bcb877eSBram Moolenaar  call assert_fails('drop xx', 'E1156:')
28196bcb877eSBram Moolenaar
28206bcb877eSBram Moolenaar  au! BufNew
28216bcb877eSBram Moolenaarendfunc
28226bcb877eSBram Moolenaar
28238ab37570SBram Moolenaarfunc Test_autocmd_closes_window()
28248ab37570SBram Moolenaar  au BufNew,BufWinLeave * e %e
28258ab37570SBram Moolenaar  file yyy
28268ab37570SBram Moolenaar  au BufNew,BufWinLeave * ball
2827aad5f9d7SBram Moolenaar  n xxx
28288ab37570SBram Moolenaar
2829aad5f9d7SBram Moolenaar  %bwipe
28308ab37570SBram Moolenaar  au! BufNew
28318ab37570SBram Moolenaar  au! BufWinLeave
28328ab37570SBram Moolenaarendfunc
28338ab37570SBram Moolenaar
283492bb83e4SBram Moolenaarfunc Test_autocmd_quit_psearch()
283592bb83e4SBram Moolenaar  sn aa bb
283692bb83e4SBram Moolenaar  augroup aucmd_win_test
283792bb83e4SBram Moolenaar    au!
283892bb83e4SBram Moolenaar    au BufEnter,BufLeave,BufNew,WinEnter,WinLeave,WinNew * if winnr('$') > 1 | q | endif
283992bb83e4SBram Moolenaar  augroup END
284092bb83e4SBram Moolenaar  ps /
284192bb83e4SBram Moolenaar
284292bb83e4SBram Moolenaar  augroup aucmd_win_test
284392bb83e4SBram Moolenaar    au!
284492bb83e4SBram Moolenaar  augroup END
284592bb83e4SBram Moolenaarendfunc
284692bb83e4SBram Moolenaar
2847aad5f9d7SBram Moolenaar" Fuzzer found some strange combination that caused a crash.
2848aad5f9d7SBram Moolenaarfunc Test_autocmd_normal_mess()
2849dd07c022SBram Moolenaar  " For unknown reason this hangs on MS-Windows
2850dd07c022SBram Moolenaar  CheckNotMSWindows
2851dd07c022SBram Moolenaar
2852aad5f9d7SBram Moolenaar  augroup aucmd_normal_test
2853aad5f9d7SBram Moolenaar    au BufLeave,BufWinLeave,BufHidden,BufUnload,BufDelete,BufWipeout * norm 7q/qc
2854aad5f9d7SBram Moolenaar  augroup END
2855983d83ffSBram Moolenaar  call assert_fails('o4', 'E1159')
2856aad5f9d7SBram Moolenaar  silent! H
2857983d83ffSBram Moolenaar  call assert_fails('e xx', 'E1159')
2858aad5f9d7SBram Moolenaar  normal G
2859aad5f9d7SBram Moolenaar
2860aad5f9d7SBram Moolenaar  augroup aucmd_normal_test
2861aad5f9d7SBram Moolenaar    au!
2862aad5f9d7SBram Moolenaar  augroup END
2863aad5f9d7SBram Moolenaarendfunc
2864aad5f9d7SBram Moolenaar
28658c6951faSBram Moolenaarfunc Test_autocmd_closing_cmdwin()
2866dd07c022SBram Moolenaar  " For unknown reason this hangs on MS-Windows
2867dd07c022SBram Moolenaar  CheckNotMSWindows
2868dd07c022SBram Moolenaar
28698c6951faSBram Moolenaar  au BufWinLeave * nested q
28708c6951faSBram Moolenaar  call assert_fails("norm 7q?\n", 'E855:')
28718c6951faSBram Moolenaar
28728c6951faSBram Moolenaar  au! BufWinLeave
28738c6951faSBram Moolenaar  new
28748c6951faSBram Moolenaar  only
28758c6951faSBram Moolenaarendfunc
28768c6951faSBram Moolenaar
28772c7080bfSBram Moolenaarfunc Test_autocmd_vimgrep()
28782c7080bfSBram Moolenaar  augroup aucmd_vimgrep
28792c7080bfSBram Moolenaar    au QuickfixCmdPre,BufNew,BufDelete,BufReadCmd * sb
28802c7080bfSBram Moolenaar    au QuickfixCmdPre,BufNew,BufDelete,BufReadCmd * q9�
28812c7080bfSBram Moolenaar  augroup END
2882983d83ffSBram Moolenaar  %bwipe!
2883dd07c022SBram Moolenaar  call assert_fails('lv ?a? foo', 'E926:')
28842c7080bfSBram Moolenaar
28852c7080bfSBram Moolenaar  augroup aucmd_vimgrep
28862c7080bfSBram Moolenaar    au!
28872c7080bfSBram Moolenaar  augroup END
28882c7080bfSBram Moolenaarendfunc
28892c7080bfSBram Moolenaar
289073b8b0aeSBram Moolenaarfunc Test_autocmd_with_block()
289173b8b0aeSBram Moolenaar  augroup block_testing
289273b8b0aeSBram Moolenaar    au BufReadPost *.xml {
289373b8b0aeSBram Moolenaar            setlocal matchpairs+=<:>
289473b8b0aeSBram Moolenaar            /<start
289573b8b0aeSBram Moolenaar          }
289663b91736SBram Moolenaar    au CursorHold * {
289763b91736SBram Moolenaar        autocmd BufReadPre * ++once echo 'one' | echo 'two'
289863b91736SBram Moolenaar        g:gotSafeState = 77
289963b91736SBram Moolenaar      }
290073b8b0aeSBram Moolenaar  augroup END
290173b8b0aeSBram Moolenaar
290273b8b0aeSBram Moolenaar  let expected = "\n--- Autocommands ---\nblock_testing  BufRead\n    *.xml     {^@            setlocal matchpairs+=<:>^@            /<start^@          }"
290373b8b0aeSBram Moolenaar  call assert_equal(expected, execute('au BufReadPost *.xml'))
290473b8b0aeSBram Moolenaar
290563b91736SBram Moolenaar  doautocmd CursorHold
290663b91736SBram Moolenaar  call assert_equal(77, g:gotSafeState)
290763b91736SBram Moolenaar  unlet g:gotSafeState
290863b91736SBram Moolenaar
290973b8b0aeSBram Moolenaar  augroup block_testing
291073b8b0aeSBram Moolenaar    au!
291173b8b0aeSBram Moolenaar  augroup END
291273b8b0aeSBram Moolenaarendfunc
291373b8b0aeSBram Moolenaar
2914db3b4464SChristian Brabandt" Test TextChangedI and TextChanged
2915db3b4464SChristian Brabandtfunc Test_Changed_ChangedI()
2916db3b4464SChristian Brabandt  new
2917db3b4464SChristian Brabandt  call test_override("char_avail", 1)
2918db3b4464SChristian Brabandt  let [g:autocmd_i, g:autocmd_n] = ['','']
2919db3b4464SChristian Brabandt
2920db3b4464SChristian Brabandt  func! TextChangedAutocmdI(char)
2921db3b4464SChristian Brabandt    let g:autocmd_{tolower(a:char)} = a:char .. b:changedtick
2922db3b4464SChristian Brabandt  endfunc
2923db3b4464SChristian Brabandt
2924db3b4464SChristian Brabandt  augroup Test_TextChanged
2925db3b4464SChristian Brabandt    au!
2926db3b4464SChristian Brabandt    au TextChanged  <buffer> :call TextChangedAutocmdI('N')
2927db3b4464SChristian Brabandt    au TextChangedI <buffer> :call TextChangedAutocmdI('I')
2928db3b4464SChristian Brabandt  augroup END
2929db3b4464SChristian Brabandt
2930db3b4464SChristian Brabandt  call feedkeys("ifoo\<esc>", 'tnix')
2931db3b4464SChristian Brabandt  " TODO: Test test does not seem to trigger TextChanged autocommand, this
2932db3b4464SChristian Brabandt  " requires running Vim in a terminal window.
2933db3b4464SChristian Brabandt  " call assert_equal('N3', g:autocmd_n)
2934db3b4464SChristian Brabandt  call assert_equal('I3', g:autocmd_i)
2935db3b4464SChristian Brabandt
2936db3b4464SChristian Brabandt  call feedkeys("yyp", 'tnix')
2937db3b4464SChristian Brabandt  " TODO: Test test does not seem to trigger TextChanged autocommand.
2938db3b4464SChristian Brabandt  " call assert_equal('N4', g:autocmd_n)
2939db3b4464SChristian Brabandt  call assert_equal('I3', g:autocmd_i)
2940db3b4464SChristian Brabandt
2941db3b4464SChristian Brabandt  " CleanUp
2942db3b4464SChristian Brabandt  call test_override("char_avail", 0)
2943db3b4464SChristian Brabandt  au! TextChanged  <buffer>
2944db3b4464SChristian Brabandt  au! TextChangedI <buffer>
2945db3b4464SChristian Brabandt  augroup! Test_TextChanged
2946db3b4464SChristian Brabandt  delfu TextChangedAutocmdI
2947db3b4464SChristian Brabandt  unlet! g:autocmd_i g:autocmd_n
2948db3b4464SChristian Brabandt
2949db3b4464SChristian Brabandt  bw!
2950db3b4464SChristian Brabandtendfunc
29512c7080bfSBram Moolenaar
2952bc2b71d4SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
2953