ichizok | 663d18d | 2025-01-02 18:06:00 +0100 | [diff] [blame] | 1 | " Test for getstacktrace() and v:stacktrace |
| 2 | |
zeertzjq | 6655bef | 2025-01-06 18:32:13 +0100 | [diff] [blame] | 3 | import './vim9.vim' as v9 |
| 4 | |
ichizok | 663d18d | 2025-01-02 18:06:00 +0100 | [diff] [blame] | 5 | let s:thisfile = expand('%:p') |
| 6 | let s:testdir = s:thisfile->fnamemodify(':h') |
| 7 | |
| 8 | func Filepath(name) |
| 9 | return s:testdir .. '/' .. a:name |
| 10 | endfunc |
| 11 | |
| 12 | func AssertStacktrace(expect, actual) |
| 13 | call assert_equal(#{lnum: 617, filepath: Filepath('runtest.vim')}, a:actual[0]) |
| 14 | call assert_equal(a:expect, a:actual[-len(a:expect):]) |
| 15 | endfunc |
| 16 | |
| 17 | func Test_getstacktrace() |
| 18 | let g:stacktrace = [] |
| 19 | let lines1 =<< trim [SCRIPT] |
| 20 | " Xscript1 |
| 21 | source Xscript2 |
| 22 | func Xfunc1() |
| 23 | " Xfunc1 |
| 24 | call Xfunc2() |
| 25 | endfunc |
| 26 | [SCRIPT] |
| 27 | let lines2 =<< trim [SCRIPT] |
| 28 | " Xscript2 |
| 29 | func Xfunc2() |
| 30 | " Xfunc2 |
| 31 | let g:stacktrace = getstacktrace() |
| 32 | endfunc |
| 33 | [SCRIPT] |
| 34 | call writefile(lines1, 'Xscript1', 'D') |
| 35 | call writefile(lines2, 'Xscript2', 'D') |
| 36 | source Xscript1 |
| 37 | call Xfunc1() |
| 38 | call AssertStacktrace([ |
zeertzjq | 6655bef | 2025-01-06 18:32:13 +0100 | [diff] [blame] | 39 | \ #{funcref: funcref('Test_getstacktrace'), lnum: 37, filepath: s:thisfile}, |
ichizok | 663d18d | 2025-01-02 18:06:00 +0100 | [diff] [blame] | 40 | \ #{funcref: funcref('Xfunc1'), lnum: 5, filepath: Filepath('Xscript1')}, |
| 41 | \ #{funcref: funcref('Xfunc2'), lnum: 4, filepath: Filepath('Xscript2')}, |
| 42 | \ ], g:stacktrace) |
| 43 | unlet g:stacktrace |
| 44 | endfunc |
| 45 | |
| 46 | func Test_getstacktrace_event() |
| 47 | let g:stacktrace = [] |
| 48 | let lines1 =<< trim [SCRIPT] |
| 49 | " Xscript1 |
| 50 | func Xfunc() |
| 51 | " Xfunc |
| 52 | let g:stacktrace = getstacktrace() |
| 53 | endfunc |
| 54 | augroup test_stacktrace |
| 55 | autocmd SourcePre * call Xfunc() |
| 56 | augroup END |
| 57 | [SCRIPT] |
| 58 | let lines2 =<< trim [SCRIPT] |
| 59 | " Xscript2 |
| 60 | [SCRIPT] |
| 61 | call writefile(lines1, 'Xscript1', 'D') |
| 62 | call writefile(lines2, 'Xscript2', 'D') |
| 63 | source Xscript1 |
| 64 | source Xscript2 |
| 65 | call AssertStacktrace([ |
zeertzjq | 6655bef | 2025-01-06 18:32:13 +0100 | [diff] [blame] | 66 | \ #{funcref: funcref('Test_getstacktrace_event'), lnum: 64, filepath: s:thisfile}, |
ichizok | 663d18d | 2025-01-02 18:06:00 +0100 | [diff] [blame] | 67 | \ #{event: 'SourcePre Autocommands for "*"', lnum: 7, filepath: Filepath('Xscript1')}, |
| 68 | \ #{funcref: funcref('Xfunc'), lnum: 4, filepath: Filepath('Xscript1')}, |
| 69 | \ ], g:stacktrace) |
| 70 | augroup test_stacktrace |
| 71 | autocmd! |
| 72 | augroup END |
| 73 | unlet g:stacktrace |
| 74 | endfunc |
| 75 | |
| 76 | func Test_vstacktrace() |
| 77 | let lines1 =<< trim [SCRIPT] |
| 78 | " Xscript1 |
| 79 | source Xscript2 |
| 80 | func Xfunc1() |
| 81 | " Xfunc1 |
| 82 | call Xfunc2() |
| 83 | endfunc |
| 84 | [SCRIPT] |
| 85 | let lines2 =<< trim [SCRIPT] |
| 86 | " Xscript2 |
| 87 | func Xfunc2() |
| 88 | " Xfunc2 |
| 89 | throw 'Exception from Xfunc2' |
| 90 | endfunc |
| 91 | [SCRIPT] |
| 92 | call writefile(lines1, 'Xscript1', 'D') |
| 93 | call writefile(lines2, 'Xscript2', 'D') |
| 94 | source Xscript1 |
| 95 | call assert_equal([], v:stacktrace) |
| 96 | try |
| 97 | call Xfunc1() |
| 98 | catch |
| 99 | let stacktrace = v:stacktrace |
| 100 | endtry |
| 101 | call assert_equal([], v:stacktrace) |
| 102 | call AssertStacktrace([ |
zeertzjq | 6655bef | 2025-01-06 18:32:13 +0100 | [diff] [blame] | 103 | \ #{funcref: funcref('Test_vstacktrace'), lnum: 97, filepath: s:thisfile}, |
ichizok | 663d18d | 2025-01-02 18:06:00 +0100 | [diff] [blame] | 104 | \ #{funcref: funcref('Xfunc1'), lnum: 5, filepath: Filepath('Xscript1')}, |
| 105 | \ #{funcref: funcref('Xfunc2'), lnum: 4, filepath: Filepath('Xscript2')}, |
| 106 | \ ], stacktrace) |
| 107 | endfunc |
| 108 | |
zeertzjq | 6655bef | 2025-01-06 18:32:13 +0100 | [diff] [blame] | 109 | func Test_zzz_stacktrace_vim9() |
| 110 | let lines =<< trim [SCRIPT] |
| 111 | var stacktrace = getstacktrace() |
| 112 | assert_notequal([], stacktrace) |
| 113 | for d in stacktrace |
| 114 | assert_true(has_key(d, 'lnum')) |
| 115 | endfor |
| 116 | try |
| 117 | throw 'Exception from s:Func' |
| 118 | catch |
| 119 | assert_notequal([], v:stacktrace) |
| 120 | assert_equal(len(stacktrace), len(v:stacktrace)) |
| 121 | for d in v:stacktrace |
| 122 | assert_true(has_key(d, 'lnum')) |
| 123 | endfor |
| 124 | endtry |
| 125 | [SCRIPT] |
| 126 | call v9.CheckDefSuccess(lines) |
| 127 | " FIXME: v:stacktrace is not cleared after the exception handling, and this |
| 128 | " test has to be run as the last one because of this. |
| 129 | " call assert_equal([], v:stacktrace) |
| 130 | endfunc |
| 131 | |
ichizok | 663d18d | 2025-01-02 18:06:00 +0100 | [diff] [blame] | 132 | " vim: shiftwidth=2 sts=2 expandtab |