From 7270d62b3c02b2b36bbc23fdaef444fca3dc00be Mon Sep 17 00:00:00 2001 From: Marc Jakobi Date: Fri, 7 Jun 2024 13:06:23 +0200 Subject: [PATCH] tests: add cmd_spec --- lua/lz/n/handler/cmd.lua | 9 ++++-- spec/cmd_spec.lua | 59 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 spec/cmd_spec.lua diff --git a/lua/lz/n/handler/cmd.lua b/lua/lz/n/handler/cmd.lua index 3b0690c..1f617af 100644 --- a/lua/lz/n/handler/cmd.lua +++ b/lua/lz/n/handler/cmd.lua @@ -66,9 +66,12 @@ local function add_cmd(cmd) }) end ----@param cmd string -function M.del(cmd) - pcall(vim.api.nvim_del_user_command, cmd) +---@param plugin LzPlugin +function M.del(plugin) + pcall(vim.api.nvim_del_user_command, plugin.cmd) + for _, plugins in pairs(M.pending) do + plugins[plugin.name] = nil + end end ---@param plugin LzPlugin diff --git a/spec/cmd_spec.lua b/spec/cmd_spec.lua new file mode 100644 index 0000000..1c21ace --- /dev/null +++ b/spec/cmd_spec.lua @@ -0,0 +1,59 @@ +---@diagnostic disable: invisible +local cmd = require("lz.n.handler.cmd") +local state = require("lz.n.state") +local loader = require("lz.n.loader") +local spy = require("luassert.spy") + +describe("cmd", function() + it("Command only loads plugin once and executes plugin command", function() + ---@type LzPlugin + local plugin = { + name = "foo", + cmd = { "Foo" }, + } + local spy_load = spy.on(loader, "_load") + state.plugins[plugin.name] = plugin + cmd.add(plugin) + assert.is_not_nil(vim.cmd.Foo) + local counter = 0 + local orig_load = loader._load + ---@diagnostic disable-next-line: duplicate-set-field + loader._load = function(...) + orig_load(...) + vim.api.nvim_create_user_command("Foo", function() + counter = counter + 1 + end, {}) + end + vim.cmd.Foo() + vim.cmd.Foo() + assert.spy(spy_load).called(1) + assert.same(2, counter) + loader._load = orig_load + end) + it("Multiple commands only load plugin once", function() + ---@param commands string[] + local function itt(commands) + local orig_load = loader._load + ---@diagnostic disable-next-line: duplicate-set-field + loader._load = function(...) + orig_load(...) + vim.api.nvim_create_user_command("Foo", function() end, {}) + vim.api.nvim_create_user_command("Bar", function() end, {}) + end + ---@type LzPlugin + local plugin = { + name = "foo", + cmd = commands, + } + local spy_load = spy.on(loader, "_load") + state.plugins[plugin.name] = plugin + cmd.add(plugin) + vim.cmd[commands[1]]() + vim.cmd[commands[2]]() + assert.spy(spy_load).called(1) + loader._load = orig_load + end + itt({ "Foo", "Bar" }) + itt({ "Bar", "Foo" }) + end) +end)