summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/testdir/Make_all.mak2
-rw-r--r--src/testdir/Makefile8
-rw-r--r--src/testdir/term_util.vim24
-rw-r--r--src/testdir/test_terminal.vim1558
-rw-r--r--src/testdir/test_terminal2.vim1550
-rw-r--r--src/version.c2
6 files changed, 1581 insertions, 1563 deletions
diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak
index fff4fdf6ac..a0884cdc87 100644
--- a/src/testdir/Make_all.mak
+++ b/src/testdir/Make_all.mak
@@ -276,6 +276,7 @@ NEW_TESTS = \
test_termcodes \
test_termencoding \
test_terminal \
+ test_terminal2 \
test_terminal_fail \
test_textformat \
test_textobjects \
@@ -492,6 +493,7 @@ NEW_TESTS_RES = \
test_termcodes.res \
test_termencoding.res \
test_terminal.res \
+ test_terminal2.res \
test_terminal_fail.res \
test_textformat.res \
test_textobjects.res \
diff --git a/src/testdir/Makefile b/src/testdir/Makefile
index 29efa0fe0e..7f9ef04342 100644
--- a/src/testdir/Makefile
+++ b/src/testdir/Makefile
@@ -168,14 +168,6 @@ newtestssilent: $(NEW_TESTS_RES)
$(RUN_VIMTEST) $(NO_INITS) -S runtest.vim $*.vim $(REDIR_TEST_TO_NULL)
@rm vimcmd
-# Temporary: Do not use $REDIR_TEST_TO_NULL for test_terminal to be able to see
-# where it sometimes hanges on CI.
-test_terminal.res: test_terminal.vim
- @echo "$(VIMPROG)" > vimcmd
- @echo "$(RUN_VIMTEST)" >> vimcmd
- $(RUN_VIMTEST) $(NO_INITS) -S runtest.vim $*.vim
- @rm vimcmd
-
test_gui.res: test_gui.vim
@echo "$(VIMPROG)" > vimcmd
@echo "$(RUN_GVIMTEST)" >> vimcmd
diff --git a/src/testdir/term_util.vim b/src/testdir/term_util.vim
index 7a73adbe07..17f9752a99 100644
--- a/src/testdir/term_util.vim
+++ b/src/testdir/term_util.vim
@@ -146,4 +146,28 @@ func StopVimInTerminal(buf)
only!
endfunc
+" Open a terminal with a shell, assign the job to g:job and return the buffer
+" number.
+func Run_shell_in_terminal(options)
+ if has('win32')
+ let buf = term_start([&shell,'/k'], a:options)
+ else
+ let buf = term_start(&shell, a:options)
+ endif
+ let g:test_is_flaky = 1
+
+ let termlist = term_list()
+ call assert_equal(1, len(termlist))
+ call assert_equal(buf, termlist[0])
+
+ let g:job = term_getjob(buf)
+ call assert_equal(v:t_job, type(g:job))
+
+ let string = string({'job': buf->term_getjob()})
+ call assert_match("{'job': 'process \\d\\+ run'}", string)
+
+ return buf
+endfunc
+
+
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/testdir/test_terminal.vim b/src/testdir/test_terminal.vim
index bbc6b90ab3..4069848744 100644
--- a/src/testdir/test_terminal.vim
+++ b/src/testdir/test_terminal.vim
@@ -1,4 +1,6 @@
" Tests for the terminal window.
+" This is split in two, because it can take a lot of time.
+" See test_terminal2.vim for further tests.
source check.vim
CheckFeature terminal
@@ -6,33 +8,11 @@ CheckFeature terminal
source shared.vim
source screendump.vim
source mouse.vim
+source term_util.vim
let s:python = PythonProg()
let $PROMPT_COMMAND=''
-" Open a terminal with a shell, assign the job to g:job and return the buffer
-" number.
-func Run_shell_in_terminal(options)
- if has('win32')
- let buf = term_start([&shell,'/k'], a:options)
- else
- let buf = term_start(&shell, a:options)
- endif
- let g:test_is_flaky = 1
-
- let termlist = term_list()
- call assert_equal(1, len(termlist))
- call assert_equal(buf, termlist[0])
-
- let g:job = term_getjob(buf)
- call assert_equal(v:t_job, type(g:job))
-
- let string = string({'job': buf->term_getjob()})
- call assert_match("{'job': 'process \\d\\+ run'}", string)
-
- return buf
-endfunc
-
func Test_terminal_basic()
au TerminalOpen * let b:done = 'yes'
let buf = Run_shell_in_terminal({})
@@ -1355,924 +1335,6 @@ func Test_terminal_dumpdiff_options()
set laststatus&
endfunc
-func Api_drop_common(options)
- call assert_equal(1, winnr('$'))
-
- " Use the title termcap entries to output the escape sequence.
- call writefile([
- \ 'set title',
- \ 'exe "set t_ts=\<Esc>]51; t_fs=\x07"',
- \ 'let &titlestring = ''["drop","Xtextfile"' . a:options . ']''',
- \ 'redraw',
- \ "set t_ts=",
- \ ], 'Xscript')
- let buf = RunVimInTerminal('-S Xscript', {})
- call WaitFor({-> bufnr('Xtextfile') > 0})
- call assert_equal('Xtextfile', expand('%:t'))
- call assert_true(winnr('$') >= 3)
- return buf
-endfunc
-
-func Test_terminal_api_drop_newwin()
- CheckRunVimInTerminal
- let buf = Api_drop_common('')
- call assert_equal(0, &bin)
- call assert_equal('', &fenc)
-
- call StopVimInTerminal(buf)
- call delete('Xscript')
- bwipe Xtextfile
-endfunc
-
-func Test_terminal_api_drop_newwin_bin()
- CheckRunVimInTerminal
- let buf = Api_drop_common(',{"bin":1}')
- call assert_equal(1, &bin)
-
- call StopVimInTerminal(buf)
- call delete('Xscript')
- bwipe Xtextfile
-endfunc
-
-func Test_terminal_api_drop_newwin_binary()
- CheckRunVimInTerminal
- let buf = Api_drop_common(',{"binary":1}')
- call assert_equal(1, &bin)
-
- call StopVimInTerminal(buf)
- call delete('Xscript')
- bwipe Xtextfile
-endfunc
-
-func Test_terminal_api_drop_newwin_nobin()
- CheckRunVimInTerminal
- set binary
- let buf = Api_drop_common(',{"nobin":1}')
- call assert_equal(0, &bin)
-
- call StopVimInTerminal(buf)
- call delete('Xscript')
- bwipe Xtextfile
- set nobinary
-endfunc
-
-func Test_terminal_api_drop_newwin_nobinary()
- CheckRunVimInTerminal
- set binary
- let buf = Api_drop_common(',{"nobinary":1}')
- call assert_equal(0, &bin)
-
- call StopVimInTerminal(buf)
- call delete('Xscript')
- bwipe Xtextfile
- set nobinary
-endfunc
-
-func Test_terminal_api_drop_newwin_ff()
- CheckRunVimInTerminal
- let buf = Api_drop_common(',{"ff":"dos"}')
- call assert_equal("dos", &ff)
-
- call StopVimInTerminal(buf)
- call delete('Xscript')
- bwipe Xtextfile
-endfunc
-
-func Test_terminal_api_drop_newwin_fileformat()
- CheckRunVimInTerminal
- let buf = Api_drop_common(',{"fileformat":"dos"}')
- call assert_equal("dos", &ff)
-
- call StopVimInTerminal(buf)
- call delete('Xscript')
- bwipe Xtextfile
-endfunc
-
-func Test_terminal_api_drop_newwin_enc()
- CheckRunVimInTerminal
- let buf = Api_drop_common(',{"enc":"utf-16"}')
- call assert_equal("utf-16", &fenc)
-
- call StopVimInTerminal(buf)
- call delete('Xscript')
- bwipe Xtextfile
-endfunc
-
-func Test_terminal_api_drop_newwin_encoding()
- CheckRunVimInTerminal
- let buf = Api_drop_common(',{"encoding":"utf-16"}')
- call assert_equal("utf-16", &fenc)
-
- call StopVimInTerminal(buf)
- call delete('Xscript')
- bwipe Xtextfile
-endfunc
-
-func Test_terminal_api_drop_oldwin()
- CheckRunVimInTerminal
- let firstwinid = win_getid()
- split Xtextfile
- let textfile_winid = win_getid()
- call assert_equal(2, winnr('$'))
- call win_gotoid(firstwinid)
-
- " Use the title termcap entries to output the escape sequence.
- call writefile([
- \ 'set title',
- \ 'exe "set t_ts=\<Esc>]51; t_fs=\x07"',
- \ 'let &titlestring = ''["drop","Xtextfile"]''',
- \ 'redraw',
- \ "set t_ts=",
- \ ], 'Xscript')
- let buf = RunVimInTerminal('-S Xscript', {'rows': 10})
- call WaitForAssert({-> assert_equal('Xtextfile', expand('%:t'))})
- call assert_equal(textfile_winid, win_getid())
-
- call StopVimInTerminal(buf)
- call delete('Xscript')
- bwipe Xtextfile
-endfunc
-
-func Tapi_TryThis(bufnum, arg)
- let g:called_bufnum = a:bufnum
- let g:called_arg = a:arg
-endfunc
-
-func WriteApiCall(funcname)
- " Use the title termcap entries to output the escape sequence.
- call writefile([
- \ 'set title',
- \ 'exe "set t_ts=\<Esc>]51; t_fs=\x07"',
- \ 'let &titlestring = ''["call","' . a:funcname . '",["hello",123]]''',
- \ 'redraw',
- \ "set t_ts=",
- \ ], 'Xscript')
-endfunc
-
-func Test_terminal_api_call()
- CheckRunVimInTerminal
-
- unlet! g:called_bufnum
- unlet! g:called_arg
-
- call WriteApiCall('Tapi_TryThis')
-
- " Default
- let buf = RunVimInTerminal('-S Xscript', {})
- call WaitFor({-> exists('g:called_bufnum')})
- call assert_equal(buf, g:called_bufnum)
- call assert_equal(['hello', 123], g:called_arg)
- call StopVimInTerminal(buf)
-
- unlet! g:called_bufnum
- unlet! g:called_arg
-
- " Enable explicitly
- let buf = RunVimInTerminal('-S Xscript', {'term_api': 'Tapi_Try'})
- call WaitFor({-> exists('g:called_bufnum')})
- call assert_equal(buf, g:called_bufnum)
- call assert_equal(['hello', 123], g:called_arg)
- call StopVimInTerminal(buf)
-
- unlet! g:called_bufnum
- unlet! g:called_arg
-
- func! ApiCall_TryThis(bufnum, arg)
- let g:called_bufnum2 = a:bufnum
- let g:called_arg2 = a:arg
- endfunc
-
- call WriteApiCall('ApiCall_TryThis')
-
- " Use prefix match
- let buf = RunVimInTerminal('-S Xscript', {'term_api': 'ApiCall_'})
- call WaitFor({-> exists('g:called_bufnum2')})
- call assert_equal(buf, g:called_bufnum2)
- call assert_equal(['hello', 123], g:called_arg2)
- call StopVimInTerminal(buf)
-
- call assert_fails("call term_start('ls', {'term_api' : []})", 'E475:')
-
- unlet! g:called_bufnum2
- unlet! g:called_arg2
-
- call delete('Xscript')
- delfunction! ApiCall_TryThis
- unlet! g:called_bufnum2
- unlet! g:called_arg2
-endfunc
-
-func Test_terminal_api_call_fails()
- CheckRunVimInTerminal
-
- func! TryThis(bufnum, arg)
- let g:called_bufnum3 = a:bufnum
- let g:called_arg3 = a:arg
- endfunc
-
- call WriteApiCall('TryThis')
-
- unlet! g:called_bufnum3
- unlet! g:called_arg3
-
- " Not permitted
- call ch_logfile('Xlog', 'w')
- let buf = RunVimInTerminal('-S Xscript', {'term_api': ''})
- call WaitForAssert({-> assert_match('Unpermitted function: TryThis', string(readfile('Xlog')))})
- call assert_false(exists('g:called_bufnum3'))
- call assert_false(exists('g:called_arg3'))
- call StopVimInTerminal(buf)
-
- " No match
- call ch_logfile('Xlog', 'w')
- let buf = RunVimInTerminal('-S Xscript', {'term_api': 'TryThat'})
- call WaitFor({-> string(readfile('Xlog')) =~ 'Unpermitted function: TryThis'})
- call assert_false(exists('g:called_bufnum3'))
- call assert_false(exists('g:called_arg3'))
- call StopVimInTerminal(buf)
-
- call delete('Xscript')
- call ch_logfile('')
- call delete('Xlog')
- delfunction! TryThis
- unlet! g:called_bufnum3
- unlet! g:called_arg3
-endfunc
-
-let s:caught_e937 = 0
-
-func Tapi_Delete(bufnum, arg)
- try
- execute 'bdelete!' a:bufnum
- catch /E937:/
- let s:caught_e937 = 1
- endtry
-endfunc
-
-func Test_terminal_api_call_fail_delete()
- CheckRunVimInTerminal
-
- call WriteApiCall('Tapi_Delete')
- let buf = RunVimInTerminal('-S Xscript', {})
- call WaitForAssert({-> assert_equal(1, s:caught_e937)})
-
- call StopVimInTerminal(buf)
- call delete('Xscript')
- call ch_logfile('', '')
-endfunc
-
-func Test_terminal_ansicolors_default()
- CheckFunction term_getansicolors
-
- let colors = [
- \ '#000000', '#e00000',
- \ '#00e000', '#e0e000',
- \ '#0000e0', '#e000e0',
- \ '#00e0e0', '#e0e0e0',
- \ '#808080', '#ff4040',
- \ '#40ff40', '#ffff40',
- \ '#4040ff', '#ff40ff',
- \ '#40ffff', '#ffffff',
- \]
-
- let buf = Run_shell_in_terminal({})
- call assert_equal(colors, term_getansicolors(buf))
- call StopShellInTerminal(buf)
- call TermWait(buf)
- call assert_equal([], term_getansicolors(buf))
-
- exe buf . 'bwipe'
-endfunc
-
-let s:test_colors = [
- \ '#616e64', '#0d0a79',
- \ '#6d610d', '#0a7373',
- \ '#690d0a', '#6d696e',
- \ '#0d0a6f', '#616e0d',
- \ '#0a6479', '#6d0d0a',
- \ '#617373', '#0d0a69',
- \ '#6d690d', '#0a6e6f',
- \ '#610d0a', '#6e6479',
- \]
-
-func Test_terminal_ansicolors_global()
- CheckFeature termguicolors
- CheckFunction term_getansicolors
-
- let g:terminal_ansi_colors = reverse(copy(s:test_colors))
- let buf = Run_shell_in_terminal({})
- call assert_equal(g:terminal_ansi_colors, term_getansicolors(buf))
- call StopShellInTerminal(buf)
- call TermWait(buf)
-
- exe buf . 'bwipe'
- unlet g:terminal_ansi_colors
-endfunc
-
-func Test_terminal_ansicolors_func()
- CheckFeature termguicolors
- CheckFunction term_getansicolors
-
- let g:terminal_ansi_colors = reverse(copy(s:test_colors))
- let buf = Run_shell_in_terminal({'ansi_colors': s:test_colors})
- call assert_equal(s:test_colors, term_getansicolors(buf))
-
- call term_setansicolors(buf, g:terminal_ansi_colors)
- call assert_equal(g:terminal_ansi_colors, buf->term_getansicolors())
-
- let colors = [
- \ 'ivory', 'AliceBlue',
- \ 'grey67', 'dark goldenrod',
- \ 'SteelBlue3', 'PaleVioletRed4',
- \ 'MediumPurple2', 'yellow2',
- \ 'RosyBrown3', 'OrangeRed2',
- \ 'white smoke', 'navy blue',
- \ 'grey47', 'gray97',
- \ 'MistyRose2', 'DodgerBlue4',
- \]
- eval buf->term_setansicolors(colors)
-
- let colors[4] = 'Invalid'
- call assert_fails('call term_setansicolors(buf, colors)', 'E474:')
- call assert_fails('call term_setansicolors(buf, {})', 'E714:')
-
- call StopShellInTerminal(buf)
- call TermWait(buf)
- call assert_equal(0, term_setansicolors(buf, []))
- exe buf . 'bwipe'
-endfunc
-
-func Test_terminal_all_ansi_colors()
- CheckRunVimInTerminal
-
- " Use all the ANSI colors.
- call writefile([
- \ 'call setline(1, "AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPP XXYYZZ")',
- \ 'hi Tblack ctermfg=0 ctermbg=8',
- \ 'hi Tdarkred ctermfg=1 ctermbg=9',
- \ 'hi Tdarkgreen ctermfg=2 ctermbg=10',
- \ 'hi Tbrown ctermfg=3 ctermbg=11',
- \ 'hi Tdarkblue ctermfg=4 ctermbg=12',
- \ 'hi Tdarkmagenta ctermfg=5 ctermbg=13',
- \ 'hi Tdarkcyan ctermfg=6 ctermbg=14',
- \ 'hi Tlightgrey ctermfg=7 ctermbg=15',
- \ 'hi Tdarkgrey ctermfg=8 ctermbg=0',
- \ 'hi Tred ctermfg=9 ctermbg=1',
- \ 'hi Tgreen ctermfg=10 ctermbg=2',
- \ 'hi Tyellow ctermfg=11 ctermbg=3',
- \ 'hi Tblue ctermfg=12 ctermbg=4',
- \ 'hi Tmagenta ctermfg=13 ctermbg=5',
- \ 'hi Tcyan ctermfg=14 ctermbg=6',
- \ 'hi Twhite ctermfg=15 ctermbg=7',
- \ 'hi TdarkredBold ctermfg=1 cterm=bold',
- \ 'hi TgreenBold ctermfg=10 cterm=bold',
- \ 'hi TmagentaBold ctermfg=13 cterm=bold ctermbg=5',
- \ '',
- \ 'call matchadd("Tblack", "A")',
- \ 'call matchadd("Tdarkred", "B")',
- \ 'call matchadd("Tdarkgreen", "C")',
- \ 'call matchadd("Tbrown", "D")',
- \ 'call matchadd("Tdarkblue", "E")',
- \ 'call matchadd("Tdarkmagenta", "F")',
- \ 'call matchadd("Tdarkcyan", "G")',
- \ 'call matchadd("Tlightgrey", "H")',
- \ 'call matchadd("Tdarkgrey", "I")',
- \ 'call matchadd("Tred", "J")',
- \ 'call matchadd("Tgreen", "K")',
- \ 'call matchadd("Tyellow", "L")',
- \ 'call matchadd("Tblue", "M")',
- \ 'call matchadd("Tmagenta", "N")',
- \ 'call matchadd("Tcyan", "O")',
- \ 'call matchadd("Twhite", "P")',
- \ 'call matchadd("TdarkredBold", "X")',
- \ 'call matchadd("TgreenBold", "Y")',
- \ 'call matchadd("TmagentaBold", "Z")',
- \ 'redraw',
- \ ], 'Xcolorscript')
- let buf = RunVimInTerminal('-S Xcolorscript', {'rows': 10})
- call VerifyScreenDump(buf, 'Test_terminal_all_ansi_colors', {})
-
- call term_sendkeys(buf, ":q\<CR>")
- call StopVimInTerminal(buf)
- call delete('Xcolorscript')
-endfunc
-
-func Test_terminal_termwinsize_option_fixed()
- CheckRunVimInTerminal
- set termwinsize=6x40
- let text = []
- for n in range(10)
- call add(text, repeat(n, 50))
- endfor
- call writefile(text, 'Xwinsize')
- let buf = RunVimInTerminal('Xwinsize', {})
- let win = bufwinid(buf)
- call assert_equal([6, 40], term_getsize(buf))
- call assert_equal(6, winheight(win))
- call assert_equal(40, winwidth(win))
-
- " resizing the window doesn't resize the terminal.
- resize 10
- vertical resize 60
- call assert_equal([6, 40], term_getsize(buf))
- call assert_equal(10, winheight(win))
- call assert_equal(60, winwidth(win))
-
- call StopVimInTerminal(buf)
- call delete('Xwinsize')
-
- call assert_fails('set termwinsize=40', 'E474')
- call assert_fails('set termwinsize=10+40', 'E474')
- call assert_fails('set termwinsize=abc', 'E474')
-
- set termwinsize=
-endfunc
-
-func Test_terminal_termwinsize_option_zero()
- set termwinsize=0x0
- let buf = Run_shell_in_terminal({})
- let win = bufwinid(buf)
- call assert_equal([winheight(win), winwidth(win)], term_getsize(buf))
- call StopShellInTerminal(buf)
- call TermWait(buf)
- exe buf . 'bwipe'
-
- set termwinsize=7x0
- let buf = Run_shell_in_terminal({})
- let win = bufwinid(buf)
- call assert_equal([7, winwidth(win)], term_getsize(buf))
- call StopShellInTerminal(buf)
- call TermWait(buf)
- exe buf . 'bwipe'
-
- set termwinsize=0x33
- let buf = Run_shell_in_terminal({})
- let win = bufwinid(buf)
- call assert_equal([winheight(win), 33], term_getsize(buf))
- call StopShellInTerminal(buf)
- call TermWait(buf)
- exe buf . 'bwipe'
-
- set termwinsize=
-endfunc
-
-func Test_terminal_termwinsize_minimum()
- set termwinsize=10*50
- vsplit
- let buf = Run_shell_in_terminal({})
- let win = bufwinid(buf)
- call assert_inrange(10, 1000, winheight(win))
- call assert_inrange(50, 1000, winwidth(win))
- call assert_equal([winheight(win), winwidth(win)], term_getsize(buf))
-
- resize 15
- vertical resize 60
- redraw
- call assert_equal([15, 60], term_getsize(buf))
- call assert_equal(15, winheight(win))
- call assert_equal(60, winwidth(win))
-
- resize 7
- vertical resize 30
- redraw
- call assert_equal([10, 50], term_getsize(buf))
- call assert_equal(7, winheight(win))
- call assert_equal(30, winwidth(win))
-
- call StopShellInTerminal(buf)
- call TermWait(buf)
- exe buf . 'bwipe'
-
- set termwinsize=0*0
- let buf = Run_shell_in_terminal({})
- let win = bufwinid(buf)
- call assert_equal([winheight(win), winwidth(win)], term_getsize(buf))
- call StopShellInTerminal(buf)
- call TermWait(buf)
- exe buf . 'bwipe'
-
- set termwinsize=
-endfunc
-
-func Test_terminal_termwinkey()
- " make three tabpages, terminal in the middle
- 0tabnew
- tabnext
- tabnew
- tabprev
- call assert_equal(1, winnr('$'))
- call assert_equal(2, tabpagenr())
- let thiswin = win_getid()
-
- let buf = Run_shell_in_terminal({})
- let termwin = bufwinid(buf)
- set termwinkey=<C-L>
- call feedkeys("\<C-L>w", 'tx')
- call assert_equal(thiswin, win_getid())
- call feedkeys("\<C-W>w", 'tx')
- call assert_equal(termwin, win_getid())
-
- if has('langmap')
- set langmap=xjyk
- call feedkeys("\<C-L>x", 'tx')
- call assert_equal(thiswin, win_getid())
- call feedkeys("\<C-W>y", 'tx')
- call assert_equal(termwin, win_getid())
- set langmap=
- endif
-
- call feedkeys("\<C-L>gt", "xt")
- call assert_equal(3, tabpagenr())
- tabprev
- call assert_equal(2, tabpagenr())
- call assert_equal(termwin, win_getid())
-
- call feedkeys("\<C-L>gT", "xt")
- call assert_equal(1, tabpagenr())
- tabnext
- call assert_equal(2, tabpagenr())
- call assert_equal(termwin, win_getid())
-
- let job = term_getjob(buf)
- call feedkeys("\<C-L>\<C-C>", 'tx')
- call WaitForAssert({-> assert_equal("dead", job_status(job))})
-
- set termwinkey&
- tabnext
- tabclose
- tabprev
- tabclose
-endfunc
-
-func Test_terminal_out_err()
- CheckUnix
-
- call writefile([
- \ '#!/bin/sh',
- \ 'echo "this is standard error" >&2',
- \ 'echo "this is standard out" >&1',
- \ ], 'Xechoerrout.sh')
- call setfperm('Xechoerrout.sh', 'rwxrwx---')
-
- let outfile = 'Xtermstdout'
- let buf = term_start(['./Xechoerrout.sh'], {'out_io': 'file', 'out_name': outfile})
-
- call WaitFor({-> !empty(readfile(outfile)) && !empty(term_getline(buf, 1))})
- call assert_equal(['this is standard out'], readfile(outfile))
- call assert_equal('this is standard error', term_getline(buf, 1))
-
- call WaitForAssert({-> assert_equal('dead', job_status(term_getjob(buf)))})
- exe buf . 'bwipe'
- call delete('Xechoerrout.sh')
- call delete(outfile)
-endfunc
-
-func Test_termwinscroll()
- CheckUnix
-
- " Let the terminal output more than 'termwinscroll' lines, some at the start
- " will be dropped.
- exe 'set termwinscroll=' . &lines
- let buf = term_start('/bin/sh')
- for i in range(1, &lines)
- call feedkeys("echo " . i . "\<CR>", 'xt')
- call WaitForAssert({-> assert_match(string(i), term_getline(buf, term_getcursor(buf)[0] - 1))})
- endfor
- " Go to Terminal-Normal mode to update the buffer.
- call feedkeys("\<C-W>N", 'xt')
- call assert_inrange(&lines, &lines * 110 / 100 + winheight(0), line('$'))
-
- " Every "echo nr" must only appear once
- let lines = getline(1, line('$'))
- for i in range(&lines - len(lines) / 2 + 2, &lines)
- let filtered = filter(copy(lines), {idx, val -> val =~ 'echo ' . i . '\>'})
- call assert_equal(1, len(filtered), 'for "echo ' . i . '"')
- endfor
-
- exe buf . 'bwipe!'
-endfunc
-
-" Resizing the terminal window caused an ml_get error.
-" TODO: This does not reproduce the original problem.
-func Test_terminal_resize()
- set statusline=x
- terminal
- call assert_equal(2, winnr('$'))
-
- " Fill the terminal with text.
- if has('win32')
- call feedkeys("dir\<CR>", 'xt')
- else
- call feedkeys("ls\<CR>", 'xt')
- endif
- " Go to Terminal-Normal mode for a moment.
- call feedkeys("\<C-W>N", 'xt')
- " Open a new window
- call feedkeys("i\<C-W>n", 'xt')
- call assert_equal(3, winnr('$'))
- redraw
-
- close
- call assert_equal(2, winnr('$'))
- call feedkeys("exit\<CR>", 'xt')
- set statusline&
-endfunc
-
-" must be nearly the last, we can't go back from GUI to terminal
-func Test_zz1_terminal_in_gui()
- CheckCanRunGui
-
- " Ignore the "failed to create input context" error.
- call test_ignore_error('E285:')
-
- gui -f
-
- call assert_equal(1, winnr('$'))
- let buf = Run_shell_in_terminal({'term_finish': 'close'})
- call StopShellInTerminal(buf)
- call TermWait(buf)
-
- " closing window wipes out the terminal buffer a with finished job
- call WaitForAssert({-> assert_equal(1, winnr('$'))})
- call assert_equal("", bufname(buf))
-
- unlet g:job
-endfunc
-
-func Test_zz2_terminal_guioptions_bang()
- CheckGui
- set guioptions+=!
-
- let filename = 'Xtestscript'
- if has('win32')
- let filename .= '.bat'
- let prefix = ''
- let contents = ['@echo off', 'exit %1']
- else
- let filename .= '.sh'
- let prefix = './'
- let contents = ['#!/bin/sh', 'exit $1']
- endif
- call writefile(contents, filename)
- call setfperm(filename, 'rwxrwx---')
-
- " Check if v:shell_error is equal to the exit status.
- let exitval = 0
- execute printf(':!%s%s %d', prefix, filename, exitval)
- call assert_equal(exitval, v:shell_error)
-
- let exitval = 9
- execute printf(':!%s%s %d', prefix, filename, exitval)
- call assert_equal(exitval, v:shell_error)
-
- set guioptions&
- call delete(filename)
-endfunc
-
-func Test_terminal_hidden()
- CheckUnix
-
- term ++hidden cat
- let bnr = bufnr('$')
- call assert_equal('terminal', getbufvar(bnr, '&buftype'))
- exe 'sbuf ' . bnr
- call assert_equal('terminal', &buftype)
- call term_sendkeys(bnr, "asdf\<CR>")
- call WaitForAssert({-> assert_match('asdf', term_getline(bnr, 2))})
- call term_sendkeys(bnr, "\<C-D>")
- call WaitForAssert({-> assert_equal('finished', bnr->term_getstatus())})
- bwipe!
-endfunc
-
-func Test_terminal_switch_mode()
- term
- let bnr = bufnr('$')
- call WaitForAssert({-> assert_equal('running', term_getstatus(bnr))})
- call feedkeys("\<C-W>N", 'xt')
- call WaitForAssert({-> assert_equal('running,normal', term_getstatus(bnr))})
- call feedkeys("A", 'xt')
- call WaitForAssert({-> assert_equal('running', term_getstatus(bnr))})
- call feedkeys("\<C-\>\<C-N>", 'xt')
- call WaitForAssert({-> assert_equal('running,normal', term_getstatus(bnr))})
- call feedkeys("I", 'xt')
- call WaitForAssert({-> assert_equal('running', term_getstatus(bnr))})
- call feedkeys("\<C-W>Nv", 'xt')
- call WaitForAssert({-> assert_equal('running,normal', term_getstatus(bnr))})
- call feedkeys("I", 'xt')
- call WaitForAssert({-> assert_equal('running', term_getstatus(bnr))})
- call feedkeys("\<C-W>Nv", 'xt')
- call WaitForAssert({-> assert_equal('running,normal', term_getstatus(bnr))})
- call feedkeys("A", 'xt')
- call WaitForAssert({-> assert_equal('running', term_getstatus(bnr))})
- bwipe!
-endfunc
-
-func Test_terminal_normal_mode()
- CheckRunVimInTerminal
-
- " Run Vim in a terminal and open a terminal window to run Vim in.
- let lines =<< trim END
- call setline(1, range(11111, 11122))
- 3
- END
- call writefile(lines, 'XtermNormal')
- let buf = RunVimInTerminal('-S XtermNormal', {'rows': 8})
- call TermWait(buf)
-
- call term_sendkeys(buf, "\<C-W>N")
- call term_sendkeys(buf, ":set number cursorline culopt=both\r")
- call VerifyScreenDump(buf, 'Test_terminal_normal_1', {})
-
- call term_sendkeys(buf, ":set culopt=number\r")
- call VerifyScreenDump(buf, 'Test_terminal_normal_2', {})
-
- call term_sendkeys(buf, ":set culopt=line\r")
- call VerifyScreenDump(buf, 'Test_terminal_normal_3', {})
-
- call assert_fails('call term_sendkeys(buf, [])', 'E730:')
- call term_sendkeys(buf, "a:q!\<CR>:q\<CR>:q\<CR>")
- call StopVimInTerminal(buf)
- call delete('XtermNormal')
-endfunc
-
-func Test_terminal_hidden_and_close()
- CheckUnix
-
- call assert_equal(1, winnr('$'))
- term ++hidden ++close ls
- let bnr = bufnr('$')
- call assert_equal('terminal', getbufvar(bnr, '&buftype'))
- call WaitForAssert({-> assert_false(bufexists(bnr))})
- call assert_equal(1, winnr('$'))
-endfunc
-
-func Test_terminal_does_not_truncate_last_newlines()
- " This test does not pass through ConPTY.
- if has('conpty')
- return
- endif
- let contents = [
- \ [ 'One', '', 'X' ],
- \ [ 'Two', '', '' ],
- \ [ 'Three' ] + repeat([''], 30)
- \ ]
-
- for c in contents
- call writefile(c, 'Xfile')
- if has('win32')
- term cmd /c type Xfile
- else
- term cat Xfile
- endif
- let bnr = bufnr('$')
- call assert_equal('terminal', getbufvar(bnr, '&buftype'))
- call WaitForAssert({-> assert_equal('finished', term_getstatus(bnr))})
- sleep 100m
- call assert_equal(c, getline(1, line('$')))
- quit
- endfor
-
- call delete('Xfile')
-endfunc
-
-func Test_terminal_no_job()
- if has('win32')
- let cmd = 'cmd /c ""'
- else
- CheckExecutable false
- let cmd = 'false'
- endif
- let term = term_start(cmd, {'term_finish': 'close'})
- call WaitForAssert({-> assert_equal(v:null, term_getjob(term)) })
-endfunc
-
-func Test_term_getcursor()
- CheckUnix
-
- let buf = Run_shell_in_terminal({})
-
- " Wait for the shell to display a prompt.
- call WaitForAssert({-> assert_notequal('', term_getline(buf, 1))})
-
- " Hide the cursor.
- call term_sendkeys(buf, "echo -e '\\033[?25l'\r")
- call WaitForAssert({-> assert_equal(0, term_getcursor(buf)[2].visible)})
-
- " Show the cursor.
- call term_sendkeys(buf, "echo -e '\\033[?25h'\r")
- call WaitForAssert({-> assert_equal(1, buf->term_getcursor()[2].visible)})
-
- " Change color of cursor.
- call WaitForAssert({-> assert_equal('', term_getcursor(buf)[2].color)})
- call term_sendkeys(buf, "echo -e '\\033]12;blue\\007'\r")
- call WaitForAssert({-> assert_equal('blue', term_getcursor(buf)[2].color)})
- call term_sendkeys(buf, "echo -e '\\033]12;green\\007'\r")
- call WaitForAssert({-> assert_equal('green', term_getcursor(buf)[2].color)})
-
- " Make cursor a blinking block.
- call term_sendkeys(buf, "echo -e '\\033[1 q'\r")
- call WaitForAssert({-> assert_equal([1, 1],
- \ [term_getcursor(buf)[2].blink, term_getcursor(buf)[2].shape])})
-
- " Make cursor a steady block.
- call term_sendkeys(buf, "echo -e '\\033[2 q'\r")
- call WaitForAssert({-> assert_equal([0, 1],
- \ [term_getcursor(buf)[2].blink, term_getcursor(buf)[2].shape])})
-
- " Make cursor a blinking underline.
- call term_sendkeys(buf, "echo -e '\\033[3 q'\r")
- call WaitForAssert({-> assert_equal([1, 2],
- \ [term_getcursor(buf)[2].blink, term_getcursor(buf)[2].shape])})
-
- " Make cursor a steady underline.
- call term_sendkeys(buf, "echo -e '\\033[4 q'\r")
- call WaitForAssert({-> assert_equal([0, 2],
- \ [term_getcursor(buf)[2].blink, term_getcursor(buf)[2].shape])})
-
- " Make cursor a blinking vertical bar.
- call term_sendkeys(buf, "echo -e '\\033[5 q'\r")
- call WaitForAssert({-> assert_equal([1, 3],
- \ [term_getcursor(buf)[2].blink, term_getcursor(buf)[2].shape])})
-
- " Make cursor a steady vertical bar.
- call term_sendkeys(buf, "echo -e '\\033[6 q'\r")
- call WaitForAssert({-> assert_equal([0, 3],
- \ [term_getcursor(buf)[2].blink, term_getcursor(buf)[2].shape])})
-
- call StopShellInTerminal(buf)
-endfunc
-
-" Test for term_gettitle()
-func Test_term_gettitle()
- " term_gettitle() returns an empty string for a non-terminal buffer
- " and for a non-existing buffer.
- call assert_equal('', bufnr('%')->term_gettitle())
- call assert_equal('', term_gettitle(bufnr('$') + 1))
-
- if !has('title') || empty(&t_ts)
- throw "Skipped: can't get/set title"
- endif
-
- let term = term_start([GetVimProg(), '--clean', '-c', 'set noswapfile', '-c', 'set title'])
- if has('autoservername')
- call WaitForAssert({-> assert_match('^\[No Name\] - VIM\d\+$', term_gettitle(term)) })
- call term_sendkeys(term, ":e Xfoo\r")
- call WaitForAssert({-> assert_match('^Xfoo (.*[/\\]testdir) - VIM\d\+$', term_gettitle(term)) })
- else
- call WaitForAssert({-> assert_equal('[No Name] - VIM', term_gettitle(term)) })
- call term_sendkeys(term, ":e Xfoo\r")
- call WaitForAssert({-> assert_match('^Xfoo (.*[/\\]testdir) - VIM$', term_gettitle(term)) })
- endif
-
- call term_sendkeys(term, ":set titlestring=foo\r")
- call WaitForAssert({-> assert_equal('foo', term_gettitle(term)) })
-
- exe term . 'bwipe!'
-endfunc
-
-func Test_term_gettty()
- let buf = Run_shell_in_terminal({})
- let gettty = term_gettty(buf)
-
- if has('unix') && executable('tty')
- " Find tty using the tty shell command.
- call WaitForAssert({-> assert_notequal('', term_getline(buf, 1))})
- call term_sendkeys(buf, "tty\r")
- call WaitForAssert({-> assert_notequal('', term_getline(buf, 3))})
- let tty = term_getline(buf, 2)
- call assert_equal(tty, gettty)
- endif
-
- let gettty0 = term_gettty(buf, 0)
- let gettty1 = term_gettty(buf, 1)
-
- call assert_equal(gettty, gettty0)
- call assert_equal(job_info(g:job).tty_out, gettty0)
- call assert_equal(job_info(g:job).tty_in, gettty1)
-
- if has('unix')
- " For unix, term_gettty(..., 0) and term_gettty(..., 1)
- " are identical according to :help term_gettty()
- call assert_equal(gettty0, gettty1)
- call assert_match('^/dev/', gettty)
- else
- " ConPTY works on anonymous pipe.
- if !has('conpty')
- call assert_match('^\\\\.\\pipe\\', gettty0)
- call assert_match('^\\\\.\\pipe\\', gettty1)
- endif
- endif
-
- call assert_fails('call term_gettty(buf, 2)', 'E475:')
- call assert_fails('call term_gettty(buf, -1)', 'E475:')
-
- call assert_equal('', term_gettty(buf + 1))
-
- call StopShellInTerminal(buf)
- call TermWait(buf)
- exe buf . 'bwipe'
-endfunc
-
" When drawing the statusline the cursor position may not have been updated
" yet.
" 1. create a terminal, make it show 2 lines
@@ -2297,619 +1359,5 @@ func Test_terminal_statusline()
set statusline=
endfunc
-func Test_terminal_getwinpos()
- CheckRunVimInTerminal
-
- " split, go to the bottom-right window
- split
- wincmd j
- set splitright
-
- call writefile([
- \ 'echo getwinpos()',
- \ ], 'XTest_getwinpos')
- let buf = RunVimInTerminal('-S XTest_getwinpos', {'cols': 60})
- call TermWait(buf)
-
- " Find the output of getwinpos() in the bottom line.
- let rows = term_getsize(buf)[0]
- call WaitForAssert({-> assert_match('\[\d\+, \d\+\]', term_getline(buf, rows))})
- let line = term_getline(buf, rows)
- let xpos = str2nr(substitute(line, '\[\(\d\+\), \d\+\]', '\1', ''))
- let ypos = str2nr(substitute(line, '\[\d\+, \(\d\+\)\]', '\1', ''))
-
- " Position must be bigger than the getwinpos() result of Vim itself.
- " The calculation in the console assumes a 10 x 7 character cell.
- " In the GUI it can be more, let's assume a 20 x 14 cell.
- " And then add 100 / 200 tolerance.
- let [xroot, yroot] = getwinpos()
- let winpos = 50->getwinpos()
- call assert_equal(xroot, winpos[0])
- call assert_equal(yroot, winpos[1])
- let [winrow, wincol] = win_screenpos('.')
- let xoff = wincol * (has('gui_running') ? 14 : 7) + 100
- let yoff = winrow * (has('gui_running') ? 20 : 10) + 200
- call assert_inrange(xroot + 2, xroot + xoff, xpos)
- call assert_inrange(yroot + 2, yroot + yoff, ypos)
-
- call TermWait(buf)
- call term_sendkeys(buf, ":q\<CR>")
- call StopVimInTerminal(buf)
- call delete('XTest_getwinpos')
- exe buf . 'bwipe!'
- set splitright&
- only!
-endfunc
-
-func Test_terminal_altscreen()
- " somehow doesn't work on MS-Windows
- CheckUnix
- let cmd = "cat Xtext\<CR>"
-
- let buf = term_start(&shell, {})
- call writefile(["\<Esc>[?1047h"], 'Xtext')
- call term_sendkeys(buf, cmd)
- call WaitForAssert({-> assert_equal(1, term_getaltscreen(buf))})
-
- call writefile(["\<Esc>[?1047l"], 'Xtext')
- call term_sendkeys(buf, cmd)
- call WaitForAssert({-> assert_equal(0, term_getaltscreen(buf))})
-
- call term_sendkeys(buf, "exit\r")
- exe buf . "bwipe!"
- call delete('Xtext')
-endfunc
-
-func Test_terminal_shell_option()
- if has('unix')
- " exec is a shell builtin command, should fail without a shell.
- term exec ls runtest.vim