blob: ec48f030c1ddd306e83483d784221cc62ff953c8 [file] [log] [blame]
Bram Moolenaar19a16692016-09-01 22:19:47 +02001"Tests for nested functions
2"
Bram Moolenaar8a01f962016-11-14 21:50:00 +01003func NestedFunc()
4 func! Func1()
Bram Moolenaar19a16692016-09-01 22:19:47 +02005 let g:text .= 'Func1 '
Bram Moolenaar8a01f962016-11-14 21:50:00 +01006 endfunc
Bram Moolenaar19a16692016-09-01 22:19:47 +02007 call Func1()
Bram Moolenaar8a01f962016-11-14 21:50:00 +01008 func! s:func2()
Bram Moolenaar19a16692016-09-01 22:19:47 +02009 let g:text .= 's:func2 '
Bram Moolenaar8a01f962016-11-14 21:50:00 +010010 endfunc
Bram Moolenaar19a16692016-09-01 22:19:47 +020011 call s:func2()
Bram Moolenaar8a01f962016-11-14 21:50:00 +010012 func! s:_func3()
Bram Moolenaar19a16692016-09-01 22:19:47 +020013 let g:text .= 's:_func3 '
Bram Moolenaar8a01f962016-11-14 21:50:00 +010014 endfunc
Bram Moolenaar19a16692016-09-01 22:19:47 +020015 call s:_func3()
16 let fn = 'Func4'
Bram Moolenaar8a01f962016-11-14 21:50:00 +010017 func! {fn}()
Bram Moolenaar19a16692016-09-01 22:19:47 +020018 let g:text .= 'Func4 '
Bram Moolenaar8a01f962016-11-14 21:50:00 +010019 endfunc
Bram Moolenaar19a16692016-09-01 22:19:47 +020020 call {fn}()
21 let fn = 'func5'
Bram Moolenaar8a01f962016-11-14 21:50:00 +010022 func! s:{fn}()
Bram Moolenaar19a16692016-09-01 22:19:47 +020023 let g:text .= 's:func5'
Bram Moolenaar8a01f962016-11-14 21:50:00 +010024 endfunc
Bram Moolenaar19a16692016-09-01 22:19:47 +020025 call s:{fn}()
Bram Moolenaar8a01f962016-11-14 21:50:00 +010026endfunc
Bram Moolenaar19a16692016-09-01 22:19:47 +020027
Bram Moolenaar8a01f962016-11-14 21:50:00 +010028func Test_nested_functions()
Bram Moolenaar19a16692016-09-01 22:19:47 +020029 let g:text = ''
30 call NestedFunc()
31 call assert_equal('Func1 s:func2 s:_func3 Func4 s:func5', g:text)
32endfunction
Bram Moolenaar8a01f962016-11-14 21:50:00 +010033
34func Test_nested_argument()
35 func g:X()
36 let g:Y = function('sort')
37 endfunc
38 let g:Y = function('sort')
39 echo g:Y([], g:X())
40 delfunc g:X
41 unlet g:Y
42endfunc
Bram Moolenaar777b30f2017-01-02 15:26:27 +010043
44func Recurse(count)
45 if a:count > 0
46 call Recurse(a:count - 1)
47 endif
48endfunc
49
50func Test_max_nesting()
Bram Moolenaar269aec72017-01-02 18:32:39 +010051 " TODO: why does this fail on Windows? Runs out of stack perhaps?
52 if has('win32')
53 return
54 endif
Bram Moolenaar777b30f2017-01-02 15:26:27 +010055 let call_depth_here = 2
56 let ex_depth_here = 5
57 set mfd&
58
59 call Recurse(99 - call_depth_here)
60 call assert_fails('call Recurse(' . (100 - call_depth_here) . ')', 'E132:')
61
62 set mfd=210
63 call Recurse(209 - ex_depth_here)
64 call assert_fails('call Recurse(' . (210 - ex_depth_here) . ')', 'E169:')
65
66 set mfd&
67endfunc