summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorJackson Moore <jacksonmoore@tuta.io>2026-09-04 14:26:06 +0200
committerJackson Moore <jacksonmoore@tuta.io>2026-09-04 14:26:06 +0200
commitae03a565105416f52a09bc0a171a7fdbb9ced5a0 (patch)
treebb4f92e9934e759e1a327e60b34e8ccd34260a86 /tests
parent4cb3fb0f1532de3465962903a1697339ad3d6159 (diff)
Translate timers and events
Diffstat (limited to 'tests')
-rw-r--r--tests/run.lua95
1 files changed, 95 insertions, 0 deletions
diff --git a/tests/run.lua b/tests/run.lua
index 64c12d6..e0c9b0c 100644
--- a/tests/run.lua
+++ b/tests/run.lua
@@ -361,6 +361,101 @@ test("ActionOutcome and DotPayload retain resolved result data", function()
same("problem", domain.ActionOutcome.error(destination, "problem").diagnostic)
end)
+test("Host adapter owns Nvim timers and event registrations", function()
+ local timer_callbacks = {}
+ local stopped_timers = {}
+ local autocmds = {}
+ local deleted_autocmds = {}
+ local runtime = {
+ api = {
+ nvim_create_augroup = function(name, options)
+ same("clever_f", name)
+ truthy(options.clear)
+ return 7
+ end,
+ nvim_create_autocmd = function(names, options)
+ local id = #autocmds + 20
+ autocmds[#autocmds + 1] = {
+ id = id,
+ names = names,
+ options = options,
+ }
+ return id
+ end,
+ nvim_del_autocmd = function(id)
+ deleted_autocmds[#deleted_autocmds + 1] = id
+ end,
+ nvim_get_current_win = function()
+ return 42
+ end,
+ },
+ fn = {
+ timer_start = function(delay, callback)
+ local id = #timer_callbacks + 1
+ timer_callbacks[id] = { delay = delay, callback = callback }
+ return id
+ end,
+ timer_stop = function(id)
+ stopped_timers[#stopped_timers + 1] = id
+ end,
+ },
+ }
+ local adapter = host_adapter.new({ runtime = runtime })
+ truthy(adapter:supports_timers())
+
+ local fired
+ local first_timer = adapter:start_timer(25, function(identity)
+ fired = identity
+ end)
+ same(25, timer_callbacks[1].delay)
+ timer_callbacks[1].callback(1)
+ same(first_timer, fired)
+ falsy(adapter:stop_timer(first_timer))
+
+ local second_timer = adapter:start_timer(40, function() end)
+ truthy(adapter:stop_timer(second_timer))
+ falsy(adapter:stop_timer(second_timer))
+ list_same({ 2 }, stopped_timers)
+
+ local deliveries = {}
+ local registration = adapter:register_events(
+ { "CursorMoved", "TextChanged" },
+ function(name, payload)
+ deliveries[#deliveries + 1] = {
+ name = name,
+ buffer = payload.buffer,
+ window = payload.window,
+ }
+ end,
+ { buffer = 3 }
+ )
+ list_same({ "CursorMoved", "TextChanged" }, autocmds[1].names)
+ same(3, autocmds[1].options.buffer)
+ same(7, autocmds[1].options.group)
+
+ local transition = adapter:begin_action_transition()
+ autocmds[1].options.callback({
+ event = "CursorMoved",
+ buf = 3,
+ file = "file",
+ match = "file",
+ })
+ same(0, #deliveries)
+ adapter:commit_action_transition(transition)
+ same(1, #deliveries)
+ same("CursorMoved", deliveries[1].name)
+ same(3, deliveries[1].buffer)
+ same(42, deliveries[1].window)
+
+ adapter:deliver_event("TextChanged", { buffer = 3, window = 51 })
+ same(2, #deliveries)
+ same("TextChanged", deliveries[2].name)
+ same(51, deliveries[2].window)
+ truthy(adapter:remove_event_registration(registration))
+ falsy(adapter:remove_event_registration(registration))
+ list_same({ 20 }, deleted_autocmds)
+end)
+
test("Host adapter materializes window-local highlight resources", function()
local groups = { Existing = { fg = 7 } }
local added = {}