neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

test_exit.vim (4424B)


      1 " Tests for exiting Vim.
      2 
      3 source shared.vim
      4 source check.vim
      5 
      6 func Test_exiting()
      7  let after =<< trim [CODE]
      8    au QuitPre * call writefile(["QuitPre"], "Xtestout")
      9    au ExitPre * call writefile(["ExitPre"], "Xtestout", "a")
     10    quit
     11  [CODE]
     12 
     13  if RunVim([], after, '')
     14    call assert_equal(['QuitPre', 'ExitPre'], readfile('Xtestout'))
     15  endif
     16  call delete('Xtestout')
     17 
     18  let after =<< trim [CODE]
     19    au QuitPre * call writefile(["QuitPre"], "Xtestout")
     20    au ExitPre * call writefile(["ExitPre"], "Xtestout", "a")
     21    help
     22    wincmd w
     23    quit
     24  [CODE]
     25 
     26  if RunVim([], after, '')
     27    call assert_equal(['QuitPre', 'ExitPre'], readfile('Xtestout'))
     28  endif
     29  call delete('Xtestout')
     30 
     31  let after =<< trim [CODE]
     32    au QuitPre * call writefile(["QuitPre"], "Xtestout")
     33    au ExitPre * call writefile(["ExitPre"], "Xtestout", "a")
     34    split
     35    new
     36    qall
     37  [CODE]
     38 
     39  if RunVim([], after, '')
     40    call assert_equal(['QuitPre', 'ExitPre'], readfile('Xtestout'))
     41  endif
     42  call delete('Xtestout')
     43 
     44  " ExitPre autocommand splits the window, so that it's no longer the last one.
     45  let after =<< trim [CODE]
     46    au QuitPre * call writefile(["QuitPre"], "Xtestout", "a")
     47    au ExitPre * call writefile(["ExitPre"], "Xtestout", "a")
     48    augroup nasty
     49      au ExitPre * split
     50    augroup END
     51    quit
     52    augroup nasty
     53      au! ExitPre
     54    augroup END
     55    quit
     56  [CODE]
     57 
     58  if RunVim([], after, '')
     59    call assert_equal(['QuitPre', 'ExitPre', 'QuitPre', 'ExitPre'],
     60   \ readfile('Xtestout'))
     61  endif
     62  call delete('Xtestout')
     63 
     64  " ExitPre autocommand splits and closes the window, so that there is still
     65  " one window but it's a different one.
     66  let after =<< trim [CODE]
     67    au QuitPre * call writefile(["QuitPre"], "Xtestout", "a")
     68    au ExitPre * call writefile(["ExitPre"], "Xtestout", "a")
     69    augroup nasty
     70      au ExitPre * split | only
     71    augroup END
     72    quit
     73    augroup nasty
     74      au! ExitPre
     75    augroup END
     76    quit
     77  [CODE]
     78 
     79  if RunVim([], after, '')
     80    call assert_equal(['QuitPre', 'ExitPre', 'QuitPre', 'ExitPre'],
     81   \ readfile('Xtestout'))
     82  endif
     83  call delete('Xtestout')
     84 
     85  " ExitPre autocommand also executed on :wqall
     86  let after =<< trim [CODE]
     87    au QuitPre * call writefile(["QuitPre"], "Xtestout", "a")
     88    au ExitPre * call writefile(["ExitPre"], "Xtestout", "a")
     89    wqall
     90  [CODE]
     91 
     92  if RunVim([], after, '')
     93    call assert_equal(['QuitPre', 'ExitPre'], readfile('Xtestout'))
     94  endif
     95  call delete('Xtestout')
     96 
     97  " Test using :quit in BufWritePost during :wqall
     98  let after =<< trim [CODE]
     99    botright new Xwritebuf
    100    call setline(1, 'SHOULD BE WRITTEN')
    101    autocmd BufWritePost Xwritebuf 1quit
    102    wqall
    103    call setline(1, 'NOT REACHED') | write | qall
    104  [CODE]
    105 
    106  if RunVim([], after, '')
    107    call assert_equal(['SHOULD BE WRITTEN'], readfile('Xwritebuf'))
    108  endif
    109  call delete('Xwritebuf')
    110 endfunc
    111 
    112 " Test for getting the Vim exit code from v:exiting
    113 func Test_exit_code()
    114  call assert_equal(v:null, v:exiting)
    115 
    116  let before =<< trim [CODE]
    117    au QuitPre * call writefile(['qp = ' .. v:exiting], 'Xtestout', 'a')
    118    au ExitPre * call writefile(['ep = ' .. v:exiting], 'Xtestout', 'a')
    119    au VimLeavePre * call writefile(['lp = ' .. v:exiting], 'Xtestout', 'a')
    120    au VimLeave * call writefile(['l = ' .. v:exiting], 'Xtestout', 'a')
    121  [CODE]
    122 
    123  if RunVim(before, ['quit'], '')
    124    call assert_equal(['qp = v:null', 'ep = v:null', 'lp = 0', 'l = 0'], readfile('Xtestout'))
    125  endif
    126  call delete('Xtestout')
    127 
    128  if RunVim(before, ['cquit'], '')
    129    call assert_equal(['lp = 1', 'l = 1'], readfile('Xtestout'))
    130  endif
    131  call delete('Xtestout')
    132 
    133  if RunVim(before, ['cquit 4'], '')
    134    call assert_equal(['lp = 4', 'l = 4'], readfile('Xtestout'))
    135  endif
    136  call delete('Xtestout')
    137 endfunc
    138 
    139 func Test_exit_error_reading_input()
    140  throw 'Skipped: Nvim does not exit after stdin is read'
    141 
    142  CheckNotGui
    143  CheckNotMSWindows
    144  " The early exit causes memory not to be freed somehow
    145  CheckNotAsan
    146  CheckNotValgrind
    147 
    148  call writefile([":au VimLeave * call writefile(['l = ' .. v:exiting], 'Xtestout')", ":tabnew", "q:"], 'Xscript', 'b')
    149 
    150  " Nvim requires "-s -" to read stdin as Normal mode input
    151  " if RunVim([], [], '<Xscript')
    152  if RunVim([], [], '-s - <Xscript')
    153    call assert_equal(1, v:shell_error)
    154    call assert_equal(['l = 1'], readfile('Xtestout'))
    155  endif
    156  call delete('Xscript')
    157  call delete('Xtestout')
    158 endfun
    159 
    160 
    161 " vim: shiftwidth=2 sts=2 expandtab