1" Tests for when a file was changed outside of Vim. 2 3func Test_FileChangedShell_reload() 4 if !has('unix') 5 return 6 endif 7 augroup testreload 8 au FileChangedShell Xchanged_r let g:reason = v:fcs_reason | let v:fcs_choice = 'reload' 9 augroup END 10 new Xchanged_r 11 call setline(1, 'reload this') 12 write 13 " Need to wait until the timestamp would change by at least a second. 14 sleep 2 15 silent !echo 'extra line' >>Xchanged_r 16 checktime 17 call assert_equal('changed', g:reason) 18 call assert_equal(2, line('$')) 19 call assert_equal('extra line', getline(2)) 20 21 " Only triggers once 22 let g:reason = '' 23 checktime 24 call assert_equal('', g:reason) 25 26 " When deleted buffer is not reloaded 27 silent !rm Xchanged_r 28 let g:reason = '' 29 checktime 30 call assert_equal('deleted', g:reason) 31 call assert_equal(2, line('$')) 32 call assert_equal('extra line', getline(2)) 33 34 " When recreated buffer is reloaded 35 call setline(1, 'buffer is changed') 36 silent !echo 'new line' >>Xchanged_r 37 let g:reason = '' 38 checktime 39 call assert_equal('conflict', g:reason) 40 call assert_equal(1, line('$')) 41 call assert_equal('new line', getline(1)) 42 43 " Only mode changed 44 silent !chmod +x Xchanged_r 45 let g:reason = '' 46 checktime 47 call assert_equal('mode', g:reason) 48 call assert_equal(1, line('$')) 49 call assert_equal('new line', getline(1)) 50 51 " Only time changed 52 sleep 2 53 silent !touch Xchanged_r 54 let g:reason = '' 55 checktime 56 call assert_equal('time', g:reason) 57 call assert_equal(1, line('$')) 58 call assert_equal('new line', getline(1)) 59 60 if has('persistent_undo') 61 " With an undo file the reload can be undone and a change before the 62 " reload. 63 set undofile 64 call setline(2, 'before write') 65 write 66 call setline(2, 'after write') 67 sleep 2 68 silent !echo 'different line' >>Xchanged_r 69 let g:reason = '' 70 checktime 71 call assert_equal('conflict', g:reason) 72 call assert_equal(3, line('$')) 73 call assert_equal('before write', getline(2)) 74 call assert_equal('different line', getline(3)) 75 " undo the reload 76 undo 77 call assert_equal(2, line('$')) 78 call assert_equal('after write', getline(2)) 79 " undo the change before reload 80 undo 81 call assert_equal(2, line('$')) 82 call assert_equal('before write', getline(2)) 83 84 set noundofile 85 endif 86 87 au! testreload 88 bwipe! 89 call delete(undofile('Xchanged_r')) 90 call delete('Xchanged_r') 91endfunc 92 93func Test_file_changed_dialog() 94 if !has('unix') || has('gui_running') 95 return 96 endif 97 au! FileChangedShell 98 99 new Xchanged_d 100 call setline(1, 'reload this') 101 write 102 " Need to wait until the timestamp would change by at least a second. 103 sleep 2 104 silent !echo 'extra line' >>Xchanged_d 105 call feedkeys('L', 'L') 106 checktime 107 call assert_match('W11:', v:warningmsg) 108 call assert_equal(2, line('$')) 109 call assert_equal('reload this', getline(1)) 110 call assert_equal('extra line', getline(2)) 111 112 " delete buffer, only shows an error, no prompt 113 silent !rm Xchanged_d 114 checktime 115 call assert_match('E211:', v:warningmsg) 116 call assert_equal(2, line('$')) 117 call assert_equal('extra line', getline(2)) 118 119 " Recreate buffer and reload 120 call setline(1, 'buffer is changed') 121 silent !echo 'new line' >Xchanged_d 122 call feedkeys('L', 'L') 123 checktime 124 call assert_match('W12:', v:warningmsg) 125 call assert_equal(1, line('$')) 126 call assert_equal('new line', getline(1)) 127 128 " Only mode changed, reload 129 silent !chmod +x Xchanged_d 130 call feedkeys('L', 'L') 131 checktime 132 call assert_match('W16:', v:warningmsg) 133 call assert_equal(1, line('$')) 134 call assert_equal('new line', getline(1)) 135 136 " Only time changed, no prompt 137 sleep 2 138 silent !touch Xchanged_d 139 let v:warningmsg = '' 140 checktime 141 call assert_equal('', v:warningmsg) 142 call assert_equal(1, line('$')) 143 call assert_equal('new line', getline(1)) 144 145 bwipe! 146 call delete('Xchanged_d') 147endfunc 148