blob: 5c71d5023d3524c1769d17022fed6e3f609d72dc [file] [log] [blame]
ichizok663d18d2025-01-02 18:06:00 +01001" Test for getstacktrace() and v:stacktrace
2
zeertzjq6655bef2025-01-06 18:32:13 +01003import './vim9.vim' as v9
4
ichizok663d18d2025-01-02 18:06:00 +01005let s:thisfile = expand('%:p')
6let s:testdir = s:thisfile->fnamemodify(':h')
7
8func Filepath(name)
9 return s:testdir .. '/' .. a:name
10endfunc
11
12func 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):])
15endfunc
16
17func 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([
zeertzjq6655bef2025-01-06 18:32:13 +010039 \ #{funcref: funcref('Test_getstacktrace'), lnum: 37, filepath: s:thisfile},
ichizok663d18d2025-01-02 18:06:00 +010040 \ #{funcref: funcref('Xfunc1'), lnum: 5, filepath: Filepath('Xscript1')},
41 \ #{funcref: funcref('Xfunc2'), lnum: 4, filepath: Filepath('Xscript2')},
42 \ ], g:stacktrace)
43 unlet g:stacktrace
44endfunc
45
46func 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([
zeertzjq6655bef2025-01-06 18:32:13 +010066 \ #{funcref: funcref('Test_getstacktrace_event'), lnum: 64, filepath: s:thisfile},
ichizok663d18d2025-01-02 18:06:00 +010067 \ #{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
74endfunc
75
76func 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([
zeertzjq6655bef2025-01-06 18:32:13 +0100103 \ #{funcref: funcref('Test_vstacktrace'), lnum: 97, filepath: s:thisfile},
ichizok663d18d2025-01-02 18:06:00 +0100104 \ #{funcref: funcref('Xfunc1'), lnum: 5, filepath: Filepath('Xscript1')},
105 \ #{funcref: funcref('Xfunc2'), lnum: 4, filepath: Filepath('Xscript2')},
106 \ ], stacktrace)
107endfunc
108
zeertzjq6655bef2025-01-06 18:32:13 +0100109func 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)
130endfunc
131
ichizok663d18d2025-01-02 18:06:00 +0100132" vim: shiftwidth=2 sts=2 expandtab