test_stacktrace.vim (3905B)
1 " Test for getstacktrace() and v:stacktrace 2 3 source vim9.vim 4 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(Filepath('runtest.vim'), a:actual[0]['filepath']) 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([ 39 \ #{funcref: funcref('Test_getstacktrace'), lnum: 37, filepath: s:thisfile}, 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([ 66 \ #{funcref: funcref('Test_getstacktrace_event'), lnum: 64, filepath: s:thisfile}, 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 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 106 endtry 107 call assert_equal([], v:stacktrace) 108 call AssertStacktrace([ 109 \ #{funcref: funcref('Test_vstacktrace'), lnum: 97, filepath: s:thisfile}, 110 \ #{funcref: funcref('Xfunc1'), lnum: 5, filepath: Filepath('Xscript1')}, 111 \ #{funcref: funcref('Xfunc2'), lnum: 4, filepath: Filepath('Xscript2')}, 112 \ ], stacktrace) 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) 119 endfunc 120 121 func Test_stacktrace_vim9() 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 137 call assert_equal([], v:stacktrace) 138 [SCRIPT] 139 call CheckDefSuccess(lines) 140 endfunc 141 142 " vim: shiftwidth=2 sts=2 expandtab