functests: Test for error conditions

During testing found the following bugs:

1. msgpack-gen.lua script is completely unprepared for Float values either in 
   return type or in arguments. Specifically:

   1. At the time of writing relevant code FLOAT_OBJ did not exist as well as 
      FLOATING_OBJ, but it would be used by msgpack-gen.lua should return type 
      be Float. I added FLOATING_OBJ macros later because did not know that 
      msgpack-gen.lua uses these _OBJ macros, otherwise it would be FLOAT_OBJ.
   2. msgpack-gen.lua should use .data.floating in place of .data.float. But it 
      did not expect that .data subattribute may have name different from 
      lowercased type name.

2. vim_replace_termcodes returned its argument as-is if it receives an empty 
   string (as well as _vim_id*() functions did). But if something in returned 
   argument lives in an allocated memory such action will cause double free: 
   once when freeing arguments, then when freeing return value. It did not cause 
   problems yet because msgpack bindings return empty string as {NULL, 0} and 
   nothing was actually allocated.
3. New code in msgpack-gen.lua popped arguments in reversed order, making lua 
   bindings’ signatures be different from API ones.
This commit is contained in:
ZyX
2016-07-16 02:26:04 +03:00
parent 7a013e93e0
commit ba2f615cd4
8 changed files with 138 additions and 50 deletions

View File

@@ -276,12 +276,53 @@ describe('luaeval() function', function()
end)
it('errors out correctly when working with API', function()
eq(0, exc_exec([[call luaeval("vim.api.id")]]))
-- Conversion errors
eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): Cannot convert given lua type',
exc_exec([[call luaeval("vim.api._vim_id(vim.api._vim_id)")]]))
eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): Cannot convert given lua table',
exc_exec([[call luaeval("vim.api._vim_id({1, foo=42})")]]))
eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): Cannot convert given lua type',
exc_exec([[call luaeval("vim.api._vim_id({42, vim.api._vim_id})")]]))
-- Errors in number of arguments
eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): Expected 1 argument',
exc_exec([[call luaeval("vim.api._vim_id()")]]))
eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): Expected 1 argument',
exc_exec([[call luaeval("vim.api._vim_id(1, 2)")]]))
eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): Expected 2 arguments',
exc_exec([[call luaeval("vim.api.vim_set_var(1, 2, 3)")]]))
-- Error in argument types
eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): Expected lua string',
exc_exec([[call luaeval("vim.api.vim_set_var(1, 2)")]]))
eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): Expected lua number',
exc_exec([[call luaeval("vim.api.buffer_get_line(0, 'test')")]]))
eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): Number is not integral',
exc_exec([[call luaeval("vim.api.buffer_get_line(0, 1.5)")]]))
eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): Expected lua table',
exc_exec([[call luaeval("vim.api._vim_id_float('test')")]]))
eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): Unexpected type',
exc_exec([[call luaeval("vim.api._vim_id_float({[vim.type_idx]=vim.types.dictionary})")]]))
eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): Expected lua table',
exc_exec([[call luaeval("vim.api._vim_id_array(1)")]]))
eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): Unexpected type',
exc_exec([[call luaeval("vim.api._vim_id_array({[vim.type_idx]=vim.types.dictionary})")]]))
eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): Expected lua table',
exc_exec([[call luaeval("vim.api._vim_id_dictionary(1)")]]))
eq('Vim(call):E5108: Error while calling lua chunk for luaeval(): Unexpected type',
exc_exec([[call luaeval("vim.api._vim_id_dictionary({[vim.type_idx]=vim.types.array})")]]))
-- TODO: check for errors with Tabpage argument
-- TODO: check for errors with Window argument
-- TODO: check for errors with Buffer argument
end)
it('accepts any value as API Boolean', function()
eq('', funcs.luaeval('vim.api.vim_replace_termcodes("", vim, false, nil)'))
eq('', funcs.luaeval('vim.api.vim_replace_termcodes("", 0, 1.5, "test")'))
eq('', funcs.luaeval('vim.api.vim_replace_termcodes("", true, {}, {[vim.type_idx]=vim.types.array})'))
end)
-- TODO: check buffer/window/etc.
-- TODO: check what happens when it errors out on second list item
-- TODO: check what happens if API function receives wrong number of
-- arguments.
-- TODO: check what happens if API function receives wrong argument types.
end)