11112c0feSBram 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_terminal.vim and test_terminal3.vim for further tests. 41112c0feSBram Moolenaar 51112c0feSBram Moolenaarsource check.vim 61112c0feSBram MoolenaarCheckFeature terminal 71112c0feSBram Moolenaar 81112c0feSBram Moolenaarsource shared.vim 91112c0feSBram Moolenaarsource screendump.vim 101112c0feSBram Moolenaarsource mouse.vim 111112c0feSBram Moolenaarsource term_util.vim 121112c0feSBram Moolenaar 131112c0feSBram Moolenaarlet $PROMPT_COMMAND='' 141112c0feSBram Moolenaar 151112c0feSBram Moolenaarfunc Test_terminal_termwinsize_option_fixed() 161112c0feSBram Moolenaar CheckRunVimInTerminal 171112c0feSBram Moolenaar set termwinsize=6x40 181112c0feSBram Moolenaar let text = [] 191112c0feSBram Moolenaar for n in range(10) 201112c0feSBram Moolenaar call add(text, repeat(n, 50)) 211112c0feSBram Moolenaar endfor 221112c0feSBram Moolenaar call writefile(text, 'Xwinsize') 231112c0feSBram Moolenaar let buf = RunVimInTerminal('Xwinsize', {}) 241112c0feSBram Moolenaar let win = bufwinid(buf) 251112c0feSBram Moolenaar call assert_equal([6, 40], term_getsize(buf)) 261112c0feSBram Moolenaar call assert_equal(6, winheight(win)) 271112c0feSBram Moolenaar call assert_equal(40, winwidth(win)) 281112c0feSBram Moolenaar 291112c0feSBram Moolenaar " resizing the window doesn't resize the terminal. 301112c0feSBram Moolenaar resize 10 311112c0feSBram Moolenaar vertical resize 60 321112c0feSBram Moolenaar call assert_equal([6, 40], term_getsize(buf)) 331112c0feSBram Moolenaar call assert_equal(10, winheight(win)) 341112c0feSBram Moolenaar call assert_equal(60, winwidth(win)) 351112c0feSBram Moolenaar 361112c0feSBram Moolenaar call StopVimInTerminal(buf) 371112c0feSBram Moolenaar call delete('Xwinsize') 381112c0feSBram Moolenaar 39e2e4075fSBram Moolenaar call assert_fails('set termwinsize=40', 'E474:') 40e2e4075fSBram Moolenaar call assert_fails('set termwinsize=10+40', 'E474:') 41e2e4075fSBram Moolenaar call assert_fails('set termwinsize=abc', 'E474:') 421112c0feSBram Moolenaar 431112c0feSBram Moolenaar set termwinsize= 441112c0feSBram Moolenaarendfunc 451112c0feSBram Moolenaar 461112c0feSBram Moolenaarfunc Test_terminal_termwinsize_option_zero() 471112c0feSBram Moolenaar set termwinsize=0x0 481112c0feSBram Moolenaar let buf = Run_shell_in_terminal({}) 491112c0feSBram Moolenaar let win = bufwinid(buf) 501112c0feSBram Moolenaar call assert_equal([winheight(win), winwidth(win)], term_getsize(buf)) 511112c0feSBram Moolenaar call StopShellInTerminal(buf) 521112c0feSBram Moolenaar call TermWait(buf) 531112c0feSBram Moolenaar exe buf . 'bwipe' 541112c0feSBram Moolenaar 551112c0feSBram Moolenaar set termwinsize=7x0 561112c0feSBram Moolenaar let buf = Run_shell_in_terminal({}) 571112c0feSBram Moolenaar let win = bufwinid(buf) 581112c0feSBram Moolenaar call assert_equal([7, winwidth(win)], term_getsize(buf)) 591112c0feSBram Moolenaar call StopShellInTerminal(buf) 601112c0feSBram Moolenaar call TermWait(buf) 611112c0feSBram Moolenaar exe buf . 'bwipe' 621112c0feSBram Moolenaar 631112c0feSBram Moolenaar set termwinsize=0x33 641112c0feSBram Moolenaar let buf = Run_shell_in_terminal({}) 651112c0feSBram Moolenaar let win = bufwinid(buf) 661112c0feSBram Moolenaar call assert_equal([winheight(win), 33], term_getsize(buf)) 671112c0feSBram Moolenaar call StopShellInTerminal(buf) 681112c0feSBram Moolenaar call TermWait(buf) 691112c0feSBram Moolenaar exe buf . 'bwipe' 701112c0feSBram Moolenaar 711112c0feSBram Moolenaar set termwinsize= 721112c0feSBram Moolenaarendfunc 731112c0feSBram Moolenaar 741112c0feSBram Moolenaarfunc Test_terminal_termwinsize_minimum() 751112c0feSBram Moolenaar set termwinsize=10*50 761112c0feSBram Moolenaar vsplit 771112c0feSBram Moolenaar let buf = Run_shell_in_terminal({}) 781112c0feSBram Moolenaar let win = bufwinid(buf) 791112c0feSBram Moolenaar call assert_inrange(10, 1000, winheight(win)) 801112c0feSBram Moolenaar call assert_inrange(50, 1000, winwidth(win)) 811112c0feSBram Moolenaar call assert_equal([winheight(win), winwidth(win)], term_getsize(buf)) 821112c0feSBram Moolenaar 831112c0feSBram Moolenaar resize 15 841112c0feSBram Moolenaar vertical resize 60 851112c0feSBram Moolenaar redraw 861112c0feSBram Moolenaar call assert_equal([15, 60], term_getsize(buf)) 871112c0feSBram Moolenaar call assert_equal(15, winheight(win)) 881112c0feSBram Moolenaar call assert_equal(60, winwidth(win)) 891112c0feSBram Moolenaar 901112c0feSBram Moolenaar resize 7 911112c0feSBram Moolenaar vertical resize 30 921112c0feSBram Moolenaar redraw 931112c0feSBram Moolenaar call assert_equal([10, 50], term_getsize(buf)) 941112c0feSBram Moolenaar call assert_equal(7, winheight(win)) 951112c0feSBram Moolenaar call assert_equal(30, winwidth(win)) 961112c0feSBram Moolenaar 971112c0feSBram Moolenaar call StopShellInTerminal(buf) 981112c0feSBram Moolenaar call TermWait(buf) 991112c0feSBram Moolenaar exe buf . 'bwipe' 1001112c0feSBram Moolenaar 1011112c0feSBram Moolenaar set termwinsize=0*0 1021112c0feSBram Moolenaar let buf = Run_shell_in_terminal({}) 1031112c0feSBram Moolenaar let win = bufwinid(buf) 1041112c0feSBram Moolenaar call assert_equal([winheight(win), winwidth(win)], term_getsize(buf)) 1051112c0feSBram Moolenaar call StopShellInTerminal(buf) 1061112c0feSBram Moolenaar call TermWait(buf) 1071112c0feSBram Moolenaar exe buf . 'bwipe' 1081112c0feSBram Moolenaar 1091112c0feSBram Moolenaar set termwinsize= 1101112c0feSBram Moolenaarendfunc 1111112c0feSBram Moolenaar 112b936b794SBram Moolenaarfunc Test_terminal_termwinsize_overruled() 113b936b794SBram Moolenaar let cmd = GetDummyCmd() 114b936b794SBram Moolenaar set termwinsize=5x43 115b936b794SBram Moolenaar let buf = term_start(cmd, #{term_rows: 7, term_cols: 50}) 116b936b794SBram Moolenaar call TermWait(buf) 117b936b794SBram Moolenaar call assert_equal([7, 50], term_getsize(buf)) 118b936b794SBram Moolenaar exe "bwipe! " .. buf 119b936b794SBram Moolenaar 120b936b794SBram Moolenaar let buf = term_start(cmd, #{term_cols: 50}) 121b936b794SBram Moolenaar call TermWait(buf) 122b936b794SBram Moolenaar call assert_equal([5, 50], term_getsize(buf)) 123b936b794SBram Moolenaar exe "bwipe! " .. buf 124b936b794SBram Moolenaar 125b936b794SBram Moolenaar let buf = term_start(cmd, #{term_rows: 7}) 126b936b794SBram Moolenaar call TermWait(buf) 127b936b794SBram Moolenaar call assert_equal([7, 43], term_getsize(buf)) 128b936b794SBram Moolenaar exe "bwipe! " .. buf 129b936b794SBram Moolenaar 130b936b794SBram Moolenaar set termwinsize= 131b936b794SBram Moolenaarendfunc 132b936b794SBram Moolenaar 1332ce14589SBram Moolenaar" hidden terminal must not change current window size 1342ce14589SBram Moolenaarfunc Test_terminal_hidden_winsize() 1352ce14589SBram Moolenaar let cmd = GetDummyCmd() 1362ce14589SBram Moolenaar let rows = winheight(0) 1372ce14589SBram Moolenaar let buf = term_start(cmd, #{hidden: 1, term_rows: 10}) 1382ce14589SBram Moolenaar call assert_equal(rows, winheight(0)) 1392ce14589SBram Moolenaar call assert_equal([10, &columns], term_getsize(buf)) 1402ce14589SBram Moolenaar exe "bwipe! " .. buf 1412ce14589SBram Moolenaarendfunc 1422ce14589SBram Moolenaar 1431112c0feSBram Moolenaarfunc Test_terminal_termwinkey() 1441112c0feSBram Moolenaar " make three tabpages, terminal in the middle 1451112c0feSBram Moolenaar 0tabnew 1461112c0feSBram Moolenaar tabnext 1471112c0feSBram Moolenaar tabnew 1481112c0feSBram Moolenaar tabprev 1491112c0feSBram Moolenaar call assert_equal(1, winnr('$')) 1501112c0feSBram Moolenaar call assert_equal(2, tabpagenr()) 1511112c0feSBram Moolenaar let thiswin = win_getid() 1521112c0feSBram Moolenaar 1531112c0feSBram Moolenaar let buf = Run_shell_in_terminal({}) 1541112c0feSBram Moolenaar let termwin = bufwinid(buf) 1551112c0feSBram Moolenaar set termwinkey=<C-L> 1561112c0feSBram Moolenaar call feedkeys("\<C-L>w", 'tx') 1571112c0feSBram Moolenaar call assert_equal(thiswin, win_getid()) 1581112c0feSBram Moolenaar call feedkeys("\<C-W>w", 'tx') 1591112c0feSBram Moolenaar call assert_equal(termwin, win_getid()) 1601112c0feSBram Moolenaar 1611112c0feSBram Moolenaar if has('langmap') 1621112c0feSBram Moolenaar set langmap=xjyk 1631112c0feSBram Moolenaar call feedkeys("\<C-L>x", 'tx') 1641112c0feSBram Moolenaar call assert_equal(thiswin, win_getid()) 1651112c0feSBram Moolenaar call feedkeys("\<C-W>y", 'tx') 1661112c0feSBram Moolenaar call assert_equal(termwin, win_getid()) 1671112c0feSBram Moolenaar set langmap= 1681112c0feSBram Moolenaar endif 1691112c0feSBram Moolenaar 1701112c0feSBram Moolenaar call feedkeys("\<C-L>gt", "xt") 1711112c0feSBram Moolenaar call assert_equal(3, tabpagenr()) 1721112c0feSBram Moolenaar tabprev 1731112c0feSBram Moolenaar call assert_equal(2, tabpagenr()) 1741112c0feSBram Moolenaar call assert_equal(termwin, win_getid()) 1751112c0feSBram Moolenaar 1761112c0feSBram Moolenaar call feedkeys("\<C-L>gT", "xt") 1771112c0feSBram Moolenaar call assert_equal(1, tabpagenr()) 1781112c0feSBram Moolenaar tabnext 1791112c0feSBram Moolenaar call assert_equal(2, tabpagenr()) 1801112c0feSBram Moolenaar call assert_equal(termwin, win_getid()) 1811112c0feSBram Moolenaar 1821112c0feSBram Moolenaar let job = term_getjob(buf) 1831112c0feSBram Moolenaar call feedkeys("\<C-L>\<C-C>", 'tx') 1841112c0feSBram Moolenaar call WaitForAssert({-> assert_equal("dead", job_status(job))}) 1851112c0feSBram Moolenaar 1861112c0feSBram Moolenaar set termwinkey& 1871112c0feSBram Moolenaar tabnext 1881112c0feSBram Moolenaar tabclose 1891112c0feSBram Moolenaar tabprev 1901112c0feSBram Moolenaar tabclose 1911112c0feSBram Moolenaarendfunc 1921112c0feSBram Moolenaar 1931112c0feSBram Moolenaarfunc Test_terminal_out_err() 1941112c0feSBram Moolenaar CheckUnix 1951112c0feSBram Moolenaar 1961112c0feSBram Moolenaar call writefile([ 1971112c0feSBram Moolenaar \ '#!/bin/sh', 1981112c0feSBram Moolenaar \ 'echo "this is standard error" >&2', 1991112c0feSBram Moolenaar \ 'echo "this is standard out" >&1', 2001112c0feSBram Moolenaar \ ], 'Xechoerrout.sh') 2011112c0feSBram Moolenaar call setfperm('Xechoerrout.sh', 'rwxrwx---') 2021112c0feSBram Moolenaar 2031112c0feSBram Moolenaar let outfile = 'Xtermstdout' 2041112c0feSBram Moolenaar let buf = term_start(['./Xechoerrout.sh'], {'out_io': 'file', 'out_name': outfile}) 2051112c0feSBram Moolenaar 2061112c0feSBram Moolenaar call WaitFor({-> !empty(readfile(outfile)) && !empty(term_getline(buf, 1))}) 2071112c0feSBram Moolenaar call assert_equal(['this is standard out'], readfile(outfile)) 2081112c0feSBram Moolenaar call assert_equal('this is standard error', term_getline(buf, 1)) 2091112c0feSBram Moolenaar 2101112c0feSBram Moolenaar call WaitForAssert({-> assert_equal('dead', job_status(term_getjob(buf)))}) 2111112c0feSBram Moolenaar exe buf . 'bwipe' 2121112c0feSBram Moolenaar call delete('Xechoerrout.sh') 2131112c0feSBram Moolenaar call delete(outfile) 2141112c0feSBram Moolenaarendfunc 2151112c0feSBram Moolenaar 2161112c0feSBram Moolenaarfunc Test_termwinscroll() 2171112c0feSBram Moolenaar CheckUnix 218f65927fcSBram Moolenaar " TODO: Somehow this test sometimes hangs in the GUI 219f65927fcSBram Moolenaar CheckNotGui 220*f08b0eb8SBram Moolenaar let g:test_is_flaky = 1 2211112c0feSBram Moolenaar 2221112c0feSBram Moolenaar " Let the terminal output more than 'termwinscroll' lines, some at the start 2231112c0feSBram Moolenaar " will be dropped. 2241112c0feSBram Moolenaar exe 'set termwinscroll=' . &lines 2251112c0feSBram Moolenaar let buf = term_start('/bin/sh') 2261112c0feSBram Moolenaar for i in range(1, &lines) 2271112c0feSBram Moolenaar call feedkeys("echo " . i . "\<CR>", 'xt') 2281112c0feSBram Moolenaar call WaitForAssert({-> assert_match(string(i), term_getline(buf, term_getcursor(buf)[0] - 1))}) 2291112c0feSBram Moolenaar endfor 2301112c0feSBram Moolenaar " Go to Terminal-Normal mode to update the buffer. 2311112c0feSBram Moolenaar call feedkeys("\<C-W>N", 'xt') 2321112c0feSBram Moolenaar call assert_inrange(&lines, &lines * 110 / 100 + winheight(0), line('$')) 2331112c0feSBram Moolenaar 2341112c0feSBram Moolenaar " Every "echo nr" must only appear once 2351112c0feSBram Moolenaar let lines = getline(1, line('$')) 2361112c0feSBram Moolenaar for i in range(&lines - len(lines) / 2 + 2, &lines) 2371112c0feSBram Moolenaar let filtered = filter(copy(lines), {idx, val -> val =~ 'echo ' . i . '\>'}) 2381112c0feSBram Moolenaar call assert_equal(1, len(filtered), 'for "echo ' . i . '"') 2391112c0feSBram Moolenaar endfor 2401112c0feSBram Moolenaar 2411112c0feSBram Moolenaar exe buf . 'bwipe!' 2421112c0feSBram Moolenaarendfunc 2431112c0feSBram Moolenaar 2441112c0feSBram Moolenaar" Resizing the terminal window caused an ml_get error. 2451112c0feSBram Moolenaar" TODO: This does not reproduce the original problem. 2461112c0feSBram Moolenaarfunc Test_terminal_resize() 2471112c0feSBram Moolenaar set statusline=x 2481112c0feSBram Moolenaar terminal 2491112c0feSBram Moolenaar call assert_equal(2, winnr('$')) 250c54f347dSBram Moolenaar let buf = bufnr() 251c54f347dSBram Moolenaar 252c54f347dSBram Moolenaar " Wait for the shell to display a prompt 253c54f347dSBram Moolenaar call WaitForAssert({-> assert_notequal('', term_getline(buf, 1))}) 2541112c0feSBram Moolenaar 2551112c0feSBram Moolenaar " Fill the terminal with text. 2561112c0feSBram Moolenaar if has('win32') 2571112c0feSBram Moolenaar call feedkeys("dir\<CR>", 'xt') 2581112c0feSBram Moolenaar else 2591112c0feSBram Moolenaar call feedkeys("ls\<CR>", 'xt') 2601112c0feSBram Moolenaar endif 261c54f347dSBram Moolenaar " Wait for some output 262c54f347dSBram Moolenaar call WaitForAssert({-> assert_notequal('', term_getline(buf, 3))}) 263c54f347dSBram Moolenaar 2641112c0feSBram Moolenaar " Go to Terminal-Normal mode for a moment. 2651112c0feSBram Moolenaar call feedkeys("\<C-W>N", 'xt') 2661112c0feSBram Moolenaar " Open a new window 2671112c0feSBram Moolenaar call feedkeys("i\<C-W>n", 'xt') 2681112c0feSBram Moolenaar call assert_equal(3, winnr('$')) 2691112c0feSBram Moolenaar redraw 2701112c0feSBram Moolenaar 2711112c0feSBram Moolenaar close 2721112c0feSBram Moolenaar call assert_equal(2, winnr('$')) 2731112c0feSBram Moolenaar call feedkeys("exit\<CR>", 'xt') 274c54f347dSBram Moolenaar call TermWait(buf) 2751112c0feSBram Moolenaar set statusline& 2761112c0feSBram Moolenaarendfunc 2771112c0feSBram Moolenaar 2781112c0feSBram Moolenaar" must be nearly the last, we can't go back from GUI to terminal 2791112c0feSBram Moolenaarfunc Test_zz1_terminal_in_gui() 2801112c0feSBram Moolenaar CheckCanRunGui 2811112c0feSBram Moolenaar 2821112c0feSBram Moolenaar " Ignore the "failed to create input context" error. 2831112c0feSBram Moolenaar call test_ignore_error('E285:') 2841112c0feSBram Moolenaar 2851112c0feSBram Moolenaar gui -f 2861112c0feSBram Moolenaar 2871112c0feSBram Moolenaar call assert_equal(1, winnr('$')) 2881112c0feSBram Moolenaar let buf = Run_shell_in_terminal({'term_finish': 'close'}) 2891112c0feSBram Moolenaar call StopShellInTerminal(buf) 2901112c0feSBram Moolenaar call TermWait(buf) 2911112c0feSBram Moolenaar 2921112c0feSBram Moolenaar " closing window wipes out the terminal buffer a with finished job 2931112c0feSBram Moolenaar call WaitForAssert({-> assert_equal(1, winnr('$'))}) 2941112c0feSBram Moolenaar call assert_equal("", bufname(buf)) 2951112c0feSBram Moolenaar 2961112c0feSBram Moolenaar unlet g:job 2971112c0feSBram Moolenaarendfunc 2981112c0feSBram Moolenaar 2998e7d6223SBram Moolenaar" TODO: re-enable when this no longer hangs on Travis 300c85156bbSBram Moolenaar"func Test_zz2_terminal_guioptions_bang() 301c85156bbSBram Moolenaar" CheckGui 302c85156bbSBram Moolenaar" set guioptions+=! 303c85156bbSBram Moolenaar" 304c85156bbSBram Moolenaar" let filename = 'Xtestscript' 305c85156bbSBram Moolenaar" if has('win32') 306c85156bbSBram Moolenaar" let filename .= '.bat' 307c85156bbSBram Moolenaar" let prefix = '' 308c85156bbSBram Moolenaar" let contents = ['@echo off', 'exit %1'] 309c85156bbSBram Moolenaar" else 310c85156bbSBram Moolenaar" let filename .= '.sh' 311c85156bbSBram Moolenaar" let prefix = './' 312c85156bbSBram Moolenaar" let contents = ['#!/bin/sh', 'exit $1'] 313c85156bbSBram Moolenaar" endif 314c85156bbSBram Moolenaar" call writefile(contents, filename) 315c85156bbSBram Moolenaar" call setfperm(filename, 'rwxrwx---') 316c85156bbSBram Moolenaar" 317c85156bbSBram Moolenaar" " Check if v:shell_error is equal to the exit status. 318c85156bbSBram Moolenaar" let exitval = 0 319c85156bbSBram Moolenaar" execute printf(':!%s%s %d', prefix, filename, exitval) 320c85156bbSBram Moolenaar" call assert_equal(exitval, v:shell_error) 321c85156bbSBram Moolenaar" 322c85156bbSBram Moolenaar" let exitval = 9 323c85156bbSBram Moolenaar" execute printf(':!%s%s %d', prefix, filename, exitval) 324c85156bbSBram Moolenaar" call assert_equal(exitval, v:shell_error) 325c85156bbSBram Moolenaar" 326c85156bbSBram Moolenaar" set guioptions& 327c85156bbSBram Moolenaar" call delete(filename) 328c85156bbSBram Moolenaar"endfunc 3291112c0feSBram Moolenaar 3301112c0feSBram Moolenaarfunc Test_terminal_hidden() 3311112c0feSBram Moolenaar CheckUnix 3321112c0feSBram Moolenaar 3331112c0feSBram Moolenaar term ++hidden cat 3341112c0feSBram Moolenaar let bnr = bufnr('$') 3351112c0feSBram Moolenaar call assert_equal('terminal', getbufvar(bnr, '&buftype')) 3361112c0feSBram Moolenaar exe 'sbuf ' . bnr 3371112c0feSBram Moolenaar call assert_equal('terminal', &buftype) 3381112c0feSBram Moolenaar call term_sendkeys(bnr, "asdf\<CR>") 3391112c0feSBram Moolenaar call WaitForAssert({-> assert_match('asdf', term_getline(bnr, 2))}) 3401112c0feSBram Moolenaar call term_sendkeys(bnr, "\<C-D>") 3411112c0feSBram Moolenaar call WaitForAssert({-> assert_equal('finished', bnr->term_getstatus())}) 3421112c0feSBram Moolenaar bwipe! 3431112c0feSBram Moolenaarendfunc 3441112c0feSBram Moolenaar 3451112c0feSBram Moolenaarfunc Test_terminal_switch_mode() 3461112c0feSBram Moolenaar term 3471112c0feSBram Moolenaar let bnr = bufnr('$') 3481112c0feSBram Moolenaar call WaitForAssert({-> assert_equal('running', term_getstatus(bnr))}) 349c85156bbSBram Moolenaar " In the GUI the first switch sometimes doesn't work. Switch twice to avoid 3508e7d6223SBram Moolenaar " flakiness. 351c85156bbSBram Moolenaar call feedkeys("\<C-W>N", 'xt') 352c85156bbSBram Moolenaar call feedkeys("A", 'xt') 353c85156bbSBram Moolenaar call WaitForAssert({-> assert_equal('running', term_getstatus(bnr))}) 3541112c0feSBram Moolenaar call feedkeys("\<C-W>N", 'xt') 3551112c0feSBram Moolenaar call WaitForAssert({-> assert_equal('running,normal', term_getstatus(bnr))}) 3561112c0feSBram Moolenaar call feedkeys("A", 'xt') 3571112c0feSBram Moolenaar call WaitForAssert({-> assert_equal('running', term_getstatus(bnr))}) 3581112c0feSBram Moolenaar call feedkeys("\<C-\>\<C-N>", 'xt') 3591112c0feSBram Moolenaar call WaitForAssert({-> assert_equal('running,normal', term_getstatus(bnr))}) 3601112c0feSBram Moolenaar call feedkeys("I", 'xt') 3611112c0feSBram Moolenaar call WaitForAssert({-> assert_equal('running', term_getstatus(bnr))}) 3621112c0feSBram Moolenaar call feedkeys("\<C-W>Nv", 'xt') 3631112c0feSBram Moolenaar call WaitForAssert({-> assert_equal('running,normal', term_getstatus(bnr))}) 3641112c0feSBram Moolenaar call feedkeys("I", 'xt') 3651112c0feSBram Moolenaar call WaitForAssert({-> assert_equal('running', term_getstatus(bnr))}) 3661112c0feSBram Moolenaar call feedkeys("\<C-W>Nv", 'xt') 3671112c0feSBram Moolenaar call WaitForAssert({-> assert_equal('running,normal', term_getstatus(bnr))}) 3681112c0feSBram Moolenaar call feedkeys("A", 'xt') 3691112c0feSBram Moolenaar call WaitForAssert({-> assert_equal('running', term_getstatus(bnr))}) 3701112c0feSBram Moolenaar bwipe! 3711112c0feSBram Moolenaarendfunc 3721112c0feSBram Moolenaar 3731112c0feSBram Moolenaarfunc Test_terminal_normal_mode() 3741112c0feSBram Moolenaar CheckRunVimInTerminal 3751112c0feSBram Moolenaar 3761112c0feSBram Moolenaar " Run Vim in a terminal and open a terminal window to run Vim in. 3771112c0feSBram Moolenaar let lines =<< trim END 3781112c0feSBram Moolenaar call setline(1, range(11111, 11122)) 3791112c0feSBram Moolenaar 3 3801112c0feSBram Moolenaar END 3811112c0feSBram Moolenaar call writefile(lines, 'XtermNormal') 3821112c0feSBram Moolenaar let buf = RunVimInTerminal('-S XtermNormal', {'rows': 8}) 3831112c0feSBram Moolenaar call TermWait(buf) 3841112c0feSBram Moolenaar 3851112c0feSBram Moolenaar call term_sendkeys(buf, "\<C-W>N") 3861112c0feSBram Moolenaar call term_sendkeys(buf, ":set number cursorline culopt=both\r") 3871112c0feSBram Moolenaar call VerifyScreenDump(buf, 'Test_terminal_normal_1', {}) 3881112c0feSBram Moolenaar 3891112c0feSBram Moolenaar call term_sendkeys(buf, ":set culopt=number\r") 3901112c0feSBram Moolenaar call VerifyScreenDump(buf, 'Test_terminal_normal_2', {}) 3911112c0feSBram Moolenaar 3921112c0feSBram Moolenaar call term_sendkeys(buf, ":set culopt=line\r") 3931112c0feSBram Moolenaar call VerifyScreenDump(buf, 'Test_terminal_normal_3', {}) 3941112c0feSBram Moolenaar 3951112c0feSBram Moolenaar call assert_fails('call term_sendkeys(buf, [])', 'E730:') 3961112c0feSBram Moolenaar call term_sendkeys(buf, "a:q!\<CR>:q\<CR>:q\<CR>") 3971112c0feSBram Moolenaar call StopVimInTerminal(buf) 3981112c0feSBram Moolenaar call delete('XtermNormal') 3991112c0feSBram Moolenaarendfunc 4001112c0feSBram Moolenaar 4011112c0feSBram Moolenaarfunc Test_terminal_hidden_and_close() 4021112c0feSBram Moolenaar CheckUnix 4031112c0feSBram Moolenaar 4041112c0feSBram Moolenaar call assert_equal(1, winnr('$')) 4051112c0feSBram Moolenaar term ++hidden ++close ls 4061112c0feSBram Moolenaar let bnr = bufnr('$') 4071112c0feSBram Moolenaar call assert_equal('terminal', getbufvar(bnr, '&buftype')) 4081112c0feSBram Moolenaar call WaitForAssert({-> assert_false(bufexists(bnr))}) 4091112c0feSBram Moolenaar call assert_equal(1, winnr('$')) 4101112c0feSBram Moolenaarendfunc 4111112c0feSBram Moolenaar 4121112c0feSBram Moolenaarfunc Test_terminal_does_not_truncate_last_newlines() 4131112c0feSBram Moolenaar if has('conpty') 4146d91bcb4SBram Moolenaar throw 'Skipped: fail on ConPTY' 4151112c0feSBram Moolenaar endif 416*f08b0eb8SBram Moolenaar let g:test_is_flaky = 1 4171112c0feSBram Moolenaar let contents = [ 4181112c0feSBram Moolenaar \ [ 'One', '', 'X' ], 4191112c0feSBram Moolenaar \ [ 'Two', '', '' ], 4201112c0feSBram Moolenaar \ [ 'Three' ] + repeat([''], 30) 4211112c0feSBram Moolenaar \ ] 4221112c0feSBram Moolenaar 4231112c0feSBram Moolenaar for c in contents 4241112c0feSBram Moolenaar call writefile(c, 'Xfile') 4251112c0feSBram Moolenaar if has('win32') 4261112c0feSBram Moolenaar term cmd /c type Xfile 4271112c0feSBram Moolenaar else 4281112c0feSBram Moolenaar term cat Xfile 4291112c0feSBram Moolenaar endif 4301112c0feSBram Moolenaar let bnr = bufnr('$') 4311112c0feSBram Moolenaar call assert_equal('terminal', getbufvar(bnr, '&buftype')) 4321112c0feSBram Moolenaar call WaitForAssert({-> assert_equal('finished', term_getstatus(bnr))}) 4331112c0feSBram Moolenaar sleep 100m 4341112c0feSBram Moolenaar call assert_equal(c, getline(1, line('$'))) 4351112c0feSBram Moolenaar quit 4361112c0feSBram Moolenaar endfor 4371112c0feSBram Moolenaar 4381112c0feSBram Moolenaar call delete('Xfile') 4391112c0feSBram Moolenaarendfunc 4401112c0feSBram Moolenaar 441b936b794SBram Moolenaarfunc GetDummyCmd() 4421112c0feSBram Moolenaar if has('win32') 443b936b794SBram Moolenaar return 'cmd /c ""' 4441112c0feSBram Moolenaar else 4451112c0feSBram Moolenaar CheckExecutable false 446b936b794SBram Moolenaar return 'false' 4471112c0feSBram Moolenaar endif 448b936b794SBram Moolenaarendfunc 449b936b794SBram Moolenaar 450b936b794SBram Moolenaarfunc Test_terminal_no_job() 451b936b794SBram Moolenaar let cmd = GetDummyCmd() 4521112c0feSBram Moolenaar let term = term_start(cmd, {'term_finish': 'close'}) 4531112c0feSBram Moolenaar call WaitForAssert({-> assert_equal(v:null, term_getjob(term)) }) 4541112c0feSBram Moolenaarendfunc 4551112c0feSBram Moolenaar 4561112c0feSBram Moolenaarfunc Test_term_getcursor() 4571112c0feSBram Moolenaar CheckUnix 4581112c0feSBram Moolenaar 4591112c0feSBram Moolenaar let buf = Run_shell_in_terminal({}) 4601112c0feSBram Moolenaar 4611112c0feSBram Moolenaar " Wait for the shell to display a prompt. 4621112c0feSBram Moolenaar call WaitForAssert({-> assert_notequal('', term_getline(buf, 1))}) 4631112c0feSBram Moolenaar 4641112c0feSBram Moolenaar " Hide the cursor. 4651112c0feSBram Moolenaar call term_sendkeys(buf, "echo -e '\\033[?25l'\r") 4661112c0feSBram Moolenaar call WaitForAssert({-> assert_equal(0, term_getcursor(buf)[2].visible)}) 4671112c0feSBram Moolenaar 4681112c0feSBram Moolenaar " Show the cursor. 4691112c0feSBram Moolenaar call term_sendkeys(buf, "echo -e '\\033[?25h'\r") 4701112c0feSBram Moolenaar call WaitForAssert({-> assert_equal(1, buf->term_getcursor()[2].visible)}) 4711112c0feSBram Moolenaar 4721112c0feSBram Moolenaar " Change color of cursor. 4731112c0feSBram Moolenaar call WaitForAssert({-> assert_equal('', term_getcursor(buf)[2].color)}) 4741112c0feSBram Moolenaar call term_sendkeys(buf, "echo -e '\\033]12;blue\\007'\r") 4751112c0feSBram Moolenaar call WaitForAssert({-> assert_equal('blue', term_getcursor(buf)[2].color)}) 4761112c0feSBram Moolenaar call term_sendkeys(buf, "echo -e '\\033]12;green\\007'\r") 4771112c0feSBram Moolenaar call WaitForAssert({-> assert_equal('green', term_getcursor(buf)[2].color)}) 4781112c0feSBram Moolenaar 4791112c0feSBram Moolenaar " Make cursor a blinking block. 4801112c0feSBram Moolenaar call term_sendkeys(buf, "echo -e '\\033[1 q'\r") 4811112c0feSBram Moolenaar call WaitForAssert({-> assert_equal([1, 1], 4821112c0feSBram Moolenaar \ [term_getcursor(buf)[2].blink, term_getcursor(buf)[2].shape])}) 4831112c0feSBram Moolenaar 4841112c0feSBram Moolenaar " Make cursor a steady block. 4851112c0feSBram Moolenaar call term_sendkeys(buf, "echo -e '\\033[2 q'\r") 4861112c0feSBram Moolenaar call WaitForAssert({-> assert_equal([0, 1], 4871112c0feSBram Moolenaar \ [term_getcursor(buf)[2].blink, term_getcursor(buf)[2].shape])}) 4881112c0feSBram Moolenaar 4891112c0feSBram Moolenaar " Make cursor a blinking underline. 4901112c0feSBram Moolenaar call term_sendkeys(buf, "echo -e '\\033[3 q'\r") 4911112c0feSBram Moolenaar call WaitForAssert({-> assert_equal([1, 2], 4921112c0feSBram Moolenaar \ [term_getcursor(buf)[2].blink, term_getcursor(buf)[2].shape])}) 4931112c0feSBram Moolenaar 4941112c0feSBram Moolenaar " Make cursor a steady underline. 4951112c0feSBram Moolenaar call term_sendkeys(buf, "echo -e '\\033[4 q'\r") 4961112c0feSBram Moolenaar call WaitForAssert({-> assert_equal([0, 2], 4971112c0feSBram Moolenaar \ [term_getcursor(buf)[2].blink, term_getcursor(buf)[2].shape])}) 4981112c0feSBram Moolenaar 4991112c0feSBram Moolenaar " Make cursor a blinking vertical bar. 5001112c0feSBram Moolenaar call term_sendkeys(buf, "echo -e '\\033[5 q'\r") 5011112c0feSBram Moolenaar call WaitForAssert({-> assert_equal([1, 3], 5021112c0feSBram Moolenaar \ [term_getcursor(buf)[2].blink, term_getcursor(buf)[2].shape])}) 5031112c0feSBram Moolenaar 5041112c0feSBram Moolenaar " Make cursor a steady vertical bar. 5051112c0feSBram Moolenaar call term_sendkeys(buf, "echo -e '\\033[6 q'\r") 5061112c0feSBram Moolenaar call WaitForAssert({-> assert_equal([0, 3], 5071112c0feSBram Moolenaar \ [term_getcursor(buf)[2].blink, term_getcursor(buf)[2].shape])}) 5081112c0feSBram Moolenaar 5091112c0feSBram Moolenaar call StopShellInTerminal(buf) 5101112c0feSBram Moolenaarendfunc 5111112c0feSBram Moolenaar 5121112c0feSBram Moolenaar" Test for term_gettitle() 5131112c0feSBram Moolenaarfunc Test_term_gettitle() 5141112c0feSBram Moolenaar " term_gettitle() returns an empty string for a non-terminal buffer 5151112c0feSBram Moolenaar " and for a non-existing buffer. 5161112c0feSBram Moolenaar call assert_equal('', bufnr('%')->term_gettitle()) 5171112c0feSBram Moolenaar call assert_equal('', term_gettitle(bufnr('$') + 1)) 5181112c0feSBram Moolenaar 5191112c0feSBram Moolenaar if !has('title') || empty(&t_ts) 5201112c0feSBram Moolenaar throw "Skipped: can't get/set title" 5211112c0feSBram Moolenaar endif 5221112c0feSBram Moolenaar 5231112c0feSBram Moolenaar let term = term_start([GetVimProg(), '--clean', '-c', 'set noswapfile', '-c', 'set title']) 5241112c0feSBram Moolenaar if has('autoservername') 5251112c0feSBram Moolenaar call WaitForAssert({-> assert_match('^\[No Name\] - VIM\d\+$', term_gettitle(term)) }) 5261112c0feSBram Moolenaar call term_sendkeys(term, ":e Xfoo\r") 5271112c0feSBram Moolenaar call WaitForAssert({-> assert_match('^Xfoo (.*[/\\]testdir) - VIM\d\+$', term_gettitle(term)) }) 5281112c0feSBram Moolenaar else 5291112c0feSBram Moolenaar call WaitForAssert({-> assert_equal('[No Name] - VIM', term_gettitle(term)) }) 5301112c0feSBram Moolenaar call term_sendkeys(term, ":e Xfoo\r") 5311112c0feSBram Moolenaar call WaitForAssert({-> assert_match('^Xfoo (.*[/\\]testdir) - VIM$', term_gettitle(term)) }) 5321112c0feSBram Moolenaar endif 5331112c0feSBram Moolenaar 5341112c0feSBram Moolenaar call term_sendkeys(term, ":set titlestring=foo\r") 5351112c0feSBram Moolenaar call WaitForAssert({-> assert_equal('foo', term_gettitle(term)) }) 5361112c0feSBram Moolenaar 5371112c0feSBram Moolenaar exe term . 'bwipe!' 5381112c0feSBram Moolenaarendfunc 5391112c0feSBram Moolenaar 5401112c0feSBram Moolenaarfunc Test_term_gettty() 5411112c0feSBram Moolenaar let buf = Run_shell_in_terminal({}) 5421112c0feSBram Moolenaar let gettty = term_gettty(buf) 5431112c0feSBram Moolenaar 5441112c0feSBram Moolenaar if has('unix') && executable('tty') 5451112c0feSBram Moolenaar " Find tty using the tty shell command. 5461112c0feSBram Moolenaar call WaitForAssert({-> assert_notequal('', term_getline(buf, 1))}) 5471112c0feSBram Moolenaar call term_sendkeys(buf, "tty\r") 5481112c0feSBram Moolenaar call WaitForAssert({-> assert_notequal('', term_getline(buf, 3))}) 5491112c0feSBram Moolenaar let tty = term_getline(buf, 2) 5501112c0feSBram Moolenaar call assert_equal(tty, gettty) 5511112c0feSBram Moolenaar endif 5521112c0feSBram Moolenaar 5531112c0feSBram Moolenaar let gettty0 = term_gettty(buf, 0) 5541112c0feSBram Moolenaar let gettty1 = term_gettty(buf, 1) 5551112c0feSBram Moolenaar 5561112c0feSBram Moolenaar call assert_equal(gettty, gettty0) 5571112c0feSBram Moolenaar call assert_equal(job_info(g:job).tty_out, gettty0) 5581112c0feSBram Moolenaar call assert_equal(job_info(g:job).tty_in, gettty1) 5591112c0feSBram Moolenaar 5601112c0feSBram Moolenaar if has('unix') 5611112c0feSBram Moolenaar " For unix, term_gettty(..., 0) and term_gettty(..., 1) 5621112c0feSBram Moolenaar " are identical according to :help term_gettty() 5631112c0feSBram Moolenaar call assert_equal(gettty0, gettty1) 5641112c0feSBram Moolenaar call assert_match('^/dev/', gettty) 5651112c0feSBram Moolenaar else 5661112c0feSBram Moolenaar " ConPTY works on anonymous pipe. 5671112c0feSBram Moolenaar if !has('conpty') 5681112c0feSBram Moolenaar call assert_match('^\\\\.\\pipe\\', gettty0) 5691112c0feSBram Moolenaar call assert_match('^\\\\.\\pipe\\', gettty1) 5701112c0feSBram Moolenaar endif 5711112c0feSBram Moolenaar endif 5721112c0feSBram Moolenaar 573bade44e5SBram Moolenaar call assert_fails('call term_gettty(buf, 2)', 'E475:') 574bade44e5SBram Moolenaar call assert_fails('call term_gettty(buf, -1)', 'E475:') 5751112c0feSBram Moolenaar 5761112c0feSBram Moolenaar call assert_equal('', term_gettty(buf + 1)) 5771112c0feSBram Moolenaar 5781112c0feSBram Moolenaar call StopShellInTerminal(buf) 5791112c0feSBram Moolenaar call TermWait(buf) 5801112c0feSBram Moolenaar exe buf . 'bwipe' 5811112c0feSBram Moolenaarendfunc 5821112c0feSBram Moolenaar 5831112c0feSBram Moolenaar 5841112c0feSBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab 585