xref: /vim-8.2.3635/src/testdir/test_profile.vim (revision 8c801b37)
1296b1f28SBram Moolenaar" Test Vim profiler
2b0f94c1fSBram Moolenaar
3b46fecd3SBram Moolenaarsource check.vim
4b46fecd3SBram MoolenaarCheckFeature profile
5296b1f28SBram Moolenaar
693344c2dSBram Moolenaarsource shared.vim
716358800SBram Moolenaarsource screendump.vim
8e5ea346aSBram Moolenaarsource vim9.vim
993344c2dSBram Moolenaar
10296b1f28SBram Moolenaarfunc Test_profile_func()
11b2049903SBram Moolenaar  call RunProfileFunc('func', 'let', 'let')
12b2049903SBram Moolenaar  call RunProfileFunc('def', 'var', '')
13b2049903SBram Moolenaarendfunc
14b2049903SBram Moolenaar
15b2049903SBram Moolenaarfunc RunProfileFunc(command, declare, assign)
16c79745a8SBram Moolenaar  let lines =<< trim [CODE]
17c79745a8SBram Moolenaar    profile start Xprofile_func.log
18c79745a8SBram Moolenaar    profile func Foo*
19b2049903SBram Moolenaar    XXX Foo1()
20b2049903SBram Moolenaar    endXXX
21b2049903SBram Moolenaar    XXX Foo2()
22b2049903SBram Moolenaar      DDD counter = 100
23b2049903SBram Moolenaar      while counter > 0
24b2049903SBram Moolenaar        AAA counter = counter - 1
25c79745a8SBram Moolenaar      endwhile
26a21df1dbSBram Moolenaar      sleep 1m
27b2049903SBram Moolenaar    endXXX
28b2049903SBram Moolenaar    XXX Foo3()
29b2049903SBram Moolenaar    endXXX
30b2049903SBram Moolenaar    XXX Bar()
31b2049903SBram Moolenaar    endXXX
32c79745a8SBram Moolenaar    call Foo1()
33c79745a8SBram Moolenaar    call Foo1()
34c79745a8SBram Moolenaar    profile pause
35c79745a8SBram Moolenaar    call Foo1()
36c79745a8SBram Moolenaar    profile continue
37c79745a8SBram Moolenaar    call Foo2()
38c79745a8SBram Moolenaar    call Foo3()
39c79745a8SBram Moolenaar    call Bar()
40c79745a8SBram Moolenaar    if !v:profiling
41c79745a8SBram Moolenaar      delfunc Foo2
42c79745a8SBram Moolenaar    endif
43c79745a8SBram Moolenaar    delfunc Foo3
44c79745a8SBram Moolenaar  [CODE]
45296b1f28SBram Moolenaar
46b2049903SBram Moolenaar  call map(lines, {k, v -> substitute(v, 'XXX', a:command, '') })
47b2049903SBram Moolenaar  call map(lines, {k, v -> substitute(v, 'DDD', a:declare, '') })
48b2049903SBram Moolenaar  call map(lines, {k, v -> substitute(v, 'AAA', a:assign, '') })
49b2049903SBram Moolenaar
50296b1f28SBram Moolenaar  call writefile(lines, 'Xprofile_func.vim')
5193344c2dSBram Moolenaar  call system(GetVimCommand()
521fbfe7c4SBram Moolenaar    \ . ' -es --clean'
53c011a3d0SBram Moolenaar    \ . ' -c "so Xprofile_func.vim"'
54c011a3d0SBram Moolenaar    \ . ' -c "qall!"')
55c011a3d0SBram Moolenaar  call assert_equal(0, v:shell_error)
56c011a3d0SBram Moolenaar
57296b1f28SBram Moolenaar  let lines = readfile('Xprofile_func.log')
58296b1f28SBram Moolenaar
59296b1f28SBram Moolenaar  " - Foo1() is called 3 times but should be reported as called twice
60296b1f28SBram Moolenaar  "   since one call is in between "profile pause" .. "profile continue".
61c011a3d0SBram Moolenaar  " - Foo2() should come before Foo1() since Foo1() does much more work.
62296b1f28SBram Moolenaar  " - Foo3() is not reported because function is deleted.
63296b1f28SBram Moolenaar  " - Unlike Foo3(), Foo2() should not be deleted since there is a check
64296b1f28SBram Moolenaar  "   for v:profiling.
65296b1f28SBram Moolenaar  " - Bar() is not reported since it does not match "profile func Foo*".
66a21df1dbSBram Moolenaar  call assert_equal(31, len(lines))
67c011a3d0SBram Moolenaar
68c011a3d0SBram Moolenaar  call assert_equal('FUNCTION  Foo1()',                            lines[0])
69181d4f58SBram Moolenaar  call assert_match('Defined:.*Xprofile_func.vim:3',               lines[1])
704c7b08f6SBram Moolenaar  call assert_equal('Called 2 times',                              lines[2])
714c7b08f6SBram Moolenaar  call assert_match('^Total time:\s\+\d\+\.\d\+$',                 lines[3])
724c7b08f6SBram Moolenaar  call assert_match('^ Self time:\s\+\d\+\.\d\+$',                 lines[4])
734c7b08f6SBram Moolenaar  call assert_equal('',                                            lines[5])
744c7b08f6SBram Moolenaar  call assert_equal('count  total (s)   self (s)',                 lines[6])
754c7b08f6SBram Moolenaar  call assert_equal('',                                            lines[7])
764c7b08f6SBram Moolenaar  call assert_equal('FUNCTION  Foo2()',                            lines[8])
774c7b08f6SBram Moolenaar  call assert_equal('Called 1 time',                               lines[10])
784c7b08f6SBram Moolenaar  call assert_match('^Total time:\s\+\d\+\.\d\+$',                 lines[11])
794c7b08f6SBram Moolenaar  call assert_match('^ Self time:\s\+\d\+\.\d\+$',                 lines[12])
804c7b08f6SBram Moolenaar  call assert_equal('',                                            lines[13])
814c7b08f6SBram Moolenaar  call assert_equal('count  total (s)   self (s)',                 lines[14])
82b2049903SBram Moolenaar  call assert_match('^\s*1\s\+.*\s\(let\|var\) counter = 100$',    lines[15])
83b2049903SBram Moolenaar  call assert_match('^\s*101\s\+.*\swhile counter > 0$',           lines[16])
84b2049903SBram Moolenaar  call assert_match('^\s*100\s\+.*\s  \(let\)\= counter = counter - 1$', lines[17])
85b2049903SBram Moolenaar  call assert_match('^\s*10[01]\s\+.*\sendwhile$',                 lines[18])
86a21df1dbSBram Moolenaar  call assert_match('^\s*1\s\+.\+sleep 1m$',                       lines[19])
87a21df1dbSBram Moolenaar  call assert_equal('',                                            lines[20])
88a21df1dbSBram Moolenaar  call assert_equal('FUNCTIONS SORTED ON TOTAL TIME',              lines[21])
89a21df1dbSBram Moolenaar  call assert_equal('count  total (s)   self (s)  function',       lines[22])
90a21df1dbSBram Moolenaar  call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo2()$',              lines[23])
91a21df1dbSBram Moolenaar  call assert_match('^\s*2\s\+\d\+\.\d\+\s\+Foo1()$',              lines[24])
92a21df1dbSBram Moolenaar  call assert_equal('',                                            lines[25])
93a21df1dbSBram Moolenaar  call assert_equal('FUNCTIONS SORTED ON SELF TIME',               lines[26])
94a21df1dbSBram Moolenaar  call assert_equal('count  total (s)   self (s)  function',       lines[27])
95a21df1dbSBram Moolenaar  call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo2()$',              lines[28])
96a21df1dbSBram Moolenaar  call assert_match('^\s*2\s\+\d\+\.\d\+\s\+Foo1()$',              lines[29])
97a21df1dbSBram Moolenaar  call assert_equal('',                                            lines[30])
98296b1f28SBram Moolenaar
99296b1f28SBram Moolenaar  call delete('Xprofile_func.vim')
100296b1f28SBram Moolenaar  call delete('Xprofile_func.log')
101296b1f28SBram Moolenaarendfunc
102296b1f28SBram Moolenaar
1037feb35e7SBram Moolenaarfunc Test_profile_func_with_ifelse()
104107e9cecSBram Moolenaar  call Run_profile_func_with_ifelse('func', 'let')
105107e9cecSBram Moolenaar  call Run_profile_func_with_ifelse('def', 'var')
106ced68a00SBram Moolenaarendfunc
107ced68a00SBram Moolenaar
108107e9cecSBram Moolenaarfunc Run_profile_func_with_ifelse(command, declare)
109c79745a8SBram Moolenaar  let lines =<< trim [CODE]
110ced68a00SBram Moolenaar    XXX Foo1()
111c79745a8SBram Moolenaar      if 1
112ced68a00SBram Moolenaar        DDD x = 0
113c79745a8SBram Moolenaar      elseif 1
114ced68a00SBram Moolenaar        DDD x = 1
115c79745a8SBram Moolenaar      else
116ced68a00SBram Moolenaar        DDD x = 2
117c79745a8SBram Moolenaar      endif
118ced68a00SBram Moolenaar    endXXX
119ced68a00SBram Moolenaar    XXX Foo2()
120c79745a8SBram Moolenaar      if 0
121ced68a00SBram Moolenaar        DDD x = 0
122c79745a8SBram Moolenaar      elseif 1
123ced68a00SBram Moolenaar        DDD x = 1
124c79745a8SBram Moolenaar      else
125ced68a00SBram Moolenaar        DDD x = 2
126c79745a8SBram Moolenaar      endif
127ced68a00SBram Moolenaar    endXXX
128ced68a00SBram Moolenaar    XXX Foo3()
129c79745a8SBram Moolenaar      if 0
130ced68a00SBram Moolenaar        DDD x = 0
131c79745a8SBram Moolenaar      elseif 0
132ced68a00SBram Moolenaar        DDD x = 1
133c79745a8SBram Moolenaar      else
134ced68a00SBram Moolenaar        DDD x = 2
135c79745a8SBram Moolenaar      endif
136ced68a00SBram Moolenaar    endXXX
137c79745a8SBram Moolenaar    call Foo1()
138c79745a8SBram Moolenaar    call Foo2()
139c79745a8SBram Moolenaar    call Foo3()
140c79745a8SBram Moolenaar  [CODE]
1417feb35e7SBram Moolenaar
142ced68a00SBram Moolenaar  call map(lines, {k, v -> substitute(v, 'XXX', a:command, '') })
143ced68a00SBram Moolenaar  call map(lines, {k, v -> substitute(v, 'DDD', a:declare, '') })
144ced68a00SBram Moolenaar
1457feb35e7SBram Moolenaar  call writefile(lines, 'Xprofile_func.vim')
14693344c2dSBram Moolenaar  call system(GetVimCommand()
14793344c2dSBram Moolenaar    \ . ' -es -i NONE --noplugin'
1487feb35e7SBram Moolenaar    \ . ' -c "profile start Xprofile_func.log"'
1497feb35e7SBram Moolenaar    \ . ' -c "profile func Foo*"'
1507feb35e7SBram Moolenaar    \ . ' -c "so Xprofile_func.vim"'
1517feb35e7SBram Moolenaar    \ . ' -c "qall!"')
1527feb35e7SBram Moolenaar  call assert_equal(0, v:shell_error)
1537feb35e7SBram Moolenaar
1547feb35e7SBram Moolenaar  let lines = readfile('Xprofile_func.log')
1557feb35e7SBram Moolenaar
1567feb35e7SBram Moolenaar  " - Foo1() should pass 'if' block.
1577feb35e7SBram Moolenaar  " - Foo2() should pass 'elseif' block.
1587feb35e7SBram Moolenaar  " - Foo3() should pass 'else' block.
1594c7b08f6SBram Moolenaar  call assert_equal(57, len(lines))
1607feb35e7SBram Moolenaar
1617feb35e7SBram Moolenaar  call assert_equal('FUNCTION  Foo1()',                            lines[0])
1624c7b08f6SBram Moolenaar  call assert_match('Defined:.*Xprofile_func.vim',                 lines[1])
1634c7b08f6SBram Moolenaar  call assert_equal('Called 1 time',                               lines[2])
1644c7b08f6SBram Moolenaar  call assert_match('^Total time:\s\+\d\+\.\d\+$',                 lines[3])
1654c7b08f6SBram Moolenaar  call assert_match('^ Self time:\s\+\d\+\.\d\+$',                 lines[4])
1664c7b08f6SBram Moolenaar  call assert_equal('',                                            lines[5])
1674c7b08f6SBram Moolenaar  call assert_equal('count  total (s)   self (s)',                 lines[6])
1684c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+.*\sif 1$',                          lines[7])
169ced68a00SBram Moolenaar  call assert_match('^\s*1\s\+.*\s  \(let\|var\) x = 0$',          lines[8])
1704c7b08f6SBram Moolenaar  call assert_match(        '^\s\+elseif 1$',                      lines[9])
171ced68a00SBram Moolenaar  call assert_match(          '^\s\+\(let\|var\) x = 1$',          lines[10])
1724c7b08f6SBram Moolenaar  call assert_match(        '^\s\+else$',                          lines[11])
173ced68a00SBram Moolenaar  call assert_match(          '^\s\+\(let\|var\) x = 2$',          lines[12])
1744c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+.*\sendif$',                         lines[13])
1754c7b08f6SBram Moolenaar  call assert_equal('',                                            lines[14])
1764c7b08f6SBram Moolenaar  call assert_equal('FUNCTION  Foo2()',                            lines[15])
1774c7b08f6SBram Moolenaar  call assert_equal('Called 1 time',                               lines[17])
1784c7b08f6SBram Moolenaar  call assert_match('^Total time:\s\+\d\+\.\d\+$',                 lines[18])
1794c7b08f6SBram Moolenaar  call assert_match('^ Self time:\s\+\d\+\.\d\+$',                 lines[19])
1804c7b08f6SBram Moolenaar  call assert_equal('',                                            lines[20])
1814c7b08f6SBram Moolenaar  call assert_equal('count  total (s)   self (s)',                 lines[21])
1824c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+.*\sif 0$',                          lines[22])
183ced68a00SBram Moolenaar  call assert_match(          '^\s\+\(let\|var\) x = 0$',          lines[23])
1844c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+.*\selseif 1$',                      lines[24])
185ced68a00SBram Moolenaar  call assert_match('^\s*1\s\+.*\s  \(let\|var\) x = 1$',          lines[25])
1864c7b08f6SBram Moolenaar  call assert_match(        '^\s\+else$',                          lines[26])
187ced68a00SBram Moolenaar  call assert_match(          '^\s\+\(let\|var\) x = 2$',          lines[27])
1884c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+.*\sendif$',                         lines[28])
1894c7b08f6SBram Moolenaar  call assert_equal('',                                            lines[29])
1904c7b08f6SBram Moolenaar  call assert_equal('FUNCTION  Foo3()',                            lines[30])
1914c7b08f6SBram Moolenaar  call assert_equal('Called 1 time',                               lines[32])
1924c7b08f6SBram Moolenaar  call assert_match('^Total time:\s\+\d\+\.\d\+$',                 lines[33])
1934c7b08f6SBram Moolenaar  call assert_match('^ Self time:\s\+\d\+\.\d\+$',                 lines[34])
1944c7b08f6SBram Moolenaar  call assert_equal('',                                            lines[35])
1954c7b08f6SBram Moolenaar  call assert_equal('count  total (s)   self (s)',                 lines[36])
1964c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+.*\sif 0$',                          lines[37])
197ced68a00SBram Moolenaar  call assert_match(          '^\s\+\(let\|var\) x = 0$',          lines[38])
1984c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+.*\selseif 0$',                      lines[39])
199ced68a00SBram Moolenaar  call assert_match(          '^\s\+\(let\|var\) x = 1$',          lines[40])
2004c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+.*\selse$',                          lines[41])
201ced68a00SBram Moolenaar  call assert_match('^\s*1\s\+.*\s  \(let\|var\) x = 2$',          lines[42])
2024c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+.*\sendif$',                         lines[43])
2034c7b08f6SBram Moolenaar  call assert_equal('',                                            lines[44])
2044c7b08f6SBram Moolenaar  call assert_equal('FUNCTIONS SORTED ON TOTAL TIME',              lines[45])
2054c7b08f6SBram Moolenaar  call assert_equal('count  total (s)   self (s)  function',       lines[46])
2064c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo.()$',              lines[47])
2074c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo.()$',              lines[48])
2084c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo.()$',              lines[49])
2094c7b08f6SBram Moolenaar  call assert_equal('',                                            lines[50])
2104c7b08f6SBram Moolenaar  call assert_equal('FUNCTIONS SORTED ON SELF TIME',               lines[51])
2114c7b08f6SBram Moolenaar  call assert_equal('count  total (s)   self (s)  function',       lines[52])
2124c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo.()$',              lines[53])
2134c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo.()$',              lines[54])
2144c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo.()$',              lines[55])
2154c7b08f6SBram Moolenaar  call assert_equal('',                                            lines[56])
2167feb35e7SBram Moolenaar
2177feb35e7SBram Moolenaar  call delete('Xprofile_func.vim')
2187feb35e7SBram Moolenaar  call delete('Xprofile_func.log')
2197feb35e7SBram Moolenaarendfunc
2207feb35e7SBram Moolenaar
2217feb35e7SBram Moolenaarfunc Test_profile_func_with_trycatch()
222107e9cecSBram Moolenaar  call Run_profile_func_with_trycatch('func', 'let')
223107e9cecSBram Moolenaar  call Run_profile_func_with_trycatch('def', 'var')
224c79745a8SBram Moolenaarendfunc
225107e9cecSBram Moolenaar
226107e9cecSBram Moolenaarfunc Run_profile_func_with_trycatch(command, declare)
227107e9cecSBram Moolenaar  let lines =<< trim [CODE]
228107e9cecSBram Moolenaar    XXX Foo1()
229107e9cecSBram Moolenaar      try
230107e9cecSBram Moolenaar        DDD x = 0
231107e9cecSBram Moolenaar      catch
232107e9cecSBram Moolenaar        DDD x = 1
233107e9cecSBram Moolenaar      finally
234107e9cecSBram Moolenaar        DDD x = 2
235107e9cecSBram Moolenaar      endtry
236107e9cecSBram Moolenaar    endXXX
237107e9cecSBram Moolenaar    XXX Foo2()
238c79745a8SBram Moolenaar      try
239c79745a8SBram Moolenaar        throw 0
240c79745a8SBram Moolenaar      catch
241107e9cecSBram Moolenaar        DDD x = 1
242c79745a8SBram Moolenaar      finally
243107e9cecSBram Moolenaar        DDD x = 2
244c79745a8SBram Moolenaar      endtry
245107e9cecSBram Moolenaar    endXXX
246107e9cecSBram Moolenaar    XXX Foo3()
247c79745a8SBram Moolenaar      try
248c79745a8SBram Moolenaar        throw 0
249c79745a8SBram Moolenaar      catch
250c79745a8SBram Moolenaar        throw 1
251c79745a8SBram Moolenaar      finally
252107e9cecSBram Moolenaar        DDD x = 2
253c79745a8SBram Moolenaar      endtry
254107e9cecSBram Moolenaar    endXXX
255c79745a8SBram Moolenaar    call Foo1()
256c79745a8SBram Moolenaar    call Foo2()
257107e9cecSBram Moolenaar    let rethrown = 0
258c79745a8SBram Moolenaar    try
259c79745a8SBram Moolenaar      call Foo3()
260c79745a8SBram Moolenaar    catch
261107e9cecSBram Moolenaar      let rethrown = 1
262c79745a8SBram Moolenaar    endtry
263107e9cecSBram Moolenaar    if rethrown != 1
264107e9cecSBram Moolenaar      " call Foo1 again so that the test fails
265107e9cecSBram Moolenaar      call Foo1()
266107e9cecSBram Moolenaar    endif
267c79745a8SBram Moolenaar  [CODE]
2687feb35e7SBram Moolenaar
269107e9cecSBram Moolenaar  call map(lines, {k, v -> substitute(v, 'XXX', a:command, '') })
270107e9cecSBram Moolenaar  call map(lines, {k, v -> substitute(v, 'DDD', a:declare, '') })
271107e9cecSBram Moolenaar
2727feb35e7SBram Moolenaar  call writefile(lines, 'Xprofile_func.vim')
27393344c2dSBram Moolenaar  call system(GetVimCommand()
27493344c2dSBram Moolenaar    \ . ' -es -i NONE --noplugin'
2757feb35e7SBram Moolenaar    \ . ' -c "profile start Xprofile_func.log"'
2767feb35e7SBram Moolenaar    \ . ' -c "profile func Foo*"'
2777feb35e7SBram Moolenaar    \ . ' -c "so Xprofile_func.vim"'
2787feb35e7SBram Moolenaar    \ . ' -c "qall!"')
2797feb35e7SBram Moolenaar  call assert_equal(0, v:shell_error)
2807feb35e7SBram Moolenaar
2817feb35e7SBram Moolenaar  let lines = readfile('Xprofile_func.log')
2827feb35e7SBram Moolenaar
2837feb35e7SBram Moolenaar  " - Foo1() should pass 'try' 'finally' blocks.
2847feb35e7SBram Moolenaar  " - Foo2() should pass 'catch' 'finally' blocks.
2857feb35e7SBram Moolenaar  " - Foo3() should not pass 'endtry'.
2864c7b08f6SBram Moolenaar  call assert_equal(57, len(lines))
2877feb35e7SBram Moolenaar
2887feb35e7SBram Moolenaar  call assert_equal('FUNCTION  Foo1()',                            lines[0])
2894c7b08f6SBram Moolenaar  call assert_match('Defined:.*Xprofile_func.vim',                 lines[1])
2904c7b08f6SBram Moolenaar  call assert_equal('Called 1 time',                               lines[2])
2914c7b08f6SBram Moolenaar  call assert_match('^Total time:\s\+\d\+\.\d\+$',                 lines[3])
2924c7b08f6SBram Moolenaar  call assert_match('^ Self time:\s\+\d\+\.\d\+$',                 lines[4])
2934c7b08f6SBram Moolenaar  call assert_equal('',                                            lines[5])
2944c7b08f6SBram Moolenaar  call assert_equal('count  total (s)   self (s)',                 lines[6])
2954c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+.*\stry$',                           lines[7])
296107e9cecSBram Moolenaar  call assert_match('^\s*1\s\+.*\s  \(let\|var\) x = 0$',          lines[8])
2974c7b08f6SBram Moolenaar  call assert_match(        '^\s\+catch$',                         lines[9])
298107e9cecSBram Moolenaar  call assert_match(          '^\s\+\(let\|var\) x = 1$',          lines[10])
2994c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+.*\sfinally$',                       lines[11])
300107e9cecSBram Moolenaar  call assert_match('^\s*1\s\+.*\s  \(let\|var\) x = 2$',          lines[12])
3014c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+.*\sendtry$',                        lines[13])
3024c7b08f6SBram Moolenaar  call assert_equal('',                                            lines[14])
3034c7b08f6SBram Moolenaar  call assert_equal('FUNCTION  Foo2()',                            lines[15])
3044c7b08f6SBram Moolenaar  call assert_equal('Called 1 time',                               lines[17])
3054c7b08f6SBram Moolenaar  call assert_match('^Total time:\s\+\d\+\.\d\+$',                 lines[18])
3064c7b08f6SBram Moolenaar  call assert_match('^ Self time:\s\+\d\+\.\d\+$',                 lines[19])
3074c7b08f6SBram Moolenaar  call assert_equal('',                                            lines[20])
3084c7b08f6SBram Moolenaar  call assert_equal('count  total (s)   self (s)',                 lines[21])
3094c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+.*\stry$',                           lines[22])
3104c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+.*\s  throw 0$',                     lines[23])
3114c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+.*\scatch$',                         lines[24])
312107e9cecSBram Moolenaar  call assert_match('^\s*1\s\+.*\s  \(let\|var\) x = 1$',          lines[25])
3134c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+.*\sfinally$',                       lines[26])
314107e9cecSBram Moolenaar  call assert_match('^\s*1\s\+.*\s  \(let\|var\) x = 2$',          lines[27])
3154c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+.*\sendtry$',                        lines[28])
3164c7b08f6SBram Moolenaar  call assert_equal('',                                            lines[29])
3174c7b08f6SBram Moolenaar  call assert_equal('FUNCTION  Foo3()',                            lines[30])
3184c7b08f6SBram Moolenaar  call assert_equal('Called 1 time',                               lines[32])
3194c7b08f6SBram Moolenaar  call assert_match('^Total time:\s\+\d\+\.\d\+$',                 lines[33])
3204c7b08f6SBram Moolenaar  call assert_match('^ Self time:\s\+\d\+\.\d\+$',                 lines[34])
3214c7b08f6SBram Moolenaar  call assert_equal('',                                            lines[35])
3224c7b08f6SBram Moolenaar  call assert_equal('count  total (s)   self (s)',                 lines[36])
3234c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+.*\stry$',                           lines[37])
3244c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+.*\s  throw 0$',                     lines[38])
3254c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+.*\scatch$',                         lines[39])
3264c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+.*\s  throw 1$',                     lines[40])
3274c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+.*\sfinally$',                       lines[41])
328107e9cecSBram Moolenaar  call assert_match('^\s*1\s\+.*\s  \(let\|var\) x = 2$',          lines[42])
3294c7b08f6SBram Moolenaar  call assert_match(        '^\s\+endtry$',                        lines[43])
3304c7b08f6SBram Moolenaar  call assert_equal('',                                            lines[44])
3314c7b08f6SBram Moolenaar  call assert_equal('FUNCTIONS SORTED ON TOTAL TIME',              lines[45])
3324c7b08f6SBram Moolenaar  call assert_equal('count  total (s)   self (s)  function',       lines[46])
3334c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo.()$',              lines[47])
3344c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo.()$',              lines[48])
3354c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo.()$',              lines[49])
3364c7b08f6SBram Moolenaar  call assert_equal('',                                            lines[50])
3374c7b08f6SBram Moolenaar  call assert_equal('FUNCTIONS SORTED ON SELF TIME',               lines[51])
3384c7b08f6SBram Moolenaar  call assert_equal('count  total (s)   self (s)  function',       lines[52])
3394c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo.()$',              lines[53])
3404c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo.()$',              lines[54])
3414c7b08f6SBram Moolenaar  call assert_match('^\s*1\s\+\d\+\.\d\+\s\+Foo.()$',              lines[55])
3424c7b08f6SBram Moolenaar  call assert_equal('',                                            lines[56])
3437feb35e7SBram Moolenaar
3447feb35e7SBram Moolenaar  call delete('Xprofile_func.vim')
3457feb35e7SBram Moolenaar  call delete('Xprofile_func.log')
3467feb35e7SBram Moolenaarendfunc
3477feb35e7SBram Moolenaar
348296b1f28SBram Moolenaarfunc Test_profile_file()
349c79745a8SBram Moolenaar  let lines =<< trim [CODE]
350c79745a8SBram Moolenaar    func! Foo()
351c79745a8SBram Moolenaar    endfunc
352c79745a8SBram Moolenaar    for i in range(10)
353c79745a8SBram Moolenaar      " a comment
354c79745a8SBram Moolenaar      call Foo()
355c79745a8SBram Moolenaar    endfor
356c79745a8SBram Moolenaar    call Foo()
357c79745a8SBram Moolenaar  [CODE]
358296b1f28SBram Moolenaar
359296b1f28SBram Moolenaar  call writefile(lines, 'Xprofile_file.vim')
36093344c2dSBram Moolenaar  call system(GetVimCommandClean()
36193344c2dSBram Moolenaar    \ . ' -es'
362c011a3d0SBram Moolenaar    \ . ' -c "profile start Xprofile_file.log"'
363c011a3d0SBram Moolenaar    \ . ' -c "profile file Xprofile_file.vim"'
364c011a3d0SBram Moolenaar    \ . ' -c "so Xprofile_file.vim"'
365c011a3d0SBram Moolenaar    \ . ' -c "so Xprofile_file.vim"'
366c011a3d0SBram Moolenaar    \ . ' -c "qall!"')
367c011a3d0SBram Moolenaar  call assert_equal(0, v:shell_error)
368296b1f28SBram Moolenaar
369296b1f28SBram Moolenaar  let lines = readfile('Xprofile_file.log')
370296b1f28SBram Moolenaar
371296b1f28SBram Moolenaar  call assert_equal(14, len(lines))
372296b1f28SBram Moolenaar
373296b1f28SBram Moolenaar  call assert_match('^SCRIPT .*Xprofile_file.vim$',                   lines[0])
374296b1f28SBram Moolenaar  call assert_equal('Sourced 2 times',                                lines[1])
375296b1f28SBram Moolenaar  call assert_match('^Total time:\s\+\d\+\.\d\+$',                    lines[2])
376296b1f28SBram Moolenaar  call assert_match('^ Self time:\s\+\d\+\.\d\+$',                    lines[3])
377296b1f28SBram Moolenaar  call assert_equal('',                                               lines[4])
378296b1f28SBram Moolenaar  call assert_equal('count  total (s)   self (s)',                    lines[5])
37967435d99SBram Moolenaar  call assert_match('    2              0.\d\+ func! Foo()',          lines[6])
380296b1f28SBram Moolenaar  call assert_equal('                            endfunc',            lines[7])
381296b1f28SBram Moolenaar  " Loop iterates 10 times. Since script runs twice, body executes 20 times.
382296b1f28SBram Moolenaar  " First line of loop executes one more time than body to detect end of loop.
383296b1f28SBram Moolenaar  call assert_match('^\s*22\s\+\d\+\.\d\+\s\+for i in range(10)$',    lines[8])
384296b1f28SBram Moolenaar  call assert_equal('                              " a comment',      lines[9])
385d21b16f3SBram Moolenaar  " if self and total are equal we only get one number
386d21b16f3SBram Moolenaar  call assert_match('^\s*20\s\+\(\d\+\.\d\+\s\+\)\=\d\+\.\d\+\s\+call Foo()$', lines[10])
3877feb35e7SBram Moolenaar  call assert_match('^\s*22\s\+\d\+\.\d\+\s\+endfor$',                lines[11])
388e32bbdedSBram Moolenaar  " if self and total are equal we only get one number
389e32bbdedSBram Moolenaar  call assert_match('^\s*2\s\+\(\d\+\.\d\+\s\+\)\=\d\+\.\d\+\s\+call Foo()$', lines[12])
390296b1f28SBram Moolenaar  call assert_equal('',                                               lines[13])
391296b1f28SBram Moolenaar
392296b1f28SBram Moolenaar  call delete('Xprofile_file.vim')
393296b1f28SBram Moolenaar  call delete('Xprofile_file.log')
394296b1f28SBram Moolenaarendfunc
395296b1f28SBram Moolenaar
39667435d99SBram Moolenaarfunc Test_profile_file_with_cont()
39767435d99SBram Moolenaar  let lines = [
39867435d99SBram Moolenaar    \ 'echo "hello',
39967435d99SBram Moolenaar    \ '  \ world"',
40067435d99SBram Moolenaar    \ 'echo "foo ',
40167435d99SBram Moolenaar    \ '  \bar"',
40267435d99SBram Moolenaar    \ ]
40367435d99SBram Moolenaar
40467435d99SBram Moolenaar  call writefile(lines, 'Xprofile_file.vim')
40593344c2dSBram Moolenaar  call system(GetVimCommandClean()
40693344c2dSBram Moolenaar    \ . ' -es'
40767435d99SBram Moolenaar    \ . ' -c "profile start Xprofile_file.log"'
40867435d99SBram Moolenaar    \ . ' -c "profile file Xprofile_file.vim"'
40967435d99SBram Moolenaar    \ . ' -c "so Xprofile_file.vim"'
41067435d99SBram Moolenaar    \ . ' -c "qall!"')
41167435d99SBram Moolenaar  call assert_equal(0, v:shell_error)
41267435d99SBram Moolenaar
41367435d99SBram Moolenaar  let lines = readfile('Xprofile_file.log')
41467435d99SBram Moolenaar  call assert_equal(11, len(lines))
41567435d99SBram Moolenaar
41667435d99SBram Moolenaar  call assert_match('^SCRIPT .*Xprofile_file.vim$',           lines[0])
41767435d99SBram Moolenaar  call assert_equal('Sourced 1 time',                         lines[1])
41867435d99SBram Moolenaar  call assert_match('^Total time:\s\+\d\+\.\d\+$',            lines[2])
41967435d99SBram Moolenaar  call assert_match('^ Self time:\s\+\d\+\.\d\+$',            lines[3])
42067435d99SBram Moolenaar  call assert_equal('',                                       lines[4])
42167435d99SBram Moolenaar  call assert_equal('count  total (s)   self (s)',            lines[5])
42267435d99SBram Moolenaar  call assert_match('    1              0.\d\+ echo "hello',  lines[6])
42367435d99SBram Moolenaar  call assert_equal('                              \ world"', lines[7])
42467435d99SBram Moolenaar  call assert_match('    1              0.\d\+ echo "foo ',   lines[8])
42567435d99SBram Moolenaar  call assert_equal('                              \bar"',    lines[9])
42667435d99SBram Moolenaar  call assert_equal('',                                       lines[10])
42767435d99SBram Moolenaar
42867435d99SBram Moolenaar  call delete('Xprofile_file.vim')
42967435d99SBram Moolenaar  call delete('Xprofile_file.log')
43067435d99SBram Moolenaarendfunc
43167435d99SBram Moolenaar
432296b1f28SBram Moolenaarfunc Test_profile_completion()
433296b1f28SBram Moolenaar  call feedkeys(":profile \<C-A>\<C-B>\"\<CR>", 'tx')
434296b1f28SBram Moolenaar  call assert_equal('"profile continue file func pause start', @:)
435296b1f28SBram Moolenaar
436296b1f28SBram Moolenaar  call feedkeys(":profile start test_prof\<C-A>\<C-B>\"\<CR>", 'tx')
437296b1f28SBram Moolenaar  call assert_match('^"profile start.* test_profile\.vim', @:)
438296b1f28SBram Moolenaarendfunc
439296b1f28SBram Moolenaar
440296b1f28SBram Moolenaarfunc Test_profile_errors()
441296b1f28SBram Moolenaar  call assert_fails("profile func Foo", 'E750:')
442296b1f28SBram Moolenaar  call assert_fails("profile pause", 'E750:')
443296b1f28SBram Moolenaar  call assert_fails("profile continue", 'E750:')
444296b1f28SBram Moolenaarendfunc
445ac112f01SBram Moolenaar
446ac112f01SBram Moolenaarfunc Test_profile_truncate_mbyte()
44730276f2bSBram Moolenaar  if &enc !=# 'utf-8'
448ac112f01SBram Moolenaar    return
449ac112f01SBram Moolenaar  endif
450ac112f01SBram Moolenaar
451ac112f01SBram Moolenaar  let lines = [
452ac112f01SBram Moolenaar    \ 'scriptencoding utf-8',
453ac112f01SBram Moolenaar    \ 'func! Foo()',
454ac112f01SBram Moolenaar    \ '  return [',
455ac112f01SBram Moolenaar    \ '  \ "' . join(map(range(0x4E00, 0x4E00 + 340), 'nr2char(v:val)'), '') . '",',
456ac112f01SBram Moolenaar    \ '  \ "' . join(map(range(0x4F00, 0x4F00 + 340), 'nr2char(v:val)'), '') . '",',
457ac112f01SBram Moolenaar    \ '  \ ]',
458ac112f01SBram Moolenaar    \ 'endfunc',
459ac112f01SBram Moolenaar    \ 'call Foo()',
460ac112f01SBram Moolenaar    \ ]
461ac112f01SBram Moolenaar
462ac112f01SBram Moolenaar  call writefile(lines, 'Xprofile_file.vim')
46393344c2dSBram Moolenaar  call system(GetVimCommandClean()
46493344c2dSBram Moolenaar    \ . ' -es --cmd "set enc=utf-8"'
465ac112f01SBram Moolenaar    \ . ' -c "profile start Xprofile_file.log"'
466ac112f01SBram Moolenaar    \ . ' -c "profile file Xprofile_file.vim"'
467ac112f01SBram Moolenaar    \ . ' -c "so Xprofile_file.vim"'
468ac112f01SBram Moolenaar    \ . ' -c "qall!"')
469ac112f01SBram Moolenaar  call assert_equal(0, v:shell_error)
470ac112f01SBram Moolenaar
471ac112f01SBram Moolenaar  split Xprofile_file.log
472ac112f01SBram Moolenaar  if &fenc != ''
473ac112f01SBram Moolenaar    call assert_equal('utf-8', &fenc)
474ac112f01SBram Moolenaar  endif
475ac112f01SBram Moolenaar  /func! Foo()
476ac112f01SBram Moolenaar  let lnum = line('.')
477ac112f01SBram Moolenaar  call assert_match('^\s*return \[$', getline(lnum + 1))
478ac112f01SBram Moolenaar  call assert_match("\u4F52$", getline(lnum + 2))
479ac112f01SBram Moolenaar  call assert_match("\u5052$", getline(lnum + 3))
480ac112f01SBram Moolenaar  call assert_match('^\s*\\ \]$', getline(lnum + 4))
481ac112f01SBram Moolenaar  bwipe!
482ac112f01SBram Moolenaar
483ac112f01SBram Moolenaar  call delete('Xprofile_file.vim')
484ac112f01SBram Moolenaar  call delete('Xprofile_file.log')
485ac112f01SBram Moolenaarendfunc
4861fbfe7c4SBram Moolenaar
4871fbfe7c4SBram Moolenaarfunc Test_profdel_func()
488c79745a8SBram Moolenaar  let lines =<< trim [CODE]
489c79745a8SBram Moolenaar    profile start Xprofile_file.log
490c79745a8SBram Moolenaar    func! Foo1()
491c79745a8SBram Moolenaar    endfunc
492c79745a8SBram Moolenaar    func! Foo2()
493c79745a8SBram Moolenaar    endfunc
494c79745a8SBram Moolenaar    func! Foo3()
495c79745a8SBram Moolenaar    endfunc
496c79745a8SBram Moolenaar
497c79745a8SBram Moolenaar    profile func Foo1
498c79745a8SBram Moolenaar    profile func Foo2
499c79745a8SBram Moolenaar    call Foo1()
500c79745a8SBram Moolenaar    call Foo2()
501c79745a8SBram Moolenaar
502c79745a8SBram Moolenaar    profile func Foo3
503c79745a8SBram Moolenaar    profdel func Foo2
504c79745a8SBram Moolenaar    profdel func Foo3
505c79745a8SBram Moolenaar    call Foo1()
506c79745a8SBram Moolenaar    call Foo2()
507c79745a8SBram Moolenaar    call Foo3()
508c79745a8SBram Moolenaar  [CODE]
5091fbfe7c4SBram Moolenaar  call writefile(lines, 'Xprofile_file.vim')
51093344c2dSBram Moolenaar  call system(GetVimCommandClean() . ' -es -c "so Xprofile_file.vim" -c q')
5111fbfe7c4SBram Moolenaar  call assert_equal(0, v:shell_error)
5121fbfe7c4SBram Moolenaar
5131fbfe7c4SBram Moolenaar  let lines = readfile('Xprofile_file.log')
5144c7b08f6SBram Moolenaar  call assert_equal(26, len(lines))
5151fbfe7c4SBram Moolenaar
5161fbfe7c4SBram Moolenaar  " Check that:
5171fbfe7c4SBram Moolenaar  " - Foo1() is called twice (profdel not invoked)
5181fbfe7c4SBram Moolenaar  " - Foo2() is called once (profdel invoked after it was called)
5191fbfe7c4SBram Moolenaar  " - Foo3() is not called (profdel invoked before it was called)
5201fbfe7c4SBram Moolenaar  call assert_equal('FUNCTION  Foo1()',               lines[0])
5214c7b08f6SBram Moolenaar  call assert_match('Defined:.*Xprofile_file.vim',    lines[1])
5224c7b08f6SBram Moolenaar  call assert_equal('Called 2 times',                 lines[2])
5234c7b08f6SBram Moolenaar  call assert_equal('FUNCTION  Foo2()',               lines[8])
5244c7b08f6SBram Moolenaar  call assert_equal('Called 1 time',                  lines[10])
5254c7b08f6SBram Moolenaar  call assert_equal('FUNCTIONS SORTED ON TOTAL TIME', lines[16])
5264c7b08f6SBram Moolenaar  call assert_equal('FUNCTIONS SORTED ON SELF TIME',  lines[21])
5271fbfe7c4SBram Moolenaar
5281fbfe7c4SBram Moolenaar  call delete('Xprofile_file.vim')
5291fbfe7c4SBram Moolenaar  call delete('Xprofile_file.log')
5301fbfe7c4SBram Moolenaarendfunc
5311fbfe7c4SBram Moolenaar
5321fbfe7c4SBram Moolenaarfunc Test_profdel_star()
5331fbfe7c4SBram Moolenaar  " Foo() is invoked once before and once after 'profdel *'.
5341fbfe7c4SBram Moolenaar  " So profiling should report it only once.
535c79745a8SBram Moolenaar  let lines =<< trim [CODE]
536c79745a8SBram Moolenaar    profile start Xprofile_file.log
537c79745a8SBram Moolenaar    func! Foo()
538c79745a8SBram Moolenaar    endfunc
539c79745a8SBram Moolenaar    profile func Foo
540c79745a8SBram Moolenaar    call Foo()
541c79745a8SBram Moolenaar    profdel *
542c79745a8SBram Moolenaar    call Foo()
543c79745a8SBram Moolenaar  [CODE]
5441fbfe7c4SBram Moolenaar  call writefile(lines, 'Xprofile_file.vim')
54593344c2dSBram Moolenaar  call system(GetVimCommandClean() . ' -es -c "so Xprofile_file.vim" -c q')
5461fbfe7c4SBram Moolenaar  call assert_equal(0, v:shell_error)
5471fbfe7c4SBram Moolenaar
5481fbfe7c4SBram Moolenaar  let lines = readfile('Xprofile_file.log')
5494c7b08f6SBram Moolenaar  call assert_equal(16, len(lines))
5501fbfe7c4SBram Moolenaar
5511fbfe7c4SBram Moolenaar  call assert_equal('FUNCTION  Foo()',                lines[0])
5524c7b08f6SBram Moolenaar  call assert_match('Defined:.*Xprofile_file.vim',    lines[1])
5534c7b08f6SBram Moolenaar  call assert_equal('Called 1 time',                  lines[2])
5544c7b08f6SBram Moolenaar  call assert_equal('FUNCTIONS SORTED ON TOTAL TIME', lines[8])
5554c7b08f6SBram Moolenaar  call assert_equal('FUNCTIONS SORTED ON SELF TIME',  lines[12])
5561fbfe7c4SBram Moolenaar
5571fbfe7c4SBram Moolenaar  call delete('Xprofile_file.vim')
5581fbfe7c4SBram Moolenaar  call delete('Xprofile_file.log')
5591fbfe7c4SBram Moolenaarendfunc
56016358800SBram Moolenaar
56116358800SBram Moolenaar" When typing the function it won't have a script ID, test that this works.
56216358800SBram Moolenaarfunc Test_profile_typed_func()
56316358800SBram Moolenaar  CheckScreendump
56416358800SBram Moolenaar
56516358800SBram Moolenaar  let lines =<< trim END
56616358800SBram Moolenaar      profile start XprofileTypedFunc
56716358800SBram Moolenaar  END
56816358800SBram Moolenaar  call writefile(lines, 'XtestProfile')
56916358800SBram Moolenaar  let buf = RunVimInTerminal('-S XtestProfile', #{})
57016358800SBram Moolenaar
57116358800SBram Moolenaar  call term_sendkeys(buf, ":func DoSomething()\<CR>"
57216358800SBram Moolenaar	\ .. "echo 'hello'\<CR>"
57316358800SBram Moolenaar	\ .. "endfunc\<CR>")
57416358800SBram Moolenaar  call term_sendkeys(buf, ":profile func DoSomething\<CR>")
57516358800SBram Moolenaar  call term_sendkeys(buf, ":call DoSomething()\<CR>")
5766a2c5a7dSBram Moolenaar  call TermWait(buf, 100)
57716358800SBram Moolenaar  call StopVimInTerminal(buf)
57816358800SBram Moolenaar  let lines = readfile('XprofileTypedFunc')
57916358800SBram Moolenaar  call assert_equal("FUNCTION  DoSomething()", lines[0])
58016358800SBram Moolenaar  call assert_equal("Called 1 time", lines[1])
58116358800SBram Moolenaar
58216358800SBram Moolenaar  " clean up
58316358800SBram Moolenaar  call delete('XprofileTypedFunc')
58416358800SBram Moolenaar  call delete('XtestProfile')
58516358800SBram Moolenaarendfunc
5866d91bcb4SBram Moolenaar
587e5ea346aSBram Moolenaarfunc Test_vim9_profiling()
588e5ea346aSBram Moolenaar  " only tests that compiling and calling functions doesn't crash
589e5ea346aSBram Moolenaar  let lines =<< trim END
590e5ea346aSBram Moolenaar      vim9script
591e5ea346aSBram Moolenaar      def Func()
592e5ea346aSBram Moolenaar        Crash()
593e5ea346aSBram Moolenaar      enddef
594e5ea346aSBram Moolenaar      def Crash()
595e5ea346aSBram Moolenaar      enddef
59698989a00SBram Moolenaar      prof start Xprofile_crash.log
597e5ea346aSBram Moolenaar      prof func Func
598e5ea346aSBram Moolenaar      Func()
599e5ea346aSBram Moolenaar  END
60098989a00SBram Moolenaar  call writefile(lines, 'Xprofile_crash.vim')
60198989a00SBram Moolenaar  call system(GetVimCommandClean() . ' -es -c "so Xprofile_crash.vim" -c q')
60298989a00SBram Moolenaar  call assert_equal(0, v:shell_error)
603*8c801b37SBram Moolenaar  call assert_true(readfile('Xprofile_crash.log')->len() > 10)
60498989a00SBram Moolenaar  call delete('Xprofile_crash.vim')
60598989a00SBram Moolenaar  call delete('Xprofile_crash.log')
606e5ea346aSBram Moolenaarendfunc
607e5ea346aSBram Moolenaar
60812d26531SBram Moolenaarfunc Test_vim9_nested_call()
60912d26531SBram Moolenaar  let lines =<< trim END
61012d26531SBram Moolenaar    vim9script
61112d26531SBram Moolenaar    var total = 0
61212d26531SBram Moolenaar    def One(Ref: func(number))
61312d26531SBram Moolenaar      for i in range(3)
61412d26531SBram Moolenaar        Ref(i)
61512d26531SBram Moolenaar      endfor
61612d26531SBram Moolenaar    enddef
61712d26531SBram Moolenaar    def Two(nr: number)
61812d26531SBram Moolenaar      total += nr
61912d26531SBram Moolenaar    enddef
62012d26531SBram Moolenaar    prof start Xprofile_nested.log
62112d26531SBram Moolenaar    prof func One
62212d26531SBram Moolenaar    prof func Two
62312d26531SBram Moolenaar    One((nr) => Two(nr))
62412d26531SBram Moolenaar    assert_equal(3, total)
62512d26531SBram Moolenaar  END
62612d26531SBram Moolenaar  call writefile(lines, 'Xprofile_nested.vim')
62712d26531SBram Moolenaar  call system(GetVimCommandClean() . ' -es -c "so Xprofile_nested.vim" -c q')
62812d26531SBram Moolenaar  call assert_equal(0, v:shell_error)
62912d26531SBram Moolenaar
63012d26531SBram Moolenaar  let prof_lines = readfile('Xprofile_nested.log')->join('#')
63112d26531SBram Moolenaar  call assert_match('FUNCTION  <SNR>\d\+_One().*'
63212d26531SBram Moolenaar        \ .. '#Called 1 time.*'
63312d26531SBram Moolenaar        \ .. '#    1 \s*[0-9.]\+   for i in range(3)'
63412d26531SBram Moolenaar        \ .. '#    3 \s*[0-9.]\+ \s*[0-9.]\+     Ref(i)'
63512d26531SBram Moolenaar        \ .. '#    3 \s*[0-9.]\+   endfor', prof_lines)
63612d26531SBram Moolenaar  call assert_match('FUNCTION  <SNR>\d\+_Two().*'
63712d26531SBram Moolenaar        \ .. '#Called 3 times.*'
63812d26531SBram Moolenaar        \ .. '#    3 \s*[0-9.]\+   total += nr', prof_lines)
6394fa11757SBram Moolenaar  call delete('Xprofile_nested.vim')
6404fa11757SBram Moolenaar  call delete('Xprofile_nested.log')
64112d26531SBram Moolenaarendfunc
64212d26531SBram Moolenaar
643e5ea346aSBram Moolenaar
6446d91bcb4SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
645