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