Bram Moolenaar | da65058 | 2018-02-20 15:51:40 +0100 | [diff] [blame] | 1 | " Functions shared by tests making screen dumps. |
| 2 | |
| 3 | " Only load this script once. |
Bram Moolenaar | 7a39dd7 | 2019-06-23 00:50:15 +0200 | [diff] [blame] | 4 | if exists('*VerifyScreenDump') |
Bram Moolenaar | da65058 | 2018-02-20 15:51:40 +0100 | [diff] [blame] | 5 | finish |
| 6 | endif |
| 7 | |
Bram Moolenaar | f273245 | 2018-06-03 14:47:35 +0200 | [diff] [blame] | 8 | " Skip the rest if there is no terminal feature at all. |
| 9 | if !has('terminal') |
Bram Moolenaar | 6bb2cdf | 2018-02-24 19:53:53 +0100 | [diff] [blame] | 10 | finish |
| 11 | endif |
| 12 | |
Bram Moolenaar | 1190139 | 2022-09-26 19:50:44 +0100 | [diff] [blame] | 13 | " Read a dump file "fname" and if "filter" exists apply it to the text. |
| 14 | def ReadAndFilter(fname: string, filter: string): list<string> |
| 15 | var contents = readfile(fname) |
| 16 | |
| 17 | if filereadable(filter) |
| 18 | # do this in the bottom window so that the terminal window is unaffected |
| 19 | wincmd j |
| 20 | enew |
| 21 | setline(1, contents) |
| 22 | exe "source " .. filter |
| 23 | contents = getline(1, '$') |
| 24 | enew! |
| 25 | wincmd k |
| 26 | redraw |
| 27 | endif |
| 28 | |
| 29 | return contents |
| 30 | enddef |
| 31 | |
| 32 | |
Bram Moolenaar | da65058 | 2018-02-20 15:51:40 +0100 | [diff] [blame] | 33 | " Verify that Vim running in terminal buffer "buf" matches the screen dump. |
Bram Moolenaar | 6bb2cdf | 2018-02-24 19:53:53 +0100 | [diff] [blame] | 34 | " "options" is passed to term_dumpwrite(). |
Bram Moolenaar | 3e79427 | 2022-05-06 11:21:19 +0100 | [diff] [blame] | 35 | " Additionally, the "wait" entry can specify the maximum time to wait for the |
| 36 | " screen dump to match in msec (default 1000 msec). |
Bram Moolenaar | da65058 | 2018-02-20 15:51:40 +0100 | [diff] [blame] | 37 | " The file name used is "dumps/{filename}.dump". |
Bram Moolenaar | 1190139 | 2022-09-26 19:50:44 +0100 | [diff] [blame] | 38 | " |
| 39 | " To ignore part of the dump, provide a "dumps/{filename}.vim" file with |
| 40 | " Vim commands to be applied to both the reference and the current dump, so |
| 41 | " that parts that are irrelevant are not used for the comparison. The result |
| 42 | " is NOT written, thus "term_dumpdiff()" shows the difference anyway. |
| 43 | " |
Bram Moolenaar | 6f8bdab | 2018-09-09 22:02:24 +0200 | [diff] [blame] | 44 | " Optionally an extra argument can be passed which is prepended to the error |
| 45 | " message. Use this when using the same dump file with different options. |
Bram Moolenaar | 6f8bdab | 2018-09-09 22:02:24 +0200 | [diff] [blame] | 46 | " Returns non-zero when verification fails. |
| 47 | func VerifyScreenDump(buf, filename, options, ...) |
Drew Vogel | ea67ba7 | 2025-05-07 22:05:17 +0200 | [diff] [blame] | 48 | if has('gui_running') && exists("g:check_screendump_called") && g:check_screendump_called == v:false |
| 49 | echoerr "VerifyScreenDump() called from a test that lacks a CheckScreendump guard." |
| 50 | return 1 |
| 51 | endif |
Bram Moolenaar | da65058 | 2018-02-20 15:51:40 +0100 | [diff] [blame] | 52 | let reference = 'dumps/' . a:filename . '.dump' |
Bram Moolenaar | 1190139 | 2022-09-26 19:50:44 +0100 | [diff] [blame] | 53 | let filter = 'dumps/' . a:filename . '.vim' |
Bram Moolenaar | ef7f0e3 | 2019-03-30 15:59:51 +0100 | [diff] [blame] | 54 | let testfile = 'failed/' . a:filename . '.dump' |
| 55 | |
Yee Cheng Chin | e70587d | 2025-02-13 20:55:45 +0100 | [diff] [blame] | 56 | let max_loops = get(a:options, 'wait', 1000) / 1 |
Bram Moolenaar | 3e79427 | 2022-05-06 11:21:19 +0100 | [diff] [blame] | 57 | |
Bram Moolenaar | 3cdcb09 | 2020-03-18 19:18:10 +0100 | [diff] [blame] | 58 | " Starting a terminal to make a screendump is always considered flaky. |
Bram Moolenaar | 30d53e2 | 2020-03-18 21:10:44 +0100 | [diff] [blame] | 59 | let g:test_is_flaky = 1 |
Milly | baab7c0 | 2024-10-28 21:56:14 +0100 | [diff] [blame] | 60 | let g:giveup_same_error = 0 |
Bram Moolenaar | 3cdcb09 | 2020-03-18 19:18:10 +0100 | [diff] [blame] | 61 | |
Yegappan Lakshmanan | 560dff4 | 2022-02-10 19:52:10 +0000 | [diff] [blame] | 62 | " wait for the pending updates to be handled. |
Yee Cheng Chin | e70587d | 2025-02-13 20:55:45 +0100 | [diff] [blame] | 63 | call TermWait(a:buf, 0) |
Yegappan Lakshmanan | 560dff4 | 2022-02-10 19:52:10 +0000 | [diff] [blame] | 64 | |
Bram Moolenaar | 1bc353b | 2019-09-01 14:45:28 +0200 | [diff] [blame] | 65 | " Redraw to execute the code that updates the screen. Otherwise we get the |
Bram Moolenaar | 87dcfd7 | 2019-04-13 22:35:29 +0200 | [diff] [blame] | 66 | " text and attributes only from the internal buffer. |
| 67 | redraw |
| 68 | |
Bram Moolenaar | 1190139 | 2022-09-26 19:50:44 +0100 | [diff] [blame] | 69 | if filereadable(reference) |
| 70 | let refdump = ReadAndFilter(reference, filter) |
| 71 | else |
| 72 | " Must be a new screendump, always fail |
| 73 | let refdump = [] |
| 74 | endif |
| 75 | |
Bram Moolenaar | ef7f0e3 | 2019-03-30 15:59:51 +0100 | [diff] [blame] | 76 | let did_mkdir = 0 |
| 77 | if !isdirectory('failed') |
| 78 | let did_mkdir = 1 |
| 79 | call mkdir('failed') |
| 80 | endif |
Bram Moolenaar | da65058 | 2018-02-20 15:51:40 +0100 | [diff] [blame] | 81 | |
| 82 | let i = 0 |
| 83 | while 1 |
Yee Cheng Chin | e70587d | 2025-02-13 20:55:45 +0100 | [diff] [blame] | 84 | " leave a bit of time for updating the original window while we spin wait. |
| 85 | sleep 1m |
Bram Moolenaar | da65058 | 2018-02-20 15:51:40 +0100 | [diff] [blame] | 86 | call delete(testfile) |
Bram Moolenaar | 6bb2cdf | 2018-02-24 19:53:53 +0100 | [diff] [blame] | 87 | call term_dumpwrite(a:buf, testfile, a:options) |
Milly | baab7c0 | 2024-10-28 21:56:14 +0100 | [diff] [blame] | 88 | |
| 89 | if refdump->empty() |
| 90 | let msg = 'See new dump file: call term_dumpload("testdir/' .. testfile .. '")' |
| 91 | call assert_report(msg) |
| 92 | " no point in retrying |
| 93 | let g:run_nr = 10 |
| 94 | return 1 |
| 95 | endif |
| 96 | |
Bram Moolenaar | 1190139 | 2022-09-26 19:50:44 +0100 | [diff] [blame] | 97 | let testdump = ReadAndFilter(testfile, filter) |
Bram Moolenaar | 353aca1 | 2019-02-21 17:05:59 +0100 | [diff] [blame] | 98 | if refdump == testdump |
Bram Moolenaar | da65058 | 2018-02-20 15:51:40 +0100 | [diff] [blame] | 99 | call delete(testfile) |
Bram Moolenaar | ef7f0e3 | 2019-03-30 15:59:51 +0100 | [diff] [blame] | 100 | if did_mkdir |
| 101 | call delete('failed', 'd') |
| 102 | endif |
Milly | baab7c0 | 2024-10-28 21:56:14 +0100 | [diff] [blame] | 103 | if i > 0 |
| 104 | call remove(v:errors, -1) |
| 105 | endif |
Bram Moolenaar | da65058 | 2018-02-20 15:51:40 +0100 | [diff] [blame] | 106 | break |
| 107 | endif |
Milly | baab7c0 | 2024-10-28 21:56:14 +0100 | [diff] [blame] | 108 | |
| 109 | " Leave the failed dump around for inspection. |
| 110 | let msg = 'See dump file difference: call term_dumpdiff("testdir/' .. testfile .. '", "testdir/' .. reference .. '")' |
| 111 | if a:0 == 1 |
| 112 | let msg = a:1 . ': ' . msg |
| 113 | endif |
| 114 | if len(testdump) != len(refdump) |
| 115 | let msg = msg . '; line count is ' . len(testdump) . ' instead of ' . len(refdump) |
| 116 | endif |
| 117 | for j in range(len(refdump)) |
| 118 | if j >= len(testdump) |
| 119 | break |
Bram Moolenaar | 353aca1 | 2019-02-21 17:05:59 +0100 | [diff] [blame] | 120 | endif |
Milly | baab7c0 | 2024-10-28 21:56:14 +0100 | [diff] [blame] | 121 | if testdump[j] != refdump[j] |
| 122 | let msg = msg . '; difference in line ' . (j + 1) . ': "' . testdump[j] . '"' |
| 123 | endif |
| 124 | endfor |
| 125 | |
| 126 | " Always add the last error so that it is displayed on timeout. |
| 127 | " See TestTimeout() in runtest.vim. |
| 128 | if i > 0 |
| 129 | call remove(v:errors, -1) |
| 130 | endif |
| 131 | call assert_report(msg) |
| 132 | |
| 133 | let i += 1 |
| 134 | if i >= max_loops |
Bram Moolenaar | 6f8bdab | 2018-09-09 22:02:24 +0200 | [diff] [blame] | 135 | return 1 |
Bram Moolenaar | da65058 | 2018-02-20 15:51:40 +0100 | [diff] [blame] | 136 | endif |
Bram Moolenaar | da65058 | 2018-02-20 15:51:40 +0100 | [diff] [blame] | 137 | endwhile |
Bram Moolenaar | 6f8bdab | 2018-09-09 22:02:24 +0200 | [diff] [blame] | 138 | return 0 |
Bram Moolenaar | da65058 | 2018-02-20 15:51:40 +0100 | [diff] [blame] | 139 | endfunc |