blob: 9812e7e6de337d18ce1300b259988de067fe9cd3 [file] [log] [blame]
Bram Moolenaarda650582018-02-20 15:51:40 +01001" Functions shared by tests making screen dumps.
2
3" Only load this script once.
Bram Moolenaar6bb2cdf2018-02-24 19:53:53 +01004if exists('*CanRunVimInTerminal')
Bram Moolenaarda650582018-02-20 15:51:40 +01005 finish
6endif
7
Bram Moolenaar6bb2cdf2018-02-24 19:53:53 +01008" Need to be able to run terminal Vim with 256 colors. On MS-Windows the
9" console only has 16 colors and the GUI can't run in a terminal.
10if !has('terminal') || has('win32')
11 func CanRunVimInTerminal()
12 return 0
13 endfunc
14 finish
15endif
16
17func CanRunVimInTerminal()
18 return 1
19endfunc
20
Bram Moolenaarda650582018-02-20 15:51:40 +010021source shared.vim
22
23" Run Vim with "arguments" in a new terminal window.
24" By default uses a size of 20 lines and 75 columns.
25" Returns the buffer number of the terminal.
26"
Bram Moolenaarcf67a502018-03-25 20:31:32 +020027" Options is a dictionary, these items are recognized:
28" "rows" - height of the terminal window (max. 20)
29" "cols" - width of the terminal window (max. 78)
Bram Moolenaarda650582018-02-20 15:51:40 +010030func RunVimInTerminal(arguments, options)
Bram Moolenaar948a7962018-03-23 20:37:45 +010031 " If Vim doesn't exit a swap file remains, causing other tests to fail.
32 " Remove it here.
33 call delete(".swp")
34
Bram Moolenaare7499dd2018-03-24 17:56:13 +010035 if exists('$COLORFGBG')
36 " Clear $COLORFGBG to avoid 'background' being set to "dark", which will
37 " only be corrected if the response to t_RB is received, which may be too
38 " late.
39 let $COLORFGBG = ''
40 endif
41
Bram Moolenaarda650582018-02-20 15:51:40 +010042 " Make a horizontal and vertical split, so that we can get exactly the right
Bram Moolenaar8fbaeb12018-03-25 18:20:17 +020043 " size terminal window. Works only when the current window is full width.
44 call assert_equal(&columns, winwidth(0))
Bram Moolenaarda650582018-02-20 15:51:40 +010045 split
46 vsplit
47
Bram Moolenaar6acadda2018-02-24 16:51:32 +010048 " Always do this with 256 colors and a light background.
49 set t_Co=256 background=light
50 hi Normal ctermfg=NONE ctermbg=NONE
Bram Moolenaarda650582018-02-20 15:51:40 +010051
Bram Moolenaarcf67a502018-03-25 20:31:32 +020052 " Make the window 20 lines high and 75 columns, unless told otherwise.
53 let rows = get(a:options, 'rows', 20)
54 let cols = get(a:options, 'cols', 75)
Bram Moolenaar15a1c3f2018-03-25 18:56:25 +020055
Bram Moolenaarda650582018-02-20 15:51:40 +010056 let cmd = GetVimCommandClean()
Bram Moolenaarb7ea7cb2018-02-24 14:38:51 +010057 " Add -v to have gvim run in the terminal (if possible)
58 let cmd .= ' -v ' . a:arguments
Bram Moolenaarcf67a502018-03-25 20:31:32 +020059 let buf = term_start(cmd, {'curwin': 1, 'term_rows': rows, 'term_cols': cols})
60 call assert_equal([rows, cols], term_getsize(buf))
Bram Moolenaarda650582018-02-20 15:51:40 +010061
Bram Moolenaar3680bab2018-04-06 20:22:06 +020062 " Wait for "All" of the ruler in the status line to be shown.
Bram Moolenaar769e9d22018-04-11 20:53:49 +020063 " This can be quite slow (e.g. when using valgrind).
64 call WaitFor({-> len(term_getline(buf, rows)) >= cols - 1})
Bram Moolenaar1834d372018-03-29 17:40:46 +020065
Bram Moolenaarda650582018-02-20 15:51:40 +010066 return buf
67endfunc
68
69" Stop a Vim running in terminal buffer "buf".
70func StopVimInTerminal(buf)
71 call assert_equal("running", term_getstatus(a:buf))
Bram Moolenaar2b10bcb2018-02-24 21:25:44 +010072 call term_sendkeys(a:buf, "\<Esc>\<Esc>:qa!\<cr>")
Bram Moolenaar769e9d22018-04-11 20:53:49 +020073 call WaitFor('term_getstatus(' . a:buf . ') == "finished"')
Bram Moolenaarda650582018-02-20 15:51:40 +010074 only!
75endfunc
76
77" Verify that Vim running in terminal buffer "buf" matches the screen dump.
Bram Moolenaar6bb2cdf2018-02-24 19:53:53 +010078" "options" is passed to term_dumpwrite().
Bram Moolenaarda650582018-02-20 15:51:40 +010079" The file name used is "dumps/{filename}.dump".
80" Will wait for up to a second for the screen dump to match.
Bram Moolenaar6bb2cdf2018-02-24 19:53:53 +010081func VerifyScreenDump(buf, filename, options)
Bram Moolenaarda650582018-02-20 15:51:40 +010082 let reference = 'dumps/' . a:filename . '.dump'
83 let testfile = a:filename . '.dump.failed'
84
85 let i = 0
86 while 1
87 call delete(testfile)
Bram Moolenaar6bb2cdf2018-02-24 19:53:53 +010088 call term_dumpwrite(a:buf, testfile, a:options)
Bram Moolenaarda650582018-02-20 15:51:40 +010089 if readfile(reference) == readfile(testfile)
90 call delete(testfile)
91 break
92 endif
93 if i == 100
94 " Leave the test file around for inspection.
95 call assert_report('See dump file difference: call term_dumpdiff("' . testfile . '", "' . reference . '")')
96 break
97 endif
98 sleep 10m
99 let i += 1
100 endwhile
101endfunc