xref: /vim-8.2.3635/src/testdir/test_cmdline.vim (revision 8fe1000e)
1" Tests for editing the command line.
2
3func Test_complete_tab()
4  call writefile(['testfile'], 'Xtestfile')
5  call feedkeys(":e Xtest\t\r", "tx")
6  call assert_equal('testfile', getline(1))
7  call delete('Xtestfile')
8endfunc
9
10func Test_complete_list()
11  " We can't see the output, but at least we check the code runs properly.
12  call feedkeys(":e test\<C-D>\r", "tx")
13  call assert_equal('test', expand('%:t'))
14endfunc
15
16func Test_complete_wildmenu()
17  call mkdir('Xdir1/Xdir2', 'p')
18  call writefile(['testfile1'], 'Xdir1/Xtestfile1')
19  call writefile(['testfile2'], 'Xdir1/Xtestfile2')
20  call writefile(['testfile3'], 'Xdir1/Xdir2/Xtestfile3')
21  call writefile(['testfile3'], 'Xdir1/Xdir2/Xtestfile4')
22  set wildmenu
23
24  " Pressing <Tab> completes, and moves to next files when pressing again.
25  call feedkeys(":e Xdir1/\<Tab>\<Tab>\<CR>", 'tx')
26  call assert_equal('testfile1', getline(1))
27  call feedkeys(":e Xdir1/\<Tab>\<Tab>\<Tab>\<CR>", 'tx')
28  call assert_equal('testfile2', getline(1))
29
30  " <S-Tab> is like <Tab> but begin with the last match and then go to
31  " previous.
32  call feedkeys(":e Xdir1/Xtest\<S-Tab>\<CR>", 'tx')
33  call assert_equal('testfile2', getline(1))
34  call feedkeys(":e Xdir1/Xtest\<S-Tab>\<S-Tab>\<CR>", 'tx')
35  call assert_equal('testfile1', getline(1))
36
37  " <Left>/<Right> to move to previous/next file.
38  call feedkeys(":e Xdir1/\<Tab>\<Right>\<CR>", 'tx')
39  call assert_equal('testfile1', getline(1))
40  call feedkeys(":e Xdir1/\<Tab>\<Right>\<Right>\<CR>", 'tx')
41  call assert_equal('testfile2', getline(1))
42  call feedkeys(":e Xdir1/\<Tab>\<Right>\<Right>\<Left>\<CR>", 'tx')
43  call assert_equal('testfile1', getline(1))
44
45  " <Up>/<Down> to go up/down directories.
46  call feedkeys(":e Xdir1/\<Tab>\<Down>\<CR>", 'tx')
47  call assert_equal('testfile3', getline(1))
48  call feedkeys(":e Xdir1/\<Tab>\<Down>\<Up>\<Right>\<CR>", 'tx')
49  call assert_equal('testfile1', getline(1))
50
51  " cleanup
52  %bwipe
53  call delete('Xdir1/Xdir2/Xtestfile4')
54  call delete('Xdir1/Xdir2/Xtestfile3')
55  call delete('Xdir1/Xtestfile2')
56  call delete('Xdir1/Xtestfile1')
57  call delete('Xdir1/Xdir2', 'd')
58  call delete('Xdir1', 'd')
59  set nowildmenu
60endfunc
61
62func Test_map_completion()
63  if !has('cmdline_compl')
64    return
65  endif
66  call feedkeys(":map <unique> <si\<Tab>\<Home>\"\<CR>", 'xt')
67  call assert_equal('"map <unique> <silent>', getreg(':'))
68  call feedkeys(":map <script> <un\<Tab>\<Home>\"\<CR>", 'xt')
69  call assert_equal('"map <script> <unique>', getreg(':'))
70  call feedkeys(":map <expr> <sc\<Tab>\<Home>\"\<CR>", 'xt')
71  call assert_equal('"map <expr> <script>', getreg(':'))
72  call feedkeys(":map <buffer> <e\<Tab>\<Home>\"\<CR>", 'xt')
73  call assert_equal('"map <buffer> <expr>', getreg(':'))
74  call feedkeys(":map <nowait> <b\<Tab>\<Home>\"\<CR>", 'xt')
75  call assert_equal('"map <nowait> <buffer>', getreg(':'))
76  call feedkeys(":map <special> <no\<Tab>\<Home>\"\<CR>", 'xt')
77  call assert_equal('"map <special> <nowait>', getreg(':'))
78  call feedkeys(":map <silent> <sp\<Tab>\<Home>\"\<CR>", 'xt')
79  call assert_equal('"map <silent> <special>', getreg(':'))
80
81  map <Middle>x middle
82
83  map ,f commaf
84  map ,g commaf
85  map <Left> left
86  map <A-Left>x shiftleft
87  call feedkeys(":map ,\<Tab>\<Home>\"\<CR>", 'xt')
88  call assert_equal('"map ,f', getreg(':'))
89  call feedkeys(":map ,\<Tab>\<Tab>\<Home>\"\<CR>", 'xt')
90  call assert_equal('"map ,g', getreg(':'))
91  call feedkeys(":map <L\<Tab>\<Home>\"\<CR>", 'xt')
92  call assert_equal('"map <Left>', getreg(':'))
93  call feedkeys(":map <A-Left>\<Tab>\<Home>\"\<CR>", 'xt')
94  call assert_equal("\"map <A-Left>\<Tab>", getreg(':'))
95  unmap ,f
96  unmap ,g
97  unmap <Left>
98  unmap <A-Left>x
99
100  set cpo-=< cpo-=B cpo-=k
101  map <Left> left
102  call feedkeys(":map <L\<Tab>\<Home>\"\<CR>", 'xt')
103  call assert_equal('"map <Left>', getreg(':'))
104  call feedkeys(":map <M\<Tab>\<Home>\"\<CR>", 'xt')
105  call assert_equal("\"map <M\<Tab>", getreg(':'))
106  unmap <Left>
107
108  set cpo+=<
109  map <Left> left
110  exe "set t_k6=\<Esc>[17~"
111  call feedkeys(":map \<Esc>[17~x f6x\<CR>", 'xt')
112  call feedkeys(":map <L\<Tab>\<Home>\"\<CR>", 'xt')
113  call assert_equal('"map <Left>', getreg(':'))
114  if !has('gui_running')
115    call feedkeys(":map \<Esc>[17~\<Tab>\<Home>\"\<CR>", 'xt')
116    call assert_equal("\"map <F6>x", getreg(':'))
117  endif
118  unmap <Left>
119  call feedkeys(":unmap \<Esc>[17~x\<CR>", 'xt')
120  set cpo-=<
121
122  set cpo+=B
123  map <Left> left
124  call feedkeys(":map <L\<Tab>\<Home>\"\<CR>", 'xt')
125  call assert_equal('"map <Left>', getreg(':'))
126  unmap <Left>
127  set cpo-=B
128
129  set cpo+=k
130  map <Left> left
131  call feedkeys(":map <L\<Tab>\<Home>\"\<CR>", 'xt')
132  call assert_equal('"map <Left>', getreg(':'))
133  unmap <Left>
134  set cpo-=k
135
136  unmap <Middle>x
137  set cpo&vim
138endfunc
139
140func Test_match_completion()
141  if !has('cmdline_compl')
142    return
143  endif
144  hi Aardig ctermfg=green
145  call feedkeys(":match \<Tab>\<Home>\"\<CR>", 'xt')
146  call assert_equal('"match Aardig', getreg(':'))
147  call feedkeys(":match \<S-Tab>\<Home>\"\<CR>", 'xt')
148  call assert_equal('"match none', getreg(':'))
149endfunc
150
151func Test_highlight_completion()
152  if !has('cmdline_compl')
153    return
154  endif
155  hi Aardig ctermfg=green
156  call feedkeys(":hi \<Tab>\<Home>\"\<CR>", 'xt')
157  call assert_equal('"hi Aardig', getreg(':'))
158  call feedkeys(":hi default \<Tab>\<Home>\"\<CR>", 'xt')
159  call assert_equal('"hi default Aardig', getreg(':'))
160  call feedkeys(":hi clear Aa\<Tab>\<Home>\"\<CR>", 'xt')
161  call assert_equal('"hi clear Aardig', getreg(':'))
162  call feedkeys(":hi li\<S-Tab>\<Home>\"\<CR>", 'xt')
163  call assert_equal('"hi link', getreg(':'))
164  call feedkeys(":hi d\<S-Tab>\<Home>\"\<CR>", 'xt')
165  call assert_equal('"hi default', getreg(':'))
166  call feedkeys(":hi c\<S-Tab>\<Home>\"\<CR>", 'xt')
167  call assert_equal('"hi clear', getreg(':'))
168
169  " A cleared group does not show up in completions.
170  hi Anders ctermfg=green
171  call assert_equal(['Aardig', 'Anders'], getcompletion('A', 'highlight'))
172  hi clear Aardig
173  call assert_equal(['Anders'], getcompletion('A', 'highlight'))
174  hi clear Anders
175  call assert_equal([], getcompletion('A', 'highlight'))
176endfunc
177
178func Test_expr_completion()
179  if !has('cmdline_compl')
180    return
181  endif
182  for cmd in [
183	\ 'let a = ',
184	\ 'if',
185	\ 'elseif',
186	\ 'while',
187	\ 'for',
188	\ 'echo',
189	\ 'echon',
190	\ 'execute',
191	\ 'echomsg',
192	\ 'echoerr',
193	\ 'call',
194	\ 'return',
195	\ 'cexpr',
196	\ 'caddexpr',
197	\ 'cgetexpr',
198	\ 'lexpr',
199	\ 'laddexpr',
200	\ 'lgetexpr']
201    call feedkeys(":" . cmd . " getl\<Tab>\<Home>\"\<CR>", 'xt')
202    call assert_equal('"' . cmd . ' getline(', getreg(':'))
203  endfor
204endfunc
205
206func Test_getcompletion()
207  if !has('cmdline_compl')
208    return
209  endif
210  let groupcount = len(getcompletion('', 'event'))
211  call assert_true(groupcount > 0)
212  let matchcount = len('File'->getcompletion('event'))
213  call assert_true(matchcount > 0)
214  call assert_true(groupcount > matchcount)
215
216  if has('menu')
217    source $VIMRUNTIME/menu.vim
218    let matchcount = len(getcompletion('', 'menu'))
219    call assert_true(matchcount > 0)
220    call assert_equal(['File.'], getcompletion('File', 'menu'))
221    call assert_true(matchcount > 0)
222    let matchcount = len(getcompletion('File.', 'menu'))
223    call assert_true(matchcount > 0)
224  endif
225
226  let l = getcompletion('v:n', 'var')
227  call assert_true(index(l, 'v:null') >= 0)
228  let l = getcompletion('v:notexists', 'var')
229  call assert_equal([], l)
230
231  args a.c b.c
232  let l = getcompletion('', 'arglist')
233  call assert_equal(['a.c', 'b.c'], l)
234  %argdelete
235
236  let l = getcompletion('', 'augroup')
237  call assert_true(index(l, 'END') >= 0)
238  let l = getcompletion('blahblah', 'augroup')
239  call assert_equal([], l)
240
241  let l = getcompletion('', 'behave')
242  call assert_true(index(l, 'mswin') >= 0)
243  let l = getcompletion('not', 'behave')
244  call assert_equal([], l)
245
246  let l = getcompletion('', 'color')
247  call assert_true(index(l, 'default') >= 0)
248  let l = getcompletion('dirty', 'color')
249  call assert_equal([], l)
250
251  let l = getcompletion('', 'command')
252  call assert_true(index(l, 'sleep') >= 0)
253  let l = getcompletion('awake', 'command')
254  call assert_equal([], l)
255
256  let l = getcompletion('', 'dir')
257  call assert_true(index(l, 'samples/') >= 0)
258  let l = getcompletion('NoMatch', 'dir')
259  call assert_equal([], l)
260
261  let l = getcompletion('exe', 'expression')
262  call assert_true(index(l, 'executable(') >= 0)
263  let l = getcompletion('kill', 'expression')
264  call assert_equal([], l)
265
266  let l = getcompletion('tag', 'function')
267  call assert_true(index(l, 'taglist(') >= 0)
268  let l = getcompletion('paint', 'function')
269  call assert_equal([], l)
270
271  let Flambda = {-> 'hello'}
272  let l = getcompletion('', 'function')
273  let l = filter(l, {i, v -> v =~ 'lambda'})
274  call assert_equal([], l)
275
276  let l = getcompletion('run', 'file')
277  call assert_true(index(l, 'runtest.vim') >= 0)
278  let l = getcompletion('walk', 'file')
279  call assert_equal([], l)
280  set wildignore=*.vim
281  let l = getcompletion('run', 'file', 1)
282  call assert_true(index(l, 'runtest.vim') < 0)
283  set wildignore&
284
285  let l = getcompletion('ha', 'filetype')
286  call assert_true(index(l, 'hamster') >= 0)
287  let l = getcompletion('horse', 'filetype')
288  call assert_equal([], l)
289
290  let l = getcompletion('z', 'syntax')
291  call assert_true(index(l, 'zimbu') >= 0)
292  let l = getcompletion('emacs', 'syntax')
293  call assert_equal([], l)
294
295  let l = getcompletion('jikes', 'compiler')
296  call assert_true(index(l, 'jikes') >= 0)
297  let l = getcompletion('break', 'compiler')
298  call assert_equal([], l)
299
300  let l = getcompletion('last', 'help')
301  call assert_true(index(l, ':tablast') >= 0)
302  let l = getcompletion('giveup', 'help')
303  call assert_equal([], l)
304
305  let l = getcompletion('time', 'option')
306  call assert_true(index(l, 'timeoutlen') >= 0)
307  let l = getcompletion('space', 'option')
308  call assert_equal([], l)
309
310  let l = getcompletion('er', 'highlight')
311  call assert_true(index(l, 'ErrorMsg') >= 0)
312  let l = getcompletion('dark', 'highlight')
313  call assert_equal([], l)
314
315  let l = getcompletion('', 'messages')
316  call assert_true(index(l, 'clear') >= 0)
317  let l = getcompletion('not', 'messages')
318  call assert_equal([], l)
319
320  let l = getcompletion('', 'mapclear')
321  call assert_true(index(l, '<buffer>') >= 0)
322  let l = getcompletion('not', 'mapclear')
323  call assert_equal([], l)
324
325  let l = getcompletion('.', 'shellcmd')
326  call assert_equal(['./', '../'], filter(l, 'v:val =~ "\\./"'))
327  call assert_equal(-1, match(l[2:], '^\.\.\?/$'))
328  let root = has('win32') ? 'C:\\' : '/'
329  let l = getcompletion(root, 'shellcmd')
330  let expected = map(filter(glob(root . '*', 0, 1),
331        \ 'isdirectory(v:val) || executable(v:val)'), 'isdirectory(v:val) ? v:val . ''/'' : v:val')
332  call assert_equal(expected, l)
333
334  if has('cscope')
335    let l = getcompletion('', 'cscope')
336    let cmds = ['add', 'find', 'help', 'kill', 'reset', 'show']
337    call assert_equal(cmds, l)
338    " using cmdline completion must not change the result
339    call feedkeys(":cscope find \<c-d>\<c-c>", 'xt')
340    let l = getcompletion('', 'cscope')
341    call assert_equal(cmds, l)
342    let keys = ['a', 'c', 'd', 'e', 'f', 'g', 'i', 's', 't']
343    let l = getcompletion('find ', 'cscope')
344    call assert_equal(keys, l)
345  endif
346
347  if has('signs')
348    sign define Testing linehl=Comment
349    let l = getcompletion('', 'sign')
350    let cmds = ['define', 'jump', 'list', 'place', 'undefine', 'unplace']
351    call assert_equal(cmds, l)
352    " using cmdline completion must not change the result
353    call feedkeys(":sign list \<c-d>\<c-c>", 'xt')
354    let l = getcompletion('', 'sign')
355    call assert_equal(cmds, l)
356    let l = getcompletion('list ', 'sign')
357    call assert_equal(['Testing'], l)
358  endif
359
360  " For others test if the name is recognized.
361  let names = ['buffer', 'environment', 'file_in_path', 'mapping', 'tag', 'tag_listfiles', 'user']
362  if has('cmdline_hist')
363    call add(names, 'history')
364  endif
365  if has('gettext')
366    call add(names, 'locale')
367  endif
368  if has('profile')
369    call add(names, 'syntime')
370  endif
371
372  set tags=Xtags
373  call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//", "word\tfile\tcmd"], 'Xtags')
374
375  for name in names
376    let matchcount = len(getcompletion('', name))
377    call assert_true(matchcount >= 0, 'No matches for ' . name)
378  endfor
379
380  call delete('Xtags')
381  set tags&
382
383  call assert_fails('call getcompletion("", "burp")', 'E475:')
384endfunc
385
386func Test_shellcmd_completion()
387  let save_path = $PATH
388
389  call mkdir('Xpathdir/Xpathsubdir', 'p')
390  call writefile([''], 'Xpathdir/Xfile.exe')
391  call setfperm('Xpathdir/Xfile.exe', 'rwx------')
392
393  " Set PATH to example directory without trailing slash.
394  let $PATH = getcwd() . '/Xpathdir'
395
396  " Test for the ":!<TAB>" case.  Previously, this would include subdirs of
397  " dirs in the PATH, even though they won't be executed.  We check that only
398  " subdirs of the PWD and executables from the PATH are included in the
399  " suggestions.
400  let actual = getcompletion('X', 'shellcmd')
401  let expected = map(filter(glob('*', 0, 1), 'isdirectory(v:val) && v:val[0] == "X"'), 'v:val . "/"')
402  call insert(expected, 'Xfile.exe')
403  call assert_equal(expected, actual)
404
405  call delete('Xpathdir', 'rf')
406  let $PATH = save_path
407endfunc
408
409func Test_expand_star_star()
410  call mkdir('a/b', 'p')
411  call writefile(['asdfasdf'], 'a/b/fileXname')
412  call feedkeys(":find **/fileXname\<Tab>\<CR>", 'xt')
413  call assert_equal('find a/b/fileXname', getreg(':'))
414  bwipe!
415  call delete('a', 'rf')
416endfunc
417
418func Test_paste_in_cmdline()
419  let @a = "def"
420  call feedkeys(":abc \<C-R>a ghi\<C-B>\"\<CR>", 'tx')
421  call assert_equal('"abc def ghi', @:)
422
423  new
424  call setline(1, 'asdf.x /tmp/some verylongword a;b-c*d ')
425
426  call feedkeys(":aaa \<C-R>\<C-W> bbb\<C-B>\"\<CR>", 'tx')
427  call assert_equal('"aaa asdf bbb', @:)
428
429  call feedkeys("ft:aaa \<C-R>\<C-F> bbb\<C-B>\"\<CR>", 'tx')
430  call assert_equal('"aaa /tmp/some bbb', @:)
431
432  call feedkeys(":aaa \<C-R>\<C-L> bbb\<C-B>\"\<CR>", 'tx')
433  call assert_equal('"aaa '.getline(1).' bbb', @:)
434
435  set incsearch
436  call feedkeys("fy:aaa veryl\<C-R>\<C-W> bbb\<C-B>\"\<CR>", 'tx')
437  call assert_equal('"aaa verylongword bbb', @:)
438
439  call feedkeys("f;:aaa \<C-R>\<C-A> bbb\<C-B>\"\<CR>", 'tx')
440  call assert_equal('"aaa a;b-c*d bbb', @:)
441
442  call feedkeys(":\<C-\>etoupper(getline(1))\<CR>\<C-B>\"\<CR>", 'tx')
443  call assert_equal('"ASDF.X /TMP/SOME VERYLONGWORD A;B-C*D ', @:)
444  bwipe!
445
446  " Error while typing a command used to cause that it was not executed
447  " in the end.
448  new
449  try
450    call feedkeys(":file \<C-R>%Xtestfile\<CR>", 'tx')
451  catch /^Vim\%((\a\+)\)\=:E32/
452    " ignore error E32
453  endtry
454  call assert_equal("Xtestfile", bufname("%"))
455  bwipe!
456endfunc
457
458func Test_remove_char_in_cmdline()
459  call feedkeys(":abc def\<S-Left>\<Del>\<C-B>\"\<CR>", 'tx')
460  call assert_equal('"abc ef', @:)
461
462  call feedkeys(":abc def\<S-Left>\<BS>\<C-B>\"\<CR>", 'tx')
463  call assert_equal('"abcdef', @:)
464
465  call feedkeys(":abc def ghi\<S-Left>\<C-W>\<C-B>\"\<CR>", 'tx')
466  call assert_equal('"abc ghi', @:)
467
468  call feedkeys(":abc def\<S-Left>\<C-U>\<C-B>\"\<CR>", 'tx')
469  call assert_equal('"def', @:)
470endfunc
471
472func Test_illegal_address1()
473  new
474  2;'(
475  2;')
476  quit
477endfunc
478
479func Test_illegal_address2()
480  call writefile(['c', 'x', '  x', '.', '1;y'], 'Xtest.vim')
481  new
482  source Xtest.vim
483  " Trigger calling validate_cursor()
484  diffsp Xtest.vim
485  quit!
486  bwipe!
487  call delete('Xtest.vim')
488endfunc
489
490func Test_cmdline_complete_wildoptions()
491  help
492  call feedkeys(":tag /\<c-a>\<c-b>\"\<cr>", 'tx')
493  let a = join(sort(split(@:)),' ')
494  set wildoptions=tagfile
495  call feedkeys(":tag /\<c-a>\<c-b>\"\<cr>", 'tx')
496  let b = join(sort(split(@:)),' ')
497  call assert_equal(a, b)
498  bw!
499endfunc
500
501func Test_cmdline_complete_user_cmd()
502  command! -complete=color -nargs=1 Foo :
503  call feedkeys(":Foo \<Tab>\<Home>\"\<cr>", 'tx')
504  call assert_equal('"Foo blue', @:)
505  call feedkeys(":Foo b\<Tab>\<Home>\"\<cr>", 'tx')
506  call assert_equal('"Foo blue', @:)
507  delcommand Foo
508endfunc
509
510func Test_cmdline_complete_user_names()
511  if has('unix') && executable('whoami')
512    let whoami = systemlist('whoami')[0]
513    let first_letter = whoami[0]
514    if len(first_letter) > 0
515      " Trying completion of  :e ~x  where x is the first letter of
516      " the user name should complete to at least the user name.
517      call feedkeys(':e ~' . first_letter . "\<c-a>\<c-B>\"\<cr>", 'tx')
518      call assert_match('^"e \~.*\<' . whoami . '\>', @:)
519    endif
520  endif
521  if has('win32')
522    " Just in case: check that the system has an Administrator account.
523    let names = system('net user')
524    if names =~ 'Administrator'
525      " Trying completion of  :e ~A  should complete to Administrator.
526      " There could be other names starting with "A" before Administrator.
527      call feedkeys(':e ~A' . "\<c-a>\<c-B>\"\<cr>", 'tx')
528      call assert_match('^"e \~.*Administrator', @:)
529    endif
530  endif
531endfunc
532
533funct Test_cmdline_complete_languages()
534  let lang = substitute(execute('language messages'), '.*"\(.*\)"$', '\1', '')
535
536  call feedkeys(":language \<c-a>\<c-b>\"\<cr>", 'tx')
537  call assert_match('^"language .*\<ctype\>.*\<messages\>.*\<time\>', @:)
538
539  if has('unix')
540    " TODO: these tests don't work on Windows. lang appears to be 'C'
541    " but C does not appear in the completion. Why?
542    call assert_match('^"language .*\<' . lang . '\>', @:)
543
544    call feedkeys(":language messages \<c-a>\<c-b>\"\<cr>", 'tx')
545    call assert_match('^"language .*\<' . lang . '\>', @:)
546
547    call feedkeys(":language ctype \<c-a>\<c-b>\"\<cr>", 'tx')
548    call assert_match('^"language .*\<' . lang . '\>', @:)
549
550    call feedkeys(":language time \<c-a>\<c-b>\"\<cr>", 'tx')
551    call assert_match('^"language .*\<' . lang . '\>', @:)
552  endif
553endfunc
554
555func Test_cmdline_write_alternatefile()
556  new
557  call setline('.', ['one', 'two'])
558  f foo.txt
559  new
560  f #-A
561  call assert_equal('foo.txt-A', expand('%'))
562  f #<-B.txt
563  call assert_equal('foo-B.txt', expand('%'))
564  f %<
565  call assert_equal('foo-B', expand('%'))
566  new
567  call assert_fails('f #<', 'E95')
568  bw!
569  f foo-B.txt
570  f %<-A
571  call assert_equal('foo-B-A', expand('%'))
572  bw!
573  bw!
574endfunc
575
576" using a leading backslash here
577set cpo+=C
578
579func Test_cmdline_search_range()
580  new
581  call setline(1, ['a', 'b', 'c', 'd'])
582  /d
583  1,\/s/b/B/
584  call assert_equal('B', getline(2))
585
586  /a
587  $
588  \?,4s/c/C/
589  call assert_equal('C', getline(3))
590
591  call setline(1, ['a', 'b', 'c', 'd'])
592  %s/c/c/
593  1,\&s/b/B/
594  call assert_equal('B', getline(2))
595
596  bwipe!
597endfunc
598
599" Tests for getcmdline(), getcmdpos() and getcmdtype()
600func Check_cmdline(cmdtype)
601  call assert_equal('MyCmd a', getcmdline())
602  call assert_equal(8, getcmdpos())
603  call assert_equal(a:cmdtype, getcmdtype())
604  return ''
605endfunc
606
607set cpo&
608
609func Test_getcmdtype()
610  call feedkeys(":MyCmd a\<C-R>=Check_cmdline(':')\<CR>\<Esc>", "xt")
611
612  let cmdtype = ''
613  debuggreedy
614  call feedkeys(":debug echo 'test'\<CR>", "t")
615  call feedkeys("let cmdtype = \<C-R>=string(getcmdtype())\<CR>\<CR>", "t")
616  call feedkeys("cont\<CR>", "xt")
617  0debuggreedy
618  call assert_equal('>', cmdtype)
619
620  call feedkeys("/MyCmd a\<C-R>=Check_cmdline('/')\<CR>\<Esc>", "xt")
621  call feedkeys("?MyCmd a\<C-R>=Check_cmdline('?')\<CR>\<Esc>", "xt")
622
623  call feedkeys(":call input('Answer?')\<CR>", "t")
624  call feedkeys("MyCmd a\<C-R>=Check_cmdline('@')\<CR>\<C-C>", "xt")
625
626  call feedkeys(":insert\<CR>MyCmd a\<C-R>=Check_cmdline('-')\<CR>\<Esc>", "xt")
627
628  cnoremap <expr> <F6> Check_cmdline('=')
629  call feedkeys("a\<C-R>=MyCmd a\<F6>\<Esc>\<Esc>", "xt")
630  cunmap <F6>
631endfunc
632
633func Test_getcmdwintype()
634  call feedkeys("q/:let a = getcmdwintype()\<CR>:q\<CR>", 'x!')
635  call assert_equal('/', a)
636
637  call feedkeys("q?:let a = getcmdwintype()\<CR>:q\<CR>", 'x!')
638  call assert_equal('?', a)
639
640  call feedkeys("q::let a = getcmdwintype()\<CR>:q\<CR>", 'x!')
641  call assert_equal(':', a)
642
643  call feedkeys(":\<C-F>:let a = getcmdwintype()\<CR>:q\<CR>", 'x!')
644  call assert_equal(':', a)
645
646  call assert_equal('', getcmdwintype())
647endfunc
648
649func Test_getcmdwin_autocmd()
650  let s:seq = []
651  augroup CmdWin
652  au WinEnter * call add(s:seq, 'WinEnter ' .. win_getid())
653  au WinLeave * call add(s:seq, 'WinLeave ' .. win_getid())
654  au BufEnter * call add(s:seq, 'BufEnter ' .. bufnr())
655  au BufLeave * call add(s:seq, 'BufLeave ' .. bufnr())
656  au CmdWinEnter * call add(s:seq, 'CmdWinEnter ' .. win_getid())
657  au CmdWinLeave * call add(s:seq, 'CmdWinLeave ' .. win_getid())
658
659  let org_winid = win_getid()
660  let org_bufnr = bufnr()
661  call feedkeys("q::let a = getcmdwintype()\<CR>:let s:cmd_winid = win_getid()\<CR>:let s:cmd_bufnr = bufnr()\<CR>:q\<CR>", 'x!')
662  call assert_equal(':', a)
663  call assert_equal([
664	\ 'WinLeave ' .. org_winid,
665	\ 'WinEnter ' .. s:cmd_winid,
666	\ 'BufLeave ' .. org_bufnr,
667	\ 'BufEnter ' .. s:cmd_bufnr,
668	\ 'CmdWinEnter ' .. s:cmd_winid,
669	\ 'CmdWinLeave ' .. s:cmd_winid,
670	\ 'BufLeave ' .. s:cmd_bufnr,
671	\ 'WinLeave ' .. s:cmd_winid,
672	\ 'WinEnter ' .. org_winid,
673	\ 'BufEnter ' .. org_bufnr,
674	\ ], s:seq)
675
676  au!
677  augroup END
678endfunc
679
680func Test_verbosefile()
681  set verbosefile=Xlog
682  echomsg 'foo'
683  echomsg 'bar'
684  set verbosefile=
685  let log = readfile('Xlog')
686  call assert_match("foo\nbar", join(log, "\n"))
687  call delete('Xlog')
688endfunc
689
690func Test_setcmdpos()
691  func InsertTextAtPos(text, pos)
692    call assert_equal(0, setcmdpos(a:pos))
693    return a:text
694  endfunc
695
696  " setcmdpos() with position in the middle of the command line.
697  call feedkeys(":\"12\<C-R>=InsertTextAtPos('a', 3)\<CR>b\<CR>", 'xt')
698  call assert_equal('"1ab2', @:)
699
700  call feedkeys(":\"12\<C-R>\<C-R>=InsertTextAtPos('a', 3)\<CR>b\<CR>", 'xt')
701  call assert_equal('"1b2a', @:)
702
703  " setcmdpos() with position beyond the end of the command line.
704  call feedkeys(":\"12\<C-B>\<C-R>=InsertTextAtPos('a', 10)\<CR>b\<CR>", 'xt')
705  call assert_equal('"12ab', @:)
706
707  " setcmdpos() returns 1 when not editing the command line.
708  call assert_equal(1, 3->setcmdpos())
709endfunc
710
711func Test_cmdline_overstrike()
712  let encodings = ['latin1', 'utf8']
713  let encoding_save = &encoding
714
715  for e in encodings
716    exe 'set encoding=' . e
717
718    " Test overstrike in the middle of the command line.
719    call feedkeys(":\"01234\<home>\<right>\<right>ab\<right>\<insert>cd\<enter>", 'xt')
720    call assert_equal('"0ab1cd4', @:)
721
722    " Test overstrike going beyond end of command line.
723    call feedkeys(":\"01234\<home>\<right>\<right>ab\<right>\<insert>cdefgh\<enter>", 'xt')
724    call assert_equal('"0ab1cdefgh', @:)
725
726    " Test toggling insert/overstrike a few times.
727    call feedkeys(":\"01234\<home>\<right>ab\<right>\<insert>cd\<right>\<insert>ef\<enter>", 'xt')
728    call assert_equal('"ab0cd3ef4', @:)
729  endfor
730
731  " Test overstrike with multi-byte characters.
732  call feedkeys(":\"テキストエディタ\<home>\<right>\<right>ab\<right>\<insert>cd\<enter>", 'xt')
733  call assert_equal('"テabキcdエディタ', @:)
734
735  let &encoding = encoding_save
736endfunc
737