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