blob: ab34420b41b0813f10d9d5a3766603ad99213753 [file] [log] [blame]
Bram Moolenaar5e66b422019-01-24 21:58:10 +01001" 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')
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