xref: /vim-8.2.3635/src/testdir/test_startup.vim (revision e7b1ea02)
1" Tests for startup.
2
3source shared.vim
4source screendump.vim
5source term_util.vim
6source check.vim
7
8" Check that loading startup.vim works.
9func Test_startup_script()
10  set compatible
11  source $VIMRUNTIME/defaults.vim
12
13  call assert_equal(0, &compatible)
14  " Restore some options, so that the following tests doesn't break
15  set nomore
16  set noshowmode
17endfunc
18
19" Verify the order in which plugins are loaded:
20" 1. plugins in non-after directories
21" 2. packages
22" 3. plugins in after directories
23func Test_after_comes_later()
24  if !has('packages')
25    return
26  endif
27  let before =<< trim [CODE]
28    set nocp viminfo+=nviminfo
29    set guioptions+=M
30    let $HOME = "/does/not/exist"
31    set loadplugins
32    set rtp=Xhere,Xafter,Xanother
33    set packpath=Xhere,Xafter
34    set nomore
35    let g:sequence = ""
36  [CODE]
37
38  let after =<< trim [CODE]
39    redir! > Xtestout
40    scriptnames
41    redir END
42    redir! > Xsequence
43    echo g:sequence
44    redir END
45    quit
46  [CODE]
47
48  call mkdir('Xhere/plugin', 'p')
49  call writefile(['let g:sequence .= "here "'], 'Xhere/plugin/here.vim')
50  call mkdir('Xanother/plugin', 'p')
51  call writefile(['let g:sequence .= "another "'], 'Xanother/plugin/another.vim')
52  call mkdir('Xhere/pack/foo/start/foobar/plugin', 'p')
53  call writefile(['let g:sequence .= "pack "'], 'Xhere/pack/foo/start/foobar/plugin/foo.vim')
54
55  call mkdir('Xafter/plugin', 'p')
56  call writefile(['let g:sequence .= "after "'], 'Xafter/plugin/later.vim')
57
58  if RunVim(before, after, '')
59
60    let lines = readfile('Xtestout')
61    let expected = ['Xbefore.vim', 'here.vim', 'another.vim', 'foo.vim', 'later.vim', 'Xafter.vim']
62    let found = []
63    for line in lines
64      for one in expected
65	if line =~ one
66	  call add(found, one)
67	endif
68      endfor
69    endfor
70    call assert_equal(expected, found)
71  endif
72
73  call assert_equal('here another pack after', substitute(join(readfile('Xsequence', 1), ''), '\s\+$', '', ''))
74
75  call delete('Xtestout')
76  call delete('Xsequence')
77  call delete('Xhere', 'rf')
78  call delete('Xanother', 'rf')
79  call delete('Xafter', 'rf')
80endfunc
81
82func Test_pack_in_rtp_when_plugins_run()
83  if !has('packages')
84    return
85  endif
86  let before =<< trim [CODE]
87    set nocp viminfo+=nviminfo
88    set guioptions+=M
89    let $HOME = "/does/not/exist"
90    set loadplugins
91    set rtp=Xhere
92    set packpath=Xhere
93    set nomore
94  [CODE]
95
96  let after = [
97	\ 'quit',
98	\ ]
99  call mkdir('Xhere/plugin', 'p')
100  call writefile(['redir! > Xtestout', 'silent set runtimepath?', 'silent! call foo#Trigger()', 'redir END'], 'Xhere/plugin/here.vim')
101  call mkdir('Xhere/pack/foo/start/foobar/autoload', 'p')
102  call writefile(['function! foo#Trigger()', 'echo "autoloaded foo"', 'endfunction'], 'Xhere/pack/foo/start/foobar/autoload/foo.vim')
103
104  if RunVim(before, after, '')
105
106    let lines = filter(readfile('Xtestout'), '!empty(v:val)')
107    call assert_match('Xhere[/\\]pack[/\\]foo[/\\]start[/\\]foobar', get(lines, 0))
108    call assert_match('autoloaded foo', get(lines, 1))
109  endif
110
111  call delete('Xtestout')
112  call delete('Xhere', 'rf')
113endfunc
114
115func Test_help_arg()
116  if !has('unix') && has('gui')
117    " this doesn't work with gvim on MS-Windows
118    return
119  endif
120  if RunVim([], [], '--help >Xtestout')
121    let lines = readfile('Xtestout')
122    call assert_true(len(lines) > 20)
123    call assert_match('Vi IMproved', lines[0])
124
125    " check if  couple of lines are there
126    let found = []
127    for line in lines
128      if line =~ '-R.*Readonly mode'
129	call add(found, 'Readonly mode')
130      endif
131      " Watch out for a second --version line in the Gnome version.
132      if line =~ '--version.*Print version information and exit'
133	call add(found, "--version")
134      endif
135    endfor
136    call assert_equal(['Readonly mode', '--version'], found)
137  endif
138  call delete('Xtestout')
139endfunc
140
141func Test_compatible_args()
142  let after =<< trim [CODE]
143    call writefile([string(&compatible)], "Xtestout")
144    set viminfo+=nviminfo
145    quit
146  [CODE]
147
148  if RunVim([], after, '-C')
149    let lines = readfile('Xtestout')
150    call assert_equal('1', lines[0])
151  endif
152
153  if RunVim([], after, '-N')
154    let lines = readfile('Xtestout')
155    call assert_equal('0', lines[0])
156  endif
157
158  call delete('Xtestout')
159endfunc
160
161" Test the -o[N] and -O[N] arguments to open N windows split
162" horizontally or vertically.
163func Test_o_arg()
164  let after =<< trim [CODE]
165    set cpo&vim
166    call writefile([winnr("$"),
167		\ winheight(1), winheight(2), &lines,
168		\ winwidth(1), winwidth(2), &columns,
169		\ bufname(winbufnr(1)), bufname(winbufnr(2))],
170		\ "Xtestout")
171    qall
172  [CODE]
173
174  if RunVim([], after, '-o2')
175    " Open 2 windows split horizontally. Expect:
176    " - 2 windows
177    " - both windows should have the same or almost the same height
178    " - sum of both windows height (+ 3 for both statusline and Ex command)
179    "   should be equal to the number of lines
180    " - both windows should have the same width which should be equal to the
181    "   number of columns
182    " - buffer of both windows should have no name
183    let [wn, wh1, wh2, ln, ww1, ww2, cn, bn1, bn2] = readfile('Xtestout')
184    call assert_equal('2', wn)
185    call assert_inrange(0, 1, wh1 - wh2)
186    call assert_equal(string(wh1 + wh2 + 3), ln)
187    call assert_equal(ww1, ww2)
188    call assert_equal(ww1, cn)
189    call assert_equal('', bn1)
190    call assert_equal('', bn2)
191  endif
192
193  if RunVim([], after, '-o foo bar')
194    " Same expectations as for -o2 but buffer names should be foo and bar
195    let [wn, wh1, wh2, ln, ww1, ww2, cn, bn1, bn2] = readfile('Xtestout')
196    call assert_equal('2', wn)
197    call assert_inrange(0, 1, wh1 - wh2)
198    call assert_equal(string(wh1 + wh2 + 3), ln)
199    call assert_equal(ww1, ww2)
200    call assert_equal(ww1, cn)
201    call assert_equal('foo', bn1)
202    call assert_equal('bar', bn2)
203  endif
204
205  if RunVim([], after, '-O2')
206    " Open 2 windows split vertically. Expect:
207    " - 2 windows
208    " - both windows should have the same or almost the same width
209    " - sum of both windows width (+ 1 for the separator) should be equal to
210    "   the number of columns
211    " - both windows should have the same height
212    " - window height (+ 2 for the statusline and Ex command) should be equal
213    "   to the number of lines
214    " - buffer of both windows should have no name
215    let [wn, wh1, wh2, ln, ww1, ww2, cn, bn1, bn2] = readfile('Xtestout')
216    call assert_equal('2', wn)
217    call assert_inrange(0, 1, ww1 - ww2)
218    call assert_equal(string(ww1 + ww2 + 1), cn)
219    call assert_equal(wh1, wh2)
220    call assert_equal(string(wh1 + 2), ln)
221    call assert_equal('', bn1)
222    call assert_equal('', bn2)
223  endif
224
225  if RunVim([], after, '-O foo bar')
226    " Same expectations as for -O2 but buffer names should be foo and bar
227    let [wn, wh1, wh2, ln, ww1, ww2, cn, bn1, bn2] = readfile('Xtestout')
228    call assert_equal('2', wn)
229    call assert_inrange(0, 1, ww1 - ww2)
230    call assert_equal(string(ww1 + ww2 + 1), cn)
231    call assert_equal(wh1, wh2)
232    call assert_equal(string(wh1 + 2), ln)
233    call assert_equal('foo', bn1)
234    call assert_equal('bar', bn2)
235  endif
236
237  call delete('Xtestout')
238endfunc
239
240" Test the -p[N] argument to open N tabpages.
241func Test_p_arg()
242  let after =<< trim [CODE]
243    call writefile(split(execute("tabs"), "\n"), "Xtestout")
244    qall
245  [CODE]
246
247  if RunVim([], after, '-p2')
248    let lines = readfile('Xtestout')
249    call assert_equal(4, len(lines))
250    call assert_equal('Tab page 1',    lines[0])
251    call assert_equal('>   [No Name]', lines[1])
252    call assert_equal('Tab page 2',    lines[2])
253    call assert_equal('    [No Name]', lines[3])
254  endif
255
256  if RunVim([], after, '-p foo bar')
257    let lines = readfile('Xtestout')
258    call assert_equal(4, len(lines))
259    call assert_equal('Tab page 1', lines[0])
260    call assert_equal('>   foo',    lines[1])
261    call assert_equal('Tab page 2', lines[2])
262    call assert_equal('    bar',    lines[3])
263  endif
264
265  call delete('Xtestout')
266endfunc
267
268" Test the -V[N] argument to set the 'verbose' option to [N]
269func Test_V_arg()
270  " Can't catch the output of gvim.
271  CheckNotGui
272
273  let out = system(GetVimCommand() . ' --clean -es -X -V0 -c "set verbose?" -cq')
274  call assert_equal("  verbose=0\n", out)
275
276  let out = system(GetVimCommand() . ' --clean -es -X -V2 -c "set verbose?" -cq')
277  call assert_match("sourcing \"$VIMRUNTIME[\\/]defaults\.vim\"\r\nline \\d\\+: sourcing \"[^\"]*runtime[\\/]filetype\.vim\".*\n", out)
278  call assert_match("  verbose=2\n", out)
279
280  let out = system(GetVimCommand() . ' --clean -es -X -V15 -c "set verbose?" -cq')
281   call assert_match("sourcing \"$VIMRUNTIME[\\/]defaults\.vim\"\r\nline 1: \" The default vimrc file\..*  verbose=15\n", out)
282endfunc
283
284" Test the '-q [errorfile]' argument.
285func Test_q_arg()
286  CheckFeature quickfix
287
288  let lines =<< trim END
289    /* some file with an error */
290    main() {
291      functionCall(arg; arg, arg);
292      return 666
293    }
294  END
295  call writefile(lines, 'Xbadfile.c')
296
297  let after =<< trim [CODE]
298    call writefile([&errorfile, string(getpos("."))], "Xtestout")
299    copen
300    w >> Xtestout
301    qall
302  [CODE]
303
304  " Test with default argument '-q'.
305  call assert_equal('errors.err', &errorfile)
306  call writefile(["Xbadfile.c:4:12: error: expected ';' before '}' token"], 'errors.err')
307  if RunVim([], after, '-q')
308    let lines = readfile('Xtestout')
309    call assert_equal(['errors.err',
310	\              '[0, 4, 12, 0]',
311	\              "Xbadfile.c|4 col 12| error: expected ';' before '}' token"],
312	\             lines)
313  endif
314  call delete('Xtestout')
315  call delete('errors.err')
316
317  " Test with explicit argument '-q Xerrors' (with space).
318  call writefile(["Xbadfile.c:4:12: error: expected ';' before '}' token"], 'Xerrors')
319  if RunVim([], after, '-q Xerrors')
320    let lines = readfile('Xtestout')
321    call assert_equal(['Xerrors',
322	\              '[0, 4, 12, 0]',
323	\              "Xbadfile.c|4 col 12| error: expected ';' before '}' token"],
324	\             lines)
325  endif
326  call delete('Xtestout')
327
328  " Test with explicit argument '-qXerrors' (without space).
329  if RunVim([], after, '-qXerrors')
330    let lines = readfile('Xtestout')
331    call assert_equal(['Xerrors',
332	\              '[0, 4, 12, 0]',
333	\              "Xbadfile.c|4 col 12| error: expected ';' before '}' token"],
334	\             lines)
335  endif
336
337  " Test with a non-existing error file (exits with value 3)
338  let out = system(GetVimCommand() .. ' -q xyz.err')
339  call assert_equal(3, v:shell_error)
340
341  call delete('Xbadfile.c')
342  call delete('Xtestout')
343  call delete('Xerrors')
344endfunc
345
346" Test the -V[N]{filename} argument to set the 'verbose' option to N
347" and set 'verbosefile' to filename.
348func Test_V_file_arg()
349  if RunVim([], [], ' --clean -V2Xverbosefile -c "set verbose? verbosefile?" -cq')
350    let out = join(readfile('Xverbosefile'), "\n")
351    call assert_match("sourcing \"$VIMRUNTIME[\\/]defaults\.vim\"\n", out)
352    call assert_match("\n  verbose=2\n", out)
353    call assert_match("\n  verbosefile=Xverbosefile", out)
354  endif
355
356  call delete('Xverbosefile')
357endfunc
358
359" Test the -m, -M and -R arguments:
360" -m resets 'write'
361" -M resets 'modifiable' and 'write'
362" -R sets 'readonly'
363func Test_m_M_R()
364  let after =<< trim [CODE]
365    call writefile([&write, &modifiable, &readonly, &updatecount], "Xtestout")
366    qall
367  [CODE]
368
369  if RunVim([], after, '')
370    let lines = readfile('Xtestout')
371    call assert_equal(['1', '1', '0', '200'], lines)
372  endif
373  if RunVim([], after, '-m')
374    let lines = readfile('Xtestout')
375    call assert_equal(['0', '1', '0', '200'], lines)
376  endif
377  if RunVim([], after, '-M')
378    let lines = readfile('Xtestout')
379    call assert_equal(['0', '0', '0', '200'], lines)
380  endif
381  if RunVim([], after, '-R')
382    let lines = readfile('Xtestout')
383    call assert_equal(['1', '1', '1', '10000'], lines)
384  endif
385
386  call delete('Xtestout')
387endfunc
388
389" Test the -A, -F and -H arguments (Arabic, Farsi and Hebrew modes).
390func Test_A_F_H_arg()
391  let after =<< trim [CODE]
392    call writefile([&rightleft, &arabic, &fkmap, &hkmap], "Xtestout")
393    qall
394  [CODE]
395
396  " Use silent Ex mode to avoid the hit-Enter prompt for the warning that
397  " 'encoding' is not utf-8.
398  if has('arabic') && &encoding == 'utf-8' && RunVim([], after, '-e -s -A')
399    let lines = readfile('Xtestout')
400    call assert_equal(['1', '1', '0', '0'], lines)
401  endif
402
403  if has('farsi') && RunVim([], after, '-F')
404    let lines = readfile('Xtestout')
405    call assert_equal(['1', '0', '1', '0'], lines)
406  endif
407
408  if has('rightleft') && RunVim([], after, '-H')
409    let lines = readfile('Xtestout')
410    call assert_equal(['1', '0', '0', '1'], lines)
411  endif
412
413  call delete('Xtestout')
414endfunc
415
416func Test_invalid_args()
417  " must be able to get the output of Vim.
418  CheckUnix
419  CheckNotGui
420
421  for opt in ['-Y', '--does-not-exist']
422    let out = split(system(GetVimCommand() .. ' ' .. opt), "\n")
423    call assert_equal(1, v:shell_error)
424    call assert_match('^VIM - Vi IMproved .* (.*)$',              out[0])
425    call assert_equal('Unknown option argument: "' .. opt .. '"', out[1])
426    call assert_equal('More info with: "vim -h"',                 out[2])
427  endfor
428
429  for opt in ['-c', '-i', '-s', '-t', '-T', '-u', '-U', '-w', '-W', '--cmd', '--startuptime']
430    let out = split(system(GetVimCommand() .. ' '  .. opt), "\n")
431    call assert_equal(1, v:shell_error)
432    call assert_match('^VIM - Vi IMproved .* (.*)$',             out[0])
433    call assert_equal('Argument missing after: "' .. opt .. '"', out[1])
434    call assert_equal('More info with: "vim -h"',                out[2])
435  endfor
436
437  if has('clientserver')
438    for opt in ['--remote', '--remote-send', '--remote-silent', '--remote-expr',
439          \     '--remote-tab', '--remote-tab-wait',
440          \     '--remote-tab-wait-silent', '--remote-tab-silent',
441          \     '--remote-wait', '--remote-wait-silent',
442          \     '--servername',
443          \    ]
444      let out = split(system(GetVimCommand() .. ' '  .. opt), "\n")
445      call assert_equal(1, v:shell_error)
446      call assert_match('^VIM - Vi IMproved .* (.*)$',             out[0])
447      call assert_equal('Argument missing after: "' .. opt .. '"', out[1])
448      call assert_equal('More info with: "vim -h"',                out[2])
449    endfor
450  endif
451
452  if has('gui_gtk')
453    let out = split(system(GetVimCommand() .. ' --display'), "\n")
454    call assert_equal(1, v:shell_error)
455    call assert_match('^VIM - Vi IMproved .* (.*)$',         out[0])
456    call assert_equal('Argument missing after: "--display"', out[1])
457    call assert_equal('More info with: "vim -h"',            out[2])
458  endif
459
460  if has('xterm_clipboard')
461    let out = split(system(GetVimCommand() .. ' -display'), "\n")
462    call assert_equal(1, v:shell_error)
463    call assert_match('^VIM - Vi IMproved .* (.*)$',         out[0])
464    call assert_equal('Argument missing after: "-display"', out[1])
465    call assert_equal('More info with: "vim -h"',            out[2])
466  endif
467
468  let out = split(system(GetVimCommand() .. ' -ix'), "\n")
469  call assert_equal(1, v:shell_error)
470  call assert_match('^VIM - Vi IMproved .* (.*)$',          out[0])
471  call assert_equal('Garbage after option argument: "-ix"', out[1])
472  call assert_equal('More info with: "vim -h"',             out[2])
473
474  let out = split(system(GetVimCommand() .. ' - xxx'), "\n")
475  call assert_equal(1, v:shell_error)
476  call assert_match('^VIM - Vi IMproved .* (.*)$',    out[0])
477  call assert_equal('Too many edit arguments: "xxx"', out[1])
478  call assert_equal('More info with: "vim -h"',       out[2])
479
480  if has('quickfix')
481    " Detect invalid repeated arguments '-t foo -t foo", '-q foo -q foo'.
482    for opt in ['-t', '-q']
483      let out = split(system(GetVimCommand() .. repeat(' ' .. opt .. ' foo', 2)), "\n")
484      call assert_equal(1, v:shell_error)
485      call assert_match('^VIM - Vi IMproved .* (.*)$',              out[0])
486      call assert_equal('Too many edit arguments: "' .. opt .. '"', out[1])
487      call assert_equal('More info with: "vim -h"',                 out[2])
488    endfor
489  endif
490
491  for opt in [' -cq', ' --cmd q', ' +', ' -S foo']
492    let out = split(system(GetVimCommand() .. repeat(opt, 11)), "\n")
493    call assert_equal(1, v:shell_error)
494    " FIXME: The error message given by Vim is not ideal in case of repeated
495    " -S foo since it does not mention -S.
496    call assert_match('^VIM - Vi IMproved .* (.*)$',                                    out[0])
497    call assert_equal('Too many "+command", "-c command" or "--cmd command" arguments', out[1])
498    call assert_equal('More info with: "vim -h"',                                       out[2])
499  endfor
500
501  if has('gui_gtk')
502    for opt in ['--socketid x', '--socketid 0xg']
503      let out = split(system(GetVimCommand() .. ' ' .. opt), "\n")
504      call assert_equal(1, v:shell_error)
505      call assert_match('^VIM - Vi IMproved .* (.*)$',        out[0])
506      call assert_equal('Invalid argument for: "--socketid"', out[1])
507      call assert_equal('More info with: "vim -h"',           out[2])
508    endfor
509  endif
510endfunc
511
512func Test_file_args()
513  let after =<< trim [CODE]
514    call writefile(argv(), "Xtestout")
515    qall
516  [CODE]
517
518  if RunVim([], after, '')
519    let lines = readfile('Xtestout')
520    call assert_equal(0, len(lines))
521  endif
522
523  if RunVim([], after, 'one')
524    let lines = readfile('Xtestout')
525    call assert_equal(1, len(lines))
526    call assert_equal('one', lines[0])
527  endif
528
529  if RunVim([], after, 'one two three')
530    let lines = readfile('Xtestout')
531    call assert_equal(3, len(lines))
532    call assert_equal('one', lines[0])
533    call assert_equal('two', lines[1])
534    call assert_equal('three', lines[2])
535  endif
536
537  if RunVim([], after, 'one -c echo two')
538    let lines = readfile('Xtestout')
539    call assert_equal(2, len(lines))
540    call assert_equal('one', lines[0])
541    call assert_equal('two', lines[1])
542  endif
543
544  if RunVim([], after, 'one -- -c echo two')
545    let lines = readfile('Xtestout')
546    call assert_equal(4, len(lines))
547    call assert_equal('one', lines[0])
548    call assert_equal('-c', lines[1])
549    call assert_equal('echo', lines[2])
550    call assert_equal('two', lines[3])
551  endif
552
553  call delete('Xtestout')
554endfunc
555
556func Test_startuptime()
557  if !has('startuptime')
558    return
559  endif
560  let after = ['qall']
561  if RunVim([], after, '--startuptime Xtestout one')
562    let lines = readfile('Xtestout')
563    let expected = ['--- VIM STARTING ---', 'parsing arguments',
564	  \ 'shell init', 'inits 3', 'start termcap', 'opening buffers']
565    let found = []
566    for line in lines
567      for exp in expected
568	if line =~ exp
569	  call add(found, exp)
570	endif
571      endfor
572    endfor
573    call assert_equal(expected, found)
574  endif
575  call delete('Xtestout')
576endfunc
577
578func Test_read_stdin()
579  let after =<< trim [CODE]
580    write Xtestout
581    quit!
582  [CODE]
583
584  if RunVimPiped([], after, '-', 'echo something | ')
585    let lines = readfile('Xtestout')
586    " MS-Windows adds a space after the word
587    call assert_equal(['something'], split(lines[0]))
588  endif
589  call delete('Xtestout')
590endfunc
591
592func Test_set_shell()
593  let after =<< trim [CODE]
594    call writefile([&shell], "Xtestout")
595    quit!
596  [CODE]
597
598  if has('win32')
599    let $SHELL = 'C:\with space\cmd.exe'
600    let expected = '"C:\with space\cmd.exe"'
601  else
602    let $SHELL = '/bin/with space/sh'
603    let expected = '/bin/with\ space/sh'
604  endif
605
606  if RunVimPiped([], after, '', '')
607    let lines = readfile('Xtestout')
608    call assert_equal(expected, lines[0])
609  endif
610  call delete('Xtestout')
611endfunc
612
613func Test_progpath()
614  " Tests normally run with "./vim" or "../vim", these must have been expanded
615  " to a full path.
616  if has('unix')
617    call assert_equal('/', v:progpath[0])
618  elseif has('win32')
619    call assert_equal(':', v:progpath[1])
620    call assert_match('[/\\]', v:progpath[2])
621  endif
622
623  " Only expect "vim" to appear in v:progname.
624  call assert_match('vim\c', v:progname)
625endfunc
626
627func Test_silent_ex_mode()
628  " must be able to get the output of Vim.
629  CheckUnix
630  CheckNotGui
631
632  " This caused an ml_get error.
633  let out = system(GetVimCommand() . '-u NONE -es -c''set verbose=1|h|exe "%norm\<c-y>\<c-d>"'' -c cq')
634  call assert_notmatch('E315:', out)
635endfunc
636
637func Test_default_term()
638  " must be able to get the output of Vim.
639  CheckUnix
640  CheckNotGui
641
642  let save_term = $TERM
643  let $TERM = 'unknownxxx'
644  let out = system(GetVimCommand() . ' -c''set term'' -c cq')
645  call assert_match("defaulting to 'ansi'", out)
646  let $TERM = save_term
647endfunc
648
649func Test_zzz_startinsert()
650  " Test :startinsert
651  call writefile(['123456'], 'Xtestout')
652  let after =<< trim [CODE]
653    :startinsert
654    call feedkeys("foobar\<c-o>:wq\<cr>","t")
655  [CODE]
656
657  if RunVim([], after, 'Xtestout')
658    let lines = readfile('Xtestout')
659    call assert_equal(['foobar123456'], lines)
660  endif
661  " Test :startinsert!
662  call writefile(['123456'], 'Xtestout')
663  let after =<< trim [CODE]
664    :startinsert!
665    call feedkeys("foobar\<c-o>:wq\<cr>","t")
666  [CODE]
667
668  if RunVim([], after, 'Xtestout')
669    let lines = readfile('Xtestout')
670    call assert_equal(['123456foobar'], lines)
671  endif
672  call delete('Xtestout')
673endfunc
674
675func Test_issue_3969()
676  " Can't catch the output of gvim.
677  CheckNotGui
678
679  " Check that message is not truncated.
680  let out = system(GetVimCommand() . ' -es -X -V1 -c "echon ''hello''" -cq')
681  call assert_equal('hello', out)
682endfunc
683
684func Test_start_with_tabs()
685  CheckRunVimInTerminal
686
687  let buf = RunVimInTerminal('-p a b c', {})
688  call VerifyScreenDump(buf, 'Test_start_with_tabs', {})
689
690  " clean up
691  call StopVimInTerminal(buf)
692endfunc
693
694func Test_v_argv()
695  " Can't catch the output of gvim.
696  CheckNotGui
697
698  let out = system(GetVimCommand() . ' -es -V1 -X arg1 --cmd "echo v:argv" --cmd q')
699  let list = out->split("', '")
700  call assert_match('vim', list[0])
701  let idx = index(list, 'arg1')
702  call assert_true(idx > 2)
703  call assert_equal(['arg1', '--cmd', 'echo v:argv', '--cmd', 'q'']'], list[idx:])
704endfunc
705
706" Test for the "-r" recovery mode option
707func Test_r_arg()
708  " Can't catch the output of gvim.
709  CheckNotGui
710  CheckUnix
711  CheckEnglish
712  let cmd = GetVimCommand()
713  " There can be swap files anywhere, only check for the headers.
714  let expected =<< trim END
715    Swap files found:.*
716    In current directory:.*
717    In directory \~/tmp:.*
718    In directory /var/tmp:.*
719    In directory /tmp:.*
720  END
721  call assert_match(join(expected, ""), system(cmd .. " -r")->substitute("[\r\n]\\+", '', ''))
722endfunc
723
724" Test for the '-t' option to jump to a tag
725func Test_t_arg()
726  let before =<< trim [CODE]
727    set tags=Xtags
728  [CODE]
729  let after =<< trim [CODE]
730    let s = bufname('') .. ':L' .. line('.') .. 'C' .. col('.')
731    call writefile([s], "Xtestout")
732    qall
733  [CODE]
734
735  call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//",
736        \ "first\tXfile1\t/^    \\zsfirst$/",
737        \ "second\tXfile1\t/^    \\zssecond$/",
738        \ "third\tXfile1\t/^    \\zsthird$/"],
739        \ 'Xtags')
740  call writefile(['    first', '    second', '    third'], 'Xfile1')
741
742  if RunVim(before, after, '-t second')
743    call assert_equal(['Xfile1:L2C5'], readfile('Xtestout'))
744    call delete('Xtestout')
745  endif
746
747  call delete('Xtags')
748  call delete('Xfile1')
749endfunc
750
751" Test for entering the insert mode on startup
752func Test_start_insertmode()
753  let before =<< trim [CODE]
754    set insertmode
755  [CODE]
756  let after =<< trim [CODE]
757    call writefile(['insertmode=' .. &insertmode], 'Xtestout')
758    qall
759  [CODE]
760  if RunVim(before, after, '')
761    call assert_equal(['insertmode=1'], readfile('Xtestout'))
762    call delete('Xtestout')
763  endif
764endfunc
765
766" Test for enabling the binary mode on startup
767func Test_b_arg()
768  let after =<< trim [CODE]
769    call writefile(['binary=' .. &binary], 'Xtestout')
770    qall
771  [CODE]
772  if RunVim([], after, '-b')
773    call assert_equal(['binary=1'], readfile('Xtestout'))
774    call delete('Xtestout')
775  endif
776endfunc
777
778" Test for enabling the lisp mode on startup
779func Test_l_arg()
780  let after =<< trim [CODE]
781    let s = 'lisp=' .. &lisp .. ', showmatch=' .. &showmatch
782    call writefile([s], 'Xtestout')
783    qall
784  [CODE]
785  if RunVim([], after, '-l')
786    call assert_equal(['lisp=1, showmatch=1'], readfile('Xtestout'))
787    call delete('Xtestout')
788  endif
789endfunc
790
791" Test for specifying a non-existing vimrc file using "-u"
792func Test_missing_vimrc()
793  CheckRunVimInTerminal
794  let after =<< trim [CODE]
795    call assert_match('^E282:', v:errmsg)
796    call writefile(v:errors, 'Xtestout')
797  [CODE]
798  call writefile(after, 'Xafter')
799
800  let cmd = GetVimCommandCleanTerm() . ' -u Xvimrc_missing -S Xafter'
801  let buf = term_start(cmd, {'term_rows' : 10})
802  call WaitForAssert({-> assert_equal("running", term_getstatus(buf))})
803  call TermWait(buf)
804  call term_sendkeys(buf, "\n:")
805  call TermWait(buf)
806  call WaitForAssert({-> assert_match(':', term_getline(buf, 10))})
807  call StopVimInTerminal(buf)
808  call assert_equal([], readfile('Xtestout'))
809  call delete('Xafter')
810  call delete('Xtestout')
811endfunc
812
813" Test for using the $VIMINIT environment variable
814func Test_VIMINIT()
815  let after =<< trim [CODE]
816    call assert_equal(1, exists('viminit_found'))
817    call assert_equal('yes', viminit_found)
818    call writefile(v:errors, 'Xtestout')
819    qall
820  [CODE]
821  call writefile(after, 'Xafter')
822  let cmd = GetVimProg() . ' --not-a-term -S Xafter --cmd "set enc=utf8"'
823  call setenv('VIMINIT', 'let viminit_found="yes"')
824  exe "silent !" . cmd
825  call assert_equal([], readfile('Xtestout'))
826  call delete('Xtestout')
827  call delete('Xafter')
828endfunc
829
830" Test for using the $EXINIT environment variable
831func Test_EXINIT()
832  let after =<< trim [CODE]
833    call assert_equal(1, exists('exinit_found'))
834    call assert_equal('yes', exinit_found)
835    call writefile(v:errors, 'Xtestout')
836    qall
837  [CODE]
838  call writefile(after, 'Xafter')
839  let cmd = GetVimProg() . ' --not-a-term -S Xafter --cmd "set enc=utf8"'
840  call setenv('EXINIT', 'let exinit_found="yes"')
841  exe "silent !" . cmd
842  call assert_equal([], readfile('Xtestout'))
843  call delete('Xtestout')
844  call delete('Xafter')
845endfunc
846
847" Test for using the 'exrc' option
848func Test_exrc()
849  let after =<< trim [CODE]
850    call assert_equal(1, &exrc)
851    call assert_equal(1, &secure)
852    call assert_equal(37, exrc_found)
853    call writefile(v:errors, 'Xtestout')
854    qall
855  [CODE]
856  call mkdir('Xdir')
857  call writefile(['let exrc_found=37'], 'Xdir/.exrc')
858  call writefile(after, 'Xdir/Xafter')
859  let cmd = GetVimProg() . ' --not-a-term -S Xafter --cmd "cd Xdir" --cmd "set enc=utf8 exrc secure"'
860  exe "silent !" . cmd
861  call assert_equal([], readfile('Xdir/Xtestout'))
862  call delete('Xdir', 'rf')
863endfunc
864
865" Test for starting Vim with a non-terminal as input/output
866func Test_io_not_a_terminal()
867  " Can't catch the output of gvim.
868  CheckNotGui
869  CheckUnix
870  CheckEnglish
871  let l = systemlist(GetVimProg() .. ' --ttyfail')
872  call assert_equal(['Vim: Warning: Output is not to a terminal',
873        \ 'Vim: Warning: Input is not from a terminal'], l)
874endfunc
875
876" Test for the "-w scriptout" argument
877func Test_w_arg()
878  " Can't catch the output of gvim.
879  CheckNotGui
880  call writefile(["iVim Editor\<Esc>:q!\<CR>"], 'Xscriptin', 'b')
881  if RunVim([], [], '-s Xscriptin -w Xscriptout')
882    call assert_equal(["iVim Editor\e:q!\r"], readfile('Xscriptout'))
883    call delete('Xscriptout')
884  endif
885  call delete('Xscriptin')
886
887  " Test for failing to open the script output file. This test works only when
888  " the language is English.
889  if v:lang == "C" || v:lang =~ '^[Ee]n'
890    call mkdir("Xdir")
891    let m = system(GetVimCommand() .. " -w Xdir")
892    call assert_equal("Cannot open for script output: \"Xdir\"\n", m)
893    call delete("Xdir", 'rf')
894  endif
895endfunc
896
897" Test for the "-s scriptin" argument
898func Test_s_arg()
899  " Can't catch the output of gvim.
900  CheckNotGui
901  CheckEnglish
902  " Test for failing to open the script input file.
903  let m = system(GetVimCommand() .. " -s abcxyz")
904  call assert_equal("Cannot open for reading: \"abcxyz\"\n", m)
905
906  call writefile([], 'Xinput')
907  let m = system(GetVimCommand() .. " -s Xinput -s Xinput")
908  call assert_equal("Attempt to open script file again: \"-s Xinput\"\n", m)
909  call delete('Xinput')
910endfunc
911
912" Test for the "-n" (no swap file) argument
913func Test_n_arg()
914  let after =<< trim [CODE]
915    call assert_equal(0, &updatecount)
916    call writefile(v:errors, 'Xtestout')
917    qall
918  [CODE]
919  if RunVim([], after, '-n')
920    call assert_equal([], readfile('Xtestout'))
921    call delete('Xtestout')
922  endif
923  call delete('Xafter')
924endfunc
925
926" Test for the "-h" (help) argument
927func Test_h_arg()
928  " Can't catch the output of gvim.
929  CheckNotGui
930  let l = systemlist(GetVimProg() .. ' -h')
931  call assert_match('^VIM - Vi IMproved', l[0])
932  let l = systemlist(GetVimProg() .. ' -?')
933  call assert_match('^VIM - Vi IMproved', l[0])
934endfunc
935
936" Test for the "-F" (farsi) argument
937func Test_F_arg()
938  " Can't catch the output of gvim.
939  CheckNotGui
940  let l = systemlist(GetVimProg() .. ' -F')
941  call assert_match('^E27:', l[0])
942endfunc
943
944" Test for the "-E" (improved Ex mode) argument
945func Test_E_arg()
946  let after =<< trim [CODE]
947    call assert_equal('cv', mode(1))
948    call writefile(v:errors, 'Xtestout')
949    qall
950  [CODE]
951  if RunVim([], after, '-E')
952    call assert_equal([], readfile('Xtestout'))
953    call delete('Xtestout')
954  endif
955  call delete('Xafter')
956endfunc
957
958" Test for too many edit argument errors
959func Test_too_many_edit_args()
960  " Can't catch the output of gvim.
961  CheckNotGui
962  CheckEnglish
963  let l = systemlist(GetVimProg() .. ' - -')
964  call assert_match('^Too many edit arguments: "-"', l[1])
965endfunc
966
967" vim: shiftwidth=2 sts=2 expandtab
968