xref: /vim-8.2.3635/src/testdir/test_excmd.vim (revision 72749f06)
1" Tests for various Ex commands.
2
3source check.vim
4
5func Test_ex_delete()
6  new
7  call setline(1, ['a', 'b', 'c'])
8  2
9  " :dl is :delete with the "l" flag, not :dlist
10  .dl
11  call assert_equal(['a', 'c'], getline(1, 2))
12endfunc
13
14func Test_range_error()
15  call assert_fails(':.echo 1', 'E481:')
16  call assert_fails(':$echo 1', 'E481:')
17  call assert_fails(':1,2echo 1', 'E481:')
18  call assert_fails(':+1echo 1', 'E481:')
19  call assert_fails(':/1/echo 1', 'E481:')
20  call assert_fails(':\/echo 1', 'E481:')
21  normal vv
22  call assert_fails(":'<,'>echo 1", 'E481:')
23  call assert_fails(":\\xcenter", 'E10:')
24endfunc
25
26func Test_buffers_lastused()
27  call test_settime(localtime() - 2000) " middle
28  edit bufa
29  enew
30  call test_settime(localtime() - 10)   " newest
31  edit bufb
32  enew
33  call test_settime(1550010000)	        " oldest
34  edit bufc
35  enew
36  call test_settime(0)
37  enew
38
39  let ls = split(execute('buffers t', 'silent!'), '\n')
40  let bufs = ls->map({i,v->split(v, '"\s*')[1:2]})
41  call assert_equal(['bufb', 'bufa', 'bufc'], bufs[1:]->map({i,v->v[0]}))
42  call assert_match('1[0-3] seconds ago', bufs[1][1])
43  call assert_match('\d\d:\d\d:\d\d', bufs[2][1])
44  call assert_match('2019/02/1\d \d\d:\d\d:00', bufs[3][1])
45
46  bwipeout bufa
47  bwipeout bufb
48  bwipeout bufc
49endfunc
50
51" Test for the :copy command
52func Test_copy()
53  new
54
55  call setline(1, ['L1', 'L2', 'L3', 'L4'])
56  " copy lines in a range to inside the range
57  1,3copy 2
58  call assert_equal(['L1', 'L2', 'L1', 'L2', 'L3', 'L3', 'L4'], getline(1, 7))
59
60  " Specifying a count before using : to run an ex-command
61  exe "normal! gg4:yank\<CR>"
62  call assert_equal("L1\nL2\nL1\nL2\n", @")
63
64  close!
65endfunc
66
67" Test for the :file command
68func Test_file_cmd()
69  call assert_fails('3file', 'E474:')
70  call assert_fails('0,0file', 'E474:')
71  call assert_fails('0file abc', 'E474:')
72endfunc
73
74" Test for the :drop command
75func Test_drop_cmd()
76  call writefile(['L1', 'L2'], 'Xfile')
77  enew | only
78  drop Xfile
79  call assert_equal('L2', getline(2))
80  " Test for switching to an existing window
81  below new
82  drop Xfile
83  call assert_equal(1, winnr())
84  " Test for splitting the current window
85  enew | only
86  set modified
87  drop Xfile
88  call assert_equal(2, winnr('$'))
89  " Check for setting the argument list
90  call assert_equal(['Xfile'], argv())
91  enew | only!
92  call delete('Xfile')
93endfunc
94
95" Test for the :append command
96func Test_append_cmd()
97  new
98  call setline(1, ['  L1'])
99  call feedkeys(":append\<CR>  L2\<CR>  L3\<CR>.\<CR>", 'xt')
100  call assert_equal(['  L1', '  L2', '  L3'], getline(1, '$'))
101  %delete _
102  " append after a specific line
103  call setline(1, ['  L1', '  L2', '  L3'])
104  call feedkeys(":2append\<CR>  L4\<CR>  L5\<CR>.\<CR>", 'xt')
105  call assert_equal(['  L1', '  L2', '  L4', '  L5', '  L3'], getline(1, '$'))
106  %delete _
107  " append with toggling 'autoindent'
108  call setline(1, ['  L1'])
109  call feedkeys(":append!\<CR>  L2\<CR>  L3\<CR>.\<CR>", 'xt')
110  call assert_equal(['  L1', '    L2', '      L3'], getline(1, '$'))
111  call assert_false(&autoindent)
112  %delete _
113  " append with 'autoindent' set and toggling 'autoindent'
114  set autoindent
115  call setline(1, ['  L1'])
116  call feedkeys(":append!\<CR>  L2\<CR>  L3\<CR>.\<CR>", 'xt')
117  call assert_equal(['  L1', '  L2', '  L3'], getline(1, '$'))
118  call assert_true(&autoindent)
119  set autoindent&
120  close!
121endfunc
122
123" Test for the :insert command
124func Test_insert_cmd()
125  new
126  call setline(1, ['  L1'])
127  call feedkeys(":insert\<CR>  L2\<CR>  L3\<CR>.\<CR>", 'xt')
128  call assert_equal(['  L2', '  L3', '  L1'], getline(1, '$'))
129  %delete _
130  " insert before a specific line
131  call setline(1, ['  L1', '  L2', '  L3'])
132  call feedkeys(":2insert\<CR>  L4\<CR>  L5\<CR>.\<CR>", 'xt')
133  call assert_equal(['  L1', '  L4', '  L5', '  L2', '  L3'], getline(1, '$'))
134  %delete _
135  " insert with toggling 'autoindent'
136  call setline(1, ['  L1'])
137  call feedkeys(":insert!\<CR>  L2\<CR>  L3\<CR>.\<CR>", 'xt')
138  call assert_equal(['    L2', '      L3', '  L1'], getline(1, '$'))
139  call assert_false(&autoindent)
140  %delete _
141  " insert with 'autoindent' set and toggling 'autoindent'
142  set autoindent
143  call setline(1, ['  L1'])
144  call feedkeys(":insert!\<CR>  L2\<CR>  L3\<CR>.\<CR>", 'xt')
145  call assert_equal(['  L2', '  L3', '  L1'], getline(1, '$'))
146  call assert_true(&autoindent)
147  set autoindent&
148  close!
149endfunc
150
151" Test for the :change command
152func Test_change_cmd()
153  new
154  call setline(1, ['  L1', 'L2', 'L3'])
155  call feedkeys(":change\<CR>  L4\<CR>  L5\<CR>.\<CR>", 'xt')
156  call assert_equal(['  L4', '  L5', 'L2', 'L3'], getline(1, '$'))
157  %delete _
158  " change a specific line
159  call setline(1, ['  L1', '  L2', '  L3'])
160  call feedkeys(":2change\<CR>  L4\<CR>  L5\<CR>.\<CR>", 'xt')
161  call assert_equal(['  L1', '  L4', '  L5', '  L3'], getline(1, '$'))
162  %delete _
163  " change with toggling 'autoindent'
164  call setline(1, ['  L1', 'L2', 'L3'])
165  call feedkeys(":change!\<CR>  L4\<CR>  L5\<CR>.\<CR>", 'xt')
166  call assert_equal(['    L4', '      L5', 'L2', 'L3'], getline(1, '$'))
167  call assert_false(&autoindent)
168  %delete _
169  " change with 'autoindent' set and toggling 'autoindent'
170  set autoindent
171  call setline(1, ['  L1', 'L2', 'L3'])
172  call feedkeys(":change!\<CR>  L4\<CR>  L5\<CR>.\<CR>", 'xt')
173  call assert_equal(['  L4', '  L5', 'L2', 'L3'], getline(1, '$'))
174  call assert_true(&autoindent)
175  set autoindent&
176  close!
177endfunc
178
179" Test for the :language command
180func Test_language_cmd()
181  CheckFeature multi_lang
182
183  call assert_fails('language ctype non_existing_lang', 'E197:')
184  call assert_fails('language time non_existing_lang', 'E197:')
185endfunc
186
187" Test for the :confirm command dialog
188func Test_confirm_cmd()
189  CheckNotGui
190  CheckRunVimInTerminal
191
192  call writefile(['foo1'], 'foo')
193  call writefile(['bar1'], 'bar')
194
195  " Test for saving all the modified buffers
196  let buf = RunVimInTerminal('', {'rows': 20})
197  call term_sendkeys(buf, ":set nomore\n")
198  call term_sendkeys(buf, ":new foo\n")
199  call term_sendkeys(buf, ":call setline(1, 'foo2')\n")
200  call term_sendkeys(buf, ":new bar\n")
201  call term_sendkeys(buf, ":call setline(1, 'bar2')\n")
202  call term_sendkeys(buf, ":wincmd b\n")
203  call term_sendkeys(buf, ":confirm qall\n")
204  call WaitForAssert({-> assert_match('\[Y\]es, (N)o, Save (A)ll, (D)iscard All, (C)ancel: ', term_getline(buf, 20))}, 1000)
205  call term_sendkeys(buf, "A")
206  call StopVimInTerminal(buf)
207
208  call assert_equal(['foo2'], readfile('foo'))
209  call assert_equal(['bar2'], readfile('bar'))
210
211  " Test for discarding all the changes to modified buffers
212  let buf = RunVimInTerminal('', {'rows': 20})
213  call term_sendkeys(buf, ":set nomore\n")
214  call term_sendkeys(buf, ":new foo\n")
215  call term_sendkeys(buf, ":call setline(1, 'foo3')\n")
216  call term_sendkeys(buf, ":new bar\n")
217  call term_sendkeys(buf, ":call setline(1, 'bar3')\n")
218  call term_sendkeys(buf, ":wincmd b\n")
219  call term_sendkeys(buf, ":confirm qall\n")
220  call WaitForAssert({-> assert_match('\[Y\]es, (N)o, Save (A)ll, (D)iscard All, (C)ancel: ', term_getline(buf, 20))}, 1000)
221  call term_sendkeys(buf, "D")
222  call StopVimInTerminal(buf)
223
224  call assert_equal(['foo2'], readfile('foo'))
225  call assert_equal(['bar2'], readfile('bar'))
226
227  " Test for saving and discarding changes to some buffers
228  let buf = RunVimInTerminal('', {'rows': 20})
229  call term_sendkeys(buf, ":set nomore\n")
230  call term_sendkeys(buf, ":new foo\n")
231  call term_sendkeys(buf, ":call setline(1, 'foo4')\n")
232  call term_sendkeys(buf, ":new bar\n")
233  call term_sendkeys(buf, ":call setline(1, 'bar4')\n")
234  call term_sendkeys(buf, ":wincmd b\n")
235  call term_sendkeys(buf, ":confirm qall\n")
236  call WaitForAssert({-> assert_match('\[Y\]es, (N)o, Save (A)ll, (D)iscard All, (C)ancel: ', term_getline(buf, 20))}, 1000)
237  call term_sendkeys(buf, "N")
238  call WaitForAssert({-> assert_match('\[Y\]es, (N)o, (C)ancel: ', term_getline(buf, 20))}, 1000)
239  call term_sendkeys(buf, "Y")
240  call StopVimInTerminal(buf)
241
242  call assert_equal(['foo4'], readfile('foo'))
243  call assert_equal(['bar2'], readfile('bar'))
244
245  call delete('foo')
246  call delete('bar')
247endfunc
248
249func Test_confirm_cmd_cancel()
250  " Test for closing a window with a modified buffer
251  let buf = RunVimInTerminal('', {'rows': 20})
252  call term_sendkeys(buf, ":set nomore\n")
253  call term_sendkeys(buf, ":new\n")
254  call term_sendkeys(buf, ":call setline(1, 'abc')\n")
255  call term_sendkeys(buf, ":confirm close\n")
256  call WaitForAssert({-> assert_match('^\[Y\]es, (N)o, (C)ancel: *$',
257        \ term_getline(buf, 20))}, 1000)
258  call term_sendkeys(buf, "C")
259  call term_wait(buf, 50)
260  call term_sendkeys(buf, ":confirm close\n")
261  call WaitForAssert({-> assert_match('^\[Y\]es, (N)o, (C)ancel: *$',
262        \ term_getline(buf, 20))}, 1000)
263  call term_sendkeys(buf, "N")
264  call StopVimInTerminal(buf)
265endfunc
266
267" Test for the :print command
268func Test_print_cmd()
269  call assert_fails('print', 'E749:')
270endfunc
271
272" Test for the :winsize command
273func Test_winsize_cmd()
274  call assert_fails('winsize 1', 'E465:')
275endfunc
276
277" Test for the :redir command
278func Test_redir_cmd()
279  call assert_fails('redir @@', 'E475:')
280  call assert_fails('redir abc', 'E475:')
281  call assert_fails('redir => 1abc', 'E474:')
282  call assert_fails('redir => a b', 'E488:')
283  call assert_fails('redir => abc[1]', 'E474:')
284  let b=0zFF
285  call assert_fails('redir =>> b', 'E734:')
286  unlet b
287
288  if has('unix')
289    " Redirecting to a directory name
290    call mkdir('Xdir')
291    call assert_fails('redir > Xdir', 'E17:')
292    call delete('Xdir', 'd')
293  endif
294  if !has('bsd')
295    " Redirecting to a read-only file
296    call writefile([], 'Xfile')
297    call setfperm('Xfile', 'r--r--r--')
298    call assert_fails('redir! > Xfile', 'E190:')
299    call delete('Xfile')
300  endif
301
302  " Test for redirecting to a register
303  redir @q> | echon 'clean ' | redir END
304  redir @q>> | echon 'water' | redir END
305  call assert_equal('clean water', @q)
306
307  " Test for redirecting to a variable
308  redir => color | echon 'blue ' | redir END
309  redir =>> color | echon 'sky' | redir END
310  call assert_equal('blue sky', color)
311endfunc
312
313" Test for the :filetype command
314func Test_filetype_cmd()
315  call assert_fails('filetype abc', 'E475:')
316endfunc
317
318" Test for the :mode command
319func Test_mode_cmd()
320  call assert_fails('mode abc', 'E359:')
321endfunc
322
323" Test for the :sleep command
324func Test_sleep_cmd()
325  call assert_fails('sleep x', 'E475:')
326endfunc
327
328" Test for the :read command
329func Test_read_cmd()
330  call writefile(['one'], 'Xfile')
331  new
332  call assert_fails('read', 'E32:')
333  edit Xfile
334  read
335  call assert_equal(['one', 'one'], getline(1, '$'))
336  close!
337  new
338  read Xfile
339  call assert_equal(['', 'one'], getline(1, '$'))
340  call deletebufline('', 1, '$')
341  call feedkeys("Qr Xfile\<CR>visual\<CR>", 'xt')
342  call assert_equal(['one'], getline(1, '$'))
343  close!
344  call delete('Xfile')
345endfunc
346
347" Test for running Ex commands when text is locked.
348" <C-\>e in the command line is used to lock the text
349func Test_run_excmd_with_text_locked()
350  " :quit
351  let cmd = ":\<C-\>eexecute('quit')\<CR>\<C-C>"
352  call assert_fails("call feedkeys(cmd, 'xt')", 'E523:')
353
354  " :qall
355  let cmd = ":\<C-\>eexecute('qall')\<CR>\<C-C>"
356  call assert_fails("call feedkeys(cmd, 'xt')", 'E523:')
357
358  " :exit
359  let cmd = ":\<C-\>eexecute('exit')\<CR>\<C-C>"
360  call assert_fails("call feedkeys(cmd, 'xt')", 'E523:')
361
362  " :close - should be ignored
363  new
364  let cmd = ":\<C-\>eexecute('close')\<CR>\<C-C>"
365  call assert_equal(2, winnr('$'))
366  close
367
368  call assert_fails("call feedkeys(\":\<C-R>=execute('bnext')\<CR>\", 'xt')", 'E523:')
369endfunc
370
371" Test for the :verbose command
372func Test_verbose_cmd()
373  call assert_equal(['  verbose=1'], split(execute('verbose set vbs'), "\n"))
374  call assert_equal(['  verbose=0'], split(execute('0verbose set vbs'), "\n"))
375  let l = execute("4verbose set verbose | set verbose")
376  call assert_equal(['  verbose=4', '  verbose=0'], split(l, "\n"))
377endfunc
378
379" Test for the :delete command and the related abbreviated commands
380func Test_excmd_delete()
381  new
382  call setline(1, ['foo', "\tbar"])
383  call assert_equal(['^Ibar$'], split(execute('dl'), "\n"))
384  call setline(1, ['foo', "\tbar"])
385  call assert_equal(['^Ibar$'], split(execute('dell'), "\n"))
386  call setline(1, ['foo', "\tbar"])
387  call assert_equal(['^Ibar$'], split(execute('delel'), "\n"))
388  call setline(1, ['foo', "\tbar"])
389  call assert_equal(['^Ibar$'], split(execute('deletl'), "\n"))
390  call setline(1, ['foo', "\tbar"])
391  call assert_equal(['^Ibar$'], split(execute('deletel'), "\n"))
392  call setline(1, ['foo', "\tbar"])
393  call assert_equal(['        bar'], split(execute('dp'), "\n"))
394  call setline(1, ['foo', "\tbar"])
395  call assert_equal(['        bar'], split(execute('dep'), "\n"))
396  call setline(1, ['foo', "\tbar"])
397  call assert_equal(['        bar'], split(execute('delp'), "\n"))
398  call setline(1, ['foo', "\tbar"])
399  call assert_equal(['        bar'], split(execute('delep'), "\n"))
400  call setline(1, ['foo', "\tbar"])
401  call assert_equal(['        bar'], split(execute('deletp'), "\n"))
402  call setline(1, ['foo', "\tbar"])
403  call assert_equal(['        bar'], split(execute('deletep'), "\n"))
404  close!
405endfunc
406
407" vim: shiftwidth=2 sts=2 expandtab
408