2019-06-10 05:13:18 -07:00
|
|
|
-- Test suite for testing interactions with API bindings
|
|
|
|
local helpers = require('test.functional.helpers')(after_each)
|
2019-06-23 11:10:28 -07:00
|
|
|
local Screen = require('test.functional.ui.screen')
|
2024-01-12 10:59:57 -07:00
|
|
|
local fn = helpers.fn
|
|
|
|
local api = helpers.api
|
2019-06-10 05:13:18 -07:00
|
|
|
local clear = helpers.clear
|
2024-01-12 04:41:09 -07:00
|
|
|
local sleep = vim.uv.sleep
|
2019-06-23 11:10:28 -07:00
|
|
|
local feed = helpers.feed
|
2019-06-10 05:13:18 -07:00
|
|
|
local eq = helpers.eq
|
2019-06-23 11:10:28 -07:00
|
|
|
local eval = helpers.eval
|
2019-06-10 05:13:18 -07:00
|
|
|
local matches = helpers.matches
|
2019-06-23 11:10:28 -07:00
|
|
|
local exec_lua = helpers.exec_lua
|
2019-07-04 07:42:10 -07:00
|
|
|
local retry = helpers.retry
|
2019-06-10 05:13:18 -07:00
|
|
|
|
|
|
|
before_each(clear)
|
|
|
|
|
2023-06-03 03:06:00 -07:00
|
|
|
describe('vim.uv', function()
|
2019-06-10 05:13:18 -07:00
|
|
|
it('version', function()
|
2024-01-12 10:59:57 -07:00
|
|
|
assert(fn.luaeval('vim.uv.version()') >= 72961, 'libuv version too old')
|
|
|
|
matches('(%d+)%.(%d+)%.(%d+)', fn.luaeval('vim.uv.version_string()'))
|
2019-06-10 05:13:18 -07:00
|
|
|
end)
|
|
|
|
|
|
|
|
it('timer', function()
|
2019-06-23 11:10:28 -07:00
|
|
|
exec_lua('vim.api.nvim_set_var("coroutine_cnt", 0)', {})
|
2019-06-10 05:13:18 -07:00
|
|
|
|
|
|
|
local code = [[
|
|
|
|
local touch = 0
|
|
|
|
local function wait(ms)
|
|
|
|
local this = coroutine.running()
|
|
|
|
assert(this)
|
2024-01-12 05:03:25 -07:00
|
|
|
local timer = vim.uv.new_timer()
|
2019-06-23 11:10:28 -07:00
|
|
|
timer:start(ms, 0, vim.schedule_wrap(function ()
|
2019-06-10 05:13:18 -07:00
|
|
|
timer:close()
|
|
|
|
touch = touch + 1
|
|
|
|
coroutine.resume(this)
|
|
|
|
touch = touch + 1
|
|
|
|
assert(touch==3)
|
|
|
|
vim.api.nvim_set_var("coroutine_cnt_1", touch)
|
2019-06-23 11:10:28 -07:00
|
|
|
end))
|
2019-06-10 05:13:18 -07:00
|
|
|
coroutine.yield()
|
|
|
|
touch = touch + 1
|
|
|
|
return touch
|
|
|
|
end
|
|
|
|
coroutine.wrap(function()
|
|
|
|
local touched = wait(10)
|
|
|
|
assert(touched==touch)
|
|
|
|
vim.api.nvim_set_var("coroutine_cnt", touched)
|
|
|
|
end)()
|
|
|
|
]]
|
|
|
|
|
2024-01-12 10:59:57 -07:00
|
|
|
eq(0, api.nvim_get_var('coroutine_cnt'))
|
2019-06-23 11:10:28 -07:00
|
|
|
exec_lua(code)
|
2019-07-04 07:42:10 -07:00
|
|
|
retry(2, nil, function()
|
|
|
|
sleep(50)
|
2024-01-12 10:59:57 -07:00
|
|
|
eq(2, api.nvim_get_var('coroutine_cnt'))
|
2019-07-04 07:42:10 -07:00
|
|
|
end)
|
2024-01-12 10:59:57 -07:00
|
|
|
eq(3, api.nvim_get_var('coroutine_cnt_1'))
|
2019-06-10 05:13:18 -07:00
|
|
|
end)
|
2019-06-23 11:10:28 -07:00
|
|
|
|
|
|
|
it('is API safe', function()
|
|
|
|
local screen = Screen.new(50, 10)
|
|
|
|
screen:attach()
|
|
|
|
screen:set_default_attr_ids({
|
|
|
|
[1] = { bold = true, foreground = Screen.colors.Blue1 },
|
|
|
|
[2] = { bold = true, reverse = true },
|
|
|
|
[3] = { foreground = Screen.colors.Grey100, background = Screen.colors.Red },
|
|
|
|
[4] = { bold = true, foreground = Screen.colors.SeaGreen4 },
|
|
|
|
[5] = { bold = true },
|
|
|
|
})
|
|
|
|
|
|
|
|
-- deferred API functions are disabled, as their safety can't be guaranteed
|
|
|
|
exec_lua([[
|
2023-06-03 03:06:00 -07:00
|
|
|
local timer = vim.uv.new_timer()
|
2019-06-23 11:10:28 -07:00
|
|
|
timer:start(20, 0, function ()
|
2019-08-04 12:56:29 -07:00
|
|
|
_G.is_fast = vim.in_fast_event()
|
2019-06-23 11:10:28 -07:00
|
|
|
timer:close()
|
|
|
|
vim.api.nvim_set_var("valid", true)
|
|
|
|
vim.api.nvim_command("echomsg 'howdy'")
|
|
|
|
end)
|
|
|
|
]])
|
|
|
|
|
|
|
|
screen:expect([[
|
|
|
|
|
|
|
|
|
{2: }|
|
|
|
|
{3:Error executing luv callback:} |
|
2019-08-04 12:56:29 -07:00
|
|
|
{3:[string "<nvim>"]:5: E5560: nvim_set_var must not }|
|
2019-06-23 11:10:28 -07:00
|
|
|
{3:be called in a lua loop callback} |
|
2021-11-06 07:26:10 -07:00
|
|
|
{3:stack traceback:} |
|
|
|
|
{3: [C]: in function 'nvim_set_var'} |
|
|
|
|
{3: [string "<nvim>"]:5: in function <[string }|
|
|
|
|
{3:"<nvim>"]:2>} |
|
2019-06-23 11:10:28 -07:00
|
|
|
{4:Press ENTER or type command to continue}^ |
|
|
|
|
]])
|
|
|
|
feed('<cr>')
|
|
|
|
eq(false, eval("get(g:, 'valid', v:false)"))
|
2019-08-04 12:56:29 -07:00
|
|
|
eq(true, exec_lua('return _G.is_fast'))
|
2019-06-23 11:10:28 -07:00
|
|
|
|
|
|
|
-- callbacks can be scheduled to be executed in the main event loop
|
|
|
|
-- where the entire API is available
|
|
|
|
exec_lua([[
|
2023-06-03 03:06:00 -07:00
|
|
|
local timer = vim.uv.new_timer()
|
2019-06-23 11:10:28 -07:00
|
|
|
timer:start(20, 0, vim.schedule_wrap(function ()
|
2019-08-04 12:56:29 -07:00
|
|
|
_G.is_fast = vim.in_fast_event()
|
2019-06-23 11:10:28 -07:00
|
|
|
timer:close()
|
|
|
|
vim.api.nvim_set_var("valid", true)
|
|
|
|
vim.api.nvim_command("echomsg 'howdy'")
|
|
|
|
end))
|
|
|
|
]])
|
|
|
|
|
|
|
|
screen:expect([[
|
|
|
|
^ |
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }|*8
|
2019-06-23 11:10:28 -07:00
|
|
|
howdy |
|
|
|
|
]])
|
|
|
|
eq(true, eval("get(g:, 'valid', v:false)"))
|
2019-08-04 12:56:29 -07:00
|
|
|
eq(false, exec_lua('return _G.is_fast'))
|
2019-06-23 11:10:28 -07:00
|
|
|
|
|
|
|
-- fast (not deferred) API functions are allowed to be called directly
|
|
|
|
exec_lua([[
|
2023-06-03 03:06:00 -07:00
|
|
|
local timer = vim.uv.new_timer()
|
2019-06-23 11:10:28 -07:00
|
|
|
timer:start(20, 0, function ()
|
|
|
|
timer:close()
|
|
|
|
-- input is queued for processing after the callback returns
|
|
|
|
vim.api.nvim_input("isneaky")
|
|
|
|
_G.mode = vim.api.nvim_get_mode()
|
|
|
|
end)
|
|
|
|
]])
|
|
|
|
screen:expect([[
|
|
|
|
sneaky^ |
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }|*8
|
2019-06-23 11:10:28 -07:00
|
|
|
{5:-- INSERT --} |
|
|
|
|
]])
|
|
|
|
eq({ blocking = false, mode = 'n' }, exec_lua('return _G.mode'))
|
|
|
|
end)
|
2019-06-26 05:33:48 -07:00
|
|
|
|
|
|
|
it("is equal to require('luv')", function()
|
2023-06-03 03:06:00 -07:00
|
|
|
eq(true, exec_lua("return vim.uv == require('luv')"))
|
2019-06-26 05:33:48 -07:00
|
|
|
end)
|
2019-06-10 05:13:18 -07:00
|
|
|
end)
|