diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 13:18:03 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 13:18:03 +0000 |
commit | afce081b90c1e2c50c3507758c7558a0dfa1f33e (patch) | |
tree | 3fb840f0bd9de41b463443ddf17131a0ad77f226 /src/testdir/test_vim9_cmd.vim | |
parent | Initial commit. (diff) | |
download | vim-afce081b90c1e2c50c3507758c7558a0dfa1f33e.tar.xz vim-afce081b90c1e2c50c3507758c7558a0dfa1f33e.zip |
Adding upstream version 2:8.2.2434.upstream/2%8.2.2434upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/testdir/test_vim9_cmd.vim')
-rw-r--r-- | src/testdir/test_vim9_cmd.vim | 963 |
1 files changed, 963 insertions, 0 deletions
diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim new file mode 100644 index 0000000..2f8fd71 --- /dev/null +++ b/src/testdir/test_vim9_cmd.vim @@ -0,0 +1,963 @@ +" Test commands that are not compiled in a :def function + +source check.vim +source vim9.vim +source term_util.vim +source view_util.vim + +def Test_edit_wildcards() + var filename = 'Xtest' + edit `=filename` + assert_equal('Xtest', bufname()) + + var filenr = 123 + edit Xtest`=filenr` + assert_equal('Xtest123', bufname()) + + filenr = 77 + edit `=filename``=filenr` + assert_equal('Xtest77', bufname()) + + edit X`=filename`xx`=filenr`yy + assert_equal('XXtestxx77yy', bufname()) + + CheckDefFailure(['edit `=xxx`'], 'E1001:') + CheckDefFailure(['edit `="foo"'], 'E1083:') +enddef + +def Test_expand_alternate_file() + var lines =<< trim END + edit Xfileone + var bone = bufnr() + edit Xfiletwo + var btwo = bufnr() + edit Xfilethree + var bthree = bufnr() + + edit # + assert_equal(bthree, bufnr()) + edit %% + assert_equal(btwo, bufnr()) + edit %% # comment + assert_equal(bthree, bufnr()) + edit %%yy + assert_equal('Xfiletwoyy', bufname()) + + exe "edit %%" .. bone + assert_equal(bone, bufnr()) + exe "edit %%" .. btwo .. "xx" + assert_equal('Xfiletwoxx', bufname()) + + next Xfileone Xfiletwo Xfilethree + assert_equal('Xfileone', argv(0)) + assert_equal('Xfiletwo', argv(1)) + assert_equal('Xfilethree', argv(2)) + next %%%zz + assert_equal('Xfileone', argv(0)) + assert_equal('Xfiletwo', argv(1)) + assert_equal('Xfilethreezz', argv(2)) + + v:oldfiles = ['Xonefile', 'Xtwofile'] + edit %%<1 + assert_equal('Xonefile', bufname()) + edit %%<2 + assert_equal('Xtwofile', bufname()) + assert_fails('edit %%<3', 'E684:') + + edit Xfileone.vim + edit Xfiletwo + edit %%:r + assert_equal('Xfileone', bufname()) + + assert_false(bufexists('altfoo')) + edit altfoo + edit bar + assert_true(bufexists('altfoo')) + assert_true(buflisted('altfoo')) + bdel %% + assert_true(bufexists('altfoo')) + assert_false(buflisted('altfoo')) + bwipe! altfoo + bwipe! bar + END + CheckDefAndScriptSuccess(lines) +enddef + +def Test_global_backtick_expansion() + new + setline(1, 'xx') + var name = 'foobar' + g/^xx/s/.*/`=name` + assert_equal('foobar', getline(1)) + bwipe! +enddef + +def Test_folddo_backtick_expansion() + new + var name = 'xxx' + folddoopen edit `=name` + assert_equal('xxx', bufname()) + bwipe! + + new + setline(1, ['one', 'two']) + set nomodified + :1,2fold + foldclose + folddoclose edit `=name` + assert_equal('xxx', bufname()) + bwipe! +enddef + +def Test_hardcopy_wildcards() + CheckUnix + CheckFeature postscript + + var outfile = 'print' + hardcopy > X`=outfile`.ps + assert_true(filereadable('Xprint.ps')) + + delete('Xprint.ps') +enddef + +def Test_syn_include_wildcards() + writefile(['syn keyword Found found'], 'Xthemine.vim') + var save_rtp = &rtp + &rtp = '.' + + var fname = 'mine' + syn include @Group Xthe`=fname`.vim + assert_match('Found.* contained found', execute('syn list Found')) + + &rtp = save_rtp + delete('Xthemine.vim') +enddef + +def Test_echo_linebreak() + var lines =<< trim END + vim9script + redir @a + echo 'one' + .. 'two' + redir END + assert_equal("\nonetwo", @a) + END + CheckScriptSuccess(lines) + + lines =<< trim END + vim9script + redir @a + echo 11 + + 77 + - 22 + redir END + assert_equal("\n66", @a) + END + CheckScriptSuccess(lines) +enddef + +def Test_condition_types() + var lines =<< trim END + if 'text' + endif + END + CheckDefAndScriptFailure(lines, 'E1135:', 1) + + lines =<< trim END + if [1] + endif + END + CheckDefFailure(lines, 'E1012:', 1) + CheckScriptFailure(['vim9script'] + lines, 'E745:', 2) + + lines =<< trim END + g:cond = 'text' + if g:cond + endif + END + CheckDefExecAndScriptFailure(lines, 'E1135:', 2) + + lines =<< trim END + g:cond = 0 + if g:cond + elseif 'text' + endif + END + CheckDefFailure(lines, 'E1012:', 3) + CheckScriptFailure(['vim9script'] + lines, 'E1135:', 4) + + lines =<< trim END + if g:cond + elseif [1] + endif + END + CheckDefFailure(lines, 'E1012:', 2) + CheckScriptFailure(['vim9script'] + lines, 'E745:', 3) + + lines =<< trim END + g:cond = 'text' + if 0 + elseif g:cond + endif + END + CheckDefExecAndScriptFailure(lines, 'E1135:', 3) + + lines =<< trim END + while 'text' + endwhile + END + CheckDefFailure(lines, 'E1012:', 1) + CheckScriptFailure(['vim9script'] + lines, 'E1135:', 2) + + lines =<< trim END + while [1] + endwhile + END + CheckDefFailure(lines, 'E1012:', 1) + CheckScriptFailure(['vim9script'] + lines, 'E745:', 2) + + lines =<< trim END + g:cond = 'text' + while g:cond + endwhile + END + CheckDefExecAndScriptFailure(lines, 'E1135:', 2) +enddef + +def Test_if_linebreak() + var lines =<< trim END + vim9script + if 1 && + true + || 1 + g:res = 42 + endif + assert_equal(42, g:res) + END + CheckScriptSuccess(lines) + unlet g:res + + lines =<< trim END + vim9script + if 1 && + 0 + g:res = 0 + elseif 0 || + 0 + || 1 + g:res = 12 + endif + assert_equal(12, g:res) + END + CheckScriptSuccess(lines) + unlet g:res +enddef + +def Test_while_linebreak() + var lines =<< trim END + vim9script + var nr = 0 + while nr < + 10 + 3 + nr = nr + + 4 + endwhile + assert_equal(16, nr) + END + CheckScriptSuccess(lines) + + lines =<< trim END + vim9script + var nr = 0 + while nr + < + 10 + + + 3 + nr = nr + + + 4 + endwhile + assert_equal(16, nr) + END + CheckScriptSuccess(lines) +enddef + +def Test_for_linebreak() + var lines =<< trim END + vim9script + var nr = 0 + for x + in + [1, 2, 3, 4] + nr = nr + x + endfor + assert_equal(10, nr) + END + CheckScriptSuccess(lines) + + lines =<< trim END + vim9script + var nr = 0 + for x + in + [1, 2, + 3, 4 + ] + nr = nr + + + x + endfor + assert_equal(10, nr) + END + CheckScriptSuccess(lines) +enddef + +def Test_method_call_linebreak() + var lines =<< trim END + vim9script + var res = [] + func RetArg( + arg + ) + let s:res = a:arg + endfunc + [1, + 2, + 3]->RetArg() + assert_equal([1, 2, 3], res) + END + CheckScriptSuccess(lines) +enddef + +def Test_method_call_whitespace() + var lines =<< trim END + new + var yank = 'text' + yank->setline(1) + yank ->setline(2) + yank-> setline(3) + yank -> setline(4) + assert_equal(['text', 'text', 'text', 'text'], getline(1, 4)) + bwipe! + END + CheckDefAndScriptSuccess(lines) +enddef + +def Test_skipped_expr_linebreak() + if 0 + var x = [] + ->map(() => 0) + endif +enddef + +def Test_dict_member() + var test: dict<list<number>> = {data: [3, 1, 2]} + test.data->sort() + assert_equal({data: [1, 2, 3]}, test) + test.data + ->reverse() + assert_equal({data: [3, 2, 1]}, test) + + var lines =<< trim END + vim9script + var test: dict<list<number>> = {data: [3, 1, 2]} + test.data->sort() + assert_equal({data: [1, 2, 3]}, test) + END + CheckScriptSuccess(lines) +enddef + +def Test_bar_after_command() + def RedrawAndEcho() + var x = 'did redraw' + redraw | echo x + enddef + RedrawAndEcho() + assert_match('did redraw', Screenline(&lines)) + + def CallAndEcho() + var x = 'did redraw' + reg_executing() | echo x + enddef + CallAndEcho() + assert_match('did redraw', Screenline(&lines)) + + if has('unix') + # bar in filter write command does not start new command + def WriteToShell() + new + setline(1, 'some text') + w !cat | cat > Xoutfile + bwipe! + enddef + WriteToShell() + assert_equal(['some text'], readfile('Xoutfile')) + delete('Xoutfile') + + # bar in filter read command does not start new command + def ReadFromShell() + new + r! echo hello there | cat > Xoutfile + r !echo again | cat >> Xoutfile + bwipe! + enddef + ReadFromShell() + assert_equal(['hello there', 'again'], readfile('Xoutfile')) + delete('Xoutfile') + endif +enddef + +def Test_filter_is_not_modifier() + var tags = [{a: 1, b: 2}, {x: 3, y: 4}] + filter(tags, ( _, v) => has_key(v, 'x') ? 1 : 0 ) + assert_equal([{x: 3, y: 4}], tags) +enddef + +def Test_command_modifier_filter() + var lines =<< trim END + final expected = "\nType Name Content\n c \"c piyo" + @a = 'hoge' + @b = 'fuga' + @c = 'piyo' + + assert_equal(execute('filter /piyo/ registers abc'), expected) + END + CheckDefAndScriptSuccess(lines) +enddef + +def Test_win_command_modifiers() + assert_equal(1, winnr('$')) + + set splitright + vsplit + assert_equal(2, winnr()) + close + aboveleft vsplit + assert_equal(1, winnr()) + close + set splitright& + + vsplit + assert_equal(1, winnr()) + close + belowright vsplit + assert_equal(2, winnr()) + close + rightbelow vsplit + assert_equal(2, winnr()) + close + + if has('browse') + browse set + assert_equal('option-window', expand('%')) + close + endif + + vsplit + botright split + assert_equal(3, winnr()) + assert_equal(&columns, winwidth(0)) + close + close + + vsplit + topleft split + assert_equal(1, winnr()) + assert_equal(&columns, winwidth(0)) + close + close + + gettabinfo()->len()->assert_equal(1) + tab split + gettabinfo()->len()->assert_equal(2) + tabclose + + vertical new + assert_inrange(&columns / 2 - 2, &columns / 2 + 1, winwidth(0)) + close +enddef + +func Test_command_modifier_confirm() + CheckNotGui + CheckRunVimInTerminal + + " Test for saving all the modified buffers + let lines =<< trim END + call setline(1, 'changed') + def Getout() + confirm write Xfile + enddef + END + call writefile(lines, 'Xconfirmscript') + call writefile(['empty'], 'Xfile') + let buf = RunVimInTerminal('-S Xconfirmscript', {'rows': 8}) + call term_sendkeys(buf, ":call Getout()\n") + call WaitForAssert({-> assert_match('(Y)es, \[N\]o: ', term_getline(buf, 8))}, 1000) + call term_sendkeys(buf, "y") + call WaitForAssert({-> assert_match('(Y)es, \[N\]o: ', term_getline(buf, 8))}, 1000) + call term_sendkeys(buf, "\<CR>") + call TermWait(buf) + call StopVimInTerminal(buf) + + call assert_equal(['changed'], readfile('Xfile')) + call delete('Xfile') + call delete('.Xfile.swp') " in case Vim was killed + call delete('Xconfirmscript') +endfunc + +def Test_command_modifiers_keep() + if has('unix') + def DoTest(addRflag: bool, keepMarks: bool, hasMarks: bool) + new + setline(1, ['one', 'two', 'three']) + normal 1Gma + normal 2Gmb + normal 3Gmc + if addRflag + set cpo+=R + else + set cpo-=R + endif + if keepMarks + keepmarks :%!cat + else + :%!cat + endif + if hasMarks + assert_equal(1, line("'a")) + assert_equal(2, line("'b")) + assert_equal(3, line("'c")) + else + assert_equal(0, line("'a")) + assert_equal(0, line("'b")) + assert_equal(0, line("'c")) + endif + quit! + enddef + DoTest(false, false, true) + DoTest(true, false, false) + DoTest(false, true, true) + DoTest(true, true, true) + set cpo&vim + + new + setline(1, ['one', 'two', 'three', 'four']) + assert_equal(4, line("$")) + normal 1Gma + normal 2Gmb + normal 3Gmc + lockmarks :1,2!wc + # line is deleted, marks don't move + assert_equal(3, line("$")) + assert_equal('four', getline(3)) + assert_equal(1, line("'a")) + assert_equal(2, line("'b")) + assert_equal(3, line("'c")) + quit! + endif + + edit Xone + edit Xtwo + assert_equal('Xone', expand('#')) + keepalt edit Xthree + assert_equal('Xone', expand('#')) + + normal /a*b* + assert_equal('a*b*', histget("search")) + keeppatterns normal /c*d* + assert_equal('a*b*', histget("search")) + + new + setline(1, range(10)) + :10 + normal gg + assert_equal(10, getpos("''")[1]) + keepjumps normal 5G + assert_equal(10, getpos("''")[1]) + quit! +enddef + +def Test_bar_line_continuation() + var lines =<< trim END + au BufNewFile Xfile g:readFile = 1 + | g:readExtra = 2 + g:readFile = 0 + g:readExtra = 0 + edit Xfile + assert_equal(1, g:readFile) + assert_equal(2, g:readExtra) + bwipe! + au! BufNewFile + + au BufNewFile Xfile g:readFile = 1 + | g:readExtra = 2 + | g:readMore = 3 + g:readFile = 0 + g:readExtra = 0 + g:readMore = 0 + edit Xfile + assert_equal(1, g:readFile) + assert_equal(2, g:readExtra) + assert_equal(3, g:readMore) + bwipe! + au! BufNewFile + unlet g:readFile + unlet g:readExtra + unlet g:readMore + END + CheckDefAndScriptSuccess(lines) +enddef + +def Test_command_modifier_other() + new Xsomefile + setline(1, 'changed') + var buf = bufnr() + hide edit Xotherfile + var info = getbufinfo(buf) + assert_equal(1, info[0].hidden) + assert_equal(1, info[0].changed) + edit Xsomefile + bwipe! + + au BufNewFile Xfile g:readFile = 1 + g:readFile = 0 + edit Xfile + assert_equal(1, g:readFile) + bwipe! + g:readFile = 0 + noautocmd edit Xfile + assert_equal(0, g:readFile) + au! BufNewFile + unlet g:readFile + + noswapfile edit XnoSwap + assert_equal(false, &l:swapfile) + bwipe! + + var caught = false + try + sandbox !ls + catch /E48:/ + caught = true + endtry + assert_true(caught) + + :8verbose g:verbose_now = &verbose + assert_equal(8, g:verbose_now) + unlet g:verbose_now +enddef + +def EchoHere() + echomsg 'here' +enddef +def EchoThere() + unsilent echomsg 'there' +enddef + +def Test_modifier_silent_unsilent() + echomsg 'last one' + silent echomsg "text" + assert_equal("\nlast one", execute(':1messages')) + + silent! echoerr "error" + + echomsg 'last one' + silent EchoHere() + assert_equal("\nlast one", execute(':1messages')) + + silent EchoThere() + assert_equal("\nthere", execute(':1messages')) + + try + silent eval [][0] + catch + echomsg "caught" + endtry + assert_equal("\ncaught", execute(':1messages')) +enddef + +def Test_range_after_command_modifier() + CheckScriptFailure(['vim9script', 'silent keepjump 1d _'], 'E1050: Colon required before a range: 1d _', 2) + new + setline(1, 'xxx') + CheckScriptSuccess(['vim9script', 'silent keepjump :1d _']) + assert_equal('', getline(1)) + bwipe! +enddef + +def Test_silent_pattern() + new + silent! :/pat/put _ + bwipe! +enddef + +def Test_eval_command() + var from = 3 + var to = 5 + g:val = 111 + def Increment(nrs: list<number>) + for nr in nrs + g:val += nr + endfor + enddef + eval range(from, to) + ->Increment() + assert_equal(111 + 3 + 4 + 5, g:val) + unlet g:val + + var lines =<< trim END + vim9script + g:caught = 'no' + try + eval 123 || 0 + catch + g:caught = 'yes' + endtry + assert_equal('yes', g:caught) + unlet g:caught + END + CheckScriptSuccess(lines) +enddef + +def Test_map_command() + var lines =<< trim END + nnoremap <F3> :echo 'hit F3 #'<CR> + assert_equal(":echo 'hit F3 #'<CR>", maparg("<F3>", "n")) + END + CheckDefSuccess(lines) + CheckScriptSuccess(['vim9script'] + lines) +enddef + +def Test_normal_command() + new + setline(1, 'doesnotexist') + var caught = 0 + try + exe "norm! \<C-]>" + catch /E433/ + caught = 2 + endtry + assert_equal(2, caught) + + try + exe "norm! 3\<C-]>" + catch /E433/ + caught = 3 + endtry + assert_equal(3, caught) + bwipe! +enddef + +def Test_put_command() + new + @p = 'ppp' + put p + assert_equal('ppp', getline(2)) + + put ='below' + assert_equal('below', getline(3)) + put! ='above' + assert_equal('above', getline(3)) + assert_equal('below', getline(4)) + + :2put =['a', 'b', 'c'] + assert_equal(['ppp', 'a', 'b', 'c', 'above'], getline(2, 6)) + + # compute range at runtime + setline(1, range(1, 8)) + @a = 'aaa' + :$-2put a + assert_equal('aaa', getline(7)) + + setline(1, range(1, 8)) + :2 + :+2put! a + assert_equal('aaa', getline(4)) + + []->mapnew(() => 0) + :$put ='end' + assert_equal('end', getline('$')) + + bwipe! + + CheckDefFailure(['put =xxx'], 'E1001:') +enddef + +def Test_put_with_linebreak() + new + var lines =<< trim END + vim9script + pu =split('abc', '\zs') + ->join() + END + CheckScriptSuccess(lines) + getline(2)->assert_equal('a b c') + bwipe! +enddef + +def Test_command_star_range() + new + setline(1, ['xxx foo xxx', 'xxx bar xxx', 'xxx foo xx bar']) + setpos("'<", [0, 1, 0, 0]) + setpos("'>", [0, 3, 0, 0]) + :*s/\(foo\|bar\)/baz/g + getline(1, 3)->assert_equal(['xxx baz xxx', 'xxx baz xxx', 'xxx baz xx baz']) + + bwipe! +enddef + +def Test_f_args() + var lines =<< trim END + vim9script + + func SaveCmdArgs(...) + let g:args = a:000 + endfunc + + command -nargs=* TestFArgs call SaveCmdArgs(<f-args>) + + TestFArgs + assert_equal([], g:args) + + TestFArgs one two three + assert_equal(['one', 'two', 'three'], g:args) + END + CheckScriptSuccess(lines) +enddef + +def Test_user_command_comment() + command -nargs=1 Comd echom <q-args> + + var lines =<< trim END + vim9script + Comd # comment + END + CheckScriptSuccess(lines) + + lines =<< trim END + vim9script + Comd# comment + END + CheckScriptFailure(lines, 'E1144:') + + delcommand Comd +enddef + +def Test_star_command() + var lines =<< trim END + vim9script + @s = 'g:success = 8' + set cpo+=* + exe '*s' + assert_equal(8, g:success) + unlet g:success + set cpo-=* + assert_fails("exe '*s'", 'E1050:') + END + CheckScriptSuccess(lines) +enddef + +def Test_cmd_argument_without_colon() + new Xfile + setline(1, ['a', 'b', 'c', 'd']) + write + edit +3 % + assert_equal(3, getcurpos()[1]) + edit +/a % + assert_equal(1, getcurpos()[1]) + bwipe + delete('Xfile') +enddef + +def Test_ambiguous_user_cmd() + command Cmd1 eval 0 + command Cmd2 eval 0 + var lines =<< trim END + Cmd + END + CheckDefAndScriptFailure(lines, 'E464:', 1) + delcommand Cmd1 + delcommand Cmd2 +enddef + +def Test_command_not_recognized() + var lines =<< trim END + d.key = 'asdf' + END + CheckDefFailure(lines, 'E1146:', 1) + + lines =<< trim END + d['key'] = 'asdf' + END + CheckDefFailure(lines, 'E1146:', 1) +enddef + +def Test_magic_not_used() + new + for cmd in ['set magic', 'set nomagic'] + exe cmd + setline(1, 'aaa') + s/.../bbb/ + assert_equal('bbb', getline(1)) + endfor + + set magic + setline(1, 'aaa') + assert_fails('s/.\M../bbb/', 'E486:') + assert_fails('snomagic/.../bbb/', 'E486:') + assert_equal('aaa', getline(1)) + + bwipe! +enddef + +def Test_gdefault_not_used() + new + for cmd in ['set gdefault', 'set nogdefault'] + exe cmd + setline(1, 'aaa') + s/./b/ + assert_equal('baa', getline(1)) + endfor + + set nogdefault + bwipe! +enddef + +def g:SomeComplFunc(findstart: number, base: string): any + if findstart + return 0 + else + return ['aaa', 'bbb'] + endif +enddef + +def Test_insert_complete() + # this was running into an error with the matchparen hack + new + set completefunc=SomeComplFunc + feedkeys("i\<c-x>\<c-u>\<Esc>", 'ntx') + assert_equal('aaa', getline(1)) + + set completefunc= + bwipe! +enddef + +def Test_wincmd() + split + var id1 = win_getid() + if true + try | wincmd w | catch | endtry + endif + assert_notequal(id1, win_getid()) + close +enddef + +def Test_windo_missing_endif() + var lines =<< trim END + windo if 1 + END + CheckDefExecFailure(lines, 'E171:', 1) +enddef + +" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker |