Bram Moolenaar | 19a1669 | 2016-09-01 22:19:47 +0200 | [diff] [blame] | 1 | "Tests for nested functions |
| 2 | " |
Bram Moolenaar | 8a01f96 | 2016-11-14 21:50:00 +0100 | [diff] [blame] | 3 | func NestedFunc() |
| 4 | func! Func1() |
Bram Moolenaar | 19a1669 | 2016-09-01 22:19:47 +0200 | [diff] [blame] | 5 | let g:text .= 'Func1 ' |
Bram Moolenaar | 8a01f96 | 2016-11-14 21:50:00 +0100 | [diff] [blame] | 6 | endfunc |
Bram Moolenaar | 19a1669 | 2016-09-01 22:19:47 +0200 | [diff] [blame] | 7 | call Func1() |
Bram Moolenaar | 8a01f96 | 2016-11-14 21:50:00 +0100 | [diff] [blame] | 8 | func! s:func2() |
Bram Moolenaar | 19a1669 | 2016-09-01 22:19:47 +0200 | [diff] [blame] | 9 | let g:text .= 's:func2 ' |
Bram Moolenaar | 8a01f96 | 2016-11-14 21:50:00 +0100 | [diff] [blame] | 10 | endfunc |
Bram Moolenaar | 19a1669 | 2016-09-01 22:19:47 +0200 | [diff] [blame] | 11 | call s:func2() |
Bram Moolenaar | 8a01f96 | 2016-11-14 21:50:00 +0100 | [diff] [blame] | 12 | func! s:_func3() |
Bram Moolenaar | 19a1669 | 2016-09-01 22:19:47 +0200 | [diff] [blame] | 13 | let g:text .= 's:_func3 ' |
Bram Moolenaar | 8a01f96 | 2016-11-14 21:50:00 +0100 | [diff] [blame] | 14 | endfunc |
Bram Moolenaar | 19a1669 | 2016-09-01 22:19:47 +0200 | [diff] [blame] | 15 | call s:_func3() |
| 16 | let fn = 'Func4' |
Bram Moolenaar | 8a01f96 | 2016-11-14 21:50:00 +0100 | [diff] [blame] | 17 | func! {fn}() |
Bram Moolenaar | 19a1669 | 2016-09-01 22:19:47 +0200 | [diff] [blame] | 18 | let g:text .= 'Func4 ' |
Bram Moolenaar | 8a01f96 | 2016-11-14 21:50:00 +0100 | [diff] [blame] | 19 | endfunc |
Bram Moolenaar | 19a1669 | 2016-09-01 22:19:47 +0200 | [diff] [blame] | 20 | call {fn}() |
| 21 | let fn = 'func5' |
Bram Moolenaar | 8a01f96 | 2016-11-14 21:50:00 +0100 | [diff] [blame] | 22 | func! s:{fn}() |
Bram Moolenaar | 19a1669 | 2016-09-01 22:19:47 +0200 | [diff] [blame] | 23 | let g:text .= 's:func5' |
Bram Moolenaar | 8a01f96 | 2016-11-14 21:50:00 +0100 | [diff] [blame] | 24 | endfunc |
Bram Moolenaar | 19a1669 | 2016-09-01 22:19:47 +0200 | [diff] [blame] | 25 | call s:{fn}() |
Bram Moolenaar | 8a01f96 | 2016-11-14 21:50:00 +0100 | [diff] [blame] | 26 | endfunc |
Bram Moolenaar | 19a1669 | 2016-09-01 22:19:47 +0200 | [diff] [blame] | 27 | |
Bram Moolenaar | 8a01f96 | 2016-11-14 21:50:00 +0100 | [diff] [blame] | 28 | func Test_nested_functions() |
Bram Moolenaar | 19a1669 | 2016-09-01 22:19:47 +0200 | [diff] [blame] | 29 | let g:text = '' |
| 30 | call NestedFunc() |
| 31 | call assert_equal('Func1 s:func2 s:_func3 Func4 s:func5', g:text) |
| 32 | endfunction |
Bram Moolenaar | 8a01f96 | 2016-11-14 21:50:00 +0100 | [diff] [blame] | 33 | |
| 34 | func 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 |
| 42 | endfunc |
Bram Moolenaar | 777b30f | 2017-01-02 15:26:27 +0100 | [diff] [blame^] | 43 | |
| 44 | func Recurse(count) |
| 45 | if a:count > 0 |
| 46 | call Recurse(a:count - 1) |
| 47 | endif |
| 48 | endfunc |
| 49 | |
| 50 | func Test_max_nesting() |
| 51 | let call_depth_here = 2 |
| 52 | let ex_depth_here = 5 |
| 53 | set mfd& |
| 54 | |
| 55 | call Recurse(99 - call_depth_here) |
| 56 | call assert_fails('call Recurse(' . (100 - call_depth_here) . ')', 'E132:') |
| 57 | |
| 58 | set mfd=210 |
| 59 | call Recurse(209 - ex_depth_here) |
| 60 | call assert_fails('call Recurse(' . (210 - ex_depth_here) . ')', 'E169:') |
| 61 | |
| 62 | set mfd& |
| 63 | endfunc |