mirror of
https://github.com/neovim/neovim.git
synced 2026-04-20 06:20:53 +00:00
Merge #8371 'API: more reliable/descriptive VimL errors'
This commit is contained in:
@@ -11,6 +11,7 @@ local ok = helpers.ok
|
||||
local meths = helpers.meths
|
||||
local spawn, nvim_argv = helpers.spawn, helpers.nvim_argv
|
||||
local set_session = helpers.set_session
|
||||
local expect_err = helpers.expect_err
|
||||
|
||||
describe('server -> client', function()
|
||||
local cid
|
||||
@@ -221,9 +222,8 @@ describe('server -> client', function()
|
||||
end)
|
||||
|
||||
it('returns an error if the request failed', function()
|
||||
local status, err = pcall(eval, "rpcrequest(vim, 'does-not-exist')")
|
||||
eq(false, status)
|
||||
ok(nil ~= string.match(err, 'Failed to evaluate expression'))
|
||||
expect_err('Vim:Invalid method name',
|
||||
eval, "rpcrequest(vim, 'does-not-exist')")
|
||||
end)
|
||||
end)
|
||||
|
||||
@@ -250,7 +250,7 @@ describe('server -> client', function()
|
||||
end)
|
||||
|
||||
after_each(function()
|
||||
funcs.jobstop(jobid)
|
||||
pcall(funcs.jobstop, jobid)
|
||||
end)
|
||||
|
||||
if helpers.pending_win32(pending) then return end
|
||||
@@ -261,7 +261,7 @@ describe('server -> client', function()
|
||||
eq({'notification', 'pong', {}}, next_msg())
|
||||
eq("done!",funcs.rpcrequest(jobid, "write_stderr", "fluff\n"))
|
||||
eq({'notification', 'stderr', {0, {'fluff', ''}}}, next_msg())
|
||||
funcs.rpcrequest(jobid, "exit")
|
||||
pcall(funcs.rpcrequest, jobid, "exit")
|
||||
eq({'notification', 'stderr', {0, {''}}}, next_msg())
|
||||
eq({'notification', 'exit', {0, 0}}, next_msg())
|
||||
end)
|
||||
@@ -308,8 +308,8 @@ describe('server -> client', function()
|
||||
it('via ipv4 address', function()
|
||||
local server = spawn(nvim_argv)
|
||||
set_session(server)
|
||||
local address = funcs.serverstart("127.0.0.1:")
|
||||
if #address == 0 then
|
||||
local status, address = pcall(funcs.serverstart, "127.0.0.1:")
|
||||
if not status then
|
||||
pending('no ipv4 stack', function() end)
|
||||
return
|
||||
end
|
||||
@@ -320,8 +320,8 @@ describe('server -> client', function()
|
||||
it('via ipv6 address', function()
|
||||
local server = spawn(nvim_argv)
|
||||
set_session(server)
|
||||
local address = funcs.serverstart('::1:')
|
||||
if #address == 0 then
|
||||
local status, address = pcall(funcs.serverstart, '::1:')
|
||||
if not status then
|
||||
pending('no ipv6 stack', function() end)
|
||||
return
|
||||
end
|
||||
|
||||
@@ -5,6 +5,7 @@ local global_helpers = require('test.helpers')
|
||||
local NIL = helpers.NIL
|
||||
local clear, nvim, eq, neq = helpers.clear, helpers.nvim, helpers.eq, helpers.neq
|
||||
local command = helpers.command
|
||||
local eval = helpers.eval
|
||||
local funcs = helpers.funcs
|
||||
local iswin = helpers.iswin
|
||||
local meth_pcall = helpers.meth_pcall
|
||||
@@ -40,20 +41,20 @@ describe('api', function()
|
||||
os.remove(fname)
|
||||
end)
|
||||
|
||||
it("parse error: fails (specific error), does NOT update v:errmsg", function()
|
||||
-- Most API methods return generic errors (or no error) if a VimL
|
||||
-- expression fails; nvim_command returns the VimL error details.
|
||||
it('VimL validation error: fails with specific error', function()
|
||||
local status, rv = pcall(nvim, "command", "bogus_command")
|
||||
eq(false, status) -- nvim_command() failed.
|
||||
eq("E492:", string.match(rv, "E%d*:")) -- VimL error was returned.
|
||||
eq("", nvim("eval", "v:errmsg")) -- v:errmsg was not updated.
|
||||
eq('', nvim('eval', 'v:errmsg')) -- v:errmsg was not updated.
|
||||
eq('', eval('v:exception'))
|
||||
end)
|
||||
|
||||
it("runtime error: fails (specific error)", function()
|
||||
it('VimL execution error: fails with specific error', function()
|
||||
local status, rv = pcall(nvim, "command_output", "buffer 23487")
|
||||
eq(false, status) -- nvim_command() failed.
|
||||
eq("E86: Buffer 23487 does not exist", string.match(rv, "E%d*:.*"))
|
||||
eq("", nvim("eval", "v:errmsg")) -- v:errmsg was not updated.
|
||||
eq('', eval('v:errmsg')) -- v:errmsg was not updated.
|
||||
eq('', eval('v:exception'))
|
||||
end)
|
||||
end)
|
||||
|
||||
@@ -109,21 +110,21 @@ describe('api', function()
|
||||
eq(':!echo foo\r\n\nfoo'..win_lf..'\n', nvim('command_output', [[!echo foo]]))
|
||||
end)
|
||||
|
||||
it("parse error: fails (specific error), does NOT update v:errmsg", function()
|
||||
it('VimL validation error: fails with specific error', function()
|
||||
local status, rv = pcall(nvim, "command_output", "bogus commannnd")
|
||||
eq(false, status) -- nvim_command_output() failed.
|
||||
eq("E492: Not an editor command: bogus commannnd",
|
||||
string.match(rv, "E%d*:.*"))
|
||||
eq("", nvim("eval", "v:errmsg")) -- v:errmsg was not updated.
|
||||
eq('', eval('v:errmsg')) -- v:errmsg was not updated.
|
||||
-- Verify NO hit-enter prompt.
|
||||
eq({mode='n', blocking=false}, nvim("get_mode"))
|
||||
end)
|
||||
|
||||
it("runtime error: fails (specific error)", function()
|
||||
it('VimL execution error: fails with specific error', function()
|
||||
local status, rv = pcall(nvim, "command_output", "buffer 42")
|
||||
eq(false, status) -- nvim_command_output() failed.
|
||||
eq("E86: Buffer 42 does not exist", string.match(rv, "E%d*:.*"))
|
||||
eq("", nvim("eval", "v:errmsg")) -- v:errmsg was not updated.
|
||||
eq('', eval('v:errmsg')) -- v:errmsg was not updated.
|
||||
-- Verify NO hit-enter prompt.
|
||||
eq({mode='n', blocking=false}, nvim("get_mode"))
|
||||
end)
|
||||
@@ -145,11 +146,10 @@ describe('api', function()
|
||||
eq(2, request("vim_eval", "1+1"))
|
||||
end)
|
||||
|
||||
it("VimL error: fails (generic error), does NOT update v:errmsg", function()
|
||||
local status, rv = pcall(nvim, "eval", "bogus expression")
|
||||
eq(false, status) -- nvim_eval() failed.
|
||||
ok(nil ~= string.find(rv, "Failed to evaluate expression"))
|
||||
eq("", nvim("eval", "v:errmsg")) -- v:errmsg was not updated.
|
||||
it("VimL error: returns error details, does NOT update v:errmsg", function()
|
||||
expect_err('E121: Undefined variable: bogus', request,
|
||||
'nvim_eval', 'bogus expression')
|
||||
eq('', eval('v:errmsg')) -- v:errmsg was not updated.
|
||||
end)
|
||||
end)
|
||||
|
||||
@@ -160,12 +160,39 @@ describe('api', function()
|
||||
eq(17, nvim('call_function', 'eval', {17}))
|
||||
eq('foo', nvim('call_function', 'simplify', {'this/./is//redundant/../../../foo'}))
|
||||
end)
|
||||
it("VimL error: fails (generic error), does NOT update v:errmsg", function()
|
||||
local status, rv = pcall(nvim, "call_function", "bogus function", {"arg1"})
|
||||
eq(false, status) -- nvim_call_function() failed.
|
||||
ok(nil ~= string.find(rv, "Error calling function"))
|
||||
eq("", nvim("eval", "v:errmsg")) -- v:errmsg was not updated.
|
||||
|
||||
it("VimL validation error: returns specific error, does NOT update v:errmsg", function()
|
||||
expect_err('E117: Unknown function: bogus function', request,
|
||||
'nvim_call_function', 'bogus function', {'arg1'})
|
||||
expect_err('E119: Not enough arguments for function: atan', request,
|
||||
'nvim_call_function', 'atan', {})
|
||||
eq('', eval('v:exception'))
|
||||
eq('', eval('v:errmsg')) -- v:errmsg was not updated.
|
||||
end)
|
||||
|
||||
it("VimL error: returns error details, does NOT update v:errmsg", function()
|
||||
expect_err('E808: Number or Float required', request,
|
||||
'nvim_call_function', 'atan', {'foo'})
|
||||
expect_err('Invalid channel stream "xxx"', request,
|
||||
'nvim_call_function', 'chanclose', {999, 'xxx'})
|
||||
expect_err('E900: Invalid channel id', request,
|
||||
'nvim_call_function', 'chansend', {999, 'foo'})
|
||||
eq('', eval('v:exception'))
|
||||
eq('', eval('v:errmsg')) -- v:errmsg was not updated.
|
||||
end)
|
||||
|
||||
it("VimL exception: returns exception details, does NOT update v:errmsg", function()
|
||||
source([[
|
||||
function! Foo() abort
|
||||
throw 'wtf'
|
||||
endfunction
|
||||
]])
|
||||
expect_err('wtf', request,
|
||||
'nvim_call_function', 'Foo', {})
|
||||
eq('', eval('v:exception'))
|
||||
eq('', eval('v:errmsg')) -- v:errmsg was not updated.
|
||||
end)
|
||||
|
||||
it('validates args', function()
|
||||
local too_many_args = { 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x' }
|
||||
source([[
|
||||
@@ -216,7 +243,7 @@ describe('api', function()
|
||||
'nvim_call_dict_function', 'g:d', 'baz', {1,2})
|
||||
expect_err('Not a function: meep', request,
|
||||
'nvim_call_dict_function', 'g:d', 'meep', {1,2})
|
||||
expect_err('Error calling function', request,
|
||||
expect_err('E117: Unknown function: f', request,
|
||||
'nvim_call_dict_function', { f = '' }, 'f', {1,2})
|
||||
expect_err('Not a function: f', request,
|
||||
'nvim_call_dict_function', "{ 'f': '' }", 'f', {1,2})
|
||||
|
||||
@@ -15,6 +15,7 @@ local curwinmeths = helpers.curwinmeths
|
||||
local curtabmeths = helpers.curtabmeths
|
||||
local get_pathsep = helpers.get_pathsep
|
||||
local rmdir = helpers.rmdir
|
||||
local expect_err = helpers.expect_err
|
||||
|
||||
local fname = 'Xtest-functional-eval-buf_functions'
|
||||
local fname2 = fname .. '.2'
|
||||
@@ -296,8 +297,8 @@ describe('setbufvar() function', function()
|
||||
eq('Vim(call):E461: Illegal variable name: b:',
|
||||
exc_exec('call setbufvar(1, "", 0)'))
|
||||
eq(true, bufmeths.get_var(buf1, 'number'))
|
||||
funcs.setbufvar(1, 'changedtick', true)
|
||||
-- eq(true, bufmeths.get_var(buf1, 'changedtick'))
|
||||
expect_err('Vim:E46: Cannot change read%-only variable "b:changedtick"',
|
||||
funcs.setbufvar, 1, 'changedtick', true)
|
||||
eq(2, funcs.getbufvar(1, 'changedtick'))
|
||||
end)
|
||||
end)
|
||||
|
||||
@@ -6,6 +6,7 @@ local clear = helpers.clear
|
||||
local funcs = helpers.funcs
|
||||
local command = helpers.command
|
||||
local exc_exec = helpers.exc_exec
|
||||
local expect_err = helpers.expect_err
|
||||
|
||||
before_each(clear)
|
||||
|
||||
@@ -40,9 +41,11 @@ describe('setmatches()', function()
|
||||
end)
|
||||
|
||||
it('fails with -1 if highlight group is not defined', function()
|
||||
eq(-1, funcs.setmatches({{group=1, pattern=2, id=3, priority=4}}))
|
||||
expect_err('E28: No such highlight group name: 1', funcs.setmatches,
|
||||
{{group=1, pattern=2, id=3, priority=4}})
|
||||
eq({}, funcs.getmatches())
|
||||
eq(-1, funcs.setmatches({{group=1, pos1={2}, pos2={6}, id=3, priority=4, conceal=5}}))
|
||||
expect_err('E28: No such highlight group name: 1', funcs.setmatches,
|
||||
{{group=1, pos1={2}, pos2={6}, id=3, priority=4, conceal=5}})
|
||||
eq({}, funcs.getmatches())
|
||||
end)
|
||||
end)
|
||||
|
||||
@@ -5,6 +5,7 @@ local clear, funcs, meths = helpers.clear, helpers.funcs, helpers.meths
|
||||
local iswin = helpers.iswin
|
||||
local ok = helpers.ok
|
||||
local matches = helpers.matches
|
||||
local expect_err = helpers.expect_err
|
||||
|
||||
local function clear_serverlist()
|
||||
for _, server in pairs(funcs.serverlist()) do
|
||||
@@ -86,22 +87,23 @@ describe('server', function()
|
||||
|
||||
local expected = {}
|
||||
local v4 = '127.0.0.1:12345'
|
||||
s = funcs.serverstart(v4)
|
||||
if #s > 0 then
|
||||
local status, _ = pcall(funcs.serverstart, v4)
|
||||
if status then
|
||||
table.insert(expected, v4)
|
||||
funcs.serverstart(v4) -- exists already; ignore
|
||||
pcall(funcs.serverstart, v4) -- exists already; ignore
|
||||
end
|
||||
|
||||
local v6 = '::1:12345'
|
||||
s = funcs.serverstart(v6)
|
||||
if #s > 0 then
|
||||
status, _ = pcall(funcs.serverstart, v6)
|
||||
if status then
|
||||
table.insert(expected, v6)
|
||||
funcs.serverstart(v6) -- exists already; ignore
|
||||
pcall(funcs.serverstart, v6) -- exists already; ignore
|
||||
end
|
||||
eq(expected, funcs.serverlist())
|
||||
clear_serverlist()
|
||||
|
||||
funcs.serverstart('127.0.0.1:65536') -- invalid port
|
||||
expect_err('Failed to start server: invalid argument',
|
||||
funcs.serverstart, '127.0.0.1:65536') -- invalid port
|
||||
eq({}, funcs.serverlist())
|
||||
end)
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ describe('Test getting and setting file permissions', function()
|
||||
|
||||
it('file permissions', function()
|
||||
eq('', call('getfperm', tempfile))
|
||||
eq(0, call('setfperm', tempfile, 'r------'))
|
||||
eq(0, call('setfperm', tempfile, 'r--------'))
|
||||
|
||||
call('writefile', {'one'}, tempfile)
|
||||
eq(9, call('len', call('getfperm', tempfile)))
|
||||
|
||||
@@ -51,12 +51,12 @@ describe('luaeval()', function()
|
||||
end)
|
||||
describe('recursive lua values', function()
|
||||
it('are successfully transformed', function()
|
||||
funcs.luaeval('rawset(_G, "d", {})')
|
||||
funcs.luaeval('rawset(d, "d", d)')
|
||||
command('lua rawset(_G, "d", {})')
|
||||
command('lua rawset(d, "d", d)')
|
||||
eq('\n{\'d\': {...@0}}', funcs.execute('echo luaeval("d")'))
|
||||
|
||||
funcs.luaeval('rawset(_G, "l", {})')
|
||||
funcs.luaeval('table.insert(l, l)')
|
||||
command('lua rawset(_G, "l", {})')
|
||||
command('lua table.insert(l, l)')
|
||||
eq('\n[[...@0]]', funcs.execute('echo luaeval("l")'))
|
||||
end)
|
||||
end)
|
||||
|
||||
Reference in New Issue
Block a user