1c6df10e5SBram Moolenaar" Tests for the terminal window. 21112c0feSBram Moolenaar" This is split in two, because it can take a lot of time. 318aa13d1SBram Moolenaar" See test_terminal2.vim and test_terminal3.vim for further tests. 4c6df10e5SBram Moolenaar 5b46fecd3SBram Moolenaarsource check.vim 6b46fecd3SBram MoolenaarCheckFeature terminal 7c6df10e5SBram Moolenaar 8c6df10e5SBram Moolenaarsource shared.vim 925cdd9c3SBram Moolenaarsource screendump.vim 1091689ea8SBram Moolenaarsource mouse.vim 111112c0feSBram Moolenaarsource term_util.vim 12c6df10e5SBram Moolenaar 13b81bc77aSBram Moolenaarlet s:python = PythonProg() 14ddd33087SBram Moolenaarlet $PROMPT_COMMAND='' 15b81bc77aSBram Moolenaar 1620e6cd07SBram Moolenaarfunc Test_terminal_basic() 17606cb8b0SBram Moolenaar au TerminalOpen * let b:done = 'yes' 1805aafed5SBram Moolenaar let buf = Run_shell_in_terminal({}) 19b00fdf6eSBram Moolenaar 202bb7b6b0SBram Moolenaar call assert_equal('t', mode()) 21b00fdf6eSBram Moolenaar call assert_equal('yes', b:done) 222bb7b6b0SBram Moolenaar call assert_match('%aR[^\n]*running]', execute('ls')) 230751f51aSBram Moolenaar call assert_match('%aR[^\n]*running]', execute('ls R')) 240751f51aSBram Moolenaar call assert_notmatch('%[^\n]*running]', execute('ls F')) 250751f51aSBram Moolenaar call assert_notmatch('%[^\n]*running]', execute('ls ?')) 26004a6781SBram Moolenaar call assert_fails('set modifiable', 'E946:') 272bb7b6b0SBram Moolenaar 287a39dd7fSBram Moolenaar call StopShellInTerminal(buf) 296a2c5a7dSBram Moolenaar call TermWait(buf) 302bb7b6b0SBram Moolenaar call assert_equal('n', mode()) 312bb7b6b0SBram Moolenaar call assert_match('%aF[^\n]*finished]', execute('ls')) 320751f51aSBram Moolenaar call assert_match('%aF[^\n]*finished]', execute('ls F')) 330751f51aSBram Moolenaar call assert_notmatch('%[^\n]*finished]', execute('ls R')) 340751f51aSBram Moolenaar call assert_notmatch('%[^\n]*finished]', execute('ls ?')) 3520e6cd07SBram Moolenaar 3694053a51SBram Moolenaar " closing window wipes out the terminal buffer a with finished job 3794053a51SBram Moolenaar close 3894053a51SBram Moolenaar call assert_equal("", bufname(buf)) 3994053a51SBram Moolenaar 40606cb8b0SBram Moolenaar au! TerminalOpen 4120e6cd07SBram Moolenaar unlet g:job 4220e6cd07SBram Moolenaarendfunc 4320e6cd07SBram Moolenaar 4400806bceSBram Moolenaarfunc Test_terminal_no_name() 4500806bceSBram Moolenaar let buf = Run_shell_in_terminal({}) 4600806bceSBram Moolenaar call assert_match('^!', bufname(buf)) 4700806bceSBram Moolenaar 0file 4800806bceSBram Moolenaar call assert_equal("", bufname(buf)) 4900806bceSBram Moolenaar call assert_match('\[No Name\]', execute('file')) 5000806bceSBram Moolenaar call StopShellInTerminal(buf) 5100806bceSBram Moolenaar call TermWait(buf) 5200806bceSBram Moolenaarendfunc 5300806bceSBram Moolenaar 5428ed4dfeSBram Moolenaarfunc Test_terminal_TerminalWinOpen() 5528ed4dfeSBram Moolenaar au TerminalWinOpen * let b:done = 'yes' 5628ed4dfeSBram Moolenaar let buf = Run_shell_in_terminal({}) 5728ed4dfeSBram Moolenaar call assert_equal('yes', b:done) 5828ed4dfeSBram Moolenaar call StopShellInTerminal(buf) 5928ed4dfeSBram Moolenaar " closing window wipes out the terminal buffer with the finished job 6028ed4dfeSBram Moolenaar close 6128ed4dfeSBram Moolenaar 6228ed4dfeSBram Moolenaar if has("unix") 6328ed4dfeSBram Moolenaar terminal ++hidden ++open sleep 1 6428ed4dfeSBram Moolenaar sleep 1 6528ed4dfeSBram Moolenaar call assert_fails("echo b:done", 'E121:') 6628ed4dfeSBram Moolenaar endif 6728ed4dfeSBram Moolenaar 6828ed4dfeSBram Moolenaar au! TerminalWinOpen 6928ed4dfeSBram Moolenaarendfunc 7028ed4dfeSBram Moolenaar 7120e6cd07SBram Moolenaarfunc Test_terminal_make_change() 7205aafed5SBram Moolenaar let buf = Run_shell_in_terminal({}) 737a39dd7fSBram Moolenaar call StopShellInTerminal(buf) 746a2c5a7dSBram Moolenaar call TermWait(buf) 7520e6cd07SBram Moolenaar 7620e6cd07SBram Moolenaar setlocal modifiable 7720e6cd07SBram Moolenaar exe "normal Axxx\<Esc>" 7828ee892aSBram Moolenaar call assert_fails(buf . 'bwipe', 'E89:') 7920e6cd07SBram Moolenaar undo 8020e6cd07SBram Moolenaar 81c6df10e5SBram Moolenaar exe buf . 'bwipe' 82c6df10e5SBram Moolenaar unlet g:job 83c6df10e5SBram Moolenaarendfunc 84c6df10e5SBram Moolenaar 855b868a82SBram Moolenaarfunc Test_terminal_paste_register() 865b868a82SBram Moolenaar let @" = "text to paste" 875b868a82SBram Moolenaar 885b868a82SBram Moolenaar let buf = Run_shell_in_terminal({}) 895b868a82SBram Moolenaar " Wait for the shell to display a prompt 905b868a82SBram Moolenaar call WaitForAssert({-> assert_notequal('', term_getline(buf, 1))}) 915b868a82SBram Moolenaar 925b868a82SBram Moolenaar call feedkeys("echo \<C-W>\"\" \<C-W>\"=37 + 5\<CR>\<CR>", 'xt') 935b868a82SBram Moolenaar call WaitForAssert({-> assert_match("echo text to paste 42$", getline(1))}) 947ee80f76SBram Moolenaar call WaitForAssert({-> assert_equal('text to paste 42', 2->getline())}) 955b868a82SBram Moolenaar 965b868a82SBram Moolenaar exe buf . 'bwipe!' 975b868a82SBram Moolenaar unlet g:job 985b868a82SBram Moolenaarendfunc 995b868a82SBram Moolenaar 10094053a51SBram Moolenaarfunc Test_terminal_wipe_buffer() 10105aafed5SBram Moolenaar let buf = Run_shell_in_terminal({}) 10228ee892aSBram Moolenaar call assert_fails(buf . 'bwipe', 'E89:') 103eb44a68bSBram Moolenaar exe buf . 'bwipe!' 10450182fa8SBram Moolenaar call WaitForAssert({-> assert_equal('dead', job_status(g:job))}) 10594053a51SBram Moolenaar call assert_equal("", bufname(buf)) 10694053a51SBram Moolenaar 10794053a51SBram Moolenaar unlet g:job 10894053a51SBram Moolenaarendfunc 10994053a51SBram Moolenaar 1108adb0d03SBram Moolenaarfunc Test_terminal_split_quit() 1118adb0d03SBram Moolenaar let buf = Run_shell_in_terminal({}) 1126a2c5a7dSBram Moolenaar call TermWait(buf) 1138adb0d03SBram Moolenaar split 1148adb0d03SBram Moolenaar quit! 1156a2c5a7dSBram Moolenaar call TermWait(buf) 1168adb0d03SBram Moolenaar sleep 50m 1178adb0d03SBram Moolenaar call assert_equal('run', job_status(g:job)) 1188adb0d03SBram Moolenaar 1198adb0d03SBram Moolenaar quit! 12050182fa8SBram Moolenaar call WaitForAssert({-> assert_equal('dead', job_status(g:job))}) 1218adb0d03SBram Moolenaar 1228adb0d03SBram Moolenaar exe buf . 'bwipe' 1238adb0d03SBram Moolenaar unlet g:job 1248adb0d03SBram Moolenaarendfunc 1258adb0d03SBram Moolenaar 126c9f8b849SBram Moolenaarfunc Test_terminal_hide_buffer_job_running() 12705aafed5SBram Moolenaar let buf = Run_shell_in_terminal({}) 12897a80e44SBram Moolenaar setlocal bufhidden=hide 12994053a51SBram Moolenaar quit 13094053a51SBram Moolenaar for nr in range(1, winnr('$')) 13194053a51SBram Moolenaar call assert_notequal(winbufnr(nr), buf) 13294053a51SBram Moolenaar endfor 13394053a51SBram Moolenaar call assert_true(bufloaded(buf)) 13494053a51SBram Moolenaar call assert_true(buflisted(buf)) 13594053a51SBram Moolenaar 13694053a51SBram Moolenaar exe 'split ' . buf . 'buf' 1377a39dd7fSBram Moolenaar call StopShellInTerminal(buf) 13894053a51SBram Moolenaar exe buf . 'bwipe' 13994053a51SBram Moolenaar 14094053a51SBram Moolenaar unlet g:job 14194053a51SBram Moolenaarendfunc 14294053a51SBram Moolenaar 143c9f8b849SBram Moolenaarfunc Test_terminal_hide_buffer_job_finished() 144c9f8b849SBram Moolenaar term echo hello 145c9f8b849SBram Moolenaar let buf = bufnr() 146c9f8b849SBram Moolenaar setlocal bufhidden=hide 147c9f8b849SBram Moolenaar call WaitForAssert({-> assert_equal('finished', term_getstatus(buf))}) 148c9f8b849SBram Moolenaar call assert_true(bufloaded(buf)) 149c9f8b849SBram Moolenaar call assert_true(buflisted(buf)) 150c9f8b849SBram Moolenaar edit Xasdfasdf 151c9f8b849SBram Moolenaar call assert_true(bufloaded(buf)) 152c9f8b849SBram Moolenaar call assert_true(buflisted(buf)) 153c9f8b849SBram Moolenaar exe buf .. 'buf' 154c9f8b849SBram Moolenaar call assert_equal(buf, bufnr()) 155c9f8b849SBram Moolenaar setlocal bufhidden= 156c9f8b849SBram Moolenaar edit Xasdfasdf 157c9f8b849SBram Moolenaar call assert_false(bufloaded(buf)) 158c9f8b849SBram Moolenaar call assert_false(buflisted(buf)) 159c9f8b849SBram Moolenaar bwipe Xasdfasdf 160c9f8b849SBram Moolenaarendfunc 161c9f8b849SBram Moolenaar 162*3ad69532SBram Moolenaarfunc Test_terminal_rename_buffer() 163*3ad69532SBram Moolenaar let cmd = Get_cat_123_cmd() 164*3ad69532SBram Moolenaar let buf = term_start(cmd, {'term_name': 'foo'}) 165*3ad69532SBram Moolenaar call WaitForAssert({-> assert_equal('finished', term_getstatus(buf))}) 166*3ad69532SBram Moolenaar call assert_equal('foo', bufname()) 167*3ad69532SBram Moolenaar call assert_match('foo.*finished', execute('ls')) 168*3ad69532SBram Moolenaar file bar 169*3ad69532SBram Moolenaar call assert_equal('bar', bufname()) 170*3ad69532SBram Moolenaar call assert_match('bar.*finished', execute('ls')) 171*3ad69532SBram Moolenaar exe 'bwipe! ' .. buf 172*3ad69532SBram Moolenaarendfunc 173*3ad69532SBram Moolenaar 1741e115360SBram Moolenaarfunc s:Nasty_exit_cb(job, st) 1753c3a80dcSBram Moolenaar exe g:buf . 'bwipe!' 1763c3a80dcSBram Moolenaar let g:buf = 0 1773c3a80dcSBram Moolenaarendfunc 1783c3a80dcSBram Moolenaar 1799d189613SBram Moolenaarfunc Get_cat_123_cmd() 1809d189613SBram Moolenaar if has('win32') 181aa5df7e3SBram Moolenaar if !has('conpty') 1829d189613SBram Moolenaar return 'cmd /c "cls && color 2 && echo 123"' 1839d189613SBram Moolenaar else 184aa5df7e3SBram Moolenaar " When clearing twice, extra sequence is not output. 185aa5df7e3SBram Moolenaar return 'cmd /c "cls && cls && color 2 && echo 123"' 186aa5df7e3SBram Moolenaar endif 187aa5df7e3SBram Moolenaar else 1889d189613SBram Moolenaar call writefile(["\<Esc>[32m123"], 'Xtext') 1899d189613SBram Moolenaar return "cat Xtext" 1909d189613SBram Moolenaar endif 1919d189613SBram Moolenaarendfunc 1929d189613SBram Moolenaar 1933c3a80dcSBram Moolenaarfunc Test_terminal_nasty_cb() 19433a43beeSBram Moolenaar let cmd = Get_cat_123_cmd() 1953c3a80dcSBram Moolenaar let g:buf = term_start(cmd, {'exit_cb': function('s:Nasty_exit_cb')}) 1963c3a80dcSBram Moolenaar let g:job = term_getjob(g:buf) 1973c3a80dcSBram Moolenaar 1980e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_equal("dead", job_status(g:job))}) 1990e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_equal(0, g:buf)}) 2003c3a80dcSBram Moolenaar unlet g:job 201aa5df7e3SBram Moolenaar unlet g:buf 2023c3a80dcSBram Moolenaar call delete('Xtext') 2033c3a80dcSBram Moolenaarendfunc 2043c3a80dcSBram Moolenaar 205c6df10e5SBram Moolenaarfunc Check_123(buf) 2065c838a3eSBram Moolenaar let l = term_scrape(a:buf, 0) 2075c838a3eSBram Moolenaar call assert_true(len(l) == 0) 2085c838a3eSBram Moolenaar let l = term_scrape(a:buf, 999) 2095c838a3eSBram Moolenaar call assert_true(len(l) == 0) 2107ee80f76SBram Moolenaar let l = a:buf->term_scrape(1) 211c6df10e5SBram Moolenaar call assert_true(len(l) > 0) 212c6df10e5SBram Moolenaar call assert_equal('1', l[0].chars) 213c6df10e5SBram Moolenaar call assert_equal('2', l[1].chars) 214c6df10e5SBram Moolenaar call assert_equal('3', l[2].chars) 215c6df10e5SBram Moolenaar call assert_equal('#00e000', l[0].fg) 2167ee80f76SBram Moolenaar call assert_equal(0, term_getattr(l[0].attr, 'bold')) 2177ee80f76SBram Moolenaar call assert_equal(0, l[0].attr->term_getattr('italic')) 21881df6353SBram Moolenaar if has('win32') 21981df6353SBram Moolenaar " On Windows 'background' always defaults to dark, even though the terminal 22081df6353SBram Moolenaar " may use a light background. Therefore accept both white and black. 22181df6353SBram Moolenaar call assert_match('#ffffff\|#000000', l[0].bg) 22281df6353SBram Moolenaar else 223c6df10e5SBram Moolenaar if &background == 'light' 224c6df10e5SBram Moolenaar call assert_equal('#ffffff', l[0].bg) 225c6df10e5SBram Moolenaar else 226c6df10e5SBram Moolenaar call assert_equal('#000000', l[0].bg) 227c6df10e5SBram Moolenaar endif 22881df6353SBram Moolenaar endif 229c6df10e5SBram Moolenaar 2305c838a3eSBram Moolenaar let l = term_getline(a:buf, -1) 2315c838a3eSBram Moolenaar call assert_equal('', l) 2325c838a3eSBram Moolenaar let l = term_getline(a:buf, 0) 2335c838a3eSBram Moolenaar call assert_equal('', l) 2345c838a3eSBram Moolenaar let l = term_getline(a:buf, 999) 2355c838a3eSBram Moolenaar call assert_equal('', l) 2369c844847SBram Moolenaar let l = term_getline(a:buf, 1) 237c6df10e5SBram Moolenaar call assert_equal('123', l) 238c6df10e5SBram Moolenaarendfunc 239c6df10e5SBram Moolenaar 24033a43beeSBram Moolenaarfunc Test_terminal_scrape_123() 24133a43beeSBram Moolenaar let cmd = Get_cat_123_cmd() 242c6df10e5SBram Moolenaar let buf = term_start(cmd) 243c6df10e5SBram Moolenaar 244c6df10e5SBram Moolenaar let termlist = term_list() 245c6df10e5SBram Moolenaar call assert_equal(1, len(termlist)) 246c6df10e5SBram Moolenaar call assert_equal(buf, termlist[0]) 247c6df10e5SBram Moolenaar 248f144a3fbSBram Moolenaar " Nothing happens with invalid buffer number 249f144a3fbSBram Moolenaar call term_wait(1234) 250f144a3fbSBram Moolenaar 2516a2c5a7dSBram Moolenaar call TermWait(buf) 25217833378SBram Moolenaar " On MS-Windows we first get a startup message of two lines, wait for the 2531bfdc07aSBram Moolenaar " "cls" to happen, after that we have one line with three characters. 2540e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_equal(3, len(term_scrape(buf, 1)))}) 255c6df10e5SBram Moolenaar call Check_123(buf) 256c6df10e5SBram Moolenaar 257c6df10e5SBram Moolenaar " Must still work after the job ended. 258ab8b1c14SBram Moolenaar let job = term_getjob(buf) 2590e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_equal("dead", job_status(job))}) 2606a2c5a7dSBram Moolenaar call TermWait(buf) 261c6df10e5SBram Moolenaar call Check_123(buf) 262c6df10e5SBram Moolenaar 263c6df10e5SBram Moolenaar exe buf . 'bwipe' 264f144a3fbSBram Moolenaar call delete('Xtext') 265c6df10e5SBram Moolenaarendfunc 266cfcc022cSBram Moolenaar 26733a43beeSBram Moolenaarfunc Test_terminal_scrape_multibyte() 26833a43beeSBram Moolenaar call writefile(["léttまrs"], 'Xtext') 26933a43beeSBram Moolenaar if has('win32') 2703678393bSBram Moolenaar " Run cmd with UTF-8 codepage to make the type command print the expected 2713678393bSBram Moolenaar " multibyte characters. 272ab8b1c14SBram Moolenaar let buf = term_start("cmd /K chcp 65001") 273ab8b1c14SBram Moolenaar call term_sendkeys(buf, "type Xtext\<CR>") 2747ee80f76SBram Moolenaar eval buf->term_sendkeys("exit\<CR>") 275ab8b1c14SBram Moolenaar let line = 4 27633a43beeSBram Moolenaar else 277ab8b1c14SBram Moolenaar let buf = term_start("cat Xtext") 278ab8b1c14SBram Moolenaar let line = 1 27933a43beeSBram Moolenaar endif 28033a43beeSBram Moolenaar 281ab8b1c14SBram Moolenaar call WaitFor({-> len(term_scrape(buf, line)) >= 7 && term_scrape(buf, line)[0].chars == "l"}) 282ab8b1c14SBram Moolenaar let l = term_scrape(buf, line) 28333a43beeSBram Moolenaar call assert_true(len(l) >= 7) 28433a43beeSBram Moolenaar call assert_equal('l', l[0].chars) 28533a43beeSBram Moolenaar call assert_equal('é', l[1].chars) 28633a43beeSBram Moolenaar call assert_equal(1, l[1].width) 28733a43beeSBram Moolenaar call assert_equal('t', l[2].chars) 28833a43beeSBram Moolenaar call assert_equal('t', l[3].chars) 28933a43beeSBram Moolenaar call assert_equal('ま', l[4].chars) 29033a43beeSBram Moolenaar call assert_equal(2, l[4].width) 29133a43beeSBram Moolenaar call assert_equal('r', l[5].chars) 29233a43beeSBram Moolenaar call assert_equal('s', l[6].chars) 29333a43beeSBram Moolenaar 294ab8b1c14SBram Moolenaar let job = term_getjob(buf) 2950e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_equal("dead", job_status(job))}) 2966a2c5a7dSBram Moolenaar call TermWait(buf) 29733a43beeSBram Moolenaar 298ab8b1c14SBram Moolenaar exe buf . 'bwipe' 29933a43beeSBram Moolenaar call delete('Xtext') 30033a43beeSBram Moolenaarendfunc 30133a43beeSBram Moolenaar 3028b89614eSBram Moolenaarfunc Test_terminal_one_column() 3038b89614eSBram Moolenaar " This creates a terminal, displays a double-wide character and makes the 3048b89614eSBram Moolenaar " window one column wide. This used to cause a crash. 3058b89614eSBram Moolenaar let width = &columns 3068b89614eSBram Moolenaar botright vert term 3078b89614eSBram Moolenaar let buf = bufnr('$') 308733d259aSBram Moolenaar call TermWait(buf, 100) 3098b89614eSBram Moolenaar exe "set columns=" .. (width / 2) 3108b89614eSBram Moolenaar redraw 3118b89614eSBram Moolenaar call term_sendkeys(buf, "キ") 312733d259aSBram Moolenaar call TermWait(buf, 10) 3138b89614eSBram Moolenaar exe "set columns=" .. width 3148b89614eSBram Moolenaar exe buf . 'bwipe!' 3158b89614eSBram Moolenaarendfunc 3168b89614eSBram Moolenaar 317f8d57a50SBram Moolenaarfunc Test_terminal_scroll() 318f8d57a50SBram Moolenaar call writefile(range(1, 200), 'Xtext') 319f8d57a50SBram Moolenaar if has('win32') 320f8d57a50SBram Moolenaar let cmd = 'cmd /c "type Xtext"' 321f8d57a50SBram Moolenaar else 322f8d57a50SBram Moolenaar let cmd = "cat Xtext" 323f8d57a50SBram Moolenaar endif 324f8d57a50SBram Moolenaar let buf = term_start(cmd) 325f8d57a50SBram Moolenaar 326ab8b1c14SBram Moolenaar let job = term_getjob(buf) 3270e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_equal("dead", job_status(job))}) 3286a2c5a7dSBram Moolenaar call TermWait(buf) 329f8d57a50SBram Moolenaar 330bfcfd578SBram Moolenaar " wait until the scrolling stops 331bfcfd578SBram Moolenaar while 1 3327ee80f76SBram Moolenaar let scrolled = buf->term_getscrolled() 333bfcfd578SBram Moolenaar sleep 20m 334bfcfd578SBram Moolenaar if scrolled == buf->term_getscrolled() 335bfcfd578SBram Moolenaar break 336bfcfd578SBram Moolenaar endif 337bfcfd578SBram Moolenaar endwhile 338bfcfd578SBram Moolenaar 339f8d57a50SBram Moolenaar call assert_equal('1', getline(1)) 34082b9ca05SBram Moolenaar call assert_equal('1', term_getline(buf, 1 - scrolled)) 341f8d57a50SBram Moolenaar call assert_equal('49', getline(49)) 34282b9ca05SBram Moolenaar call assert_equal('49', term_getline(buf, 49 - scrolled)) 343f8d57a50SBram Moolenaar call assert_equal('200', getline(200)) 34482b9ca05SBram Moolenaar call assert_equal('200', term_getline(buf, 200 - scrolled)) 345f8d57a50SBram Moolenaar 346f8d57a50SBram Moolenaar exe buf . 'bwipe' 347f8d57a50SBram Moolenaar call delete('Xtext') 348f8d57a50SBram Moolenaarendfunc 349f8d57a50SBram Moolenaar 3506e72cd0dSBram Moolenaarfunc Test_terminal_scrollback() 35133c5e9faSBram Moolenaar let buf = Run_shell_in_terminal({'term_rows': 15}) 3526d150f78SBram Moolenaar set termwinscroll=100 3536e72cd0dSBram Moolenaar call writefile(range(150), 'Xtext') 3546e72cd0dSBram Moolenaar if has('win32') 3556e72cd0dSBram Moolenaar call term_sendkeys(buf, "type Xtext\<CR>") 3566e72cd0dSBram Moolenaar else 3576e72cd0dSBram Moolenaar call term_sendkeys(buf, "cat Xtext\<CR>") 3586e72cd0dSBram Moolenaar endif 3596e72cd0dSBram Moolenaar let rows = term_getsize(buf)[0] 3606c672194SBram Moolenaar " On MS-Windows there is an empty line, check both last line and above it. 3610e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_match( '149', term_getline(buf, rows - 1) . term_getline(buf, rows - 2))}) 3626e72cd0dSBram Moolenaar let lines = line('$') 363ac3e8300SBram Moolenaar call assert_inrange(91, 100, lines) 3646e72cd0dSBram Moolenaar 3657a39dd7fSBram Moolenaar call StopShellInTerminal(buf) 3666a2c5a7dSBram Moolenaar call TermWait(buf) 3676e72cd0dSBram Moolenaar exe buf . 'bwipe' 3686d150f78SBram Moolenaar set termwinscroll& 36929ae223dSBram Moolenaar call delete('Xtext') 37029ae223dSBram Moolenaarendfunc 37129ae223dSBram Moolenaar 37229ae223dSBram Moolenaarfunc Test_terminal_postponed_scrollback() 37329ae223dSBram Moolenaar " tail -f only works on Unix 374adbde3fbSBram Moolenaar CheckUnix 37529ae223dSBram Moolenaar 37629ae223dSBram Moolenaar call writefile(range(50), 'Xtext') 37729ae223dSBram Moolenaar call writefile([ 3785ff7df50SBram Moolenaar \ 'set shell=/bin/sh noruler', 37929ae223dSBram Moolenaar \ 'terminal', 3807e841e3cSBram Moolenaar \ 'sleep 200m', 3815ff7df50SBram Moolenaar \ 'call feedkeys("tail -n 100 -f Xtext\<CR>", "xt")', 3825ff7df50SBram Moolenaar \ 'sleep 100m', 38329ae223dSBram Moolenaar \ 'call feedkeys("\<C-W>N", "xt")', 38429ae223dSBram Moolenaar \ ], 'XTest_postponed') 38529ae223dSBram Moolenaar let buf = RunVimInTerminal('-S XTest_postponed', {}) 38629ae223dSBram Moolenaar " Check that the Xtext lines are displayed and in Terminal-Normal mode 387ddbfe238SBram Moolenaar call VerifyScreenDump(buf, 'Test_terminal_scrollback_1', {}) 38829ae223dSBram Moolenaar 38929ae223dSBram Moolenaar silent !echo 'one more line' >>Xtext 390700dfaa8SBram Moolenaar " Screen will not change, move cursor to get a different dump 39129ae223dSBram Moolenaar call term_sendkeys(buf, "k") 392ddbfe238SBram Moolenaar call VerifyScreenDump(buf, 'Test_terminal_scrollback_2', {}) 39329ae223dSBram Moolenaar 39429ae223dSBram Moolenaar " Back to Terminal-Job mode, text will scroll and show the extra line. 39529ae223dSBram Moolenaar call term_sendkeys(buf, "a") 396ddbfe238SBram Moolenaar call VerifyScreenDump(buf, 'Test_terminal_scrollback_3', {}) 39729ae223dSBram Moolenaar 398ddbfe238SBram Moolenaar " stop "tail -f" 39929ae223dSBram Moolenaar call term_sendkeys(buf, "\<C-C>") 4006a2c5a7dSBram Moolenaar call TermWait(buf, 25) 401ddbfe238SBram Moolenaar " stop shell 40229ae223dSBram Moolenaar call term_sendkeys(buf, "exit\<CR>") 4036a2c5a7dSBram Moolenaar call TermWait(buf, 50) 404ddbfe238SBram Moolenaar " close terminal window 4053a05ce63SBram Moolenaar let tsk_ret = term_sendkeys(buf, ":q\<CR>") 4063a05ce63SBram Moolenaar 4073a05ce63SBram Moolenaar " check type of term_sendkeys() return value 4083a05ce63SBram Moolenaar echo type(tsk_ret) 4093a05ce63SBram Moolenaar 41029ae223dSBram Moolenaar call StopVimInTerminal(buf) 41129ae223dSBram Moolenaar call delete('XTest_postponed') 41229ae223dSBram Moolenaar call delete('Xtext') 4136e72cd0dSBram Moolenaarendfunc 4146e72cd0dSBram Moolenaar 41581aa0f56SBram Moolenaar" Run diff on two dumps with different size. 41681aa0f56SBram Moolenaarfunc Test_terminal_dumpdiff_size() 41781aa0f56SBram Moolenaar call assert_equal(1, winnr('$')) 41881aa0f56SBram Moolenaar call term_dumpdiff('dumps/Test_incsearch_search_01.dump', 'dumps/Test_popup_command_01.dump') 41981aa0f56SBram Moolenaar call assert_equal(2, winnr('$')) 42081aa0f56SBram Moolenaar call assert_match('Test_incsearch_search_01.dump', getline(10)) 42181aa0f56SBram Moolenaar call assert_match(' +++++$', getline(11)) 42281aa0f56SBram Moolenaar call assert_match('Test_popup_command_01.dump', getline(31)) 42381aa0f56SBram Moolenaar call assert_equal(repeat('+', 75), getline(30)) 42481aa0f56SBram Moolenaar quit 42581aa0f56SBram Moolenaarendfunc 42681aa0f56SBram Moolenaar 427cfcc022cSBram Moolenaarfunc Test_terminal_size() 42833a43beeSBram Moolenaar let cmd = Get_cat_123_cmd() 429cfcc022cSBram Moolenaar 430b241208aSBram Moolenaar exe 'terminal ++rows=5 ' . cmd 431cfcc022cSBram Moolenaar let size = term_getsize('') 432cfcc022cSBram Moolenaar bwipe! 433cfcc022cSBram Moolenaar call assert_equal(5, size[0]) 434cfcc022cSBram Moolenaar 43508d384ffSBram Moolenaar call term_start(cmd, {'term_rows': 6}) 43608d384ffSBram Moolenaar let size = term_getsize('') 43708d384ffSBram Moolenaar bwipe! 43808d384ffSBram Moolenaar call assert_equal(6, size[0]) 43908d384ffSBram Moolenaar 440cfcc022cSBram Moolenaar vsplit 441b241208aSBram Moolenaar exe 'terminal ++rows=5 ++cols=33 ' . cmd 4427ee80f76SBram Moolenaar call assert_equal([5, 33], ''->term_getsize()) 443a42d363bSBram Moolenaar 444a42d363bSBram Moolenaar call term_setsize('', 6, 0) 445a42d363bSBram Moolenaar call assert_equal([6, 33], term_getsize('')) 446a42d363bSBram Moolenaar 4477ee80f76SBram Moolenaar eval ''->term_setsize(0, 35) 448a42d363bSBram Moolenaar call assert_equal([6, 35], term_getsize('')) 449a42d363bSBram Moolenaar 450a42d363bSBram Moolenaar call term_setsize('', 7, 30) 451a42d363bSBram Moolenaar call assert_equal([7, 30], term_getsize('')) 452a42d363bSBram Moolenaar 453cfcc022cSBram Moolenaar bwipe! 4546e72cd0dSBram Moolenaar call assert_fails("call term_setsize('', 7, 30)", "E955:") 455cfcc022cSBram Moolenaar 45608d384ffSBram Moolenaar call term_start(cmd, {'term_rows': 6, 'term_cols': 36}) 45708d384ffSBram Moolenaar let size = term_getsize('') 45808d384ffSBram Moolenaar bwipe! 45908d384ffSBram Moolenaar call assert_equal([6, 36], size) 46008d384ffSBram Moolenaar 461b241208aSBram Moolenaar exe 'vertical terminal ++cols=20 ' . cmd 462cfcc022cSBram Moolenaar let size = term_getsize('') 463cfcc022cSBram Moolenaar bwipe! 464cfcc022cSBram Moolenaar call assert_equal(20, size[1]) 465cfcc022cSBram Moolenaar 4667ee80f76SBram Moolenaar eval cmd->term_start({'vertical': 1, 'term_cols': 26}) 46708d384ffSBram Moolenaar let size = term_getsize('') 46808d384ffSBram Moolenaar bwipe! 46908d384ffSBram Moolenaar call assert_equal(26, size[1]) 47008d384ffSBram Moolenaar 471cfcc022cSBram Moolenaar split 472b241208aSBram Moolenaar exe 'vertical terminal ++rows=6 ++cols=20 ' . cmd 473cfcc022cSBram Moolenaar let size = term_getsize('') 474cfcc022cSBram Moolenaar bwipe! 475cfcc022cSBram Moolenaar call assert_equal([6, 20], size) 47608d384ffSBram Moolenaar 47708d384ffSBram Moolenaar call term_start(cmd, {'vertical': 1, 'term_rows': 7, 'term_cols': 27}) 47808d384ffSBram Moolenaar let size = term_getsize('') 47908d384ffSBram Moolenaar bwipe! 48008d384ffSBram Moolenaar call assert_equal([7, 27], size) 4819d654a8dSBram Moolenaar 4825300be62SBram Moolenaar call assert_fails("call term_start(cmd, {'term_rows': -1})", 'E475:') 4835300be62SBram Moolenaar call assert_fails("call term_start(cmd, {'term_rows': 1001})", 'E475:') 48488137396SBram Moolenaar if has('float') 48588137396SBram Moolenaar call assert_fails("call term_start(cmd, {'term_rows': 10.0})", 'E805:') 48688137396SBram Moolenaar endif 48788137396SBram Moolenaar 4889d654a8dSBram Moolenaar call delete('Xtext') 489da43b61dSBram Moolenaarendfunc 490da43b61dSBram Moolenaar 491eba13e4eSBram Moolenaarfunc Test_terminal_zero_height() 492eba13e4eSBram Moolenaar split 493eba13e4eSBram Moolenaar wincmd j 494eba13e4eSBram Moolenaar anoremenu 1.1 WinBar.test : 495eba13e4eSBram Moolenaar terminal ++curwin 496eba13e4eSBram Moolenaar wincmd k 497eba13e4eSBram Moolenaar wincmd _ 498eba13e4eSBram Moolenaar redraw 499eba13e4eSBram Moolenaar 500eba13e4eSBram Moolenaar call term_sendkeys(bufnr(), "exit\r") 501eba13e4eSBram Moolenaar bwipe! 502eba13e4eSBram Moolenaarendfunc 503eba13e4eSBram Moolenaar 504da43b61dSBram Moolenaarfunc Test_terminal_curwin() 505da43b61dSBram Moolenaar let cmd = Get_cat_123_cmd() 506da43b61dSBram Moolenaar call assert_equal(1, winnr('$')) 507da43b61dSBram Moolenaar 508b1009092SBram Moolenaar split Xdummy 509b1009092SBram Moolenaar call setline(1, 'dummy') 510b1009092SBram Moolenaar write 511b1009092SBram Moolenaar call assert_equal(1, getbufinfo('Xdummy')[0].loaded) 512da43b61dSBram Moolenaar exe 'terminal ++curwin ' . cmd 513da43b61dSBram Moolenaar call assert_equal(2, winnr('$')) 514b1009092SBram Moolenaar call assert_equal(0, getbufinfo('Xdummy')[0].loaded) 515da43b61dSBram Moolenaar bwipe! 516da43b61dSBram Moolenaar 517b1009092SBram Moolenaar split Xdummy 518da43b61dSBram Moolenaar call term_start(cmd, {'curwin': 1}) 519da43b61dSBram Moolenaar call assert_equal(2, winnr('$')) 520da43b61dSBram Moolenaar bwipe! 521da43b61dSBram Moolenaar 522b1009092SBram Moolenaar split Xdummy 523da43b61dSBram Moolenaar call setline(1, 'change') 524da43b61dSBram Moolenaar call assert_fails('terminal ++curwin ' . cmd, 'E37:') 525da43b61dSBram Moolenaar call assert_equal(2, winnr('$')) 526da43b61dSBram Moolenaar exe 'terminal! ++curwin ' . cmd 527da43b61dSBram Moolenaar call assert_equal(2, winnr('$')) 528da43b61dSBram Moolenaar bwipe! 529da43b61dSBram Moolenaar 530b1009092SBram Moolenaar split Xdummy 531da43b61dSBram Moolenaar call setline(1, 'change') 532da43b61dSBram Moolenaar call assert_fails("call term_start(cmd, {'curwin': 1})", 'E37:') 533da43b61dSBram Moolenaar call assert_equal(2, winnr('$')) 534da43b61dSBram Moolenaar bwipe! 535da43b61dSBram Moolenaar 536b1009092SBram Moolenaar split Xdummy 537da43b61dSBram Moolenaar bwipe! 5389d654a8dSBram Moolenaar call delete('Xtext') 539b1009092SBram Moolenaar call delete('Xdummy') 540cfcc022cSBram Moolenaarendfunc 541dd693ce2SBram Moolenaar 542ff546796SBram Moolenaarfunc s:get_sleep_cmd() 543b81bc77aSBram Moolenaar if s:python != '' 544b81bc77aSBram Moolenaar let cmd = s:python . " test_short_sleep.py" 545c8523e2eSBram Moolenaar " 500 was not enough for Travis 546c8523e2eSBram Moolenaar let waittime = 900 547b81bc77aSBram Moolenaar else 548b81bc77aSBram Moolenaar echo 'This will take five seconds...' 549b81bc77aSBram Moolenaar let waittime = 2000 550dd693ce2SBram Moolenaar if has('win32') 551dd693ce2SBram Moolenaar let cmd = $windir . '\system32\timeout.exe 1' 552dd693ce2SBram Moolenaar else 553dd693ce2SBram Moolenaar let cmd = 'sleep 1' 554dd693ce2SBram Moolenaar endif 555b81bc77aSBram Moolenaar endif 556ff546796SBram Moolenaar return [cmd, waittime] 557ff546796SBram Moolenaarendfunc 558ff546796SBram Moolenaar 559ff546796SBram Moolenaarfunc Test_terminal_finish_open_close() 560ff546796SBram Moolenaar call assert_equal(1, winnr('$')) 561ff546796SBram Moolenaar 562ff546796SBram Moolenaar let [cmd, waittime] = s:get_sleep_cmd() 563b81bc77aSBram Moolenaar 5641dd98334SBram Moolenaar " shell terminal closes automatically 5651dd98334SBram Moolenaar terminal 5661dd98334SBram Moolenaar let buf = bufnr('%') 5671dd98334SBram Moolenaar call assert_equal(2, winnr('$')) 5681dd98334SBram Moolenaar " Wait for the shell to display a prompt 5690e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_notequal('', term_getline(buf, 1))}) 5707a39dd7fSBram Moolenaar call StopShellInTerminal(buf) 5710e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_equal(1, winnr('$'))}, waittime) 5721dd98334SBram Moolenaar 5731dd98334SBram Moolenaar " shell terminal that does not close automatically 5741dd98334SBram Moolenaar terminal ++noclose 5751dd98334SBram Moolenaar let buf = bufnr('%') 5761dd98334SBram Moolenaar call assert_equal(2, winnr('$')) 5771dd98334SBram Moolenaar " Wait for the shell to display a prompt 5780e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_notequal('', term_getline(buf, 1))}) 5797a39dd7fSBram Moolenaar call StopShellInTerminal(buf) 5801dd98334SBram Moolenaar call assert_equal(2, winnr('$')) 5811dd98334SBram Moolenaar quit 5821dd98334SBram Moolenaar call assert_equal(1, winnr('$')) 5831dd98334SBram Moolenaar 584dd693ce2SBram Moolenaar exe 'terminal ++close ' . cmd 585dd693ce2SBram Moolenaar call assert_equal(2, winnr('$')) 586dd693ce2SBram Moolenaar wincmd p 5870e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_equal(1, winnr('$'))}, waittime) 588dd693ce2SBram Moolenaar 589dd693ce2SBram Moolenaar call term_start(cmd, {'term_finish': 'close'}) 590dd693ce2SBram Moolenaar call assert_equal(2, winnr('$')) 591dd693ce2SBram Moolenaar wincmd p 5920e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_equal(1, winnr('$'))}, waittime) 593dd693ce2SBram Moolenaar call assert_equal(1, winnr('$')) 594dd693ce2SBram Moolenaar 595dd693ce2SBram Moolenaar exe 'terminal ++open ' . cmd 59697a80e44SBram Moolenaar close! 5970e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_equal(2, winnr('$'))}, waittime) 598dd693ce2SBram Moolenaar bwipe 599dd693ce2SBram Moolenaar 600dd693ce2SBram Moolenaar call term_start(cmd, {'term_finish': 'open'}) 60197a80e44SBram Moolenaar close! 6020e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_equal(2, winnr('$'))}, waittime) 6038cad930aSBram Moolenaar bwipe 604dd693ce2SBram Moolenaar 6058cad930aSBram Moolenaar exe 'terminal ++hidden ++open ' . cmd 6068cad930aSBram Moolenaar call assert_equal(1, winnr('$')) 6070e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_equal(2, winnr('$'))}, waittime) 6088cad930aSBram Moolenaar bwipe 6098cad930aSBram Moolenaar 6108cad930aSBram Moolenaar call term_start(cmd, {'term_finish': 'open', 'hidden': 1}) 6118cad930aSBram Moolenaar call assert_equal(1, winnr('$')) 6120e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_equal(2, winnr('$'))}, waittime) 613dd693ce2SBram Moolenaar bwipe 61437c45835SBram Moolenaar 61537c45835SBram Moolenaar call assert_fails("call term_start(cmd, {'term_opencmd': 'open'})", 'E475:') 61637c45835SBram Moolenaar call assert_fails("call term_start(cmd, {'term_opencmd': 'split %x'})", 'E475:') 61737c45835SBram Moolenaar call assert_fails("call term_start(cmd, {'term_opencmd': 'split %d and %s'})", 'E475:') 61837c45835SBram Moolenaar call assert_fails("call term_start(cmd, {'term_opencmd': 'split % and %d'})", 'E475:') 61937c45835SBram Moolenaar 62047c5ea44SBram Moolenaar call term_start(cmd, {'term_finish': 'open', 'term_opencmd': '4split | buffer %d | let g:result = "opened the buffer in a window"'}) 62197a80e44SBram Moolenaar close! 6220e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_equal(2, winnr('$'))}, waittime) 62337c45835SBram Moolenaar call assert_equal(4, winheight(0)) 62447c5ea44SBram Moolenaar call assert_equal('opened the buffer in a window', g:result) 62547c5ea44SBram Moolenaar unlet g:result 62637c45835SBram Moolenaar bwipe 627dd693ce2SBram Moolenaarendfunc 62805aafed5SBram Moolenaar 62905aafed5SBram Moolenaarfunc Test_terminal_cwd() 630077ff436SBram Moolenaar if has('win32') 631077ff436SBram Moolenaar let cmd = 'cmd /c cd' 632077ff436SBram Moolenaar else 633077ff436SBram Moolenaar CheckExecutable pwd 634077ff436SBram Moolenaar let cmd = 'pwd' 63505aafed5SBram Moolenaar endif 63605aafed5SBram Moolenaar call mkdir('Xdir') 637077ff436SBram Moolenaar let buf = term_start(cmd, {'cwd': 'Xdir'}) 6380e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_equal('Xdir', fnamemodify(getline(1), ":t"))}) 63905aafed5SBram Moolenaar 64005aafed5SBram Moolenaar exe buf . 'bwipe' 64105aafed5SBram Moolenaar call delete('Xdir', 'rf') 64205aafed5SBram Moolenaarendfunc 64305aafed5SBram Moolenaar 644839e81e1SBram Moolenaarfunc Test_terminal_cwd_failure() 645839e81e1SBram Moolenaar " Case 1: Provided directory is not actually a directory. Attempt to make 646839e81e1SBram Moolenaar " the file executable as well. 647839e81e1SBram Moolenaar call writefile([], 'Xfile') 648839e81e1SBram Moolenaar call setfperm('Xfile', 'rwx------') 649839e81e1SBram Moolenaar call assert_fails("call term_start(&shell, {'cwd': 'Xfile'})", 'E475:') 650839e81e1SBram Moolenaar call delete('Xfile') 651839e81e1SBram Moolenaar 652839e81e1SBram Moolenaar " Case 2: Directory does not exist. 653839e81e1SBram Moolenaar call assert_fails("call term_start(&shell, {'cwd': 'Xdir'})", 'E475:') 654839e81e1SBram Moolenaar 655839e81e1SBram Moolenaar " Case 3: Directory exists but is not accessible. 6560b38f547SBram Moolenaar " Skip this for root, it will be accessible anyway. 65707282f01SBram Moolenaar if !IsRoot() 6580b38f547SBram Moolenaar call mkdir('XdirNoAccess', '', '0600') 659839e81e1SBram Moolenaar " return early if the directory permissions could not be set properly 6600b38f547SBram Moolenaar if getfperm('XdirNoAccess')[2] == 'x' 6610b38f547SBram Moolenaar call delete('XdirNoAccess', 'rf') 662839e81e1SBram Moolenaar return 663839e81e1SBram Moolenaar endif 6640b38f547SBram Moolenaar call assert_fails("call term_start(&shell, {'cwd': 'XdirNoAccess'})", 'E475:') 6650b38f547SBram Moolenaar call delete('XdirNoAccess', 'rf') 6660b38f547SBram Moolenaar endif 667839e81e1SBram Moolenaarendfunc 668839e81e1SBram Moolenaar 66952dbb5eaSBram Moolenaarfunc Test_terminal_servername() 6706d91bcb4SBram Moolenaar CheckFeature clientserver 671d7a137fbSBram Moolenaar call s:test_environment("VIM_SERVERNAME", v:servername) 672d7a137fbSBram Moolenaarendfunc 673d7a137fbSBram Moolenaar 674d7a137fbSBram Moolenaarfunc Test_terminal_version() 675d7a137fbSBram Moolenaar call s:test_environment("VIM_TERMINAL", string(v:version)) 676d7a137fbSBram Moolenaarendfunc 677d7a137fbSBram Moolenaar 678d7a137fbSBram Moolenaarfunc s:test_environment(name, value) 679012eb662SBram Moolenaar let buf = Run_shell_in_terminal({}) 68052dbb5eaSBram Moolenaar " Wait for the shell to display a prompt 6810e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_notequal('', term_getline(buf, 1))}) 68252dbb5eaSBram Moolenaar if has('win32') 683d7a137fbSBram Moolenaar call term_sendkeys(buf, "echo %" . a:name . "%\r") 68452dbb5eaSBram Moolenaar else 685d7a137fbSBram Moolenaar call term_sendkeys(buf, "echo $" . a:name . "\r") 68652dbb5eaSBram Moolenaar endif 6876a2c5a7dSBram Moolenaar call TermWait(buf) 6887a39dd7fSBram Moolenaar call StopShellInTerminal(buf) 689d7a137fbSBram Moolenaar call WaitForAssert({-> assert_equal(a:value, getline(2))}) 69052dbb5eaSBram Moolenaar 691012eb662SBram Moolenaar exe buf . 'bwipe' 692012eb662SBram Moolenaar unlet buf 69352dbb5eaSBram Moolenaarendfunc 69452dbb5eaSBram Moolenaar 69505aafed5SBram Moolenaarfunc Test_terminal_env() 696012eb662SBram Moolenaar let buf = Run_shell_in_terminal({'env': {'TESTENV': 'correct'}}) 69751c23687SBram Moolenaar " Wait for the shell to display a prompt 6980e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_notequal('', term_getline(buf, 1))}) 699ba6febd3SBram Moolenaar if has('win32') 700012eb662SBram Moolenaar call term_sendkeys(buf, "echo %TESTENV%\r") 701ba6febd3SBram Moolenaar else 702012eb662SBram Moolenaar call term_sendkeys(buf, "echo $TESTENV\r") 703ba6febd3SBram Moolenaar endif 7046a2c5a7dSBram Moolenaar eval buf->TermWait() 7057a39dd7fSBram Moolenaar call StopShellInTerminal(buf) 7060e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_equal('correct', getline(2))}) 70705aafed5SBram Moolenaar 708012eb662SBram Moolenaar exe buf . 'bwipe' 70905aafed5SBram Moolenaarendfunc 710679653e5SBram Moolenaar 711dcaa6138SBram Moolenaarfunc Test_terminal_list_args() 712dcaa6138SBram Moolenaar let buf = term_start([&shell, &shellcmdflag, 'echo "123"']) 71328ee892aSBram Moolenaar call assert_fails(buf . 'bwipe', 'E89:') 714dcaa6138SBram Moolenaar exe buf . 'bwipe!' 715dcaa6138SBram Moolenaar call assert_equal("", bufname(buf)) 716dcaa6138SBram Moolenaarendfunction 71797bd5e65SBram Moolenaar 71897bd5e65SBram Moolenaarfunc Test_terminal_noblock() 719f08b0eb8SBram Moolenaar let g:test_is_flaky = 1 720ab8b1c14SBram Moolenaar let buf = term_start(&shell) 721f3710ee2SBram Moolenaar let wait_time = 5000 722f3710ee2SBram Moolenaar let letters = 'abcdefghijklmnopqrstuvwxyz' 72339536dd5SBram Moolenaar if has('bsd') || has('mac') || has('sun') 724d8d85bfbSBram Moolenaar " The shell or something else has a problem dealing with more than 1000 725f3710ee2SBram Moolenaar " characters at the same time. It's very slow too. 726d8d85bfbSBram Moolenaar let len = 1000 727d06dbf3fSBram Moolenaar let wait_time = 15000 728f3710ee2SBram Moolenaar let letters = 'abcdefghijklm' 729aa5df7e3SBram Moolenaar " NPFS is used in Windows, nonblocking mode does not work properly. 730aa5df7e3SBram Moolenaar elseif has('win32') 731aa5df7e3SBram Moolenaar let len = 1 732d8d85bfbSBram Moolenaar else 733d8d85bfbSBram Moolenaar let len = 5000 734d8d85bfbSBram Moolenaar endif 73597bd5e65SBram Moolenaar 736d06dbf3fSBram Moolenaar " Send a lot of text lines, should be buffered properly. 737f3710ee2SBram Moolenaar for c in split(letters, '\zs') 738ab8b1c14SBram Moolenaar call term_sendkeys(buf, 'echo ' . repeat(c, len) . "\<cr>") 73997bd5e65SBram Moolenaar endfor 740ab8b1c14SBram Moolenaar call term_sendkeys(buf, "echo done\<cr>") 741eef05316SBram Moolenaar 742eef05316SBram Moolenaar " On MS-Windows there is an extra empty line below "done". Find "done" in 743eef05316SBram Moolenaar " the last-but-one or the last-but-two line. 744ab8b1c14SBram Moolenaar let lnum = term_getsize(buf)[0] - 1 745d06dbf3fSBram Moolenaar call WaitForAssert({-> assert_match('done', term_getline(buf, lnum - 1) .. '//' .. term_getline(buf, lnum))}, wait_time) 746ab8b1c14SBram Moolenaar let line = term_getline(buf, lnum) 747eef05316SBram Moolenaar if line !~ 'done' 748ab8b1c14SBram Moolenaar let line = term_getline(buf, lnum - 1) 749eef05316SBram Moolenaar endif 750eef05316SBram Moolenaar call assert_match('done', line) 75197bd5e65SBram Moolenaar 752ab8b1c14SBram Moolenaar let g:job = term_getjob(buf) 7537a39dd7fSBram Moolenaar call StopShellInTerminal(buf) 7546a2c5a7dSBram Moolenaar call TermWait(buf) 755d21f8b54SBram Moolenaar unlet g:job 75697bd5e65SBram Moolenaar bwipe 75797bd5e65SBram Moolenaarendfunc 75837819ed5SBram Moolenaar 75937819ed5SBram Moolenaarfunc Test_terminal_write_stdin() 7601580f755SBram Moolenaar " TODO: enable once writing to stdin works on MS-Windows 76121109272SBram Moolenaar CheckNotMSWindows 76221109272SBram Moolenaar CheckExecutable wc 76321109272SBram Moolenaar 76437819ed5SBram Moolenaar call setline(1, ['one', 'two', 'three']) 76537819ed5SBram Moolenaar %term wc 7660e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_match('3', getline("$"))}) 7673346cc4fSBram Moolenaar let nrs = split(getline('$')) 76837819ed5SBram Moolenaar call assert_equal(['3', '3', '14'], nrs) 76921109272SBram Moolenaar %bwipe! 77037819ed5SBram Moolenaar 77137819ed5SBram Moolenaar call setline(1, ['one', 'two', 'three', 'four']) 77237819ed5SBram Moolenaar 2,3term wc 7730e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_match('2', getline("$"))}) 7743346cc4fSBram Moolenaar let nrs = split(getline('$')) 77537819ed5SBram Moolenaar call assert_equal(['2', '2', '10'], nrs) 77621109272SBram Moolenaar %bwipe! 77721109272SBram Moolenaarendfunc 77837819ed5SBram Moolenaar 77921109272SBram Moolenaarfunc Test_terminal_eof_arg() 780a161cb5dSBram Moolenaar call CheckPython(s:python) 78121109272SBram Moolenaar 782dada6d2aSBram Moolenaar call setline(1, ['print("hello")']) 783a161cb5dSBram Moolenaar exe '1term ++eof=exit(123) ' .. s:python 784dada6d2aSBram Moolenaar " MS-Windows echoes the input, Unix doesn't. 785dada6d2aSBram Moolenaar if has('win32') 78621109272SBram Moolenaar call WaitFor({-> getline('$') =~ 'exit(123)'}) 78721109272SBram Moolenaar call assert_equal('hello', getline(line('$') - 1)) 78821109272SBram Moolenaar else 78921109272SBram Moolenaar call WaitFor({-> getline('$') =~ 'hello'}) 79021109272SBram Moolenaar call assert_equal('hello', getline('$')) 79121109272SBram Moolenaar endif 79221109272SBram Moolenaar call assert_equal(123, bufnr()->term_getjob()->job_info().exitval) 79321109272SBram Moolenaar %bwipe! 79421109272SBram Moolenaarendfunc 79521109272SBram Moolenaar 79621109272SBram Moolenaarfunc Test_terminal_eof_arg_win32_ctrl_z() 79721109272SBram Moolenaar CheckMSWindows 798a161cb5dSBram Moolenaar call CheckPython(s:python) 79921109272SBram Moolenaar 800dada6d2aSBram Moolenaar call setline(1, ['print("hello")']) 801a161cb5dSBram Moolenaar exe '1term ++eof=<C-Z> ' .. s:python 80221109272SBram Moolenaar call WaitForAssert({-> assert_match('\^Z', getline(line('$') - 1))}) 80321109272SBram Moolenaar call assert_match('\^Z', getline(line('$') - 1)) 80421109272SBram Moolenaar %bwipe! 80521109272SBram Moolenaarendfunc 806dada6d2aSBram Moolenaar 80721109272SBram Moolenaarfunc Test_terminal_duplicate_eof_arg() 808a161cb5dSBram Moolenaar call CheckPython(s:python) 80921109272SBram Moolenaar 81021109272SBram Moolenaar " Check the last specified ++eof arg is used and should not memory leak. 81121109272SBram Moolenaar new 81221109272SBram Moolenaar call setline(1, ['print("hello")']) 813a161cb5dSBram Moolenaar exe '1term ++eof=<C-Z> ++eof=exit(123) ' .. s:python 81421109272SBram Moolenaar " MS-Windows echoes the input, Unix doesn't. 81521109272SBram Moolenaar if has('win32') 81621109272SBram Moolenaar call WaitFor({-> getline('$') =~ 'exit(123)'}) 81721109272SBram Moolenaar call assert_equal('hello', getline(line('$') - 1)) 81821109272SBram Moolenaar else 81921109272SBram Moolenaar call WaitFor({-> getline('$') =~ 'hello'}) 82021109272SBram Moolenaar call assert_equal('hello', getline('$')) 82121109272SBram Moolenaar endif 82221109272SBram Moolenaar call assert_equal(123, bufnr()->term_getjob()->job_info().exitval) 82321109272SBram Moolenaar %bwipe! 82437819ed5SBram Moolenaarendfunc 82513ebb03eSBram Moolenaar 82613ebb03eSBram Moolenaarfunc Test_terminal_no_cmd() 827f08b0eb8SBram Moolenaar let g:test_is_flaky = 1 82813ebb03eSBram Moolenaar let buf = term_start('NONE', {}) 82913ebb03eSBram Moolenaar call assert_notequal(0, buf) 83013ebb03eSBram Moolenaar 8312dc9d26cSBram Moolenaar let pty = job_info(term_getjob(buf))['tty_out'] 83213ebb03eSBram Moolenaar call assert_notequal('', pty) 833cfc15237SBram Moolenaar if has('gui_running') && !has('win32') 834cfc15237SBram Moolenaar " In the GUI job_start() doesn't work, it does not read from the pty. 83513ebb03eSBram Moolenaar call system('echo "look here" > ' . pty) 836cfc15237SBram Moolenaar else 837cfc15237SBram Moolenaar " Otherwise using a job works on all systems. 838cfc15237SBram Moolenaar call job_start([&shell, &shellcmdflag, 'echo "look here" > ' . pty]) 8392dc9d26cSBram Moolenaar endif 8400e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_match('look here', term_getline(buf, 1))}) 8412dc9d26cSBram Moolenaar 84213ebb03eSBram Moolenaar bwipe! 84313ebb03eSBram Moolenaarendfunc 8449d654a8dSBram Moolenaar 8459d654a8dSBram Moolenaarfunc Test_terminal_special_chars() 8469d654a8dSBram Moolenaar " this file name only works on Unix 847adbde3fbSBram Moolenaar CheckUnix 848adbde3fbSBram Moolenaar 8499d654a8dSBram Moolenaar call mkdir('Xdir with spaces') 8509d654a8dSBram Moolenaar call writefile(['x'], 'Xdir with spaces/quoted"file') 8519d654a8dSBram Moolenaar term ls Xdir\ with\ spaces/quoted\"file 8520e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_match('quoted"file', term_getline('', 1))}) 85395ffd43fSBram Moolenaar " make sure the job has finished 85495ffd43fSBram Moolenaar call WaitForAssert({-> assert_match('finish', term_getstatus(bufnr()))}) 8559d654a8dSBram Moolenaar 8569d654a8dSBram Moolenaar call delete('Xdir with spaces', 'rf') 8579d654a8dSBram Moolenaar bwipe 8589d654a8dSBram Moolenaarendfunc 859e88fc7a5SBram Moolenaar 860e88fc7a5SBram Moolenaarfunc Test_terminal_wrong_options() 861e88fc7a5SBram Moolenaar call assert_fails('call term_start(&shell, { 862e88fc7a5SBram Moolenaar \ "in_io": "file", 863e88fc7a5SBram Moolenaar \ "in_name": "xxx", 864e88fc7a5SBram Moolenaar \ "out_io": "file", 865e88fc7a5SBram Moolenaar \ "out_name": "xxx", 866e88fc7a5SBram Moolenaar \ "err_io": "file", 867e88fc7a5SBram Moolenaar \ "err_name": "xxx" 868e88fc7a5SBram Moolenaar \ })', 'E474:') 869e88fc7a5SBram Moolenaar call assert_fails('call term_start(&shell, { 870e88fc7a5SBram Moolenaar \ "out_buf": bufnr("%") 871e88fc7a5SBram Moolenaar \ })', 'E474:') 872e88fc7a5SBram Moolenaar call assert_fails('call term_start(&shell, { 873e88fc7a5SBram Moolenaar \ "err_buf": bufnr("%") 874e88fc7a5SBram Moolenaar \ })', 'E474:') 875e88fc7a5SBram Moolenaarendfunc 876e88fc7a5SBram Moolenaar 877e88fc7a5SBram Moolenaarfunc Test_terminal_redir_file() 878f08b0eb8SBram Moolenaar let g:test_is_flaky = 1 879e88fc7a5SBram Moolenaar let cmd = Get_cat_123_cmd() 880e88fc7a5SBram Moolenaar let buf = term_start(cmd, {'out_io': 'file', 'out_name': 'Xfile'}) 8816a2c5a7dSBram Moolenaar call TermWait(buf) 882aa5df7e3SBram Moolenaar " ConPTY may precede escape sequence. There are things that are not so. 883aa5df7e3SBram Moolenaar if !has('conpty') 8840e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_notequal(0, len(readfile("Xfile")))}) 885e88fc7a5SBram Moolenaar call assert_match('123', readfile('Xfile')[0]) 886aa5df7e3SBram Moolenaar endif 887e9f6fd27SBram Moolenaar let g:job = term_getjob(buf) 8880e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_equal("dead", job_status(g:job))}) 889c69950acSBram Moolenaar 890c69950acSBram Moolenaar if has('win32') 891c69950acSBram Moolenaar " On Windows we cannot delete a file being used by a process. When 892c69950acSBram Moolenaar " job_status() returns "dead", the process remains for a short time. 893c69950acSBram Moolenaar " Just wait for a moment. 894c69950acSBram Moolenaar sleep 50m 895c69950acSBram Moolenaar endif 896e88fc7a5SBram Moolenaar call delete('Xfile') 8972dc9d26cSBram Moolenaar bwipe 898e88fc7a5SBram Moolenaar 899e88fc7a5SBram Moolenaar if has('unix') 900e88fc7a5SBram Moolenaar call writefile(['one line'], 'Xfile') 901e88fc7a5SBram Moolenaar let buf = term_start('cat', {'in_io': 'file', 'in_name': 'Xfile'}) 9026a2c5a7dSBram Moolenaar call TermWait(buf) 9030e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_equal('one line', term_getline(buf, 1))}) 9048b53b79eSBram Moolenaar let g:job = term_getjob(buf) 9050e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_equal('dead', job_status(g:job))}) 906e88fc7a5SBram Moolenaar bwipe 907e88fc7a5SBram Moolenaar call delete('Xfile') 908e88fc7a5SBram Moolenaar endif 909e88fc7a5SBram Moolenaarendfunc 91069fbc9e1SBram Moolenaar 91169fbc9e1SBram Moolenaarfunc TerminalTmap(remap) 91269fbc9e1SBram Moolenaar let buf = Run_shell_in_terminal({}) 913f4a2ed07SBram Moolenaar " Wait for the shell to display a prompt 914f4a2ed07SBram Moolenaar call WaitForAssert({-> assert_notequal('', term_getline(buf, 1))}) 91569fbc9e1SBram Moolenaar call assert_equal('t', mode()) 91669fbc9e1SBram Moolenaar 91769fbc9e1SBram Moolenaar if a:remap 91869fbc9e1SBram Moolenaar tmap 123 456 91969fbc9e1SBram Moolenaar else 92069fbc9e1SBram Moolenaar tnoremap 123 456 92169fbc9e1SBram Moolenaar endif 922461fe50fSBram Moolenaar " don't use abcde, it's an existing command 923461fe50fSBram Moolenaar tmap 456 abxde 92469fbc9e1SBram Moolenaar call assert_equal('456', maparg('123', 't')) 925461fe50fSBram Moolenaar call assert_equal('abxde', maparg('456', 't')) 92669fbc9e1SBram Moolenaar call feedkeys("123", 'tx') 9270e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_match('abxde\|456', term_getline(buf, term_getcursor(buf)[0]))}) 92869fbc9e1SBram Moolenaar let lnum = term_getcursor(buf)[0] 92969fbc9e1SBram Moolenaar if a:remap 930461fe50fSBram Moolenaar call assert_match('abxde', term_getline(buf, lnum)) 93169fbc9e1SBram Moolenaar else 93269fbc9e1SBram Moolenaar call assert_match('456', term_getline(buf, lnum)) 93369fbc9e1SBram Moolenaar endif 93469fbc9e1SBram Moolenaar 93569fbc9e1SBram Moolenaar call term_sendkeys(buf, "\r") 9367a39dd7fSBram Moolenaar call StopShellInTerminal(buf) 9376a2c5a7dSBram Moolenaar call TermWait(buf) 93869fbc9e1SBram Moolenaar 93969fbc9e1SBram Moolenaar tunmap 123 94069fbc9e1SBram Moolenaar tunmap 456 94169fbc9e1SBram Moolenaar call assert_equal('', maparg('123', 't')) 94269fbc9e1SBram Moolenaar close 94369fbc9e1SBram Moolenaar unlet g:job 94469fbc9e1SBram Moolenaarendfunc 94569fbc9e1SBram Moolenaar 94669fbc9e1SBram Moolenaarfunc Test_terminal_tmap() 94769fbc9e1SBram Moolenaar call TerminalTmap(1) 94869fbc9e1SBram Moolenaar call TerminalTmap(0) 94969fbc9e1SBram Moolenaarendfunc 950059db5c2SBram Moolenaar 951059db5c2SBram Moolenaarfunc Test_terminal_wall() 952059db5c2SBram Moolenaar let buf = Run_shell_in_terminal({}) 953059db5c2SBram Moolenaar wall 9547a39dd7fSBram Moolenaar call StopShellInTerminal(buf) 9556a2c5a7dSBram Moolenaar call TermWait(buf) 956059db5c2SBram Moolenaar exe buf . 'bwipe' 957059db5c2SBram Moolenaar unlet g:job 958059db5c2SBram Moolenaarendfunc 9596daeef19SBram Moolenaar 9607a76092aSBram Moolenaarfunc Test_terminal_wqall() 9617a76092aSBram Moolenaar let buf = Run_shell_in_terminal({}) 962e2e4075fSBram Moolenaar call assert_fails('wqall', 'E948:') 9637a39dd7fSBram Moolenaar call StopShellInTerminal(buf) 9646a2c5a7dSBram Moolenaar call TermWait(buf) 9657a76092aSBram Moolenaar exe buf . 'bwipe' 9667a76092aSBram Moolenaar unlet g:job 9677a76092aSBram Moolenaarendfunc 9687a76092aSBram Moolenaar 9696daeef19SBram Moolenaarfunc Test_terminal_composing_unicode() 970f08b0eb8SBram Moolenaar let g:test_is_flaky = 1 9716daeef19SBram Moolenaar let save_enc = &encoding 9726daeef19SBram Moolenaar set encoding=utf-8 9736daeef19SBram Moolenaar 9746daeef19SBram Moolenaar if has('win32') 9756daeef19SBram Moolenaar let cmd = "cmd /K chcp 65001" 9766daeef19SBram Moolenaar let lnum = [3, 6, 9] 9776daeef19SBram Moolenaar else 9786daeef19SBram Moolenaar let cmd = &shell 9796daeef19SBram Moolenaar let lnum = [1, 3, 5] 9806daeef19SBram Moolenaar endif 9816daeef19SBram Moolenaar 9826daeef19SBram Moolenaar enew 983c98cdb3bSBram Moolenaar let buf = term_start(cmd, {'curwin': 1}) 9843e1c617dSBram Moolenaar let g:job = term_getjob(buf) 98541d4299fSBram Moolenaar call WaitFor({-> term_getline(buf, 1) !=# ''}, 1000) 9866daeef19SBram Moolenaar 987ebe74b73SBram Moolenaar if has('win32') 988ebe74b73SBram Moolenaar call assert_equal('cmd', job_info(g:job).cmd[0]) 989ebe74b73SBram Moolenaar else 990ebe74b73SBram Moolenaar call assert_equal(&shell, job_info(g:job).cmd[0]) 991ebe74b73SBram Moolenaar endif 992ebe74b73SBram Moolenaar 9936daeef19SBram Moolenaar " ascii + composing 9946daeef19SBram Moolenaar let txt = "a\u0308bc" 99541d4299fSBram Moolenaar call term_sendkeys(buf, "echo " . txt) 9966a2c5a7dSBram Moolenaar call TermWait(buf, 25) 9976daeef19SBram Moolenaar call assert_match("echo " . txt, term_getline(buf, lnum[0])) 99841d4299fSBram Moolenaar call term_sendkeys(buf, "\<cr>") 99941d4299fSBram Moolenaar call WaitForAssert({-> assert_equal(txt, term_getline(buf, lnum[0] + 1))}, 1000) 10006daeef19SBram Moolenaar let l = term_scrape(buf, lnum[0] + 1) 10016daeef19SBram Moolenaar call assert_equal("a\u0308", l[0].chars) 10026daeef19SBram Moolenaar call assert_equal("b", l[1].chars) 10036daeef19SBram Moolenaar call assert_equal("c", l[2].chars) 10046daeef19SBram Moolenaar 10054549dad8SBram Moolenaar " multibyte + composing: がぎぐげご 10066daeef19SBram Moolenaar let txt = "\u304b\u3099\u304e\u304f\u3099\u3052\u3053\u3099" 100741d4299fSBram Moolenaar call term_sendkeys(buf, "echo " . txt) 10086a2c5a7dSBram Moolenaar call TermWait(buf, 25) 10096daeef19SBram Moolenaar call assert_match("echo " . txt, term_getline(buf, lnum[1])) 101041d4299fSBram Moolenaar call term_sendkeys(buf, "\<cr>") 101141d4299fSBram Moolenaar call WaitForAssert({-> assert_equal(txt, term_getline(buf, lnum[1] + 1))}, 1000) 10126daeef19SBram Moolenaar let l = term_scrape(buf, lnum[1] + 1) 10136daeef19SBram Moolenaar call assert_equal("\u304b\u3099", l[0].chars) 10144549dad8SBram Moolenaar call assert_equal(2, l[0].width) 10154549dad8SBram Moolenaar call assert_equal("\u304e", l[1].chars) 10164549dad8SBram Moolenaar call assert_equal(2, l[1].width) 10174549dad8SBram Moolenaar call assert_equal("\u304f\u3099", l[2].chars) 10184549dad8SBram Moolenaar call assert_equal(2, l[2].width) 10194549dad8SBram Moolenaar call assert_equal("\u3052", l[3].chars) 10204549dad8SBram Moolenaar call assert_equal(2, l[3].width) 10214549dad8SBram Moolenaar call assert_equal("\u3053\u3099", l[4].chars) 10224549dad8SBram Moolenaar call assert_equal(2, l[4].width) 10236daeef19SBram Moolenaar 10246daeef19SBram Moolenaar " \u00a0 + composing 10256daeef19SBram Moolenaar let txt = "abc\u00a0\u0308" 102641d4299fSBram Moolenaar call term_sendkeys(buf, "echo " . txt) 10276a2c5a7dSBram Moolenaar call TermWait(buf, 25) 10286daeef19SBram Moolenaar call assert_match("echo " . txt, term_getline(buf, lnum[2])) 102941d4299fSBram Moolenaar call term_sendkeys(buf, "\<cr>") 103041d4299fSBram Moolenaar call WaitForAssert({-> assert_equal(txt, term_getline(buf, lnum[2] + 1))}, 1000) 10316daeef19SBram Moolenaar let l = term_scrape(buf, lnum[2] + 1) 10326daeef19SBram Moolenaar call assert_equal("\u00a0\u0308", l[3].chars) 10336daeef19SBram Moolenaar 10346daeef19SBram Moolenaar call term_sendkeys(buf, "exit\r") 10350e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_equal('dead', job_status(g:job))}) 10366daeef19SBram Moolenaar bwipe! 10373e1c617dSBram Moolenaar unlet g:job 10386daeef19SBram Moolenaar let &encoding = save_enc 10396daeef19SBram Moolenaarendfunc 1040ff546796SBram Moolenaar 1041ff546796SBram Moolenaarfunc Test_terminal_aucmd_on_close() 1042ff546796SBram Moolenaar fun Nop() 1043ff546796SBram Moolenaar let s:called = 1 1044ff546796SBram Moolenaar endfun 1045ff546796SBram Moolenaar 1046ff546796SBram Moolenaar aug repro 1047ff546796SBram Moolenaar au! 1048ff546796SBram Moolenaar au BufWinLeave * call Nop() 1049ff546796SBram Moolenaar aug END 1050ff546796SBram Moolenaar 1051ff546796SBram Moolenaar let [cmd, waittime] = s:get_sleep_cmd() 1052ff546796SBram Moolenaar 1053ff546796SBram Moolenaar call assert_equal(1, winnr('$')) 1054ff546796SBram Moolenaar new 1055ff546796SBram Moolenaar call setline(1, ['one', 'two']) 1056ff546796SBram Moolenaar exe 'term ++close ' . cmd 1057ff546796SBram Moolenaar wincmd p 10580e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_equal(2, winnr('$'))}, waittime) 1059ff546796SBram Moolenaar call assert_equal(1, s:called) 1060ff546796SBram Moolenaar bwipe! 1061ff546796SBram Moolenaar 1062ff546796SBram Moolenaar unlet s:called 1063ff546796SBram Moolenaar au! repro 1064ff546796SBram Moolenaar delfunc Nop 1065ff546796SBram Moolenaarendfunc 1066ede35bbbSBram Moolenaar 1067ede35bbbSBram Moolenaarfunc Test_terminal_term_start_empty_command() 1068ede35bbbSBram Moolenaar let cmd = "call term_start('', {'curwin' : 1, 'term_finish' : 'close'})" 1069e2e4075fSBram Moolenaar call assert_fails(cmd, 'E474:') 1070ede35bbbSBram Moolenaar let cmd = "call term_start('', {'curwin' : 1, 'term_finish' : 'close'})" 1071e2e4075fSBram Moolenaar call assert_fails(cmd, 'E474:') 1072ede35bbbSBram Moolenaar let cmd = "call term_start({}, {'curwin' : 1, 'term_finish' : 'close'})" 1073e2e4075fSBram Moolenaar call assert_fails(cmd, 'E474:') 1074ede35bbbSBram Moolenaar let cmd = "call term_start(0, {'curwin' : 1, 'term_finish' : 'close'})" 1075e2e4075fSBram Moolenaar call assert_fails(cmd, 'E474:') 1076ca68ae13SBram Moolenaar let cmd = "call term_start('', {'term_name' : []})" 1077e2e4075fSBram Moolenaar call assert_fails(cmd, 'E730:') 1078ca68ae13SBram Moolenaar let cmd = "call term_start('', {'term_finish' : 'axby'})" 1079e2e4075fSBram Moolenaar call assert_fails(cmd, 'E475:') 1080ca68ae13SBram Moolenaar let cmd = "call term_start('', {'eof_chars' : []})" 10819b7bf9e9SBram Moolenaar call assert_fails(cmd, 'E730:') 1082ca68ae13SBram Moolenaar let cmd = "call term_start('', {'term_kill' : []})" 10839b7bf9e9SBram Moolenaar call assert_fails(cmd, 'E730:') 1084ca68ae13SBram Moolenaar let cmd = "call term_start('', {'tty_type' : []})" 10859b7bf9e9SBram Moolenaar call assert_fails(cmd, 'E730:') 1086ca68ae13SBram Moolenaar let cmd = "call term_start('', {'tty_type' : 'abc'})" 1087ca68ae13SBram Moolenaar call assert_fails(cmd, 'E475:') 1088ca68ae13SBram Moolenaar let cmd = "call term_start('', {'term_highlight' : []})" 10899b7bf9e9SBram Moolenaar call assert_fails(cmd, 'E730:') 109087202264SBram Moolenaar if has('gui') || has('termguicolors') 1091ca68ae13SBram Moolenaar let cmd = "call term_start('', {'ansi_colors' : 'abc'})" 1092ca68ae13SBram Moolenaar call assert_fails(cmd, 'E475:') 1093ca68ae13SBram Moolenaar let cmd = "call term_start('', {'ansi_colors' : [[]]})" 1094ca68ae13SBram Moolenaar call assert_fails(cmd, 'E730:') 1095ca68ae13SBram Moolenaar let cmd = "call term_start('', {'ansi_colors' : repeat(['blue'], 18)})" 109687202264SBram Moolenaar if has('gui_running') || has('termguicolors') 1097ca68ae13SBram Moolenaar call assert_fails(cmd, 'E475:') 109887202264SBram Moolenaar else 109987202264SBram Moolenaar call assert_fails(cmd, 'E254:') 110087202264SBram Moolenaar endif 1101ca68ae13SBram Moolenaar endif 1102ede35bbbSBram Moolenaarendfunc 1103b50773c6SBram Moolenaar 1104b50773c6SBram Moolenaarfunc Test_terminal_response_to_control_sequence() 1105adbde3fbSBram Moolenaar CheckUnix 1106b50773c6SBram Moolenaar 1107b50773c6SBram Moolenaar let buf = Run_shell_in_terminal({}) 11080e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_notequal('', term_getline(buf, 1))}) 1109b50773c6SBram Moolenaar 1110086eb876SBram Moolenaar call term_sendkeys(buf, "cat\<CR>") 11110e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_match('cat', term_getline(buf, 1))}) 1112d4a282f7SBram Moolenaar 1113086eb876SBram Moolenaar " Request the cursor position. 1114086eb876SBram Moolenaar call term_sendkeys(buf, "\x1b[6n\<CR>") 1115d4a282f7SBram Moolenaar 1116d4a282f7SBram Moolenaar " Wait for output from tty to display, below an empty line. 11170e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_match('3;1R', term_getline(buf, 4))}) 1118b50773c6SBram Moolenaar 1119086eb876SBram Moolenaar " End "cat" gently. 1120086eb876SBram Moolenaar call term_sendkeys(buf, "\<CR>\<C-D>") 1121086eb876SBram Moolenaar 11227a39dd7fSBram Moolenaar call StopShellInTerminal(buf) 1123b50773c6SBram Moolenaar exe buf . 'bwipe' 1124b50773c6SBram Moolenaar unlet g:job 1125b50773c6SBram Moolenaarendfunc 112625cdd9c3SBram Moolenaar 11273e8d3853SBram Moolenaar" Run Vim, start a terminal in that Vim with the kill argument, 11283e8d3853SBram Moolenaar" :qall works. 11293e8d3853SBram Moolenaarfunc Run_terminal_qall_kill(line1, line2) 11303e8d3853SBram Moolenaar " 1. Open a terminal window and wait for the prompt to appear 11313e8d3853SBram Moolenaar " 2. set kill using term_setkill() 11323e8d3853SBram Moolenaar " 3. make Vim exit, it will kill the shell 11333e8d3853SBram Moolenaar let after = [ 11343e8d3853SBram Moolenaar \ a:line1, 11353e8d3853SBram Moolenaar \ 'let buf = bufnr("%")', 11363e8d3853SBram Moolenaar \ 'while term_getline(buf, 1) =~ "^\\s*$"', 11373e8d3853SBram Moolenaar \ ' sleep 10m', 11383e8d3853SBram Moolenaar \ 'endwhile', 11393e8d3853SBram Moolenaar \ a:line2, 11403e8d3853SBram Moolenaar \ 'au VimLeavePre * call writefile(["done"], "Xdone")', 11413e8d3853SBram Moolenaar \ 'qall', 11423e8d3853SBram Moolenaar \ ] 11433e8d3853SBram Moolenaar if !RunVim([], after, '') 114425cdd9c3SBram Moolenaar return 114525cdd9c3SBram Moolenaar endif 11463e8d3853SBram Moolenaar call assert_equal("done", readfile("Xdone")[0]) 11473e8d3853SBram Moolenaar call delete("Xdone") 114825cdd9c3SBram Moolenaarendfunc 114925cdd9c3SBram Moolenaar 115025cdd9c3SBram Moolenaar" Run Vim in a terminal, then start a terminal in that Vim with a kill 115125cdd9c3SBram Moolenaar" argument, check that :qall works. 11523e8d3853SBram Moolenaarfunc Test_terminal_qall_kill_arg() 11533e8d3853SBram Moolenaar call Run_terminal_qall_kill('term ++kill=kill', '') 11543e8d3853SBram Moolenaarendfunc 11553e8d3853SBram Moolenaar 11563e8d3853SBram Moolenaar" Run Vim, start a terminal in that Vim, set the kill argument with 11573e8d3853SBram Moolenaar" term_setkill(), check that :qall works. 115825cdd9c3SBram Moolenaarfunc Test_terminal_qall_kill_func() 11597ee80f76SBram Moolenaar call Run_terminal_qall_kill('term', 'eval buf->term_setkill("kill")') 11603e8d3853SBram Moolenaarendfunc 11613e8d3853SBram Moolenaar 11623e8d3853SBram Moolenaar" Run Vim, start a terminal in that Vim without the kill argument, 11633e8d3853SBram Moolenaar" check that :qall does not exit, :qall! does. 11643e8d3853SBram Moolenaarfunc Test_terminal_qall_exit() 1165c79745a8SBram Moolenaar let after =<< trim [CODE] 1166c79745a8SBram Moolenaar term 1167c79745a8SBram Moolenaar let buf = bufnr("%") 1168c79745a8SBram Moolenaar while term_getline(buf, 1) =~ "^\\s*$" 1169c79745a8SBram Moolenaar sleep 10m 1170c79745a8SBram Moolenaar endwhile 1171c79745a8SBram Moolenaar set nomore 1172c79745a8SBram Moolenaar au VimLeavePre * call writefile(["too early"], "Xdone") 1173c79745a8SBram Moolenaar qall 1174c79745a8SBram Moolenaar au! VimLeavePre * exe buf . "bwipe!" | call writefile(["done"], "Xdone") 1175c79745a8SBram Moolenaar cquit 1176c79745a8SBram Moolenaar [CODE] 1177c79745a8SBram Moolenaar 11783e8d3853SBram Moolenaar if !RunVim([], after, '') 117925cdd9c3SBram Moolenaar return 118025cdd9c3SBram Moolenaar endif 11813e8d3853SBram Moolenaar call assert_equal("done", readfile("Xdone")[0]) 11823e8d3853SBram Moolenaar call delete("Xdone") 118325cdd9c3SBram Moolenaarendfunc 1184435acdb8SBram Moolenaar 1185435acdb8SBram Moolenaar" Run Vim in a terminal, then start a terminal in that Vim without a kill 1186435acdb8SBram Moolenaar" argument, check that :confirm qall works. 1187435acdb8SBram Moolenaarfunc Test_terminal_qall_prompt() 1188c2585490SBram Moolenaar CheckRunVimInTerminal 1189435acdb8SBram Moolenaar let buf = RunVimInTerminal('', {}) 1190435acdb8SBram Moolenaar 1191435acdb8SBram Moolenaar " Open a terminal window and wait for the prompt to appear 1192435acdb8SBram Moolenaar call term_sendkeys(buf, ":term\<CR>") 11930e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_match('\[running]', term_getline(buf, 10))}) 11940e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_notmatch('^\s*$', term_getline(buf, 1))}) 1195435acdb8SBram Moolenaar 1196435acdb8SBram Moolenaar " make Vim exit, it will prompt to kill the shell 1197435acdb8SBram Moolenaar call term_sendkeys(buf, "\<C-W>:confirm qall\<CR>") 11980e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_match('ancel:', term_getline(buf, 20))}) 1199435acdb8SBram Moolenaar call term_sendkeys(buf, "y") 12000e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_equal('finished', term_getstatus(buf))}) 1201435acdb8SBram Moolenaar 1202435acdb8SBram Moolenaar " close the terminal window where Vim was running 1203435acdb8SBram Moolenaar quit 1204435acdb8SBram Moolenaarendfunc 1205b852c3e6SBram Moolenaar 12064d14bac8SBram Moolenaar" Run Vim in a terminal, then start a terminal window with a shell and check 12074d14bac8SBram Moolenaar" that Vim exits if it is closed. 12084d14bac8SBram Moolenaarfunc Test_terminal_exit() 12094d14bac8SBram Moolenaar CheckRunVimInTerminal 12104d14bac8SBram Moolenaar 12114d14bac8SBram Moolenaar let lines =<< trim END 12124d14bac8SBram Moolenaar let winid = win_getid() 12134d14bac8SBram Moolenaar help 12144d14bac8SBram Moolenaar term 12154d14bac8SBram Moolenaar let termid = win_getid() 12164d14bac8SBram Moolenaar call win_gotoid(winid) 12174d14bac8SBram Moolenaar close 12184d14bac8SBram Moolenaar call win_gotoid(termid) 12194d14bac8SBram Moolenaar END 12204d14bac8SBram Moolenaar call writefile(lines, 'XtermExit') 12214d14bac8SBram Moolenaar let buf = RunVimInTerminal('-S XtermExit', #{rows: 10}) 12224d14bac8SBram Moolenaar let job = term_getjob(buf) 12234d14bac8SBram Moolenaar call WaitForAssert({-> assert_equal("run", job_status(job))}) 12244d14bac8SBram Moolenaar 12254d14bac8SBram Moolenaar " quit the shell, it will make Vim exit 12264d14bac8SBram Moolenaar call term_sendkeys(buf, "exit\<CR>") 12274d14bac8SBram Moolenaar call WaitForAssert({-> assert_equal("dead", job_status(job))}) 12284d14bac8SBram Moolenaar 12294d14bac8SBram Moolenaar call delete('XtermExit') 12304d14bac8SBram Moolenaarendfunc 12314d14bac8SBram Moolenaar 1232012eb662SBram Moolenaarfunc Test_terminal_open_autocmd() 1233b852c3e6SBram Moolenaar augroup repro 1234b852c3e6SBram Moolenaar au! 1235b852c3e6SBram Moolenaar au TerminalOpen * let s:called += 1 1236b852c3e6SBram Moolenaar augroup END 1237b852c3e6SBram Moolenaar 1238b852c3e6SBram Moolenaar let s:called = 0 1239b852c3e6SBram Moolenaar 1240b852c3e6SBram Moolenaar " Open a terminal window with :terminal 1241b852c3e6SBram Moolenaar terminal 1242b852c3e6SBram Moolenaar call assert_equal(1, s:called) 1243b852c3e6SBram Moolenaar bwipe! 1244b852c3e6SBram Moolenaar 1245b852c3e6SBram Moolenaar " Open a terminal window with term_start() 1246b852c3e6SBram Moolenaar call term_start(&shell) 1247b852c3e6SBram Moolenaar call assert_equal(2, s:called) 1248b852c3e6SBram Moolenaar bwipe! 1249b852c3e6SBram Moolenaar 1250b852c3e6SBram Moolenaar " Open a hidden terminal buffer with :terminal 1251b852c3e6SBram Moolenaar terminal ++hidden 1252b852c3e6SBram Moolenaar call assert_equal(3, s:called) 1253b852c3e6SBram Moolenaar for buf in term_list() 1254b852c3e6SBram Moolenaar exe buf . "bwipe!" 1255b852c3e6SBram Moolenaar endfor 1256b852c3e6SBram Moolenaar 1257b852c3e6SBram Moolenaar " Open a hidden terminal buffer with term_start() 1258b852c3e6SBram Moolenaar let buf = term_start(&shell, {'hidden': 1}) 1259b852c3e6SBram Moolenaar call assert_equal(4, s:called) 1260b852c3e6SBram Moolenaar exe buf . "bwipe!" 1261b852c3e6SBram Moolenaar 1262b852c3e6SBram Moolenaar unlet s:called 1263b852c3e6SBram Moolenaar au! repro 1264f4d61bc5SBram Moolenaarendfunc 1265f4d61bc5SBram Moolenaar 1266f4d61bc5SBram Moolenaarfunc Test_open_term_from_cmd() 1267f4d61bc5SBram Moolenaar CheckUnix 1268f4d61bc5SBram Moolenaar CheckRunVimInTerminal 1269f4d61bc5SBram Moolenaar 1270f4d61bc5SBram Moolenaar let lines =<< trim END 1271f4d61bc5SBram Moolenaar call setline(1, ['a', 'b', 'c']) 1272f4d61bc5SBram Moolenaar 3 1273f4d61bc5SBram Moolenaar set incsearch 1274f4d61bc5SBram Moolenaar cnoremap <F3> <Cmd>call term_start(['/bin/sh', '-c', ':'])<CR> 1275f4d61bc5SBram Moolenaar END 1276f4d61bc5SBram Moolenaar call writefile(lines, 'Xopenterm') 1277f4d61bc5SBram Moolenaar let buf = RunVimInTerminal('-S Xopenterm', {}) 1278f4d61bc5SBram Moolenaar 1279f4d61bc5SBram Moolenaar " this opens a window, incsearch should not use the old cursor position 1280f4d61bc5SBram Moolenaar call term_sendkeys(buf, "/\<F3>") 1281f4d61bc5SBram Moolenaar call VerifyScreenDump(buf, 'Test_terminal_from_cmd', {}) 1282f4d61bc5SBram Moolenaar call term_sendkeys(buf, "\<Esc>") 1283f4d61bc5SBram Moolenaar call term_sendkeys(buf, ":q\<CR>") 1284f4d61bc5SBram Moolenaar 1285f4d61bc5SBram Moolenaar call StopVimInTerminal(buf) 1286f4d61bc5SBram Moolenaar call delete('Xopenterm') 1287f4d61bc5SBram Moolenaarendfunc 128845d2a64fSBram Moolenaar 12894549dad8SBram Moolenaarfunc Test_combining_double_width() 12904549dad8SBram Moolenaar CheckUnix 12914549dad8SBram Moolenaar CheckRunVimInTerminal 12924549dad8SBram Moolenaar 12934549dad8SBram Moolenaar call writefile(["\xe3\x83\x9b\xe3\x82\x9a"], 'Xonedouble') 12944549dad8SBram Moolenaar let lines =<< trim END 12954549dad8SBram Moolenaar call term_start(['/bin/sh', '-c', 'cat Xonedouble']) 12964549dad8SBram Moolenaar END 12974549dad8SBram Moolenaar call writefile(lines, 'Xcombining') 12984549dad8SBram Moolenaar let buf = RunVimInTerminal('-S Xcombining', #{rows: 9}) 12994549dad8SBram Moolenaar 13004549dad8SBram Moolenaar " this opens a window, incsearch should not use the old cursor position 13014549dad8SBram Moolenaar call VerifyScreenDump(buf, 'Test_terminal_combining', {}) 13024549dad8SBram Moolenaar call term_sendkeys(buf, ":q\<CR>") 13034549dad8SBram Moolenaar 13044549dad8SBram Moolenaar call StopVimInTerminal(buf) 13054549dad8SBram Moolenaar call delete('Xonedouble') 13064549dad8SBram Moolenaar call delete('Xcombining') 13074549dad8SBram Moolenaarendfunc 13084549dad8SBram Moolenaar 130902764713SBram Moolenaarfunc Test_terminal_popup_with_cmd() 131002764713SBram Moolenaar " this was crashing 131102764713SBram Moolenaar let buf = term_start(&shell, #{hidden: v:true}) 131202764713SBram Moolenaar let s:winid = popup_create(buf, {}) 131302764713SBram Moolenaar tnoremap <F3> <Cmd>call popup_close(s:winid)<CR> 131402764713SBram Moolenaar call feedkeys("\<F3>", 'xt') 131502764713SBram Moolenaar 131602764713SBram Moolenaar tunmap <F3> 131702764713SBram Moolenaar exe 'bwipe! ' .. buf 131802764713SBram Moolenaar unlet s:winid 131902764713SBram Moolenaarendfunc 132002764713SBram Moolenaar 13218adc8d9bSBram Moolenaarfunc Test_terminal_popup_bufload() 13228adc8d9bSBram Moolenaar let termbuf = term_start(&shell, #{hidden: v:true, term_finish: 'close'}) 13238adc8d9bSBram Moolenaar let winid = popup_create(termbuf, {}) 13248adc8d9bSBram Moolenaar sleep 50m 13258adc8d9bSBram Moolenaar 13268adc8d9bSBram Moolenaar let newbuf = bufadd('') 13278adc8d9bSBram Moolenaar call bufload(newbuf) 13288adc8d9bSBram Moolenaar call setbufline(newbuf, 1, 'foobar') 13298adc8d9bSBram Moolenaar 13308adc8d9bSBram Moolenaar " must not have switched to another window 13318adc8d9bSBram Moolenaar call assert_equal(winid, win_getid()) 13328adc8d9bSBram Moolenaar 1333e6329e4cSBram Moolenaar call StopShellInTerminal(termbuf) 1334e6329e4cSBram Moolenaar call WaitFor({-> win_getid() != winid}) 13358adc8d9bSBram Moolenaar exe 'bwipe! ' .. newbuf 13368adc8d9bSBram Moolenaarendfunc 13378adc8d9bSBram Moolenaar 1338e41decc8SBram Moolenaarfunc Test_terminal_popup_insert_cmd() 1339e41decc8SBram Moolenaar CheckUnix 1340e41decc8SBram Moolenaar 1341e41decc8SBram Moolenaar inoremap <F3> <Cmd>call StartTermInPopup()<CR> 1342e41decc8SBram Moolenaar func StartTermInPopup() 134327f4f6baSBram Moolenaar call term_start(['/bin/sh', '-c', 'cat'], #{hidden: v:true, term_finish: 'close'})->popup_create(#{highlight: 'Pmenu'}) 1344e41decc8SBram Moolenaar endfunc 1345e41decc8SBram Moolenaar call feedkeys("i\<F3>") 1346e41decc8SBram Moolenaar sleep 10m 1347e41decc8SBram Moolenaar call assert_equal('n', mode()) 1348e41decc8SBram Moolenaar 1349e41decc8SBram Moolenaar call feedkeys("\<C-D>", 'xt') 135017ab28daSBram Moolenaar call WaitFor({-> popup_list() == []}) 1351e41decc8SBram Moolenaar delfunc StartTermInPopup 1352e41decc8SBram Moolenaar iunmap <F3> 1353e41decc8SBram Moolenaarendfunc 1354e41decc8SBram Moolenaar 135545d2a64fSBram Moolenaarfunc Check_dump01(off) 135645d2a64fSBram Moolenaar call assert_equal('one two three four five', trim(getline(a:off + 1))) 135745d2a64fSBram Moolenaar call assert_equal('~ Select Word', trim(getline(a:off + 7))) 13581834d373SBram Moolenaar call assert_equal(':popup PopUp', trim(getline(a:off + 20))) 135945d2a64fSBram Moolenaarendfunc 136045d2a64fSBram Moolenaar 1361f06b0b6cSBram Moolenaarfunc Test_terminal_dumpwrite_composing() 1362c2585490SBram Moolenaar CheckRunVimInTerminal 1363f06b0b6cSBram Moolenaar let save_enc = &encoding 1364f06b0b6cSBram Moolenaar set encoding=utf-8 1365f06b0b6cSBram Moolenaar call assert_equal(1, winnr('$')) 1366f06b0b6cSBram Moolenaar 1367f06b0b6cSBram Moolenaar let text = " a\u0300 e\u0302 o\u0308" 1368f06b0b6cSBram Moolenaar call writefile([text], 'Xcomposing') 136977bfd756SBram Moolenaar let buf = RunVimInTerminal('--cmd "set encoding=utf-8" Xcomposing', {}) 13700e9d1ae3SBram Moolenaar call WaitForAssert({-> assert_match(text, term_getline(buf, 1))}) 13717ee80f76SBram Moolenaar eval 'Xdump'->term_dumpwrite(buf) 1372f06b0b6cSBram Moolenaar let dumpline = readfile('Xdump')[0] 1373f06b0b6cSBram Moolenaar call assert_match('|à| |ê| |ö', dumpline) 1374f06b0b6cSBram Moolenaar 1375f06b0b6cSBram Moolenaar call StopVimInTerminal(buf) 1376f06b0b6cSBram Moolenaar call delete('Xcomposing') 1377f06b0b6cSBram Moolenaar call delete('Xdump') 1378f06b0b6cSBram Moolenaar let &encoding = save_enc 1379f06b0b6cSBram Moolenaarendfunc 1380f06b0b6cSBram Moolenaar 138191689ea8SBram Moolenaar" Tests for failures in the term_dumpwrite() function 138291689ea8SBram Moolenaarfunc Test_terminal_dumpwrite_errors() 138391689ea8SBram Moolenaar CheckRunVimInTerminal 138491689ea8SBram Moolenaar call assert_fails("call term_dumpwrite({}, 'Xtest.dump')", 'E728:') 138591689ea8SBram Moolenaar let buf = RunVimInTerminal('', {}) 1386733d259aSBram Moolenaar call TermWait(buf) 138791689ea8SBram Moolenaar call assert_fails("call term_dumpwrite(buf, 'Xtest.dump', '')", 'E715:') 138891689ea8SBram Moolenaar call assert_fails("call term_dumpwrite(buf, [])", 'E730:') 138991689ea8SBram Moolenaar call writefile([], 'Xtest.dump') 139091689ea8SBram Moolenaar call assert_fails("call term_dumpwrite(buf, 'Xtest.dump')", 'E953:') 139191689ea8SBram Moolenaar call delete('Xtest.dump') 139291689ea8SBram Moolenaar call assert_fails("call term_dumpwrite(buf, '')", 'E482:') 139391689ea8SBram Moolenaar call assert_fails("call term_dumpwrite(buf, test_null_string())", 'E482:') 139498f1671cSBram Moolenaar call test_garbagecollect_now() 1395a46765a7SBram Moolenaar call StopVimInTerminal(buf, 0) 1396733d259aSBram Moolenaar call TermWait(buf) 139791689ea8SBram Moolenaar call assert_fails("call term_dumpwrite(buf, 'Xtest.dump')", 'E958:') 139891689ea8SBram Moolenaar call assert_fails('call term_sendkeys([], ":q\<CR>")', 'E745:') 139991689ea8SBram Moolenaar call assert_equal(0, term_sendkeys(buf, ":q\<CR>")) 140091689ea8SBram Moolenaarendfunc 140191689ea8SBram Moolenaar 140245d2a64fSBram Moolenaar" just testing basic functionality. 140345d2a64fSBram Moolenaarfunc Test_terminal_dumpload() 140487abab92SBram Moolenaar let curbuf = winbufnr('') 140545d2a64fSBram Moolenaar call assert_equal(1, winnr('$')) 140687abab92SBram Moolenaar let buf = term_dumpload('dumps/Test_popup_command_01.dump') 140745d2a64fSBram Moolenaar call assert_equal(2, winnr('$')) 140845d2a64fSBram Moolenaar call assert_equal(20, line('$')) 140945d2a64fSBram Moolenaar call Check_dump01(0) 141087abab92SBram Moolenaar 141187abab92SBram Moolenaar " Load another dump in the same window 14127ee80f76SBram Moolenaar let buf2 = 'dumps/Test_diff_01.dump'->term_dumpload({'bufnr': buf}) 141387abab92SBram Moolenaar call assert_equal(buf, buf2) 141487abab92SBram Moolenaar call assert_notequal('one two three four five', trim(getline(1))) 141587abab92SBram Moolenaar 141687abab92SBram Moolenaar " Load the first dump again in the same window 141787abab92SBram Moolenaar let buf2 = term_dumpload('dumps/Test_popup_command_01.dump', {'bufnr': buf}) 141887abab92SBram Moolenaar call assert_equal(buf, buf2) 141987abab92SBram Moolenaar call Check_dump01(0) 142087abab92SBram Moolenaar 142187abab92SBram Moolenaar call assert_fails("call term_dumpload('dumps/Test_popup_command_01.dump', {'bufnr': curbuf})", 'E475:') 142287abab92SBram Moolenaar call assert_fails("call term_dumpload('dumps/Test_popup_command_01.dump', {'bufnr': 9999})", 'E86:') 142387abab92SBram Moolenaar new 142487abab92SBram Moolenaar let closedbuf = winbufnr('') 142587abab92SBram Moolenaar quit 142687abab92SBram Moolenaar call assert_fails("call term_dumpload('dumps/Test_popup_command_01.dump', {'bufnr': closedbuf})", 'E475:') 14279b7bf9e9SBram Moolenaar call assert_fails('call term_dumpload([])', 'E730:') 142891689ea8SBram Moolenaar call assert_fails('call term_dumpload("xabcy.dump")', 'E485:') 142987abab92SBram Moolenaar 143045d2a64fSBram Moolenaar quit 143145d2a64fSBram Moolenaarendfunc 143245d2a64fSBram Moolenaar 143317efc7faSBram Moolenaarfunc Test_terminal_dumpload_dump() 143417efc7faSBram Moolenaar CheckRunVimInTerminal 143517efc7faSBram Moolenaar 143617efc7faSBram Moolenaar let lines =<< trim END 143717efc7faSBram Moolenaar call term_dumpload('dumps/Test_popupwin_22.dump', #{term_rows: 12}) 143817efc7faSBram Moolenaar END 143917efc7faSBram Moolenaar call writefile(lines, 'XtermDumpload') 144017efc7faSBram Moolenaar let buf = RunVimInTerminal('-S XtermDumpload', #{rows: 15}) 144117efc7faSBram Moolenaar call VerifyScreenDump(buf, 'Test_terminal_dumpload', {}) 144217efc7faSBram Moolenaar 144317efc7faSBram Moolenaar call StopVimInTerminal(buf) 144417efc7faSBram Moolenaar call delete('XtermDumpload') 144517efc7faSBram Moolenaarendfunc 144617efc7faSBram Moolenaar 144745d2a64fSBram Moolenaarfunc Test_terminal_dumpdiff() 144845d2a64fSBram Moolenaar call assert_equal(1, winnr('$')) 14497ee80f76SBram Moolenaar eval 'dumps/Test_popup_command_01.dump'->term_dumpdiff('dumps/Test_popup_command_02.dump') 145045d2a64fSBram Moolenaar call assert_equal(2, winnr('$')) 145145d2a64fSBram Moolenaar call assert_equal(62, line('$')) 145245d2a64fSBram Moolenaar call Check_dump01(0) 145345d2a64fSBram Moolenaar call Check_dump01(42) 145445d2a64fSBram Moolenaar call assert_equal(' bbbbbbbbbbbbbbbbbb ', getline(26)[0:29]) 145545d2a64fSBram Moolenaar quit 145691689ea8SBram Moolenaar 14579b7bf9e9SBram Moolenaar call assert_fails('call term_dumpdiff("X1.dump", [])', 'E730:') 145891689ea8SBram Moolenaar call assert_fails('call term_dumpdiff("X1.dump", "X2.dump")', 'E485:') 145991689ea8SBram Moolenaar call writefile([], 'X1.dump') 146091689ea8SBram Moolenaar call assert_fails('call term_dumpdiff("X1.dump", "X2.dump")', 'E485:') 146191689ea8SBram Moolenaar call delete('X1.dump') 146245d2a64fSBram Moolenaarendfunc 1463897e63c4SBram Moolenaar 1464c3ef8966SBram Moolenaarfunc Test_terminal_dumpdiff_swap() 1465c3ef8966SBram Moolenaar call assert_equal(1, winnr('$')) 1466c3ef8966SBram Moolenaar call term_dumpdiff('dumps/Test_popup_command_01.dump', 'dumps/Test_popup_command_03.dump') 1467c3ef8966SBram Moolenaar call assert_equal(2, winnr('$')) 1468c3ef8966SBram Moolenaar call assert_equal(62, line('$')) 1469c3ef8966SBram Moolenaar call assert_match('Test_popup_command_01.dump', getline(21)) 1470c3ef8966SBram Moolenaar call assert_match('Test_popup_command_03.dump', getline(42)) 1471c3ef8966SBram Moolenaar call assert_match('Undo', getline(3)) 1472c3ef8966SBram Moolenaar call assert_match('three four five', getline(45)) 1473c3ef8966SBram Moolenaar 1474c3ef8966SBram Moolenaar normal s 1475c3ef8966SBram Moolenaar call assert_match('Test_popup_command_03.dump', getline(21)) 1476c3ef8966SBram Moolenaar call assert_match('Test_popup_command_01.dump', getline(42)) 1477c3ef8966SBram Moolenaar call assert_match('three four five', getline(3)) 1478c3ef8966SBram Moolenaar call assert_match('Undo', getline(45)) 1479c3ef8966SBram Moolenaar quit 148098f1671cSBram Moolenaar 148198f1671cSBram Moolenaar " Diff two terminal dump files with different number of rows 148298f1671cSBram Moolenaar " Swap the diffs 148398f1671cSBram Moolenaar call term_dumpdiff('dumps/Test_popup_command_01.dump', 'dumps/Test_winline_rnu.dump') 148498f1671cSBram Moolenaar call assert_match('Test_popup_command_01.dump', getline(21)) 148598f1671cSBram Moolenaar call assert_match('Test_winline_rnu.dump', getline(42)) 148698f1671cSBram Moolenaar normal s 148798f1671cSBram Moolenaar call assert_match('Test_winline_rnu.dump', getline(6)) 148898f1671cSBram Moolenaar call assert_match('Test_popup_command_01.dump', getline(27)) 148998f1671cSBram Moolenaar quit 1490c3ef8966SBram Moolenaarendfunc 1491c3ef8966SBram Moolenaar 1492897e63c4SBram Moolenaarfunc Test_terminal_dumpdiff_options() 1493897e63c4SBram Moolenaar set laststatus=0 1494897e63c4SBram Moolenaar call assert_equal(1, winnr('$')) 1495897e63c4SBram Moolenaar let height = winheight(0) 1496897e63c4SBram Moolenaar call term_dumpdiff('dumps/Test_popup_command_01.dump', 'dumps/Test_popup_command_02.dump', {'vertical': 1, 'term_cols': 33}) 1497897e63c4SBram Moolenaar call assert_equal(2, winnr('$')) 1498897e63c4SBram Moolenaar call assert_equal(height, winheight(winnr())) 1499897e63c4SBram Moolenaar call assert_equal(33, winwidth(winnr())) 1500897e63c4SBram Moolenaar call assert_equal('dump diff dumps/Test_popup_command_01.dump', bufname('%')) 1501897e63c4SBram Moolenaar quit 1502897e63c4SBram Moolenaar 1503897e63c4SBram Moolenaar call assert_equal(1, winnr('$')) 1504897e63c4SBram Moolenaar call term_dumpdiff('dumps/Test_popup_command_01.dump', 'dumps/Test_popup_command_02.dump', {'vertical': 0, 'term_rows': 13, 'term_name': 'something else'}) 1505897e63c4SBram Moolenaar call assert_equal(2, winnr('$')) 1506e809a4edSBram Moolenaar call assert_equal(&columns, winwidth(0)) 1507e809a4edSBram Moolenaar call assert_equal(13, winheight(0)) 1508897e63c4SBram Moolenaar call assert_equal('something else', bufname('%')) 1509897e63c4SBram Moolenaar quit 1510897e63c4SBram Moolenaar 1511897e63c4SBram Moolenaar call assert_equal(1, winnr('$')) 1512897e63c4SBram Moolenaar call term_dumpdiff('dumps/Test_popup_command_01.dump', 'dumps/Test_popup_command_02.dump', {'curwin': 1}) 1513897e63c4SBram Moolenaar call assert_equal(1, winnr('$')) 1514ca68ae13SBram Moolenaar call assert_fails("call term_dumpdiff('dumps/Test_popup_command_01.dump', 'dumps/Test_popup_command_02.dump', {'bufnr': -1})", 'E475:') 1515897e63c4SBram Moolenaar bwipe 1516897e63c4SBram Moolenaar 1517897e63c4SBram Moolenaar set laststatus& 1518897e63c4SBram Moolenaarendfunc 15198fbaeb19SBram Moolenaar 152010772307SBram Moolenaar" When drawing the statusline the cursor position may not have been updated 152110772307SBram Moolenaar" yet. 152210772307SBram Moolenaar" 1. create a terminal, make it show 2 lines 152310772307SBram Moolenaar" 2. 0.5 sec later: leave terminal window, execute "i" 152410772307SBram Moolenaar" 3. 0.5 sec later: clear terminal window, now it's 1 line 152510772307SBram Moolenaar" 4. 0.5 sec later: redraw, including statusline (used to trigger bug) 152610772307SBram Moolenaar" 4. 0.5 sec later: should be done, clean up 152710772307SBram Moolenaarfunc Test_terminal_statusline() 1528adbde3fbSBram Moolenaar CheckUnix 1529adbde3fbSBram Moolenaar 153010772307SBram Moolenaar set statusline=x 153110772307SBram Moolenaar terminal 153210772307SBram Moolenaar let tbuf = bufnr('') 153310772307SBram Moolenaar call term_sendkeys(tbuf, "clear; echo a; echo b; sleep 1; clear\n") 153410772307SBram Moolenaar call timer_start(500, { tid -> feedkeys("\<C-w>j", 'tx') }) 153510772307SBram Moolenaar call timer_start(1500, { tid -> feedkeys("\<C-l>", 'tx') }) 153610772307SBram Moolenaar au BufLeave * if &buftype == 'terminal' | silent! normal i | endif 153710772307SBram Moolenaar 153810772307SBram Moolenaar sleep 2 153910772307SBram Moolenaar exe tbuf . 'bwipe!' 154010772307SBram Moolenaar au! BufLeave 154110772307SBram Moolenaar set statusline= 154210772307SBram Moolenaarendfunc 1543fa1e90cdSBram Moolenaar 1544f43e7ac4SBram Moolenaarfunc Test_terminal_window_focus() 1545f43e7ac4SBram Moolenaar let winid1 = win_getid() 1546f43e7ac4SBram Moolenaar terminal 1547f43e7ac4SBram Moolenaar let winid2 = win_getid() 1548f43e7ac4SBram Moolenaar call feedkeys("\<C-W>j", 'xt') 1549f43e7ac4SBram Moolenaar call assert_equal(winid1, win_getid()) 1550f43e7ac4SBram Moolenaar call feedkeys("\<C-W>k", 'xt') 1551f43e7ac4SBram Moolenaar call assert_equal(winid2, win_getid()) 1552f43e7ac4SBram Moolenaar " can use a cursor key here 1553f43e7ac4SBram Moolenaar call feedkeys("\<C-W>\<Down>", 'xt') 1554f43e7ac4SBram Moolenaar call assert_equal(winid1, win_getid()) 1555f43e7ac4SBram Moolenaar call feedkeys("\<C-W>\<Up>", 'xt') 1556f43e7ac4SBram Moolenaar call assert_equal(winid2, win_getid()) 1557f43e7ac4SBram Moolenaar 1558f43e7ac4SBram Moolenaar bwipe! 1559f43e7ac4SBram Moolenaarendfunc 1560f43e7ac4SBram Moolenaar 156118aa13d1SBram Moolenaarfunc Api_drop_common(options) 156218aa13d1SBram Moolenaar call assert_equal(1, winnr('$')) 156318aa13d1SBram Moolenaar 156418aa13d1SBram Moolenaar " Use the title termcap entries to output the escape sequence. 156518aa13d1SBram Moolenaar call writefile([ 156618aa13d1SBram Moolenaar \ 'set title', 156718aa13d1SBram Moolenaar \ 'exe "set t_ts=\<Esc>]51; t_fs=\x07"', 156818aa13d1SBram Moolenaar \ 'let &titlestring = ''["drop","Xtextfile"' . a:options . ']''', 156918aa13d1SBram Moolenaar \ 'redraw', 157018aa13d1SBram Moolenaar \ "set t_ts=", 157118aa13d1SBram Moolenaar \ ], 'Xscript') 157218aa13d1SBram Moolenaar let buf = RunVimInTerminal('-S Xscript', {}) 157318aa13d1SBram Moolenaar call WaitFor({-> bufnr('Xtextfile') > 0}) 157418aa13d1SBram Moolenaar call assert_equal('Xtextfile', expand('%:t')) 157518aa13d1SBram Moolenaar call assert_true(winnr('$') >= 3) 157618aa13d1SBram Moolenaar return buf 157718aa13d1SBram Moolenaarendfunc 157818aa13d1SBram Moolenaar 157918aa13d1SBram Moolenaarfunc Test_terminal_api_drop_newwin() 158018aa13d1SBram Moolenaar CheckRunVimInTerminal 158118aa13d1SBram Moolenaar let buf = Api_drop_common('') 158218aa13d1SBram Moolenaar call assert_equal(0, &bin) 158318aa13d1SBram Moolenaar call assert_equal('', &fenc) 158418aa13d1SBram Moolenaar 158518aa13d1SBram Moolenaar call StopVimInTerminal(buf) 158618aa13d1SBram Moolenaar call delete('Xscript') 158718aa13d1SBram Moolenaar bwipe Xtextfile 158818aa13d1SBram Moolenaarendfunc 158918aa13d1SBram Moolenaar 159018aa13d1SBram Moolenaarfunc Test_terminal_api_drop_newwin_bin() 159118aa13d1SBram Moolenaar CheckRunVimInTerminal 159218aa13d1SBram Moolenaar let buf = Api_drop_common(',{"bin":1}') 159318aa13d1SBram Moolenaar call assert_equal(1, &bin) 159418aa13d1SBram Moolenaar 159518aa13d1SBram Moolenaar call StopVimInTerminal(buf) 159618aa13d1SBram Moolenaar call delete('Xscript') 159718aa13d1SBram Moolenaar bwipe Xtextfile 159818aa13d1SBram Moolenaarendfunc 159918aa13d1SBram Moolenaar 160018aa13d1SBram Moolenaarfunc Test_terminal_api_drop_newwin_binary() 160118aa13d1SBram Moolenaar CheckRunVimInTerminal 160218aa13d1SBram Moolenaar let buf = Api_drop_common(',{"binary":1}') 160318aa13d1SBram Moolenaar call assert_equal(1, &bin) 160418aa13d1SBram Moolenaar 160518aa13d1SBram Moolenaar call StopVimInTerminal(buf) 160618aa13d1SBram Moolenaar call delete('Xscript') 160718aa13d1SBram Moolenaar bwipe Xtextfile 160818aa13d1SBram Moolenaarendfunc 160918aa13d1SBram Moolenaar 161018aa13d1SBram Moolenaarfunc Test_terminal_api_drop_newwin_nobin() 161118aa13d1SBram Moolenaar CheckRunVimInTerminal 161218aa13d1SBram Moolenaar set binary 161318aa13d1SBram Moolenaar let buf = Api_drop_common(',{"nobin":1}') 161418aa13d1SBram Moolenaar call assert_equal(0, &bin) 161518aa13d1SBram Moolenaar 161618aa13d1SBram Moolenaar call StopVimInTerminal(buf) 161718aa13d1SBram Moolenaar call delete('Xscript') 161818aa13d1SBram Moolenaar bwipe Xtextfile 161918aa13d1SBram Moolenaar set nobinary 162018aa13d1SBram Moolenaarendfunc 162118aa13d1SBram Moolenaar 162218aa13d1SBram Moolenaarfunc Test_terminal_api_drop_newwin_nobinary() 162318aa13d1SBram Moolenaar CheckRunVimInTerminal 162418aa13d1SBram Moolenaar set binary 162518aa13d1SBram Moolenaar let buf = Api_drop_common(',{"nobinary":1}') 162618aa13d1SBram Moolenaar call assert_equal(0, &bin) 162718aa13d1SBram Moolenaar 162818aa13d1SBram Moolenaar call StopVimInTerminal(buf) 162918aa13d1SBram Moolenaar call delete('Xscript') 163018aa13d1SBram Moolenaar bwipe Xtextfile 163118aa13d1SBram Moolenaar set nobinary 163218aa13d1SBram Moolenaarendfunc 163318aa13d1SBram Moolenaar 163418aa13d1SBram Moolenaarfunc Test_terminal_api_drop_newwin_ff() 163518aa13d1SBram Moolenaar CheckRunVimInTerminal 163618aa13d1SBram Moolenaar let buf = Api_drop_common(',{"ff":"dos"}') 163718aa13d1SBram Moolenaar call assert_equal("dos", &ff) 163818aa13d1SBram Moolenaar 163918aa13d1SBram Moolenaar call StopVimInTerminal(buf) 164018aa13d1SBram Moolenaar call delete('Xscript') 164118aa13d1SBram Moolenaar bwipe Xtextfile 164218aa13d1SBram Moolenaarendfunc 164318aa13d1SBram Moolenaar 164418aa13d1SBram Moolenaarfunc Test_terminal_api_drop_newwin_fileformat() 164518aa13d1SBram Moolenaar CheckRunVimInTerminal 164618aa13d1SBram Moolenaar let buf = Api_drop_common(',{"fileformat":"dos"}') 164718aa13d1SBram Moolenaar call assert_equal("dos", &ff) 164818aa13d1SBram Moolenaar 164918aa13d1SBram Moolenaar call StopVimInTerminal(buf) 165018aa13d1SBram Moolenaar call delete('Xscript') 165118aa13d1SBram Moolenaar bwipe Xtextfile 165218aa13d1SBram Moolenaarendfunc 165318aa13d1SBram Moolenaar 165418aa13d1SBram Moolenaarfunc Test_terminal_api_drop_newwin_enc() 165518aa13d1SBram Moolenaar CheckRunVimInTerminal 165618aa13d1SBram Moolenaar let buf = Api_drop_common(',{"enc":"utf-16"}') 165718aa13d1SBram Moolenaar call assert_equal("utf-16", &fenc) 165818aa13d1SBram Moolenaar 165918aa13d1SBram Moolenaar call StopVimInTerminal(buf) 166018aa13d1SBram Moolenaar call delete('Xscript') 166118aa13d1SBram Moolenaar bwipe Xtextfile 166218aa13d1SBram Moolenaarendfunc 166318aa13d1SBram Moolenaar 166418aa13d1SBram Moolenaarfunc Test_terminal_api_drop_newwin_encoding() 166518aa13d1SBram Moolenaar CheckRunVimInTerminal 166618aa13d1SBram Moolenaar let buf = Api_drop_common(',{"encoding":"utf-16"}') 166718aa13d1SBram Moolenaar call assert_equal("utf-16", &fenc) 166818aa13d1SBram Moolenaar 166918aa13d1SBram Moolenaar call StopVimInTerminal(buf) 167018aa13d1SBram Moolenaar call delete('Xscript') 167118aa13d1SBram Moolenaar bwipe Xtextfile 167218aa13d1SBram Moolenaarendfunc 167318aa13d1SBram Moolenaar 167418aa13d1SBram Moolenaarfunc Test_terminal_api_drop_oldwin() 167518aa13d1SBram Moolenaar CheckRunVimInTerminal 167618aa13d1SBram Moolenaar let firstwinid = win_getid() 167718aa13d1SBram Moolenaar split Xtextfile 167818aa13d1SBram Moolenaar let textfile_winid = win_getid() 167918aa13d1SBram Moolenaar call assert_equal(2, winnr('$')) 168018aa13d1SBram Moolenaar call win_gotoid(firstwinid) 168118aa13d1SBram Moolenaar 168218aa13d1SBram Moolenaar " Use the title termcap entries to output the escape sequence. 168318aa13d1SBram Moolenaar call writefile([ 168418aa13d1SBram Moolenaar \ 'set title', 168518aa13d1SBram Moolenaar \ 'exe "set t_ts=\<Esc>]51; t_fs=\x07"', 168618aa13d1SBram Moolenaar \ 'let &titlestring = ''["drop","Xtextfile"]''', 168718aa13d1SBram Moolenaar \ 'redraw', 168818aa13d1SBram Moolenaar \ "set t_ts=", 168918aa13d1SBram Moolenaar \ ], 'Xscript') 169018aa13d1SBram Moolenaar let buf = RunVimInTerminal('-S Xscript', {'rows': 10}) 169118aa13d1SBram Moolenaar call WaitForAssert({-> assert_equal('Xtextfile', expand('%:t'))}) 169218aa13d1SBram Moolenaar call assert_equal(textfile_winid, win_getid()) 169318aa13d1SBram Moolenaar 169418aa13d1SBram Moolenaar call StopVimInTerminal(buf) 169518aa13d1SBram Moolenaar call delete('Xscript') 169618aa13d1SBram Moolenaar bwipe Xtextfile 169718aa13d1SBram Moolenaarendfunc 169818aa13d1SBram Moolenaar 169918aa13d1SBram Moolenaarfunc Tapi_TryThis(bufnum, arg) 170018aa13d1SBram Moolenaar let g:called_bufnum = a:bufnum 170118aa13d1SBram Moolenaar let g:called_arg = a:arg 170218aa13d1SBram Moolenaarendfunc 170318aa13d1SBram Moolenaar 170418aa13d1SBram Moolenaarfunc WriteApiCall(funcname) 170518aa13d1SBram Moolenaar " Use the title termcap entries to output the escape sequence. 170618aa13d1SBram Moolenaar call writefile([ 170718aa13d1SBram Moolenaar \ 'set title', 170818aa13d1SBram Moolenaar \ 'exe "set t_ts=\<Esc>]51; t_fs=\x07"', 170918aa13d1SBram Moolenaar \ 'let &titlestring = ''["call","' . a:funcname . '",["hello",123]]''', 171018aa13d1SBram Moolenaar \ 'redraw', 171118aa13d1SBram Moolenaar \ "set t_ts=", 171218aa13d1SBram Moolenaar \ ], 'Xscript') 171318aa13d1SBram Moolenaarendfunc 171418aa13d1SBram Moolenaar 171518aa13d1SBram Moolenaarfunc Test_terminal_api_call() 171618aa13d1SBram Moolenaar CheckRunVimInTerminal 171718aa13d1SBram Moolenaar 171818aa13d1SBram Moolenaar unlet! g:called_bufnum 171918aa13d1SBram Moolenaar unlet! g:called_arg 172018aa13d1SBram Moolenaar 172118aa13d1SBram Moolenaar call WriteApiCall('Tapi_TryThis') 172218aa13d1SBram Moolenaar 172318aa13d1SBram Moolenaar " Default 172418aa13d1SBram Moolenaar let buf = RunVimInTerminal('-S Xscript', {}) 172518aa13d1SBram Moolenaar call WaitFor({-> exists('g:called_bufnum')}) 172618aa13d1SBram Moolenaar call assert_equal(buf, g:called_bufnum) 172718aa13d1SBram Moolenaar call assert_equal(['hello', 123], g:called_arg) 172818aa13d1SBram Moolenaar call StopVimInTerminal(buf) 172918aa13d1SBram Moolenaar 173018aa13d1SBram Moolenaar unlet! g:called_bufnum 173118aa13d1SBram Moolenaar unlet! g:called_arg 173218aa13d1SBram Moolenaar 173318aa13d1SBram Moolenaar " Enable explicitly 173418aa13d1SBram Moolenaar let buf = RunVimInTerminal('-S Xscript', {'term_api': 'Tapi_Try'}) 173518aa13d1SBram Moolenaar call WaitFor({-> exists('g:called_bufnum')}) 173618aa13d1SBram Moolenaar call assert_equal(buf, g:called_bufnum) 173718aa13d1SBram Moolenaar call assert_equal(['hello', 123], g:called_arg) 173818aa13d1SBram Moolenaar call StopVimInTerminal(buf) 173918aa13d1SBram Moolenaar 174018aa13d1SBram Moolenaar unlet! g:called_bufnum 174118aa13d1SBram Moolenaar unlet! g:called_arg 174218aa13d1SBram Moolenaar 174318aa13d1SBram Moolenaar func! ApiCall_TryThis(bufnum, arg) 174418aa13d1SBram Moolenaar let g:called_bufnum2 = a:bufnum 174518aa13d1SBram Moolenaar let g:called_arg2 = a:arg 174618aa13d1SBram Moolenaar endfunc 174718aa13d1SBram Moolenaar 174818aa13d1SBram Moolenaar call WriteApiCall('ApiCall_TryThis') 174918aa13d1SBram Moolenaar 175018aa13d1SBram Moolenaar " Use prefix match 175118aa13d1SBram Moolenaar let buf = RunVimInTerminal('-S Xscript', {'term_api': 'ApiCall_'}) 175218aa13d1SBram Moolenaar call WaitFor({-> exists('g:called_bufnum2')}) 175318aa13d1SBram Moolenaar call assert_equal(buf, g:called_bufnum2) 175418aa13d1SBram Moolenaar call assert_equal(['hello', 123], g:called_arg2) 175518aa13d1SBram Moolenaar call StopVimInTerminal(buf) 175618aa13d1SBram Moolenaar 17579b7bf9e9SBram Moolenaar call assert_fails("call term_start('ls', {'term_api' : []})", 'E730:') 175818aa13d1SBram Moolenaar 175918aa13d1SBram Moolenaar unlet! g:called_bufnum2 176018aa13d1SBram Moolenaar unlet! g:called_arg2 176118aa13d1SBram Moolenaar 176218aa13d1SBram Moolenaar call delete('Xscript') 176318aa13d1SBram Moolenaar delfunction! ApiCall_TryThis 176418aa13d1SBram Moolenaar unlet! g:called_bufnum2 176518aa13d1SBram Moolenaar unlet! g:called_arg2 176618aa13d1SBram Moolenaarendfunc 176718aa13d1SBram Moolenaar 176818aa13d1SBram Moolenaarfunc Test_terminal_api_call_fails() 176918aa13d1SBram Moolenaar CheckRunVimInTerminal 177018aa13d1SBram Moolenaar 177118aa13d1SBram Moolenaar func! TryThis(bufnum, arg) 177218aa13d1SBram Moolenaar let g:called_bufnum3 = a:bufnum 177318aa13d1SBram Moolenaar let g:called_arg3 = a:arg 177418aa13d1SBram Moolenaar endfunc 177518aa13d1SBram Moolenaar 177618aa13d1SBram Moolenaar call WriteApiCall('TryThis') 177718aa13d1SBram Moolenaar 177818aa13d1SBram Moolenaar unlet! g:called_bufnum3 177918aa13d1SBram Moolenaar unlet! g:called_arg3 178018aa13d1SBram Moolenaar 178118aa13d1SBram Moolenaar " Not permitted 178218aa13d1SBram Moolenaar call ch_logfile('Xlog', 'w') 178318aa13d1SBram Moolenaar let buf = RunVimInTerminal('-S Xscript', {'term_api': ''}) 178418aa13d1SBram Moolenaar call WaitForAssert({-> assert_match('Unpermitted function: TryThis', string(readfile('Xlog')))}) 178518aa13d1SBram Moolenaar call assert_false(exists('g:called_bufnum3')) 178618aa13d1SBram Moolenaar call assert_false(exists('g:called_arg3')) 178718aa13d1SBram Moolenaar call StopVimInTerminal(buf) 178818aa13d1SBram Moolenaar 178918aa13d1SBram Moolenaar " No match 179018aa13d1SBram Moolenaar call ch_logfile('Xlog', 'w') 179118aa13d1SBram Moolenaar let buf = RunVimInTerminal('-S Xscript', {'term_api': 'TryThat'}) 179218aa13d1SBram Moolenaar call WaitFor({-> string(readfile('Xlog')) =~ 'Unpermitted function: TryThis'}) 179318aa13d1SBram Moolenaar call assert_false(exists('g:called_bufnum3')) 179418aa13d1SBram Moolenaar call assert_false(exists('g:called_arg3')) 179518aa13d1SBram Moolenaar call StopVimInTerminal(buf) 179618aa13d1SBram Moolenaar 179718aa13d1SBram Moolenaar call delete('Xscript') 179818aa13d1SBram Moolenaar call ch_logfile('') 179918aa13d1SBram Moolenaar call delete('Xlog') 180018aa13d1SBram Moolenaar delfunction! TryThis 180118aa13d1SBram Moolenaar unlet! g:called_bufnum3 180218aa13d1SBram Moolenaar unlet! g:called_arg3 180318aa13d1SBram Moolenaarendfunc 180418aa13d1SBram Moolenaar 180518aa13d1SBram Moolenaarlet s:caught_e937 = 0 180618aa13d1SBram Moolenaar 180718aa13d1SBram Moolenaarfunc Tapi_Delete(bufnum, arg) 180818aa13d1SBram Moolenaar try 180918aa13d1SBram Moolenaar execute 'bdelete!' a:bufnum 181018aa13d1SBram Moolenaar catch /E937:/ 181118aa13d1SBram Moolenaar let s:caught_e937 = 1 181218aa13d1SBram Moolenaar endtry 181318aa13d1SBram Moolenaarendfunc 181418aa13d1SBram Moolenaar 181518aa13d1SBram Moolenaarfunc Test_terminal_api_call_fail_delete() 181618aa13d1SBram Moolenaar CheckRunVimInTerminal 181718aa13d1SBram Moolenaar 181818aa13d1SBram Moolenaar call WriteApiCall('Tapi_Delete') 181918aa13d1SBram Moolenaar let buf = RunVimInTerminal('-S Xscript', {}) 182018aa13d1SBram Moolenaar call WaitForAssert({-> assert_equal(1, s:caught_e937)}) 182118aa13d1SBram Moolenaar 182218aa13d1SBram Moolenaar call StopVimInTerminal(buf) 182318aa13d1SBram Moolenaar call delete('Xscript') 182418aa13d1SBram Moolenaar call ch_logfile('', '') 182518aa13d1SBram Moolenaarendfunc 182618aa13d1SBram Moolenaar 182718aa13d1SBram Moolenaarfunc Test_terminal_setapi_and_call() 182818aa13d1SBram Moolenaar CheckRunVimInTerminal 182918aa13d1SBram Moolenaar 183018aa13d1SBram Moolenaar call WriteApiCall('Tapi_TryThis') 183118aa13d1SBram Moolenaar call ch_logfile('Xlog', 'w') 183218aa13d1SBram Moolenaar 183318aa13d1SBram Moolenaar unlet! g:called_bufnum 183418aa13d1SBram Moolenaar unlet! g:called_arg 183518aa13d1SBram Moolenaar 183618aa13d1SBram Moolenaar let buf = RunVimInTerminal('-S Xscript', {'term_api': ''}) 183718aa13d1SBram Moolenaar call WaitForAssert({-> assert_match('Unpermitted function: Tapi_TryThis', string(readfile('Xlog')))}) 183818aa13d1SBram Moolenaar call assert_false(exists('g:called_bufnum')) 183918aa13d1SBram Moolenaar call assert_false(exists('g:called_arg')) 184018aa13d1SBram Moolenaar 184118aa13d1SBram Moolenaar eval buf->term_setapi('Tapi_') 184218aa13d1SBram Moolenaar call term_sendkeys(buf, ":set notitle\<CR>") 184318aa13d1SBram Moolenaar call term_sendkeys(buf, ":source Xscript\<CR>") 184418aa13d1SBram Moolenaar call WaitFor({-> exists('g:called_bufnum')}) 184518aa13d1SBram Moolenaar call assert_equal(buf, g:called_bufnum) 184618aa13d1SBram Moolenaar call assert_equal(['hello', 123], g:called_arg) 184718aa13d1SBram Moolenaar 184818aa13d1SBram Moolenaar call StopVimInTerminal(buf) 184918aa13d1SBram Moolenaar 185018aa13d1SBram Moolenaar call delete('Xscript') 185118aa13d1SBram Moolenaar call ch_logfile('') 185218aa13d1SBram Moolenaar call delete('Xlog') 185318aa13d1SBram Moolenaar unlet! g:called_bufnum 185418aa13d1SBram Moolenaar unlet! g:called_arg 185518aa13d1SBram Moolenaarendfunc 185618aa13d1SBram Moolenaar 185718aa13d1SBram Moolenaarfunc Test_terminal_api_arg() 185818aa13d1SBram Moolenaar CheckRunVimInTerminal 185918aa13d1SBram Moolenaar 186018aa13d1SBram Moolenaar call WriteApiCall('Tapi_TryThis') 186118aa13d1SBram Moolenaar call ch_logfile('Xlog', 'w') 186218aa13d1SBram Moolenaar 186318aa13d1SBram Moolenaar unlet! g:called_bufnum 186418aa13d1SBram Moolenaar unlet! g:called_arg 186518aa13d1SBram Moolenaar 186618aa13d1SBram Moolenaar execute 'term ++api= ' .. GetVimCommandCleanTerm() .. '-S Xscript' 186718aa13d1SBram Moolenaar let buf = bufnr('%') 186818aa13d1SBram Moolenaar call WaitForAssert({-> assert_match('Unpermitted function: Tapi_TryThis', string(readfile('Xlog')))}) 186918aa13d1SBram Moolenaar call assert_false(exists('g:called_bufnum')) 187018aa13d1SBram Moolenaar call assert_false(exists('g:called_arg')) 187118aa13d1SBram Moolenaar 187218aa13d1SBram Moolenaar call StopVimInTerminal(buf) 187318aa13d1SBram Moolenaar 187418aa13d1SBram Moolenaar call ch_logfile('Xlog', 'w') 187518aa13d1SBram Moolenaar 187618aa13d1SBram Moolenaar execute 'term ++api=Tapi_ ' .. GetVimCommandCleanTerm() .. '-S Xscript' 187718aa13d1SBram Moolenaar let buf = bufnr('%') 187818aa13d1SBram Moolenaar call WaitFor({-> exists('g:called_bufnum')}) 187918aa13d1SBram Moolenaar call assert_equal(buf, g:called_bufnum) 188018aa13d1SBram Moolenaar call assert_equal(['hello', 123], g:called_arg) 188118aa13d1SBram Moolenaar 188218aa13d1SBram Moolenaar call StopVimInTerminal(buf) 188318aa13d1SBram Moolenaar 188418aa13d1SBram Moolenaar call delete('Xscript') 188518aa13d1SBram Moolenaar call ch_logfile('') 188618aa13d1SBram Moolenaar call delete('Xlog') 188718aa13d1SBram Moolenaar unlet! g:called_bufnum 188818aa13d1SBram Moolenaar unlet! g:called_arg 188918aa13d1SBram Moolenaarendfunc 189018aa13d1SBram Moolenaar 189118aa13d1SBram Moolenaarfunc Test_terminal_ansicolors_default() 189218aa13d1SBram Moolenaar CheckFunction term_getansicolors 189318aa13d1SBram Moolenaar 189418aa13d1SBram Moolenaar let colors = [ 189518aa13d1SBram Moolenaar \ '#000000', '#e00000', 189618aa13d1SBram Moolenaar \ '#00e000', '#e0e000', 189718aa13d1SBram Moolenaar \ '#0000e0', '#e000e0', 189818aa13d1SBram Moolenaar \ '#00e0e0', '#e0e0e0', 189918aa13d1SBram Moolenaar \ '#808080', '#ff4040', 190018aa13d1SBram Moolenaar \ '#40ff40', '#ffff40', 190118aa13d1SBram Moolenaar \ '#4040ff', '#ff40ff', 190218aa13d1SBram Moolenaar \ '#40ffff', '#ffffff', 190318aa13d1SBram Moolenaar \] 190418aa13d1SBram Moolenaar 190518aa13d1SBram Moolenaar let buf = Run_shell_in_terminal({}) 190618aa13d1SBram Moolenaar call assert_equal(colors, term_getansicolors(buf)) 190718aa13d1SBram Moolenaar call StopShellInTerminal(buf) 190818aa13d1SBram Moolenaar call TermWait(buf) 190918aa13d1SBram Moolenaar call assert_equal([], term_getansicolors(buf)) 191018aa13d1SBram Moolenaar 191118aa13d1SBram Moolenaar exe buf . 'bwipe' 191218aa13d1SBram Moolenaarendfunc 191318aa13d1SBram Moolenaar 191418aa13d1SBram Moolenaarlet s:test_colors = [ 191518aa13d1SBram Moolenaar \ '#616e64', '#0d0a79', 191618aa13d1SBram Moolenaar \ '#6d610d', '#0a7373', 191718aa13d1SBram Moolenaar \ '#690d0a', '#6d696e', 191818aa13d1SBram Moolenaar \ '#0d0a6f', '#616e0d', 191918aa13d1SBram Moolenaar \ '#0a6479', '#6d0d0a', 192018aa13d1SBram Moolenaar \ '#617373', '#0d0a69', 192118aa13d1SBram Moolenaar \ '#6d690d', '#0a6e6f', 192218aa13d1SBram Moolenaar \ '#610d0a', '#6e6479', 192318aa13d1SBram Moolenaar \] 192418aa13d1SBram Moolenaar 192518aa13d1SBram Moolenaarfunc Test_terminal_ansicolors_global() 192618aa13d1SBram Moolenaar CheckFeature termguicolors 192718aa13d1SBram Moolenaar CheckFunction term_getansicolors 192818aa13d1SBram Moolenaar 192918aa13d1SBram Moolenaar let g:terminal_ansi_colors = reverse(copy(s:test_colors)) 193018aa13d1SBram Moolenaar let buf = Run_shell_in_terminal({}) 193118aa13d1SBram Moolenaar call assert_equal(g:terminal_ansi_colors, term_getansicolors(buf)) 193218aa13d1SBram Moolenaar call StopShellInTerminal(buf) 193318aa13d1SBram Moolenaar call TermWait(buf) 193418aa13d1SBram Moolenaar 193518aa13d1SBram Moolenaar exe buf . 'bwipe' 193618aa13d1SBram Moolenaar unlet g:terminal_ansi_colors 193718aa13d1SBram Moolenaarendfunc 193818aa13d1SBram Moolenaar 193918aa13d1SBram Moolenaarfunc Test_terminal_ansicolors_func() 194018aa13d1SBram Moolenaar CheckFeature termguicolors 194118aa13d1SBram Moolenaar CheckFunction term_getansicolors 194218aa13d1SBram Moolenaar 194318aa13d1SBram Moolenaar let g:terminal_ansi_colors = reverse(copy(s:test_colors)) 194418aa13d1SBram Moolenaar let buf = Run_shell_in_terminal({'ansi_colors': s:test_colors}) 194518aa13d1SBram Moolenaar call assert_equal(s:test_colors, term_getansicolors(buf)) 194618aa13d1SBram Moolenaar 194718aa13d1SBram Moolenaar call term_setansicolors(buf, g:terminal_ansi_colors) 194818aa13d1SBram Moolenaar call assert_equal(g:terminal_ansi_colors, buf->term_getansicolors()) 194918aa13d1SBram Moolenaar 195018aa13d1SBram Moolenaar let colors = [ 195118aa13d1SBram Moolenaar \ 'ivory', 'AliceBlue', 195218aa13d1SBram Moolenaar \ 'grey67', 'dark goldenrod', 195318aa13d1SBram Moolenaar \ 'SteelBlue3', 'PaleVioletRed4', 195418aa13d1SBram Moolenaar \ 'MediumPurple2', 'yellow2', 195518aa13d1SBram Moolenaar \ 'RosyBrown3', 'OrangeRed2', 195618aa13d1SBram Moolenaar \ 'white smoke', 'navy blue', 195718aa13d1SBram Moolenaar \ 'grey47', 'gray97', 195818aa13d1SBram Moolenaar \ 'MistyRose2', 'DodgerBlue4', 195918aa13d1SBram Moolenaar \] 196018aa13d1SBram Moolenaar eval buf->term_setansicolors(colors) 196118aa13d1SBram Moolenaar 196218aa13d1SBram Moolenaar let colors[4] = 'Invalid' 19639b7bf9e9SBram Moolenaar call assert_fails('call term_setansicolors(buf, colors)', 'E254:') 196418aa13d1SBram Moolenaar call assert_fails('call term_setansicolors(buf, {})', 'E714:') 196518aa13d1SBram Moolenaar 196618aa13d1SBram Moolenaar call StopShellInTerminal(buf) 196718aa13d1SBram Moolenaar call TermWait(buf) 196818aa13d1SBram Moolenaar call assert_equal(0, term_setansicolors(buf, [])) 196918aa13d1SBram Moolenaar exe buf . 'bwipe' 197018aa13d1SBram Moolenaarendfunc 197118aa13d1SBram Moolenaar 197218aa13d1SBram Moolenaarfunc Test_terminal_all_ansi_colors() 197318aa13d1SBram Moolenaar CheckRunVimInTerminal 197418aa13d1SBram Moolenaar 197518aa13d1SBram Moolenaar " Use all the ANSI colors. 197618aa13d1SBram Moolenaar call writefile([ 197718aa13d1SBram Moolenaar \ 'call setline(1, "AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPP XXYYZZ")', 197818aa13d1SBram Moolenaar \ 'hi Tblack ctermfg=0 ctermbg=8', 197918aa13d1SBram Moolenaar \ 'hi Tdarkred ctermfg=1 ctermbg=9', 198018aa13d1SBram Moolenaar \ 'hi Tdarkgreen ctermfg=2 ctermbg=10', 198118aa13d1SBram Moolenaar \ 'hi Tbrown ctermfg=3 ctermbg=11', 198218aa13d1SBram Moolenaar \ 'hi Tdarkblue ctermfg=4 ctermbg=12', 198318aa13d1SBram Moolenaar \ 'hi Tdarkmagenta ctermfg=5 ctermbg=13', 198418aa13d1SBram Moolenaar \ 'hi Tdarkcyan ctermfg=6 ctermbg=14', 198518aa13d1SBram Moolenaar \ 'hi Tlightgrey ctermfg=7 ctermbg=15', 198618aa13d1SBram Moolenaar \ 'hi Tdarkgrey ctermfg=8 ctermbg=0', 198718aa13d1SBram Moolenaar \ 'hi Tred ctermfg=9 ctermbg=1', 198818aa13d1SBram Moolenaar \ 'hi Tgreen ctermfg=10 ctermbg=2', 198918aa13d1SBram Moolenaar \ 'hi Tyellow ctermfg=11 ctermbg=3', 199018aa13d1SBram Moolenaar \ 'hi Tblue ctermfg=12 ctermbg=4', 199118aa13d1SBram Moolenaar \ 'hi Tmagenta ctermfg=13 ctermbg=5', 199218aa13d1SBram Moolenaar \ 'hi Tcyan ctermfg=14 ctermbg=6', 199318aa13d1SBram Moolenaar \ 'hi Twhite ctermfg=15 ctermbg=7', 199418aa13d1SBram Moolenaar \ 'hi TdarkredBold ctermfg=1 cterm=bold', 199518aa13d1SBram Moolenaar \ 'hi TgreenBold ctermfg=10 cterm=bold', 199618aa13d1SBram Moolenaar \ 'hi TmagentaBold ctermfg=13 cterm=bold ctermbg=5', 199718aa13d1SBram Moolenaar \ '', 199818aa13d1SBram Moolenaar \ 'call matchadd("Tblack", "A")', 199918aa13d1SBram Moolenaar \ 'call matchadd("Tdarkred", "B")', 200018aa13d1SBram Moolenaar \ 'call matchadd("Tdarkgreen", "C")', 200118aa13d1SBram Moolenaar \ 'call matchadd("Tbrown", "D")', 200218aa13d1SBram Moolenaar \ 'call matchadd("Tdarkblue", "E")', 200318aa13d1SBram Moolenaar \ 'call matchadd("Tdarkmagenta", "F")', 200418aa13d1SBram Moolenaar \ 'call matchadd("Tdarkcyan", "G")', 200518aa13d1SBram Moolenaar \ 'call matchadd("Tlightgrey", "H")', 200618aa13d1SBram Moolenaar \ 'call matchadd("Tdarkgrey", "I")', 200718aa13d1SBram Moolenaar \ 'call matchadd("Tred", "J")', 200818aa13d1SBram Moolenaar \ 'call matchadd("Tgreen", "K")', 200918aa13d1SBram Moolenaar \ 'call matchadd("Tyellow", "L")', 201018aa13d1SBram Moolenaar \ 'call matchadd("Tblue", "M")', 201118aa13d1SBram Moolenaar \ 'call matchadd("Tmagenta", "N")', 201218aa13d1SBram Moolenaar \ 'call matchadd("Tcyan", "O")', 201318aa13d1SBram Moolenaar \ 'call matchadd("Twhite", "P")', 201418aa13d1SBram Moolenaar \ 'call matchadd("TdarkredBold", "X")', 201518aa13d1SBram Moolenaar \ 'call matchadd("TgreenBold", "Y")', 201618aa13d1SBram Moolenaar \ 'call matchadd("TmagentaBold", "Z")', 201718aa13d1SBram Moolenaar \ 'redraw', 201818aa13d1SBram Moolenaar \ ], 'Xcolorscript') 201918aa13d1SBram Moolenaar let buf = RunVimInTerminal('-S Xcolorscript', {'rows': 10}) 202018aa13d1SBram Moolenaar call VerifyScreenDump(buf, 'Test_terminal_all_ansi_colors', {}) 202118aa13d1SBram Moolenaar 202218aa13d1SBram Moolenaar call term_sendkeys(buf, ":q\<CR>") 202318aa13d1SBram Moolenaar call StopVimInTerminal(buf) 202418aa13d1SBram Moolenaar call delete('Xcolorscript') 202518aa13d1SBram Moolenaarendfunc 202618aa13d1SBram Moolenaar 20271e6bbfb5SBram Moolenaarfunction On_BufFilePost() 20281e6bbfb5SBram Moolenaar doautocmd <nomodeline> User UserEvent 20291e6bbfb5SBram Moolenaarendfunction 20301e6bbfb5SBram Moolenaar 20311e6bbfb5SBram Moolenaarfunc Test_terminal_nested_autocmd() 20321e6bbfb5SBram Moolenaar new 20331e6bbfb5SBram Moolenaar call setline(1, range(500)) 20341e6bbfb5SBram Moolenaar $ 20351e6bbfb5SBram Moolenaar let lastline = line('.') 20361e6bbfb5SBram Moolenaar 20371e6bbfb5SBram Moolenaar augroup TermTest 20381e6bbfb5SBram Moolenaar autocmd BufFilePost * call On_BufFilePost() 20391e6bbfb5SBram Moolenaar autocmd User UserEvent silent 20401e6bbfb5SBram Moolenaar augroup END 20411e6bbfb5SBram Moolenaar 20421e6bbfb5SBram Moolenaar let cmd = Get_cat_123_cmd() 20431e6bbfb5SBram Moolenaar let buf = term_start(cmd, #{term_finish: 'close', hidden: 1}) 20441e6bbfb5SBram Moolenaar call assert_equal(lastline, line('.')) 20451e6bbfb5SBram Moolenaar 20466437475fSBram Moolenaar let job = term_getjob(buf) 20476437475fSBram Moolenaar call WaitForAssert({-> assert_equal("dead", job_status(job))}) 20481e6bbfb5SBram Moolenaar call delete('Xtext') 20491e6bbfb5SBram Moolenaar augroup TermTest 20501e6bbfb5SBram Moolenaar au! 20511e6bbfb5SBram Moolenaar augroup END 20521e6bbfb5SBram Moolenaarendfunc 20531e6bbfb5SBram Moolenaar 2054aeed2a63SBram Moolenaarfunc Test_terminal_adds_jump() 2055aeed2a63SBram Moolenaar clearjumps 2056aeed2a63SBram Moolenaar call term_start("ls", #{curwin: 1}) 2057aeed2a63SBram Moolenaar call assert_equal(1, getjumplist()[0]->len()) 2058aeed2a63SBram Moolenaar bwipe! 2059aeed2a63SBram Moolenaarendfunc 2060aeed2a63SBram Moolenaar 206191689ea8SBram Moolenaar 2062ca68ae13SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab 2063