blob: 77ea28f94fade0ef50e662ca2ec3671b77b787c3 [file] [log] [blame]
ichizok663d18d2025-01-02 18:06:00 +01001" Test for getstacktrace() and v:stacktrace
2
Christian Brabandteb380b92025-07-07 20:53:55 +02003import './util/vim9.vim' as v9
zeertzjq6655bef2025-01-06 18:32:13 +01004
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)
Yee Cheng Chin2051af12025-01-09 22:14:34 +010013 call assert_equal(Filepath('runtest.vim'), a:actual[0]['filepath'])
ichizok663d18d2025-01-02 18:06:00 +010014 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
Yee Cheng Chin2051af12025-01-09 22:14:34 +0100100 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
ichizok663d18d2025-01-02 18:06:00 +0100106 endtry
107 call assert_equal([], v:stacktrace)
108 call AssertStacktrace([
zeertzjq6655bef2025-01-06 18:32:13 +0100109 \ #{funcref: funcref('Test_vstacktrace'), lnum: 97, filepath: s:thisfile},
ichizok663d18d2025-01-02 18:06:00 +0100110 \ #{funcref: funcref('Xfunc1'), lnum: 5, filepath: Filepath('Xscript1')},
111 \ #{funcref: funcref('Xfunc2'), lnum: 4, filepath: Filepath('Xscript2')},
112 \ ], stacktrace)
Yee Cheng Chin2051af12025-01-09 22:14:34 +0100113 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)
ichizok663d18d2025-01-02 18:06:00 +0100119endfunc
120
Yee Cheng Chin2051af12025-01-09 22:14:34 +0100121func Test_stacktrace_vim9()
zeertzjq6655bef2025-01-06 18:32:13 +0100122 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 Chin2051af12025-01-09 22:14:34 +0100137 call assert_equal([], v:stacktrace)
zeertzjq6655bef2025-01-06 18:32:13 +0100138 [SCRIPT]
139 call v9.CheckDefSuccess(lines)
zeertzjq6655bef2025-01-06 18:32:13 +0100140endfunc
141
ichizok663d18d2025-01-02 18:06:00 +0100142" vim: shiftwidth=2 sts=2 expandtab