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('Xchanged_r') 90endfunc 91 92func Test_file_changed_dialog() 93 if !has('unix') || has('gui_running') 94 return 95 endif 96 au! FileChangedShell 97 98 new Xchanged_d 99 call setline(1, 'reload this') 100 write 101 " Need to wait until the timestamp would change by at least a second. 102 sleep 2 103 silent !echo 'extra line' >>Xchanged_d 104 call feedkeys('L', 'L') 105 checktime 106 call assert_match('W11:', v:warningmsg) 107 call assert_equal(2, line('$')) 108 call assert_equal('reload this', getline(1)) 109 call assert_equal('extra line', getline(2)) 110 111 " delete buffer, only shows an error, no prompt 112 silent !rm Xchanged_d 113 checktime 114 call assert_match('E211:', v:warningmsg) 115 call assert_equal(2, line('$')) 116 call assert_equal('extra line', getline(2)) 117 118 " Recreate buffer and reload 119 call setline(1, 'buffer is changed') 120 silent !echo 'new line' >Xchanged_d 121 call feedkeys('L', 'L') 122 checktime 123 call assert_match('W12:', v:warningmsg) 124 call assert_equal(1, line('$')) 125 call assert_equal('new line', getline(1)) 126 127 " Only mode changed, reload 128 silent !chmod +x Xchanged_d 129 call feedkeys('L', 'L') 130 checktime 131 call assert_match('W16:', v:warningmsg) 132 call assert_equal(1, line('$')) 133 call assert_equal('new line', getline(1)) 134 135 " Only time changed, no prompt 136 sleep 2 137 silent !touch Xchanged_d 138 let v:warningmsg = '' 139 checktime 140 call assert_equal('', v:warningmsg) 141 call assert_equal(1, line('$')) 142 call assert_equal('new line', getline(1)) 143 144 bwipe! 145 call delete('Xchanged_d') 146endfunc 147