Bram Moolenaar | 6d91bcb | 2020-08-12 18:50:36 +0200 | [diff] [blame] | 1 | " Tests for nested functions |
| 2 | |
| 3 | source check.vim |
| 4 | |
Bram Moolenaar | 8a01f96 | 2016-11-14 21:50:00 +0100 | [diff] [blame] | 5 | func NestedFunc() |
| 6 | func! Func1() |
Bram Moolenaar | 19a1669 | 2016-09-01 22:19:47 +0200 | [diff] [blame] | 7 | let g:text .= 'Func1 ' |
Bram Moolenaar | 8a01f96 | 2016-11-14 21:50:00 +0100 | [diff] [blame] | 8 | endfunc |
Bram Moolenaar | 19a1669 | 2016-09-01 22:19:47 +0200 | [diff] [blame] | 9 | call Func1() |
Bram Moolenaar | 8a01f96 | 2016-11-14 21:50:00 +0100 | [diff] [blame] | 10 | func! s:func2() |
Bram Moolenaar | 19a1669 | 2016-09-01 22:19:47 +0200 | [diff] [blame] | 11 | let g:text .= 's:func2 ' |
Bram Moolenaar | 8a01f96 | 2016-11-14 21:50:00 +0100 | [diff] [blame] | 12 | endfunc |
Bram Moolenaar | 19a1669 | 2016-09-01 22:19:47 +0200 | [diff] [blame] | 13 | call s:func2() |
Bram Moolenaar | 8a01f96 | 2016-11-14 21:50:00 +0100 | [diff] [blame] | 14 | func! s:_func3() |
Bram Moolenaar | 19a1669 | 2016-09-01 22:19:47 +0200 | [diff] [blame] | 15 | let g:text .= 's:_func3 ' |
Bram Moolenaar | 8a01f96 | 2016-11-14 21:50:00 +0100 | [diff] [blame] | 16 | endfunc |
Bram Moolenaar | 19a1669 | 2016-09-01 22:19:47 +0200 | [diff] [blame] | 17 | call s:_func3() |
| 18 | let fn = 'Func4' |
Bram Moolenaar | 8a01f96 | 2016-11-14 21:50:00 +0100 | [diff] [blame] | 19 | func! {fn}() |
Bram Moolenaar | 19a1669 | 2016-09-01 22:19:47 +0200 | [diff] [blame] | 20 | let g:text .= 'Func4 ' |
Bram Moolenaar | 8a01f96 | 2016-11-14 21:50:00 +0100 | [diff] [blame] | 21 | endfunc |
Bram Moolenaar | 19a1669 | 2016-09-01 22:19:47 +0200 | [diff] [blame] | 22 | call {fn}() |
| 23 | let fn = 'func5' |
Bram Moolenaar | 8a01f96 | 2016-11-14 21:50:00 +0100 | [diff] [blame] | 24 | func! s:{fn}() |
Bram Moolenaar | 19a1669 | 2016-09-01 22:19:47 +0200 | [diff] [blame] | 25 | let g:text .= 's:func5' |
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 | call s:{fn}() |
Bram Moolenaar | 8a01f96 | 2016-11-14 21:50:00 +0100 | [diff] [blame] | 28 | endfunc |
Bram Moolenaar | 19a1669 | 2016-09-01 22:19:47 +0200 | [diff] [blame] | 29 | |
Bram Moolenaar | 8a01f96 | 2016-11-14 21:50:00 +0100 | [diff] [blame] | 30 | func Test_nested_functions() |
Bram Moolenaar | 19a1669 | 2016-09-01 22:19:47 +0200 | [diff] [blame] | 31 | let g:text = '' |
| 32 | call NestedFunc() |
| 33 | call assert_equal('Func1 s:func2 s:_func3 Func4 s:func5', g:text) |
| 34 | endfunction |
Bram Moolenaar | 8a01f96 | 2016-11-14 21:50:00 +0100 | [diff] [blame] | 35 | |
| 36 | func Test_nested_argument() |
| 37 | func g:X() |
| 38 | let g:Y = function('sort') |
| 39 | endfunc |
| 40 | let g:Y = function('sort') |
| 41 | echo g:Y([], g:X()) |
| 42 | delfunc g:X |
| 43 | unlet g:Y |
| 44 | endfunc |
Bram Moolenaar | 777b30f | 2017-01-02 15:26:27 +0100 | [diff] [blame] | 45 | |
| 46 | func Recurse(count) |
| 47 | if a:count > 0 |
| 48 | call Recurse(a:count - 1) |
| 49 | endif |
| 50 | endfunc |
| 51 | |
| 52 | func Test_max_nesting() |
Bram Moolenaar | 269aec7 | 2017-01-02 18:32:39 +0100 | [diff] [blame] | 53 | " TODO: why does this fail on Windows? Runs out of stack perhaps? |
Bram Moolenaar | 6d91bcb | 2020-08-12 18:50:36 +0200 | [diff] [blame] | 54 | CheckNotMSWindows |
| 55 | |
Bram Moolenaar | 777b30f | 2017-01-02 15:26:27 +0100 | [diff] [blame] | 56 | let call_depth_here = 2 |
| 57 | let ex_depth_here = 5 |
| 58 | set mfd& |
| 59 | |
| 60 | call Recurse(99 - call_depth_here) |
| 61 | call assert_fails('call Recurse(' . (100 - call_depth_here) . ')', 'E132:') |
| 62 | |
| 63 | set mfd=210 |
| 64 | call Recurse(209 - ex_depth_here) |
| 65 | call assert_fails('call Recurse(' . (210 - ex_depth_here) . ')', 'E169:') |
| 66 | |
| 67 | set mfd& |
| 68 | endfunc |
Bram Moolenaar | 6d91bcb | 2020-08-12 18:50:36 +0200 | [diff] [blame] | 69 | |
| 70 | " vim: shiftwidth=2 sts=2 expandtab |