diff options
Diffstat (limited to 'test/functional/viml/function_spec.lua')
| -rw-r--r-- | test/functional/viml/function_spec.lua | 232 | 
1 files changed, 212 insertions, 20 deletions
| diff --git a/test/functional/viml/function_spec.lua b/test/functional/viml/function_spec.lua index 776e760aaf..0cf92f7d40 100644 --- a/test/functional/viml/function_spec.lua +++ b/test/functional/viml/function_spec.lua @@ -1,29 +1,221 @@  local helpers = require('test.functional.helpers')(after_each) -local clear = helpers.clear  local eq = helpers.eq -local exc_exec = helpers.exc_exec +local clear = helpers.clear +local funcs = helpers.funcs +local dedent = helpers.dedent +local redir_exec = helpers.redir_exec -describe('Up to MAX_FUNC_ARGS arguments are handled by', function() -  local max_func_args = 20  -- from eval.h -  local range = helpers.funcs.range +before_each(clear) -  before_each(clear) +local function check_nofunc(fname) +  eq(0, funcs.exists('*' .. fname)) +end -  it('printf()', function() -    local printf = helpers.funcs.printf -    local rep = helpers.funcs['repeat'] -    local expected = '2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,' -    eq(expected, printf(rep('%d,', max_func_args-1), unpack(range(2, max_func_args)))) -    local ret = exc_exec('call printf("", 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21)') -    eq('Vim(call):E740: Too many arguments for function printf', ret) -  end) +local function check_func(fname, body, indent) +  if type(body) == 'number' then +    body = ('return %i'):format(body) +  end +  eq(dedent(([[ -  it('rpcnotify()', function() -    local rpcnotify = helpers.funcs.rpcnotify -    local ret = rpcnotify(0, 'foo', unpack(range(3, max_func_args))) -    eq(1, ret) -    ret = exc_exec('call rpcnotify(0, "foo", 3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21)') -    eq('Vim(call):E740: Too many arguments for function rpcnotify', ret) +      function %s()%s +      endfunction]] +    ), 3):format( +      fname, +      body and ('\n1' .. (' '):rep(2 + (indent or 8)) .. body) or ''), +  redir_exec('function ' .. fname)) +end + +describe(':endfunction', function() +  it('accepts bang', function() +    eq('', redir_exec([[ +      function F() +      endfunction! +    ]])) +    check_func('F') +    eq('', redir_exec([[ +      function! F() +        return 1 +      endfunction! +    ]])) +    check_func('F', 1) +  end) +  it('accepts comments', function() +    eq('', redir_exec([[ +      function F1() +      endfunction " Comment +    ]])) +    check_func('F1') +    eq('', redir_exec([[ +      function F2() +      endfunction " }}} +    ]])) +    check_func('F2') +    eq('', redir_exec([[ +      function F3() +      endfunction " F3 +    ]])) +    check_func('F3') +    eq('', redir_exec([[ +      function F4() +      endfunction! " F4 +    ]])) +    check_func('F4') +    eq('', redir_exec([[ +      function! F4() +        return 2 +      endfunction! " F4 +    ]])) +    check_func('F4', 2) +  end) +  it('accepts function name', function() +    eq('', redir_exec([[ +      function F0() +      endfunction F0 +    ]])) +    check_func('F0') +    eq('', redir_exec([[ +      function F1() +      endfunction! F1 +    ]])) +    check_func('F1') +    eq('', redir_exec([[ +      function! F2() +      endfunction! F2 +    ]])) +    check_func('F2') +    eq('', redir_exec([[ +      function! F2() +        return 3 +      endfunction! F2 +    ]])) +    check_func('F2', 3) +  end) +  it('accepts weird characters', function() +    eq('', redir_exec([[ +      function F1() +      endfunction: }}} +    ]])) +    check_func('F1') +    -- From accurev +    eq('', redir_exec([[ +      function F2() +      endfunction :}}} +    ]])) +    check_func('F2') +    -- From cream-vimabbrev +    eq('', redir_exec([[ +      function F3() +      endfunction 1}}} +    ]])) +    check_func('F3') +    -- From pyunit +    eq('', redir_exec([[ +      function F4() +      endfunction # }}} +    ]])) +    check_func('F4') +    -- From vim-lldb +    eq('', redir_exec([[ +      function F5() +      endfunction() +    ]])) +    check_func('F5') +    -- From vim-mail +    eq('', redir_exec([[ +      function F6() +      endfunction; +    ]])) +    check_func('F6') +  end) +  it('accepts commented bar', function() +    eq('', redir_exec([[ +      function F1() +      endfunction " F1 | echo 42 +    ]])) +    check_func('F1') +    eq('', redir_exec([[ +      function! F1() +        return 42 +      endfunction! " F1 | echo 42 +    ]])) +    check_func('F1', 42) +  end) +  it('errors out on an uncommented bar', function() +    eq('\nE488: Trailing characters: | echo 42', redir_exec([[ +      function F1() +      endfunction | echo 42 +    ]])) +    check_nofunc('F1') +  end) +  it('allows running multiple commands', function() +    eq('\n2', redir_exec([[ +      function F1() +        echo 2 +      endfunction +      call F1() +    ]])) +    check_func('F1', 'echo 2') +    eq('\n2\n3\n4', redir_exec([[ +      function F2() +        echo 2 +      endfunction F2 +      function F3() +        echo 3 +      endfunction " F3 +      function! F4() +        echo 4 +      endfunction! +      call F2() +      call F3() +      call F4() +    ]])) +    check_func('F2', 'echo 2') +    check_func('F3', 'echo 3') +    check_func('F4', 'echo 4') +  end) +  it('allows running multiple commands with only one character in between', +  function() +    eq('\n3', redir_exec(dedent([[ +      function! F1() +        echo 3 +      endfunction! +      call F1()]]))) +    check_func('F1', 'echo 3', 2) +    eq('\n4', redir_exec(dedent([[ +      function F5() +        echo 4 +      endfunction +      call F5()]]))) +    check_func('F5', 'echo 4', 2) +    eq('\n5', redir_exec(dedent([[ +      function F6() +        echo 5 +      endfunction " TEST +      call F6()]]))) +    check_func('F6', 'echo 5', 2) +    eq('\n6', redir_exec(dedent([[ +      function F7() +        echo 6 +      endfunction F7 +      call F7()]]))) +    check_func('F7', 'echo 6', 2) +    eq('\n2\n3\n4', redir_exec(dedent([[ +      function F2() +        echo 2 +      endfunction F2 +      function F3() +        echo 3 +      endfunction " F3 +      function! F4() +        echo 4 +      endfunction! +      call F2() +      call F3() +      call F4()]]))) +    check_func('F2', 'echo 2', 2) +    check_func('F3', 'echo 3', 2) +    check_func('F4', 'echo 4', 2)    end)  end) +-- vim: foldmarker=▶,▲ | 
