diff options
| author | Mehmet Samet Duman <yongdohyun@projecttick.org> | 2026-04-04 12:41:27 +0300 |
|---|---|---|
| committer | Mehmet Samet Duman <yongdohyun@projecttick.org> | 2026-04-04 12:41:27 +0300 |
| commit | 4f2d36194b4f299aa7509d815c07121039ea833b (patch) | |
| tree | f3ded014bad3a4c76ff6a22b8726ebaab68c3d13 /mnv/src/testdir/test_system.mnv | |
| parent | 5b578e70c314723a3cde5c9bfc2be0bf1dadc93b (diff) | |
| download | Project-Tick-4f2d36194b4f299aa7509d815c07121039ea833b.tar.gz Project-Tick-4f2d36194b4f299aa7509d815c07121039ea833b.zip | |
NOISSUE change uvim folder name to mnv
Signed-off-by: Mehmet Samet Duman <yongdohyun@projecttick.org>
Diffstat (limited to 'mnv/src/testdir/test_system.mnv')
| -rw-r--r-- | mnv/src/testdir/test_system.mnv | 256 |
1 files changed, 256 insertions, 0 deletions
diff --git a/mnv/src/testdir/test_system.mnv b/mnv/src/testdir/test_system.mnv new file mode 100644 index 0000000000..b3f05d779d --- /dev/null +++ b/mnv/src/testdir/test_system.mnv @@ -0,0 +1,256 @@ +" Tests for system() and systemlist() + +func Test_System() + if !has('win32') + call assert_equal("123\n", system('echo 123')) + call assert_equal(['123'], systemlist('echo 123')) + call assert_equal('123', system('cat', '123')) + call assert_equal(['123'], systemlist('cat', '123')) + call assert_equal(["as\<NL>df"], systemlist('cat', ["as\<NL>df"])) + else + call assert_equal("123\n", system('echo 123')) + call assert_equal(["123\r"], systemlist('echo 123')) + call assert_equal("123\n", system('more.com', '123')) + call assert_equal(["123\r"], systemlist('more.com', '123')) + call assert_equal(["as\r", "df\r"], systemlist('more.com', ["as\<NL>df"])) + endif + + new Xdummy + call setline(1, ['asdf', "pw\<NL>er", 'xxxx']) + + if executable('wc') + let out = system('wc -l', bufnr('%')) + " On OS/X we get leading spaces + let out = substitute(out, '^ *', '', '') + call assert_equal("3\n", out) + + let out = systemlist('wc -l', bufnr('%')) + " On Windows we may get a trailing CR. + if out != ["3\r"] + " On OS/X we get leading spaces + if type(out) == v:t_list + let out[0] = substitute(out[0], '^ *', '', '') + endif + call assert_equal(['3'], out) + endif + endif + + if !has('win32') + let out = systemlist('cat', bufnr('%')) + call assert_equal(['asdf', "pw\<NL>er", 'xxxx'], out) + else + let out = systemlist('more.com', bufnr('%')) + call assert_equal(["asdf\r", "pw\r", "er\r", "xxxx\r"], out) + endif + bwipe! + + call assert_fails('call system("wc -l", 99999)', 'E86:') +endfunc + +func Test_system_exmode() + if has('unix') " echo $? only works on Unix + let cmd = ' -es -c "source Xscript" +q; echo "result=$?"' + " Need to put this in a script, "catch" isn't found after an unknown + " function. + call writefile(['try', 'call doesnotexist()', 'catch', 'endtry'], 'Xscript', 'D') + let a = system(GetMNVCommand() . cmd) + call assert_match('result=0', a) + call assert_equal(0, v:shell_error) + endif + + " Error before try does set error flag. + call writefile(['call nosuchfunction()', 'try', 'call doesnotexist()', 'catch', 'endtry'], 'Xscript') + if has('unix') " echo $? only works on Unix + let a = system(GetMNVCommand() . cmd) + call assert_notequal('0', a[0]) + endif + + let cmd = ' -es -c "source Xscript" +q' + let a = system(GetMNVCommand() . cmd) + call assert_notequal(0, v:shell_error) + + if has('unix') " echo $? only works on Unix + let cmd = ' -es -c "call doesnotexist()" +q; echo $?' + let a = system(GetMNVCommand() . cmd) + call assert_notequal(0, a[0]) + endif + + let cmd = ' -es -c "call doesnotexist()" +q' + let a = system(GetMNVCommand(). cmd) + call assert_notequal(0, v:shell_error) + + if has('unix') " echo $? only works on Unix + let cmd = ' -es -c "call doesnotexist()|let a=1" +q; echo $?' + let a = system(GetMNVCommand() . cmd) + call assert_notequal(0, a[0]) + endif + + let cmd = ' -es -c "call doesnotexist()|let a=1" +q' + let a = system(GetMNVCommand() . cmd) + call assert_notequal(0, v:shell_error) +endfunc + +func Test_system_with_shell_quote() + CheckMSWindows + + call mkdir('Xdir with spaces', 'p') + call system('copy "%COMSPEC%" "Xdir with spaces\cmd.exe"') + + let shell_save = &shell + let shellxquote_save = &shellxquote + try + " Set 'shell' always needs noshellslash. + let shellslash_save = &shellslash + set noshellslash + let shell_tests = [ + \ expand('$COMSPEC'), + \ '"' . fnamemodify('Xdir with spaces\cmd.exe', ':p') . '"', + \] + let &shellslash = shellslash_save + + let sxq_tests = ['', '(', '"'] + + " Matrix tests: 'shell' * 'shellxquote' + for shell in shell_tests + let &shell = shell + for sxq in sxq_tests + let &shellxquote = sxq + + let msg = printf('shell=%s shellxquote=%s', &shell, &shellxquote) + + try + let out = 'echo 123'->system() + catch + call assert_report(printf('%s: %s', msg, v:exception)) + continue + endtry + + " On Windows we may get a trailing space and CR. + if out != "123 \n" + call assert_equal("123\n", out, msg) + endif + + endfor + endfor + + finally + let &shell = shell_save + let &shellxquote = shellxquote_save + call delete('Xdir with spaces', 'rf') + endtry +endfunc + +" Check that MNV does not execute anything from current directory +func Test_windows_external_cmd_in_cwd() + CheckMSWindows + + " just in case + call system('rd /S /Q Xfolder') + call mkdir('Xfolder', 'R') + cd Xfolder + + let contents = ['@echo off', 'echo filename1.txt:1:AAAA'] + call writefile(contents, 'findstr.cmd') + + let file1 = ['AAAA', 'THIS FILE SHOULD NOT BE FOUND'] + let file2 = ['BBBB', 'THIS FILE SHOULD BE FOUND'] + + call writefile(file1, 'filename1.txt') + call writefile(file2, 'filename2.txt') + + if has('quickfix') + " use silent to avoid hit-enter-prompt + sil grep BBBB filename*.txt + call assert_equal('filename2.txt', @%) + endif + + let output = system('findstr BBBB filename*') + " Match trailing newline byte + call assert_match('filename2.txt:BBBB.', output) + + if has('gui') + set guioptions+=! + let output = system('findstr BBBB filename*') + call assert_match('filename2.txt:BBBB.', output) + endif + + cd - + set guioptions& +endfunc + +func Test_system_with_powershell() + CheckPowerShell + + let shell_save = &shell + let shellcmdflag_save = &shellcmdflag + let shellxquote_save = &shellxquote + let shellpipe_save = &shellpipe + let shellredir_save = &shellredir + try + if executable('powershell') + let &shell = 'powershell' + let &shellcmdflag = '-Command' + let &shellredir = '2>&1 | Out-File -Encoding default' + else + let &shell = 'pwsh' + let &shellcmdflag = '-c' + let &shellredir = '>%s 2>&1' + endif + let &shellxquote = has('win32') ? '"' : '' + let &shellpipe = &shellredir + + " Make sure compound commands are handled properly. + call assert_equal("123\n456\n", system('echo 123; echo 456')) + finally + let &shell = shell_save + let &shellcmdflag = shellcmdflag_save + let &shellxquote = shellxquote_save + let &shellpipe = shellpipe_save + let &shellredir = shellredir_save + endtry +endfunc + +func Test_system_list_arg() + CheckExecutable python3 + + " When the command is a List, it is executed directly without the shell. + " Shell meta characters should not be interpreted but passed as-is. + + " Redirect characters should be passed literally. + let out = system(['python3', '-c', 'import sys; print(sys.argv[1])', '<foo>']) + call assert_match('^<foo>', out) + + " Environment variable syntax should not be expanded. + if has('win32') + let out = system(['python3', '-c', 'import sys; print(sys.argv[1])', '%USERPROFILE%']) + call assert_match('^%USERPROFILE%', out) + else + let out = system(['python3', '-c', 'import sys; print(sys.argv[1])', '$HOME']) + call assert_match('^\$HOME', out) + endif + + " Spaces in arguments should be preserved without shell word splitting. + let out = system(['python3', '-c', 'import sys; print(sys.argv[1])', 'hello world']) + call assert_match('^hello world', out) + + " Pipe and ampersand should be passed literally. + let out = system(['python3', '-c', 'import sys; print(sys.argv[1])', 'a&b|c']) + call assert_match('^a&b|c', out) + + " systemlist() should work too. + let out = systemlist(['python3', '-c', 'print("line1"); print("line2")']) + call assert_match('^line1', out[0]) + call assert_match('^line2', out[1]) + + " v:shell_error should be set. + call system(['python3', '-c', 'import sys; sys.exit(42)']) + call assert_equal(42, v:shell_error) + call system(['python3', '-c', 'import sys; sys.exit(0)']) + call assert_equal(0, v:shell_error) + + " Invalid arguments. + call assert_fails('call system([])', 'E474:') + call assert_fails('call systemlist([])', 'E474:') +endfunc + +" mnv: shiftwidth=2 sts=2 expandtab |
