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