xref: /vim-8.2.3635/src/testdir/test_shell.vim (revision ffec6dd1)
1054794c2SYegappan Lakshmanan" Test for the shell related options ('shell', 'shellcmdflag', 'shellpipe',
2054794c2SYegappan Lakshmanan" 'shellquote', 'shellredir', 'shellxescape', and 'shellxquote')
3054794c2SYegappan Lakshmanan
4054794c2SYegappan Lakshmanansource check.vim
5054794c2SYegappan Lakshmanansource shared.vim
6054794c2SYegappan Lakshmanan
7054794c2SYegappan Lakshmananfunc Test_shell_options()
8*ffec6dd1SYegappan Lakshmanan  " The expected value of 'shellcmdflag', 'shellpipe', 'shellquote',
9*ffec6dd1SYegappan Lakshmanan  " 'shellredir', 'shellxescape', 'shellxquote' for the supported shells.
10054794c2SYegappan Lakshmanan  let shells = []
11054794c2SYegappan Lakshmanan  if has('unix')
12054794c2SYegappan Lakshmanan    let shells += [['sh', '-c', '2>&1| tee', '', '>%s 2>&1', '', ''],
13054794c2SYegappan Lakshmanan          \ ['ksh', '-c', '2>&1| tee', '', '>%s 2>&1', '', ''],
14054794c2SYegappan Lakshmanan          \ ['mksh', '-c', '2>&1| tee', '', '>%s 2>&1', '', ''],
15054794c2SYegappan Lakshmanan          \ ['zsh', '-c', '2>&1| tee', '', '>%s 2>&1', '', ''],
16054794c2SYegappan Lakshmanan          \ ['zsh-beta', '-c', '2>&1| tee', '', '>%s 2>&1', '', ''],
17054794c2SYegappan Lakshmanan          \ ['bash', '-c', '2>&1| tee', '', '>%s 2>&1', '', ''],
18054794c2SYegappan Lakshmanan          \ ['fish', '-c', '2>&1| tee', '', '>%s 2>&1', '', ''],
19054794c2SYegappan Lakshmanan          \ ['ash', '-c', '2>&1| tee', '', '>%s 2>&1', '', ''],
20054794c2SYegappan Lakshmanan          \ ['dash', '-c', '2>&1| tee', '', '>%s 2>&1', '', ''],
21054794c2SYegappan Lakshmanan          \ ['csh', '-c', '|& tee', '', '>&', '', ''],
22054794c2SYegappan Lakshmanan          \ ['tcsh', '-c', '|& tee', '', '>&', '', '']]
23054794c2SYegappan Lakshmanan  endif
24054794c2SYegappan Lakshmanan  if has('win32')
25054794c2SYegappan Lakshmanan    let shells += [['cmd', '/c', '>%s 2>&1', '', '>%s 2>&1', '"&|<>()@^', ''],
26054794c2SYegappan Lakshmanan          \ ['cmd.exe', '/c', '>%s 2>&1', '', '>%s 2>&1', '"&|<>()@^', '('],
27054794c2SYegappan Lakshmanan          \ ['powershell.exe', '-c', '>', '', '>', '"&|<>()@^', '"'],
28054794c2SYegappan Lakshmanan          \ ['powershell', '-c', '>', '', '>', '"&|<>()@^', '"'],
29054794c2SYegappan Lakshmanan          \ ['sh.exe', '-c', '>%s 2>&1', '', '>%s 2>&1', '"&|<>()@^', '"'],
30054794c2SYegappan Lakshmanan          \ ['ksh.exe', '-c', '>%s 2>&1', '', '>%s 2>&1', '"&|<>()@^', '"'],
31054794c2SYegappan Lakshmanan          \ ['mksh.exe', '-c', '>%s 2>&1', '', '>%s 2>&1', '"&|<>()@^', '"'],
32054794c2SYegappan Lakshmanan          \ ['pdksh.exe', '-c', '>%s 2>&1', '', '>%s 2>&1', '"&|<>()@^', '"'],
33054794c2SYegappan Lakshmanan          \ ['zsh.exe', '-c', '>%s 2>&1', '', '>%s 2>&1', '"&|<>()@^', '"'],
34054794c2SYegappan Lakshmanan          \ ['zsh-beta.exe', '-c', '>%s 2>&1', '', '>%s 2>&1', '"&|<>()@^', '"'],
35054794c2SYegappan Lakshmanan          \ ['bash.exe', '-c', '>%s 2>&1', '', '>%s 2>&1', '"&|<>()@^', '"'],
36054794c2SYegappan Lakshmanan          \ ['dash.exe', '-c', '>%s 2>&1', '', '>%s 2>&1', '"&|<>()@^', '"'],
37054794c2SYegappan Lakshmanan          \ ['csh.exe', '-c', '>&', '', '>&', '"&|<>()@^', '"'],
38054794c2SYegappan Lakshmanan          \ ['tcsh.exe', '-c', '>&', '', '>&', '"&|<>()@^', '"']]
39054794c2SYegappan Lakshmanan  endif
40054794c2SYegappan Lakshmanan
41*ffec6dd1SYegappan Lakshmanan  " start a new Vim instance with 'shell' set to each of the supported shells
42*ffec6dd1SYegappan Lakshmanan  " and check the default shell option settings
43054794c2SYegappan Lakshmanan  let after =<< trim END
44054794c2SYegappan Lakshmanan    let l = [&shell, &shellcmdflag, &shellpipe, &shellquote]
45054794c2SYegappan Lakshmanan    let l += [&shellredir, &shellxescape, &shellxquote]
46054794c2SYegappan Lakshmanan    call writefile([json_encode(l)], 'Xtestout')
47054794c2SYegappan Lakshmanan    qall!
48054794c2SYegappan Lakshmanan  END
49054794c2SYegappan Lakshmanan  for e in shells
50054794c2SYegappan Lakshmanan    if RunVim([], after, '--cmd "set shell=' .. e[0] .. '"')
51054794c2SYegappan Lakshmanan      call assert_equal(e, json_decode(readfile('Xtestout')[0]))
52054794c2SYegappan Lakshmanan    endif
53054794c2SYegappan Lakshmanan  endfor
54054794c2SYegappan Lakshmanan
55*ffec6dd1SYegappan Lakshmanan  " Test shellescape() for each of the shells.
56054794c2SYegappan Lakshmanan  for e in shells
57054794c2SYegappan Lakshmanan    exe 'set shell=' .. e[0]
58054794c2SYegappan Lakshmanan    if e[0] =~# '.*csh$' || e[0] =~# '.*csh.exe$'
59054794c2SYegappan Lakshmanan      let str1 = "'cmd \"arg1\" '\\''arg2'\\'' \\!%#'"
60054794c2SYegappan Lakshmanan      let str2 = "'cmd \"arg1\" '\\''arg2'\\'' \\\\!\\%\\#'"
61054794c2SYegappan Lakshmanan    else
62054794c2SYegappan Lakshmanan      let str1 = "'cmd \"arg1\" '\\''arg2'\\'' !%#'"
63054794c2SYegappan Lakshmanan      let str2 = "'cmd \"arg1\" '\\''arg2'\\'' \\!\\%\\#'"
64054794c2SYegappan Lakshmanan    endif
65054794c2SYegappan Lakshmanan    call assert_equal(str1, shellescape("cmd \"arg1\" 'arg2' !%#"), e[0])
66054794c2SYegappan Lakshmanan    call assert_equal(str2, shellescape("cmd \"arg1\" 'arg2' !%#", 1), e[0])
67*ffec6dd1SYegappan Lakshmanan
68*ffec6dd1SYegappan Lakshmanan    " Try running an external command with the shell.
69*ffec6dd1SYegappan Lakshmanan    if executable(e[0])
70*ffec6dd1SYegappan Lakshmanan      " set the shell options for the current 'shell'
71*ffec6dd1SYegappan Lakshmanan      let [&shellcmdflag, &shellpipe, &shellquote, &shellredir,
72*ffec6dd1SYegappan Lakshmanan            \ &shellxescape, &shellxquote] = e[1:6]
73*ffec6dd1SYegappan Lakshmanan      new
74*ffec6dd1SYegappan Lakshmanan      r !echo hello
75*ffec6dd1SYegappan Lakshmanan      call assert_equal('hello', substitute(getline(2), '\W', '', 'g'), e[0])
76*ffec6dd1SYegappan Lakshmanan      bwipe!
77*ffec6dd1SYegappan Lakshmanan    endif
78054794c2SYegappan Lakshmanan  endfor
79*ffec6dd1SYegappan Lakshmanan  set shell& shellcmdflag& shellpipe& shellquote&
80*ffec6dd1SYegappan Lakshmanan  set shellredir& shellxescape& shellxquote&
81054794c2SYegappan Lakshmanan  call delete('Xtestout')
82054794c2SYegappan Lakshmananendfunc
83054794c2SYegappan Lakshmanan
84054794c2SYegappan Lakshmanan" Test for the 'shell' option
85054794c2SYegappan Lakshmananfunc Test_shell()
86054794c2SYegappan Lakshmanan  CheckUnix
87054794c2SYegappan Lakshmanan  let save_shell = &shell
88054794c2SYegappan Lakshmanan  set shell=
89054794c2SYegappan Lakshmanan  let caught_e91 = 0
90054794c2SYegappan Lakshmanan  try
91054794c2SYegappan Lakshmanan    shell
92054794c2SYegappan Lakshmanan  catch /E91:/
93054794c2SYegappan Lakshmanan    let caught_e91 = 1
94054794c2SYegappan Lakshmanan  endtry
95054794c2SYegappan Lakshmanan  call assert_equal(1, caught_e91)
96054794c2SYegappan Lakshmanan  let &shell = save_shell
97054794c2SYegappan Lakshmananendfunc
98054794c2SYegappan Lakshmanan
99054794c2SYegappan Lakshmanan" Test for the 'shellquote' option
100054794c2SYegappan Lakshmananfunc Test_shellquote()
101054794c2SYegappan Lakshmanan  CheckUnix
102054794c2SYegappan Lakshmanan  set shellquote=#
103054794c2SYegappan Lakshmanan  set verbose=20
104054794c2SYegappan Lakshmanan  redir => v
105054794c2SYegappan Lakshmanan  silent! !echo Hello
106054794c2SYegappan Lakshmanan  redir END
107054794c2SYegappan Lakshmanan  set verbose&
108054794c2SYegappan Lakshmanan  set shellquote&
109054794c2SYegappan Lakshmanan  call assert_match(': "#echo Hello#"', v)
110054794c2SYegappan Lakshmananendfunc
111054794c2SYegappan Lakshmanan
112*ffec6dd1SYegappan Lakshmanan" Test for the 'shellescape' option
113054794c2SYegappan Lakshmananfunc Test_shellescape()
114054794c2SYegappan Lakshmanan  let save_shell = &shell
115054794c2SYegappan Lakshmanan  set shell=bash
116054794c2SYegappan Lakshmanan  call assert_equal("'text'", shellescape('text'))
117054794c2SYegappan Lakshmanan  call assert_equal("'te\"xt'", 'te"xt'->shellescape())
118054794c2SYegappan Lakshmanan  call assert_equal("'te'\\''xt'", shellescape("te'xt"))
119054794c2SYegappan Lakshmanan
120054794c2SYegappan Lakshmanan  call assert_equal("'te%xt'", shellescape("te%xt"))
121054794c2SYegappan Lakshmanan  call assert_equal("'te\\%xt'", shellescape("te%xt", 1))
122054794c2SYegappan Lakshmanan  call assert_equal("'te#xt'", shellescape("te#xt"))
123054794c2SYegappan Lakshmanan  call assert_equal("'te\\#xt'", shellescape("te#xt", 1))
124054794c2SYegappan Lakshmanan  call assert_equal("'te!xt'", shellescape("te!xt"))
125054794c2SYegappan Lakshmanan  call assert_equal("'te\\!xt'", shellescape("te!xt", 1))
126054794c2SYegappan Lakshmanan
127054794c2SYegappan Lakshmanan  call assert_equal("'te\nxt'", shellescape("te\nxt"))
128054794c2SYegappan Lakshmanan  call assert_equal("'te\\\nxt'", shellescape("te\nxt", 1))
129054794c2SYegappan Lakshmanan  set shell=tcsh
130054794c2SYegappan Lakshmanan  call assert_equal("'te\\!xt'", shellescape("te!xt"))
131054794c2SYegappan Lakshmanan  call assert_equal("'te\\\\!xt'", shellescape("te!xt", 1))
132054794c2SYegappan Lakshmanan  call assert_equal("'te\\\nxt'", shellescape("te\nxt"))
133054794c2SYegappan Lakshmanan  call assert_equal("'te\\\\\nxt'", shellescape("te\nxt", 1))
134054794c2SYegappan Lakshmanan
135054794c2SYegappan Lakshmanan  let &shell = save_shell
136054794c2SYegappan Lakshmananendfunc
137054794c2SYegappan Lakshmanan
138054794c2SYegappan Lakshmanan" Test for 'shellxquote'
139054794c2SYegappan Lakshmananfunc Test_shellxquote()
140054794c2SYegappan Lakshmanan  CheckUnix
141054794c2SYegappan Lakshmanan
142054794c2SYegappan Lakshmanan  let save_shell = &shell
143054794c2SYegappan Lakshmanan  let save_sxq = &shellxquote
144054794c2SYegappan Lakshmanan  let save_sxe = &shellxescape
145054794c2SYegappan Lakshmanan
146054794c2SYegappan Lakshmanan  call writefile(['#!/bin/sh', 'echo "Cmd: [$*]" > Xlog'], 'Xtestshell')
147054794c2SYegappan Lakshmanan  call setfperm('Xtestshell', "r-x------")
148054794c2SYegappan Lakshmanan  set shell=./Xtestshell
149054794c2SYegappan Lakshmanan
150054794c2SYegappan Lakshmanan  set shellxquote=\\"
151054794c2SYegappan Lakshmanan  call feedkeys(":!pwd\<CR>\<CR>", 'xt')
152054794c2SYegappan Lakshmanan  call assert_equal(['Cmd: [-c "pwd"]'], readfile('Xlog'))
153054794c2SYegappan Lakshmanan
154054794c2SYegappan Lakshmanan  set shellxquote=(
155054794c2SYegappan Lakshmanan  call feedkeys(":!pwd\<CR>\<CR>", 'xt')
156054794c2SYegappan Lakshmanan  call assert_equal(['Cmd: [-c (pwd)]'], readfile('Xlog'))
157054794c2SYegappan Lakshmanan
158054794c2SYegappan Lakshmanan  set shellxquote=\\"(
159054794c2SYegappan Lakshmanan  call feedkeys(":!pwd\<CR>\<CR>", 'xt')
160054794c2SYegappan Lakshmanan  call assert_equal(['Cmd: [-c "(pwd)"]'], readfile('Xlog'))
161054794c2SYegappan Lakshmanan
162054794c2SYegappan Lakshmanan  set shellxescape=\"&<<()@^
163054794c2SYegappan Lakshmanan  set shellxquote=(
164054794c2SYegappan Lakshmanan  call feedkeys(":!pwd\"&<<{}@^\<CR>\<CR>", 'xt')
165054794c2SYegappan Lakshmanan  call assert_equal(['Cmd: [-c (pwd^"^&^<^<{}^@^^)]'], readfile('Xlog'))
166054794c2SYegappan Lakshmanan
167054794c2SYegappan Lakshmanan  let &shell = save_shell
168054794c2SYegappan Lakshmanan  let &shellxquote = save_sxq
169054794c2SYegappan Lakshmanan  let &shellxescape = save_sxe
170054794c2SYegappan Lakshmanan  call delete('Xtestshell')
171054794c2SYegappan Lakshmanan  call delete('Xlog')
172054794c2SYegappan Lakshmananendfunc
173054794c2SYegappan Lakshmanan
174*ffec6dd1SYegappan Lakshmanan" Test for using the shell set in the $SHELL environment variable
175*ffec6dd1SYegappan Lakshmananfunc Test_set_shell()
176*ffec6dd1SYegappan Lakshmanan  let after =<< trim [CODE]
177*ffec6dd1SYegappan Lakshmanan    call writefile([&shell], "Xtestout")
178*ffec6dd1SYegappan Lakshmanan    quit!
179*ffec6dd1SYegappan Lakshmanan  [CODE]
180*ffec6dd1SYegappan Lakshmanan
181*ffec6dd1SYegappan Lakshmanan  if has('win32')
182*ffec6dd1SYegappan Lakshmanan    let $SHELL = 'C:\with space\cmd.exe'
183*ffec6dd1SYegappan Lakshmanan    let expected = '"C:\with space\cmd.exe"'
184*ffec6dd1SYegappan Lakshmanan  else
185*ffec6dd1SYegappan Lakshmanan    let $SHELL = '/bin/with space/sh'
186*ffec6dd1SYegappan Lakshmanan    let expected = '/bin/with\ space/sh'
187*ffec6dd1SYegappan Lakshmanan  endif
188*ffec6dd1SYegappan Lakshmanan
189*ffec6dd1SYegappan Lakshmanan  if RunVimPiped([], after, '', '')
190*ffec6dd1SYegappan Lakshmanan    let lines = readfile('Xtestout')
191*ffec6dd1SYegappan Lakshmanan    call assert_equal(expected, lines[0])
192*ffec6dd1SYegappan Lakshmanan  endif
193*ffec6dd1SYegappan Lakshmanan  call delete('Xtestout')
194*ffec6dd1SYegappan Lakshmananendfunc
195*ffec6dd1SYegappan Lakshmanan
196054794c2SYegappan Lakshmanan" vim: shiftwidth=2 sts=2 expandtab
197