neovim/test/functional/legacy/034_user_function_spec.lua
ZyX 65fb622000 functests: Replace execute with either command or feed_command
Hope this will make people using feed_command less likely: this hides bugs.
Already found at least two:

1. msgpackparse() will show internal error: hash_add() in case of duplicate
   keys, though it will still work correctly. Currently silenced.
2. ttimeoutlen was spelled incorrectly, resulting in option not being set when
   expected. Test was still functioning somehow though. Currently fixed.
2017-04-09 03:24:08 +03:00

103 lines
3.0 KiB
Lua

-- Test for user functions.
-- Also test an <expr> mapping calling a function.
-- Also test that a builtin function cannot be replaced.
-- Also test for regression when calling arbitrary expression.
local helpers = require('test.functional.helpers')(after_each)
local feed, insert, source = helpers.feed, helpers.insert, helpers.source
local clear, feed_command, expect = helpers.clear, helpers.feed_command, helpers.expect
describe('user functions, expr-mappings, overwrite protected builtin functions and regression on calling expressions', function()
setup(clear)
it('are working', function()
insert('here')
source([[
function Table(title, ...)
let ret = a:title
let idx = 1
while idx <= a:0
exe "let ret = ret . a:" . idx
let idx = idx + 1
endwhile
return ret
endfunction
function Compute(n1, n2, divname)
if a:n2 == 0
return "fail"
endif
exe "let g:" . a:divname . " = ". a:n1 / a:n2
return "ok"
endfunction
func Expr1()
normal! v
return "111"
endfunc
func Expr2()
call search('XX', 'b')
return "222"
endfunc
func ListItem()
let g:counter += 1
return g:counter . '. '
endfunc
func ListReset()
let g:counter = 0
return ''
endfunc
func FuncWithRef(a)
unlet g:FuncRef
return a:a
endfunc
let g:FuncRef=function("FuncWithRef")
let counter = 0
inoremap <expr> ( ListItem()
inoremap <expr> [ ListReset()
imap <expr> + Expr1()
imap <expr> * Expr2()
let retval = "nop"
/^here
]])
feed('C<C-R>=Table("xxx", 4, "asdf")<cr>')
-- Using a actual space will not work as feed() calls dedent on the input.
feed('<space><C-R>=Compute(45, 0, "retval")<cr>')
feed('<space><C-R>=retval<cr>')
feed('<space><C-R>=Compute(45, 5, "retval")<cr>')
feed('<space><C-R>=retval<cr>')
feed('<space><C-R>=g:FuncRef(333)<cr>')
feed('<cr>')
feed('XX+-XX<cr>')
feed('---*---<cr>')
feed('(one<cr>')
feed('(two<cr>')
feed('[(one again<esc>')
feed_command('call append(line("$"), max([1, 2, 3]))')
feed_command('call extend(g:, {"max": function("min")})')
feed_command('call append(line("$"), max([1, 2, 3]))')
feed_command('try')
-- Regression: the first line below used to throw "E110: Missing ')'"
-- Second is here just to prove that this line is correct when not
-- skipping rhs of &&.
feed_command([[ $put =(0&&(function('tr'))(1, 2, 3))]])
feed_command([[ $put =(1&&(function('tr'))(1, 2, 3))]])
feed_command('catch')
feed_command([[ $put ='!!! Unexpected exception:']])
feed_command(' $put =v:exception')
feed_command('endtry')
-- Assert buffer contents.
expect([[
xxx4asdf fail nop ok 9 333
XX111-XX
---222---
1. one
2. two
1. one again
3
3
0
1]])
end)
end)