ichizok | 663d18d | 2025-01-02 18:06:00 +0100 | [diff] [blame] | 1 | " Test for getstacktrace() and v:stacktrace |
| 2 | |
Christian Brabandt | eb380b9 | 2025-07-07 20:53:55 +0200 | [diff] [blame] | 3 | import './util/vim9.vim' as v9 |
zeertzjq | 6655bef | 2025-01-06 18:32:13 +0100 | [diff] [blame] | 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) |
Yee Cheng Chin | 2051af1 | 2025-01-09 22:14:34 +0100 | [diff] [blame] | 13 | call assert_equal(Filepath('runtest.vim'), a:actual[0]['filepath']) |
ichizok | 663d18d | 2025-01-02 18:06:00 +0100 | [diff] [blame] | 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 |
Yee Cheng Chin | 2051af1 | 2025-01-09 22:14:34 +0100 | [diff] [blame] | 100 | try |
| 101 | call Xfunc1() |
| 102 | catch |
| 103 | let stacktrace_inner = v:stacktrace |
| 104 | endtry |
| 105 | let stacktrace_after = v:stacktrace " should be restored by the exception stack to the previous one |
ichizok | 663d18d | 2025-01-02 18:06:00 +0100 | [diff] [blame] | 106 | endtry |
| 107 | call assert_equal([], v:stacktrace) |
| 108 | call AssertStacktrace([ |
zeertzjq | 6655bef | 2025-01-06 18:32:13 +0100 | [diff] [blame] | 109 | \ #{funcref: funcref('Test_vstacktrace'), lnum: 97, filepath: s:thisfile}, |
ichizok | 663d18d | 2025-01-02 18:06:00 +0100 | [diff] [blame] | 110 | \ #{funcref: funcref('Xfunc1'), lnum: 5, filepath: Filepath('Xscript1')}, |
| 111 | \ #{funcref: funcref('Xfunc2'), lnum: 4, filepath: Filepath('Xscript2')}, |
| 112 | \ ], stacktrace) |
Yee Cheng Chin | 2051af1 | 2025-01-09 22:14:34 +0100 | [diff] [blame] | 113 | call AssertStacktrace([ |
| 114 | \ #{funcref: funcref('Test_vstacktrace'), lnum: 101, filepath: s:thisfile}, |
| 115 | \ #{funcref: funcref('Xfunc1'), lnum: 5, filepath: Filepath('Xscript1')}, |
| 116 | \ #{funcref: funcref('Xfunc2'), lnum: 4, filepath: Filepath('Xscript2')}, |
| 117 | \ ], stacktrace_inner) |
| 118 | call assert_equal(stacktrace, stacktrace_after) |
ichizok | 663d18d | 2025-01-02 18:06:00 +0100 | [diff] [blame] | 119 | endfunc |
| 120 | |
Yee Cheng Chin | 2051af1 | 2025-01-09 22:14:34 +0100 | [diff] [blame] | 121 | func Test_stacktrace_vim9() |
zeertzjq | 6655bef | 2025-01-06 18:32:13 +0100 | [diff] [blame] | 122 | let lines =<< trim [SCRIPT] |
| 123 | var stacktrace = getstacktrace() |
| 124 | assert_notequal([], stacktrace) |
| 125 | for d in stacktrace |
| 126 | assert_true(has_key(d, 'lnum')) |
| 127 | endfor |
| 128 | try |
| 129 | throw 'Exception from s:Func' |
| 130 | catch |
| 131 | assert_notequal([], v:stacktrace) |
| 132 | assert_equal(len(stacktrace), len(v:stacktrace)) |
| 133 | for d in v:stacktrace |
| 134 | assert_true(has_key(d, 'lnum')) |
| 135 | endfor |
| 136 | endtry |
Yee Cheng Chin | 2051af1 | 2025-01-09 22:14:34 +0100 | [diff] [blame] | 137 | call assert_equal([], v:stacktrace) |
zeertzjq | 6655bef | 2025-01-06 18:32:13 +0100 | [diff] [blame] | 138 | [SCRIPT] |
| 139 | call v9.CheckDefSuccess(lines) |
zeertzjq | 6655bef | 2025-01-06 18:32:13 +0100 | [diff] [blame] | 140 | endfunc |
| 141 | |
ichizok | 663d18d | 2025-01-02 18:06:00 +0100 | [diff] [blame] | 142 | " vim: shiftwidth=2 sts=2 expandtab |