xref: /vim-8.2.3635/src/testdir/term_util.vim (revision 3a6aadb3)
17a39dd7fSBram Moolenaar" Functions about terminal shared by several tests
27a39dd7fSBram Moolenaar
37a39dd7fSBram Moolenaar" Only load this script once.
47a39dd7fSBram Moolenaarif exists('*CanRunVimInTerminal')
57a39dd7fSBram Moolenaar  finish
67a39dd7fSBram Moolenaarendif
77a39dd7fSBram Moolenaar
86bf1b52bSBram Moolenaarsource shared.vim
96bf1b52bSBram Moolenaar
107a39dd7fSBram Moolenaar" For most tests we need to be able to run terminal Vim with 256 colors.  On
117a39dd7fSBram Moolenaar" MS-Windows the console only has 16 colors and the GUI can't run in a
127a39dd7fSBram Moolenaar" terminal.
137a39dd7fSBram Moolenaarfunc CanRunVimInTerminal()
147a39dd7fSBram Moolenaar  return has('terminal') && !has('win32')
157a39dd7fSBram Moolenaarendfunc
167a39dd7fSBram Moolenaar
177a39dd7fSBram Moolenaar" Skip the rest if there is no terminal feature at all.
187a39dd7fSBram Moolenaarif !has('terminal')
197a39dd7fSBram Moolenaar  finish
207a39dd7fSBram Moolenaarendif
217a39dd7fSBram Moolenaar
227a39dd7fSBram Moolenaar" Stops the shell running in terminal "buf".
237a39dd7fSBram Moolenaarfunc StopShellInTerminal(buf)
247a39dd7fSBram Moolenaar  call term_sendkeys(a:buf, "exit\r")
257a39dd7fSBram Moolenaar  let job = term_getjob(a:buf)
26*3a6aadb3SBram Moolenaar  call WaitForAssert({-> assert_equal("dead", job_status(job))})
277a39dd7fSBram Moolenaarendfunc
287a39dd7fSBram Moolenaar
296a2c5a7dSBram Moolenaar" Wrapper around term_wait() to allow more time for re-runs of flaky tests
306a2c5a7dSBram Moolenaar" The second argument is the minimum time to wait in msec, 10 if omitted.
316a2c5a7dSBram Moolenaarfunc TermWait(buf, ...)
326a2c5a7dSBram Moolenaar  let wait_time = a:0 ? a:1 : 10
33ceb2e775SBram Moolenaar  if exists('g:run_nr')
346a2c5a7dSBram Moolenaar    if g:run_nr == 2
356a2c5a7dSBram Moolenaar      let wait_time *= 4
366a2c5a7dSBram Moolenaar    elseif g:run_nr > 2
376a2c5a7dSBram Moolenaar      let wait_time *= 10
386a2c5a7dSBram Moolenaar    endif
39ceb2e775SBram Moolenaar  endif
406a2c5a7dSBram Moolenaar  call term_wait(a:buf, wait_time)
416a2c5a7dSBram Moolenaar
426a2c5a7dSBram Moolenaar  " In case it wasn't set yet.
436a2c5a7dSBram Moolenaar  let g:test_is_flaky = 1
446a2c5a7dSBram Moolenaarendfunc
456a2c5a7dSBram Moolenaar
467a39dd7fSBram Moolenaar" Run Vim with "arguments" in a new terminal window.
477a39dd7fSBram Moolenaar" By default uses a size of 20 lines and 75 columns.
487a39dd7fSBram Moolenaar" Returns the buffer number of the terminal.
497a39dd7fSBram Moolenaar"
507a39dd7fSBram Moolenaar" Options is a dictionary, these items are recognized:
51a45551a5SBram Moolenaar" "keep_t_u7" - when 1 do not make t_u7 empty (resetting t_u7 avoids clearing
52a45551a5SBram Moolenaar"               parts of line 2 and 3 on the display)
537a39dd7fSBram Moolenaar" "rows" - height of the terminal window (max. 20)
547a39dd7fSBram Moolenaar" "cols" - width of the terminal window (max. 78)
557a39dd7fSBram Moolenaar" "statusoff" - number of lines the status is offset from default
566bf1b52bSBram Moolenaar" "wait_for_ruler" - if zero then don't wait for ruler to show
577a39dd7fSBram Moolenaarfunc RunVimInTerminal(arguments, options)
587a39dd7fSBram Moolenaar  " If Vim doesn't exit a swap file remains, causing other tests to fail.
597a39dd7fSBram Moolenaar  " Remove it here.
607a39dd7fSBram Moolenaar  call delete(".swp")
617a39dd7fSBram Moolenaar
627a39dd7fSBram Moolenaar  if exists('$COLORFGBG')
637a39dd7fSBram Moolenaar    " Clear $COLORFGBG to avoid 'background' being set to "dark", which will
647a39dd7fSBram Moolenaar    " only be corrected if the response to t_RB is received, which may be too
657a39dd7fSBram Moolenaar    " late.
667a39dd7fSBram Moolenaar    let $COLORFGBG = ''
677a39dd7fSBram Moolenaar  endif
687a39dd7fSBram Moolenaar
697a39dd7fSBram Moolenaar  " Make a horizontal and vertical split, so that we can get exactly the right
707a39dd7fSBram Moolenaar  " size terminal window.  Works only when the current window is full width.
717a39dd7fSBram Moolenaar  call assert_equal(&columns, winwidth(0))
727a39dd7fSBram Moolenaar  split
737a39dd7fSBram Moolenaar  vsplit
747a39dd7fSBram Moolenaar
757a39dd7fSBram Moolenaar  " Always do this with 256 colors and a light background.
767a39dd7fSBram Moolenaar  set t_Co=256 background=light
777a39dd7fSBram Moolenaar  hi Normal ctermfg=NONE ctermbg=NONE
787a39dd7fSBram Moolenaar
79b936b794SBram Moolenaar  " Make the window 20 lines high and 75 columns, unless told otherwise or
80b936b794SBram Moolenaar  " 'termwinsize' is set.
817a39dd7fSBram Moolenaar  let rows = get(a:options, 'rows', 20)
827a39dd7fSBram Moolenaar  let cols = get(a:options, 'cols', 75)
837a39dd7fSBram Moolenaar  let statusoff = get(a:options, 'statusoff', 1)
847a39dd7fSBram Moolenaar
85a45551a5SBram Moolenaar  if get(a:options, 'keep_t_u7', 0)
86a45551a5SBram Moolenaar    let reset_u7 = ''
87a45551a5SBram Moolenaar  else
88a45551a5SBram Moolenaar    let reset_u7 = ' --cmd "set t_u7=" '
89a45551a5SBram Moolenaar  endif
90a45551a5SBram Moolenaar
91a45551a5SBram Moolenaar  let cmd = GetVimCommandCleanTerm() .. reset_u7 .. a:arguments
927a39dd7fSBram Moolenaar
93b936b794SBram Moolenaar  let options = #{curwin: 1}
94b936b794SBram Moolenaar  if &termwinsize == ''
95b936b794SBram Moolenaar    let options.term_rows = rows
96b936b794SBram Moolenaar    let options.term_cols = cols
97b936b794SBram Moolenaar  endif
98b936b794SBram Moolenaar
99d2842ea6SBram Moolenaar  " Accept other options whose name starts with 'term_'.
100d2842ea6SBram Moolenaar  call extend(options, filter(copy(a:options), 'v:key =~# "^term_"'))
101d2842ea6SBram Moolenaar
102d2842ea6SBram Moolenaar  let buf = term_start(cmd, options)
103d2842ea6SBram Moolenaar
1047a39dd7fSBram Moolenaar  if &termwinsize == ''
1057a39dd7fSBram Moolenaar    " in the GUI we may end up with a different size, try to set it.
1067a39dd7fSBram Moolenaar    if term_getsize(buf) != [rows, cols]
1077a39dd7fSBram Moolenaar      call term_setsize(buf, rows, cols)
1087a39dd7fSBram Moolenaar    endif
1097a39dd7fSBram Moolenaar    call assert_equal([rows, cols], term_getsize(buf))
1107a39dd7fSBram Moolenaar  else
1117a39dd7fSBram Moolenaar    let rows = term_getsize(buf)[0]
1127a39dd7fSBram Moolenaar    let cols = term_getsize(buf)[1]
1137a39dd7fSBram Moolenaar  endif
1147a39dd7fSBram Moolenaar
1156a2c5a7dSBram Moolenaar  call TermWait(buf)
116cde0ff39SBram Moolenaar
117101f4810SBram Moolenaar  if get(a:options, 'wait_for_ruler', 1)
1187a39dd7fSBram Moolenaar    " Wait for "All" or "Top" of the ruler to be shown in the last line or in
1197a39dd7fSBram Moolenaar    " the status line of the last window. This can be quite slow (e.g. when
1207a39dd7fSBram Moolenaar    " using valgrind).
1217a39dd7fSBram Moolenaar    " If it fails then show the terminal contents for debugging.
1227a39dd7fSBram Moolenaar    try
1237a39dd7fSBram Moolenaar      call WaitFor({-> len(term_getline(buf, rows)) >= cols - 1 || len(term_getline(buf, rows - statusoff)) >= cols - 1})
1247a39dd7fSBram Moolenaar    catch /timed out after/
1257a39dd7fSBram Moolenaar      let lines = map(range(1, rows), {key, val -> term_getline(buf, val)})
1267a39dd7fSBram Moolenaar      call assert_report('RunVimInTerminal() failed, screen contents: ' . join(lines, "<NL>"))
1277a39dd7fSBram Moolenaar    endtry
128101f4810SBram Moolenaar  endif
1297a39dd7fSBram Moolenaar
1303cdcb090SBram Moolenaar  " Starting a terminal to run Vim is always considered flaky.
13130d53e2cSBram Moolenaar  let g:test_is_flaky = 1
1323cdcb090SBram Moolenaar
1337a39dd7fSBram Moolenaar  return buf
1347a39dd7fSBram Moolenaarendfunc
1357a39dd7fSBram Moolenaar
1367a39dd7fSBram Moolenaar" Stop a Vim running in terminal buffer "buf".
137a46765a7SBram Moolenaarfunc StopVimInTerminal(buf, kill = 1)
1383cdcb090SBram Moolenaar  " Using a terminal to run Vim is always considered flaky.
13930d53e2cSBram Moolenaar  let g:test_is_flaky = 1
1403cdcb090SBram Moolenaar
1417a39dd7fSBram Moolenaar  call assert_equal("running", term_getstatus(a:buf))
1427a39dd7fSBram Moolenaar
1437a39dd7fSBram Moolenaar  " CTRL-O : works both in Normal mode and Insert mode to start a command line.
1447a39dd7fSBram Moolenaar  " In Command-line it's inserted, the CTRL-U removes it again.
1457a39dd7fSBram Moolenaar  call term_sendkeys(a:buf, "\<C-O>:\<C-U>qa!\<cr>")
1467a39dd7fSBram Moolenaar
14791689ea8SBram Moolenaar  " Wait for all the pending updates to terminal to complete
14891689ea8SBram Moolenaar  call TermWait(a:buf)
14991689ea8SBram Moolenaar
150645cd3ebSBram Moolenaar  " Wait for the terminal to end.
1517a39dd7fSBram Moolenaar  call WaitForAssert({-> assert_equal("finished", term_getstatus(a:buf))})
152645cd3ebSBram Moolenaar
153645cd3ebSBram Moolenaar  " If the buffer still exists forcefully wipe it.
154a46765a7SBram Moolenaar  if a:kill && bufexists(a:buf)
155645cd3ebSBram Moolenaar    exe a:buf .. 'bwipe!'
156645cd3ebSBram Moolenaar  endif
1577a39dd7fSBram Moolenaarendfunc
158cde0ff39SBram Moolenaar
1591112c0feSBram Moolenaar" Open a terminal with a shell, assign the job to g:job and return the buffer
1601112c0feSBram Moolenaar" number.
1611112c0feSBram Moolenaarfunc Run_shell_in_terminal(options)
1621112c0feSBram Moolenaar  if has('win32')
1631112c0feSBram Moolenaar    let buf = term_start([&shell, '/k'], a:options)
1641112c0feSBram Moolenaar  else
1651112c0feSBram Moolenaar    let buf = term_start(&shell, a:options)
1661112c0feSBram Moolenaar  endif
1671112c0feSBram Moolenaar  let g:test_is_flaky = 1
1681112c0feSBram Moolenaar
1691112c0feSBram Moolenaar  let termlist = term_list()
1701112c0feSBram Moolenaar  call assert_equal(1, len(termlist))
1711112c0feSBram Moolenaar  call assert_equal(buf, termlist[0])
1721112c0feSBram Moolenaar
1731112c0feSBram Moolenaar  let g:job = term_getjob(buf)
1741112c0feSBram Moolenaar  call assert_equal(v:t_job, type(g:job))
1751112c0feSBram Moolenaar
1761112c0feSBram Moolenaar  let string = string({'job': buf->term_getjob()})
1771112c0feSBram Moolenaar  call assert_match("{'job': 'process \\d\\+ run'}", string)
1781112c0feSBram Moolenaar
1791112c0feSBram Moolenaar  return buf
1801112c0feSBram Moolenaarendfunc
1811112c0feSBram Moolenaar
18203dfde2bSBram Moolenaar" Return concatenated lines in terminal.
18303dfde2bSBram Moolenaarfunc Term_getlines(buf, lines)
18403dfde2bSBram Moolenaar  return join(map(a:lines, 'term_getline(a:buf, v:val)'), '')
18503dfde2bSBram Moolenaarendfunc
1861112c0feSBram Moolenaar
187cde0ff39SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
188