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