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