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 | da65058 | 2018-02-20 15:51:40 +0100 | [diff] [blame] | 16 | " Verify that Vim running in terminal buffer "buf" matches the screen dump. |
Bram Moolenaar | 6bb2cdf | 2018-02-24 19:53:53 +0100 | [diff] [blame] | 17 | " "options" is passed to term_dumpwrite(). |
Bram Moolenaar | da65058 | 2018-02-20 15:51:40 +0100 | [diff] [blame] | 18 | " The file name used is "dumps/{filename}.dump". |
Bram Moolenaar | 6f8bdab | 2018-09-09 22:02:24 +0200 | [diff] [blame] | 19 | " Optionally an extra argument can be passed which is prepended to the error |
| 20 | " message. Use this when using the same dump file with different options. |
Bram Moolenaar | da65058 | 2018-02-20 15:51:40 +0100 | [diff] [blame] | 21 | " Will wait for up to a second for the screen dump to match. |
Bram Moolenaar | 6f8bdab | 2018-09-09 22:02:24 +0200 | [diff] [blame] | 22 | " Returns non-zero when verification fails. |
| 23 | func VerifyScreenDump(buf, filename, options, ...) |
Bram Moolenaar | da65058 | 2018-02-20 15:51:40 +0100 | [diff] [blame] | 24 | let reference = 'dumps/' . a:filename . '.dump' |
Bram Moolenaar | ef7f0e3 | 2019-03-30 15:59:51 +0100 | [diff] [blame] | 25 | let testfile = 'failed/' . a:filename . '.dump' |
| 26 | |
Bram Moolenaar | 1bc353b | 2019-09-01 14:45:28 +0200 | [diff] [blame] | 27 | " 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] | 28 | " text and attributes only from the internal buffer. |
| 29 | redraw |
| 30 | |
Bram Moolenaar | ef7f0e3 | 2019-03-30 15:59:51 +0100 | [diff] [blame] | 31 | let did_mkdir = 0 |
| 32 | if !isdirectory('failed') |
| 33 | let did_mkdir = 1 |
| 34 | call mkdir('failed') |
| 35 | endif |
Bram Moolenaar | da65058 | 2018-02-20 15:51:40 +0100 | [diff] [blame] | 36 | |
| 37 | let i = 0 |
| 38 | while 1 |
Bram Moolenaar | b6fc728 | 2018-12-04 22:24:16 +0100 | [diff] [blame] | 39 | " leave some time for updating the original window |
| 40 | sleep 10m |
Bram Moolenaar | da65058 | 2018-02-20 15:51:40 +0100 | [diff] [blame] | 41 | call delete(testfile) |
Bram Moolenaar | 6bb2cdf | 2018-02-24 19:53:53 +0100 | [diff] [blame] | 42 | call term_dumpwrite(a:buf, testfile, a:options) |
Bram Moolenaar | 353aca1 | 2019-02-21 17:05:59 +0100 | [diff] [blame] | 43 | let testdump = readfile(testfile) |
Bram Moolenaar | 2d7260d | 2019-04-06 20:51:52 +0200 | [diff] [blame] | 44 | if filereadable(reference) |
| 45 | let refdump = readfile(reference) |
| 46 | else |
| 47 | " Must be a new screendump, always fail |
| 48 | let refdump = [] |
| 49 | endif |
Bram Moolenaar | 353aca1 | 2019-02-21 17:05:59 +0100 | [diff] [blame] | 50 | if refdump == testdump |
Bram Moolenaar | da65058 | 2018-02-20 15:51:40 +0100 | [diff] [blame] | 51 | call delete(testfile) |
Bram Moolenaar | ef7f0e3 | 2019-03-30 15:59:51 +0100 | [diff] [blame] | 52 | if did_mkdir |
| 53 | call delete('failed', 'd') |
| 54 | endif |
Bram Moolenaar | da65058 | 2018-02-20 15:51:40 +0100 | [diff] [blame] | 55 | break |
| 56 | endif |
| 57 | if i == 100 |
Bram Moolenaar | 2d7260d | 2019-04-06 20:51:52 +0200 | [diff] [blame] | 58 | " Leave the failed dump around for inspection. |
| 59 | if filereadable(reference) |
Bram Moolenaar | 8a5c7ef | 2019-06-16 16:14:20 +0200 | [diff] [blame] | 60 | let msg = 'See dump file difference: call term_dumpdiff("testdir/' .. testfile .. '", "testdir/' .. reference .. '")' |
Bram Moolenaar | 2d7260d | 2019-04-06 20:51:52 +0200 | [diff] [blame] | 61 | if a:0 == 1 |
| 62 | let msg = a:1 . ': ' . msg |
| 63 | endif |
| 64 | if len(testdump) != len(refdump) |
| 65 | let msg = msg . '; line count is ' . len(testdump) . ' instead of ' . len(refdump) |
| 66 | endif |
| 67 | else |
Bram Moolenaar | 8a5c7ef | 2019-06-16 16:14:20 +0200 | [diff] [blame] | 68 | let msg = 'See new dump file: call term_dumpload("testdir/' .. testfile .. '")' |
Bram Moolenaar | 353aca1 | 2019-02-21 17:05:59 +0100 | [diff] [blame] | 69 | endif |
| 70 | for i in range(len(refdump)) |
| 71 | if i >= len(testdump) |
| 72 | break |
| 73 | endif |
| 74 | if testdump[i] != refdump[i] |
| 75 | let msg = msg . '; difference in line ' . (i + 1) . ': "' . testdump[i] . '"' |
| 76 | endif |
| 77 | endfor |
Bram Moolenaar | 6f8bdab | 2018-09-09 22:02:24 +0200 | [diff] [blame] | 78 | call assert_report(msg) |
| 79 | return 1 |
Bram Moolenaar | da65058 | 2018-02-20 15:51:40 +0100 | [diff] [blame] | 80 | endif |
Bram Moolenaar | da65058 | 2018-02-20 15:51:40 +0100 | [diff] [blame] | 81 | let i += 1 |
| 82 | endwhile |
Bram Moolenaar | 6f8bdab | 2018-09-09 22:02:24 +0200 | [diff] [blame] | 83 | return 0 |
Bram Moolenaar | da65058 | 2018-02-20 15:51:40 +0100 | [diff] [blame] | 84 | endfunc |