blob: bfcdb76abb5793a3b2982545c3293438b7cf0399 [file] [log] [blame]
Bram Moolenaar5e66b422019-01-24 21:58:10 +01001" Tests for when a file was changed outside of Vim.
2
Bram Moolenaar8c5a2782019-08-07 23:07:07 +02003source check.vim
4
Bram Moolenaar5e66b422019-01-24 21:58:10 +01005func Test_FileChangedShell_reload()
Bram Moolenaar8c5a2782019-08-07 23:07:07 +02006 CheckUnix
7
Bram Moolenaar5e66b422019-01-24 21:58:10 +01008 augroup testreload
9 au FileChangedShell Xchanged_r let g:reason = v:fcs_reason | let v:fcs_choice = 'reload'
10 augroup END
11 new Xchanged_r
12 call setline(1, 'reload this')
13 write
14 " Need to wait until the timestamp would change by at least a second.
15 sleep 2
16 silent !echo 'extra line' >>Xchanged_r
17 checktime
18 call assert_equal('changed', g:reason)
19 call assert_equal(2, line('$'))
20 call assert_equal('extra line', getline(2))
21
22 " Only triggers once
23 let g:reason = ''
24 checktime
25 call assert_equal('', g:reason)
26
27 " When deleted buffer is not reloaded
28 silent !rm Xchanged_r
29 let g:reason = ''
30 checktime
31 call assert_equal('deleted', g:reason)
32 call assert_equal(2, line('$'))
33 call assert_equal('extra line', getline(2))
34
35 " When recreated buffer is reloaded
36 call setline(1, 'buffer is changed')
37 silent !echo 'new line' >>Xchanged_r
38 let g:reason = ''
39 checktime
40 call assert_equal('conflict', g:reason)
41 call assert_equal(1, line('$'))
42 call assert_equal('new line', getline(1))
43
44 " Only mode changed
45 silent !chmod +x Xchanged_r
46 let g:reason = ''
47 checktime
48 call assert_equal('mode', g:reason)
49 call assert_equal(1, line('$'))
50 call assert_equal('new line', getline(1))
51
52 " Only time changed
53 sleep 2
54 silent !touch Xchanged_r
55 let g:reason = ''
56 checktime
57 call assert_equal('time', g:reason)
58 call assert_equal(1, line('$'))
59 call assert_equal('new line', getline(1))
60
61 if has('persistent_undo')
62 " With an undo file the reload can be undone and a change before the
63 " reload.
64 set undofile
65 call setline(2, 'before write')
66 write
67 call setline(2, 'after write')
68 sleep 2
69 silent !echo 'different line' >>Xchanged_r
70 let g:reason = ''
71 checktime
72 call assert_equal('conflict', g:reason)
73 call assert_equal(3, line('$'))
74 call assert_equal('before write', getline(2))
75 call assert_equal('different line', getline(3))
76 " undo the reload
77 undo
78 call assert_equal(2, line('$'))
79 call assert_equal('after write', getline(2))
80 " undo the change before reload
81 undo
82 call assert_equal(2, line('$'))
83 call assert_equal('before write', getline(2))
84
85 set noundofile
86 endif
87
88 au! testreload
89 bwipe!
Bram Moolenaar137c14b2019-04-18 20:30:55 +020090 call delete(undofile('Xchanged_r'))
Bram Moolenaar5e66b422019-01-24 21:58:10 +010091 call delete('Xchanged_r')
92endfunc
93
94func Test_file_changed_dialog()
Bram Moolenaar8c5a2782019-08-07 23:07:07 +020095 CheckUnix
96 CheckNotGui
Bram Moolenaar5e66b422019-01-24 21:58:10 +010097 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))
Bram Moolenaar8239c622019-05-24 16:46:01 +0200118 let v:warningmsg = 'empty'
Bram Moolenaar5e66b422019-01-24 21:58:10 +0100119
Bram Moolenaar8239c622019-05-24 16:46:01 +0200120 " change buffer, recreate the file and reload
Bram Moolenaar5e66b422019-01-24 21:58:10 +0100121 call setline(1, 'buffer is changed')
122 silent !echo 'new line' >Xchanged_d
123 call feedkeys('L', 'L')
124 checktime
125 call assert_match('W12:', v:warningmsg)
126 call assert_equal(1, line('$'))
127 call assert_equal('new line', getline(1))
128
129 " Only mode changed, reload
130 silent !chmod +x Xchanged_d
131 call feedkeys('L', 'L')
132 checktime
133 call assert_match('W16:', v:warningmsg)
134 call assert_equal(1, line('$'))
135 call assert_equal('new line', getline(1))
136
137 " Only time changed, no prompt
138 sleep 2
139 silent !touch Xchanged_d
140 let v:warningmsg = ''
141 checktime
142 call assert_equal('', v:warningmsg)
143 call assert_equal(1, line('$'))
144 call assert_equal('new line', getline(1))
145
146 bwipe!
147 call delete('Xchanged_d')
148endfunc