blob: 8cdb6efb513bac87e818fb6b824dd2dabb07e689 [file] [log] [blame]
ichizok663d18d2025-01-02 18:06:00 +01001" Test for getstacktrace() and v:stacktrace
2
3let s:thisfile = expand('%:p')
4let s:testdir = s:thisfile->fnamemodify(':h')
5
6func Filepath(name)
7 return s:testdir .. '/' .. a:name
8endfunc
9
10func AssertStacktrace(expect, actual)
11 call assert_equal(#{lnum: 617, filepath: Filepath('runtest.vim')}, a:actual[0])
12 call assert_equal(a:expect, a:actual[-len(a:expect):])
13endfunc
14
15func Test_getstacktrace()
16 let g:stacktrace = []
17 let lines1 =<< trim [SCRIPT]
18 " Xscript1
19 source Xscript2
20 func Xfunc1()
21 " Xfunc1
22 call Xfunc2()
23 endfunc
24 [SCRIPT]
25 let lines2 =<< trim [SCRIPT]
26 " Xscript2
27 func Xfunc2()
28 " Xfunc2
29 let g:stacktrace = getstacktrace()
30 endfunc
31 [SCRIPT]
32 call writefile(lines1, 'Xscript1', 'D')
33 call writefile(lines2, 'Xscript2', 'D')
34 source Xscript1
35 call Xfunc1()
36 call AssertStacktrace([
37 \ #{funcref: funcref('Test_getstacktrace'), lnum: 35, filepath: s:thisfile},
38 \ #{funcref: funcref('Xfunc1'), lnum: 5, filepath: Filepath('Xscript1')},
39 \ #{funcref: funcref('Xfunc2'), lnum: 4, filepath: Filepath('Xscript2')},
40 \ ], g:stacktrace)
41 unlet g:stacktrace
42endfunc
43
44func Test_getstacktrace_event()
45 let g:stacktrace = []
46 let lines1 =<< trim [SCRIPT]
47 " Xscript1
48 func Xfunc()
49 " Xfunc
50 let g:stacktrace = getstacktrace()
51 endfunc
52 augroup test_stacktrace
53 autocmd SourcePre * call Xfunc()
54 augroup END
55 [SCRIPT]
56 let lines2 =<< trim [SCRIPT]
57 " Xscript2
58 [SCRIPT]
59 call writefile(lines1, 'Xscript1', 'D')
60 call writefile(lines2, 'Xscript2', 'D')
61 source Xscript1
62 source Xscript2
63 call AssertStacktrace([
64 \ #{funcref: funcref('Test_getstacktrace_event'), lnum: 62, filepath: s:thisfile},
65 \ #{event: 'SourcePre Autocommands for "*"', lnum: 7, filepath: Filepath('Xscript1')},
66 \ #{funcref: funcref('Xfunc'), lnum: 4, filepath: Filepath('Xscript1')},
67 \ ], g:stacktrace)
68 augroup test_stacktrace
69 autocmd!
70 augroup END
71 unlet g:stacktrace
72endfunc
73
74func Test_vstacktrace()
75 let lines1 =<< trim [SCRIPT]
76 " Xscript1
77 source Xscript2
78 func Xfunc1()
79 " Xfunc1
80 call Xfunc2()
81 endfunc
82 [SCRIPT]
83 let lines2 =<< trim [SCRIPT]
84 " Xscript2
85 func Xfunc2()
86 " Xfunc2
87 throw 'Exception from Xfunc2'
88 endfunc
89 [SCRIPT]
90 call writefile(lines1, 'Xscript1', 'D')
91 call writefile(lines2, 'Xscript2', 'D')
92 source Xscript1
93 call assert_equal([], v:stacktrace)
94 try
95 call Xfunc1()
96 catch
97 let stacktrace = v:stacktrace
98 endtry
99 call assert_equal([], v:stacktrace)
100 call AssertStacktrace([
101 \ #{funcref: funcref('Test_vstacktrace'), lnum: 95, filepath: s:thisfile},
102 \ #{funcref: funcref('Xfunc1'), lnum: 5, filepath: Filepath('Xscript1')},
103 \ #{funcref: funcref('Xfunc2'), lnum: 4, filepath: Filepath('Xscript2')},
104 \ ], stacktrace)
105endfunc
106
107" vim: shiftwidth=2 sts=2 expandtab