15e66b42aSBram Moolenaar" Tests for when a file was changed outside of Vim.
25e66b42aSBram Moolenaar
38c5a278fSBram Moolenaarsource check.vim
48c5a278fSBram Moolenaar
55e66b42aSBram Moolenaarfunc Test_FileChangedShell_reload()
68c5a278fSBram Moolenaar  CheckUnix
78c5a278fSBram Moolenaar
85e66b42aSBram Moolenaar  augroup testreload
95e66b42aSBram Moolenaar    au FileChangedShell Xchanged_r let g:reason = v:fcs_reason | let v:fcs_choice = 'reload'
105e66b42aSBram Moolenaar  augroup END
115e66b42aSBram Moolenaar  new Xchanged_r
125e66b42aSBram Moolenaar  call setline(1, 'reload this')
135e66b42aSBram Moolenaar  write
145e66b42aSBram Moolenaar  " Need to wait until the timestamp would change by at least a second.
155e66b42aSBram Moolenaar  sleep 2
165e66b42aSBram Moolenaar  silent !echo 'extra line' >>Xchanged_r
175e66b42aSBram Moolenaar  checktime
185e66b42aSBram Moolenaar  call assert_equal('changed', g:reason)
195e66b42aSBram Moolenaar  call assert_equal(2, line('$'))
205e66b42aSBram Moolenaar  call assert_equal('extra line', getline(2))
215e66b42aSBram Moolenaar
225e66b42aSBram Moolenaar  " Only triggers once
235e66b42aSBram Moolenaar  let g:reason = ''
245e66b42aSBram Moolenaar  checktime
255e66b42aSBram Moolenaar  call assert_equal('', g:reason)
265e66b42aSBram Moolenaar
275e66b42aSBram Moolenaar  " When deleted buffer is not reloaded
285e66b42aSBram Moolenaar  silent !rm Xchanged_r
295e66b42aSBram Moolenaar  let g:reason = ''
305e66b42aSBram Moolenaar  checktime
315e66b42aSBram Moolenaar  call assert_equal('deleted', g:reason)
325e66b42aSBram Moolenaar  call assert_equal(2, line('$'))
335e66b42aSBram Moolenaar  call assert_equal('extra line', getline(2))
345e66b42aSBram Moolenaar
355e66b42aSBram Moolenaar  " When recreated buffer is reloaded
365e66b42aSBram Moolenaar  call setline(1, 'buffer is changed')
375e66b42aSBram Moolenaar  silent !echo 'new line' >>Xchanged_r
385e66b42aSBram Moolenaar  let g:reason = ''
395e66b42aSBram Moolenaar  checktime
405e66b42aSBram Moolenaar  call assert_equal('conflict', g:reason)
415e66b42aSBram Moolenaar  call assert_equal(1, line('$'))
425e66b42aSBram Moolenaar  call assert_equal('new line', getline(1))
435e66b42aSBram Moolenaar
445e66b42aSBram Moolenaar  " Only mode changed
455e66b42aSBram Moolenaar  silent !chmod +x Xchanged_r
465e66b42aSBram Moolenaar  let g:reason = ''
475e66b42aSBram Moolenaar  checktime
485e66b42aSBram Moolenaar  call assert_equal('mode', g:reason)
495e66b42aSBram Moolenaar  call assert_equal(1, line('$'))
505e66b42aSBram Moolenaar  call assert_equal('new line', getline(1))
515e66b42aSBram Moolenaar
525e66b42aSBram Moolenaar  " Only time changed
535e66b42aSBram Moolenaar  sleep 2
545e66b42aSBram Moolenaar  silent !touch Xchanged_r
555e66b42aSBram Moolenaar  let g:reason = ''
565e66b42aSBram Moolenaar  checktime
575e66b42aSBram Moolenaar  call assert_equal('time', g:reason)
585e66b42aSBram Moolenaar  call assert_equal(1, line('$'))
595e66b42aSBram Moolenaar  call assert_equal('new line', getline(1))
605e66b42aSBram Moolenaar
615e66b42aSBram Moolenaar  if has('persistent_undo')
625e66b42aSBram Moolenaar    " With an undo file the reload can be undone and a change before the
635e66b42aSBram Moolenaar    " reload.
645e66b42aSBram Moolenaar    set undofile
655e66b42aSBram Moolenaar    call setline(2, 'before write')
665e66b42aSBram Moolenaar    write
675e66b42aSBram Moolenaar    call setline(2, 'after write')
685e66b42aSBram Moolenaar    sleep 2
695e66b42aSBram Moolenaar    silent !echo 'different line' >>Xchanged_r
705e66b42aSBram Moolenaar    let g:reason = ''
715e66b42aSBram Moolenaar    checktime
725e66b42aSBram Moolenaar    call assert_equal('conflict', g:reason)
735e66b42aSBram Moolenaar    call assert_equal(3, line('$'))
745e66b42aSBram Moolenaar    call assert_equal('before write', getline(2))
755e66b42aSBram Moolenaar    call assert_equal('different line', getline(3))
765e66b42aSBram Moolenaar    " undo the reload
775e66b42aSBram Moolenaar    undo
785e66b42aSBram Moolenaar    call assert_equal(2, line('$'))
795e66b42aSBram Moolenaar    call assert_equal('after write', getline(2))
805e66b42aSBram Moolenaar    " undo the change before reload
815e66b42aSBram Moolenaar    undo
825e66b42aSBram Moolenaar    call assert_equal(2, line('$'))
835e66b42aSBram Moolenaar    call assert_equal('before write', getline(2))
845e66b42aSBram Moolenaar
855e66b42aSBram Moolenaar    set noundofile
865e66b42aSBram Moolenaar  endif
875e66b42aSBram Moolenaar
885e66b42aSBram Moolenaar  au! testreload
895e66b42aSBram Moolenaar  bwipe!
90137c14bbSBram Moolenaar  call delete(undofile('Xchanged_r'))
915e66b42aSBram Moolenaar  call delete('Xchanged_r')
925e66b42aSBram Moolenaarendfunc
935e66b42aSBram Moolenaar
945e66b42aSBram Moolenaarfunc Test_file_changed_dialog()
958c5a278fSBram Moolenaar  CheckUnix
968c5a278fSBram Moolenaar  CheckNotGui
975e66b42aSBram Moolenaar  au! FileChangedShell
985e66b42aSBram Moolenaar
995e66b42aSBram Moolenaar  new Xchanged_d
1005e66b42aSBram Moolenaar  call setline(1, 'reload this')
1015e66b42aSBram Moolenaar  write
1025e66b42aSBram Moolenaar  " Need to wait until the timestamp would change by at least a second.
1035e66b42aSBram Moolenaar  sleep 2
1045e66b42aSBram Moolenaar  silent !echo 'extra line' >>Xchanged_d
1055e66b42aSBram Moolenaar  call feedkeys('L', 'L')
1065e66b42aSBram Moolenaar  checktime
1075e66b42aSBram Moolenaar  call assert_match('W11:', v:warningmsg)
1085e66b42aSBram Moolenaar  call assert_equal(2, line('$'))
1095e66b42aSBram Moolenaar  call assert_equal('reload this', getline(1))
1105e66b42aSBram Moolenaar  call assert_equal('extra line', getline(2))
1115e66b42aSBram Moolenaar
1125e66b42aSBram Moolenaar  " delete buffer, only shows an error, no prompt
1135e66b42aSBram Moolenaar  silent !rm Xchanged_d
1145e66b42aSBram Moolenaar  checktime
1155e66b42aSBram Moolenaar  call assert_match('E211:', v:warningmsg)
1165e66b42aSBram Moolenaar  call assert_equal(2, line('$'))
1175e66b42aSBram Moolenaar  call assert_equal('extra line', getline(2))
1188239c620SBram Moolenaar  let v:warningmsg = 'empty'
1195e66b42aSBram Moolenaar
1208239c620SBram Moolenaar  " change buffer, recreate the file and reload
1215e66b42aSBram Moolenaar  call setline(1, 'buffer is changed')
1225e66b42aSBram Moolenaar  silent !echo 'new line' >Xchanged_d
1235e66b42aSBram Moolenaar  call feedkeys('L', 'L')
1245e66b42aSBram Moolenaar  checktime
1255e66b42aSBram Moolenaar  call assert_match('W12:', v:warningmsg)
1265e66b42aSBram Moolenaar  call assert_equal(1, line('$'))
1275e66b42aSBram Moolenaar  call assert_equal('new line', getline(1))
1285e66b42aSBram Moolenaar
1295e66b42aSBram Moolenaar  " Only mode changed, reload
1305e66b42aSBram Moolenaar  silent !chmod +x Xchanged_d
1315e66b42aSBram Moolenaar  call feedkeys('L', 'L')
1325e66b42aSBram Moolenaar  checktime
1335e66b42aSBram Moolenaar  call assert_match('W16:', v:warningmsg)
1345e66b42aSBram Moolenaar  call assert_equal(1, line('$'))
1355e66b42aSBram Moolenaar  call assert_equal('new line', getline(1))
1365e66b42aSBram Moolenaar
1375e66b42aSBram Moolenaar  " Only time changed, no prompt
1385e66b42aSBram Moolenaar  sleep 2
1395e66b42aSBram Moolenaar  silent !touch Xchanged_d
1405e66b42aSBram Moolenaar  let v:warningmsg = ''
141e20b9eceSBram Moolenaar  checktime Xchanged_d
1425e66b42aSBram Moolenaar  call assert_equal('', v:warningmsg)
1435e66b42aSBram Moolenaar  call assert_equal(1, line('$'))
1445e66b42aSBram Moolenaar  call assert_equal('new line', getline(1))
1455e66b42aSBram Moolenaar
146*b340baedSBram Moolenaar  " File created after starting to edit it
147*b340baedSBram Moolenaar  call delete('Xchanged_d')
148*b340baedSBram Moolenaar  new Xchanged_d
149*b340baedSBram Moolenaar  call writefile(['one'], 'Xchanged_d')
150*b340baedSBram Moolenaar  call feedkeys('L', 'L')
151*b340baedSBram Moolenaar  checktime Xchanged_d
152*b340baedSBram Moolenaar  call assert_equal(['one'], getline(1, '$'))
153*b340baedSBram Moolenaar  close!
154*b340baedSBram Moolenaar
1555e66b42aSBram Moolenaar  bwipe!
1565e66b42aSBram Moolenaar  call delete('Xchanged_d')
1575e66b42aSBram Moolenaarendfunc
158f0cee197SBram Moolenaar
159f0cee197SBram Moolenaar" Test for editing a new buffer from a FileChangedShell autocmd
160f0cee197SBram Moolenaarfunc Test_FileChangedShell_newbuf()
161f0cee197SBram Moolenaar  call writefile(['one', 'two'], 'Xfile')
162f0cee197SBram Moolenaar  new Xfile
163f0cee197SBram Moolenaar  augroup testnewbuf
164f0cee197SBram Moolenaar    autocmd FileChangedShell * enew
165f0cee197SBram Moolenaar  augroup END
166f0cee197SBram Moolenaar  call writefile(['red'], 'Xfile')
167f0cee197SBram Moolenaar  call assert_fails('checktime', 'E811:')
168f0cee197SBram Moolenaar  au! testnewbuf
169f0cee197SBram Moolenaar  call delete('Xfile')
170f0cee197SBram Moolenaarendfunc
171f0cee197SBram Moolenaar
172f0cee197SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
173