2022-11-29 13:27:58 +00:00
|
|
|
local Config = require("lazy.core.config")
|
|
|
|
local Plugin = require("lazy.core.plugin")
|
2023-01-08 14:01:49 +00:00
|
|
|
local Loader = require("lazy.core.loader")
|
2022-11-29 13:27:58 +00:00
|
|
|
|
|
|
|
local assert = require("luassert")
|
|
|
|
|
|
|
|
Config.setup()
|
|
|
|
|
2022-12-06 10:12:54 +00:00
|
|
|
describe("plugin spec url/name", function()
|
2022-11-29 13:27:58 +00:00
|
|
|
local tests = {
|
2022-12-13 09:29:48 +00:00
|
|
|
{ { dir = "~/foo" }, { name = "foo", dir = vim.fn.fnamemodify("~/foo", ":p") } },
|
|
|
|
{ { dir = "/tmp/foo" }, { dir = "/tmp/foo", name = "foo" } },
|
2022-12-06 10:12:54 +00:00
|
|
|
{ { "foo/bar" }, { [1] = "foo/bar", name = "bar", url = "https://github.com/foo/bar.git" } },
|
2023-01-09 12:25:50 +00:00
|
|
|
{ { "https://foo.bar" }, { [1] = "https://foo.bar", name = "foo.bar", url = "https://foo.bar" } },
|
2022-12-06 10:12:54 +00:00
|
|
|
{ { "foo/bar", name = "foobar" }, { [1] = "foo/bar", name = "foobar", url = "https://github.com/foo/bar.git" } },
|
2022-12-13 09:29:48 +00:00
|
|
|
{ { "foo/bar", url = "123" }, { [1] = "foo/bar", name = "123", url = "123" } },
|
|
|
|
{ { url = "https://foobar" }, { name = "foobar", url = "https://foobar" } },
|
|
|
|
{ { url = "ssh://foobar" }, { name = "foobar", url = "ssh://foobar" } },
|
2022-12-06 10:12:54 +00:00
|
|
|
{ "foo/bar", { [1] = "foo/bar", name = "bar", url = "https://github.com/foo/bar.git" } },
|
|
|
|
{ { { { "foo/bar" } } }, { [1] = "foo/bar", name = "bar", url = "https://github.com/foo/bar.git" } },
|
2022-11-29 13:27:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
for _, test in ipairs(tests) do
|
2022-12-02 16:09:40 +00:00
|
|
|
test[2]._ = {}
|
2022-11-29 18:51:37 +00:00
|
|
|
it("parses " .. vim.inspect(test[1]):gsub("%s+", " "), function()
|
2022-12-13 09:29:48 +00:00
|
|
|
if not test[2].dir then
|
|
|
|
test[2].dir = Config.options.root .. "/" .. test[2].name
|
|
|
|
end
|
2022-11-29 13:27:58 +00:00
|
|
|
local spec = Plugin.Spec.new(test[1])
|
|
|
|
local plugins = vim.tbl_values(spec.plugins)
|
2023-01-02 13:35:36 +00:00
|
|
|
assert(#spec.notifs == 0)
|
2022-11-29 13:27:58 +00:00
|
|
|
assert.equal(1, #plugins)
|
|
|
|
assert.same(test[2], plugins[1])
|
|
|
|
end)
|
|
|
|
end
|
|
|
|
end)
|
2022-11-29 18:51:37 +00:00
|
|
|
|
|
|
|
describe("plugin spec opt", function()
|
|
|
|
it("handles dependencies", function()
|
2022-12-01 10:06:44 +00:00
|
|
|
Config.options.defaults.lazy = false
|
2022-11-29 18:51:37 +00:00
|
|
|
local tests = {
|
|
|
|
{ "foo/bar", dependencies = { "foo/dep1", "foo/dep2" } },
|
|
|
|
{ "foo/bar", dependencies = { { "foo/dep1" }, "foo/dep2" } },
|
|
|
|
{ { { "foo/bar", dependencies = { { "foo/dep1" }, "foo/dep2" } } } },
|
|
|
|
}
|
|
|
|
for _, test in ipairs(tests) do
|
2022-12-22 15:36:07 +00:00
|
|
|
local spec = Plugin.Spec.new(vim.deepcopy(test))
|
2023-01-02 13:35:36 +00:00
|
|
|
assert(#spec.notifs == 0)
|
2022-11-29 23:18:59 +00:00
|
|
|
Config.plugins = spec.plugins
|
2023-07-06 14:38:21 +01:00
|
|
|
Config.spec = spec
|
2022-11-29 23:18:59 +00:00
|
|
|
Plugin.update_state()
|
2022-11-29 18:51:37 +00:00
|
|
|
assert(vim.tbl_count(spec.plugins) == 3)
|
|
|
|
assert(#spec.plugins.bar.dependencies == 2)
|
2022-12-02 16:09:40 +00:00
|
|
|
assert(spec.plugins.bar._.dep ~= true)
|
2022-12-01 10:06:44 +00:00
|
|
|
assert(spec.plugins.bar.lazy == false)
|
2022-12-02 16:09:40 +00:00
|
|
|
assert(spec.plugins.dep1._.dep == true)
|
2022-12-01 10:06:44 +00:00
|
|
|
assert(spec.plugins.dep1.lazy == true)
|
2022-12-02 16:09:40 +00:00
|
|
|
assert(spec.plugins.dep2._.dep == true)
|
2022-12-01 10:06:44 +00:00
|
|
|
assert(spec.plugins.dep2.lazy == true)
|
2022-12-22 15:36:07 +00:00
|
|
|
spec = Plugin.Spec.new(test)
|
|
|
|
for _, plugin in pairs(spec.plugins) do
|
|
|
|
plugin.dir = nil
|
|
|
|
end
|
|
|
|
assert.same(spec.plugins, {
|
|
|
|
bar = {
|
|
|
|
"foo/bar",
|
|
|
|
_ = {},
|
|
|
|
dependencies = { "dep1", "dep2" },
|
|
|
|
name = "bar",
|
|
|
|
url = "https://github.com/foo/bar.git",
|
|
|
|
},
|
|
|
|
dep1 = {
|
|
|
|
"foo/dep1",
|
|
|
|
_ = {
|
|
|
|
dep = true,
|
|
|
|
},
|
|
|
|
name = "dep1",
|
|
|
|
url = "https://github.com/foo/dep1.git",
|
|
|
|
},
|
|
|
|
dep2 = {
|
|
|
|
"foo/dep2",
|
|
|
|
_ = {
|
|
|
|
dep = true,
|
|
|
|
},
|
|
|
|
name = "dep2",
|
|
|
|
url = "https://github.com/foo/dep2.git",
|
|
|
|
},
|
|
|
|
})
|
2022-11-29 18:51:37 +00:00
|
|
|
end
|
|
|
|
end)
|
|
|
|
|
2022-12-22 15:36:07 +00:00
|
|
|
describe("deps", function()
|
|
|
|
it("handles dep names", function()
|
|
|
|
Config.options.defaults.lazy = false
|
|
|
|
local tests = {
|
|
|
|
{ { "foo/bar", dependencies = { { "dep1" }, "foo/dep2" } }, "foo/dep1" },
|
|
|
|
{ "foo/dep1", { "foo/bar", dependencies = { { "dep1" }, "foo/dep2" } } },
|
|
|
|
}
|
|
|
|
for _, test in ipairs(tests) do
|
|
|
|
local spec = Plugin.Spec.new(vim.deepcopy(test))
|
2023-01-02 13:35:36 +00:00
|
|
|
assert(#spec.notifs == 0)
|
2022-12-22 15:36:07 +00:00
|
|
|
Config.plugins = spec.plugins
|
|
|
|
Plugin.update_state()
|
|
|
|
spec = Plugin.Spec.new(test)
|
|
|
|
for _, plugin in pairs(spec.plugins) do
|
|
|
|
plugin.dir = nil
|
|
|
|
end
|
|
|
|
assert.same(spec.plugins, {
|
|
|
|
bar = {
|
|
|
|
"foo/bar",
|
|
|
|
_ = {},
|
|
|
|
dependencies = { "dep1", "dep2" },
|
|
|
|
name = "bar",
|
|
|
|
url = "https://github.com/foo/bar.git",
|
|
|
|
},
|
|
|
|
dep1 = {
|
|
|
|
"foo/dep1",
|
|
|
|
_ = {},
|
|
|
|
name = "dep1",
|
|
|
|
url = "https://github.com/foo/dep1.git",
|
|
|
|
},
|
|
|
|
dep2 = {
|
|
|
|
"foo/dep2",
|
|
|
|
_ = {
|
|
|
|
dep = true,
|
|
|
|
},
|
|
|
|
name = "dep2",
|
|
|
|
url = "https://github.com/foo/dep2.git",
|
|
|
|
},
|
|
|
|
})
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
|
|
|
|
it("handles opt from dep", function()
|
|
|
|
Config.options.defaults.lazy = false
|
|
|
|
local spec = Plugin.Spec.new({ "foo/dep1", { "foo/bar", dependencies = { "foo/dep1", "foo/dep2" } } })
|
2023-01-02 13:35:36 +00:00
|
|
|
assert(#spec.notifs == 0)
|
2022-12-22 15:36:07 +00:00
|
|
|
Config.plugins = spec.plugins
|
|
|
|
Plugin.update_state()
|
|
|
|
assert.same(3, vim.tbl_count(spec.plugins))
|
|
|
|
assert(spec.plugins.bar._.dep ~= true)
|
|
|
|
assert(spec.plugins.bar.lazy == false)
|
|
|
|
assert(spec.plugins.dep2._.dep == true)
|
|
|
|
assert(spec.plugins.dep2.lazy == true)
|
|
|
|
assert(spec.plugins.dep1._.dep ~= true)
|
|
|
|
assert(spec.plugins.dep1.lazy == false)
|
|
|
|
end)
|
|
|
|
|
|
|
|
it("handles defaults opt", function()
|
|
|
|
do
|
|
|
|
Config.options.defaults.lazy = true
|
|
|
|
local spec = Plugin.Spec.new({ "foo/bar" })
|
2023-01-02 13:35:36 +00:00
|
|
|
assert(#spec.notifs == 0)
|
2022-12-22 15:36:07 +00:00
|
|
|
Config.plugins = spec.plugins
|
|
|
|
Plugin.update_state()
|
|
|
|
assert(spec.plugins.bar.lazy == true)
|
|
|
|
end
|
|
|
|
do
|
|
|
|
Config.options.defaults.lazy = false
|
|
|
|
local spec = Plugin.Spec.new({ "foo/bar" })
|
|
|
|
Config.plugins = spec.plugins
|
|
|
|
Plugin.update_state()
|
|
|
|
assert(spec.plugins.bar.lazy == false)
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
|
|
|
|
it("handles opt from dep", function()
|
|
|
|
Config.options.defaults.lazy = false
|
|
|
|
local spec = Plugin.Spec.new({ "foo/bar", event = "foo" })
|
2023-01-02 13:35:36 +00:00
|
|
|
assert(#spec.notifs == 0)
|
2022-12-22 15:36:07 +00:00
|
|
|
Config.plugins = spec.plugins
|
|
|
|
Plugin.update_state()
|
|
|
|
assert.same(1, vim.tbl_count(spec.plugins))
|
|
|
|
assert(spec.plugins.bar._.dep ~= true)
|
|
|
|
assert(spec.plugins.bar.lazy == true)
|
|
|
|
end)
|
|
|
|
|
|
|
|
it("merges lazy loaders", function()
|
|
|
|
local tests = {
|
|
|
|
{ { "foo/bar", event = "mod1" }, { "foo/bar", event = "mod2" } },
|
|
|
|
{ { "foo/bar", event = { "mod1" } }, { "foo/bar", event = { "mod2" } } },
|
|
|
|
{ { "foo/bar", event = "mod1" }, { "foo/bar", event = { "mod2" } } },
|
|
|
|
}
|
|
|
|
for _, test in ipairs(tests) do
|
|
|
|
local spec = Plugin.Spec.new(test)
|
2023-01-02 13:35:36 +00:00
|
|
|
assert(#spec.notifs == 0)
|
2022-12-22 15:36:07 +00:00
|
|
|
assert(vim.tbl_count(spec.plugins) == 1)
|
|
|
|
assert(type(spec.plugins.bar.event) == "table")
|
|
|
|
assert(#spec.plugins.bar.event == 2)
|
|
|
|
assert(vim.tbl_contains(spec.plugins.bar.event, "mod1"))
|
|
|
|
assert(vim.tbl_contains(spec.plugins.bar.event, "mod2"))
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
end)
|
|
|
|
|
2022-11-29 18:51:37 +00:00
|
|
|
it("handles opt from dep", function()
|
2022-12-01 10:06:44 +00:00
|
|
|
Config.options.defaults.lazy = false
|
2022-11-29 18:51:37 +00:00
|
|
|
local spec = Plugin.Spec.new({ "foo/dep1", { "foo/bar", dependencies = { "foo/dep1", "foo/dep2" } } })
|
2023-01-02 13:35:36 +00:00
|
|
|
assert(#spec.notifs == 0)
|
2022-11-29 23:18:59 +00:00
|
|
|
Config.plugins = spec.plugins
|
|
|
|
Plugin.update_state()
|
2022-11-29 18:51:37 +00:00
|
|
|
assert.same(3, vim.tbl_count(spec.plugins))
|
2022-12-02 16:09:40 +00:00
|
|
|
assert(spec.plugins.bar._.dep ~= true)
|
2022-12-01 10:06:44 +00:00
|
|
|
assert(spec.plugins.bar.lazy == false)
|
2022-12-02 16:09:40 +00:00
|
|
|
assert(spec.plugins.dep2._.dep == true)
|
2022-12-01 10:06:44 +00:00
|
|
|
assert(spec.plugins.dep2.lazy == true)
|
2022-12-02 16:09:40 +00:00
|
|
|
assert(spec.plugins.dep1._.dep ~= true)
|
2022-12-01 10:06:44 +00:00
|
|
|
assert(spec.plugins.dep1.lazy == false)
|
2022-11-29 18:51:37 +00:00
|
|
|
end)
|
|
|
|
|
2022-11-30 22:14:16 +00:00
|
|
|
it("handles defaults opt", function()
|
|
|
|
do
|
2022-12-01 10:06:44 +00:00
|
|
|
Config.options.defaults.lazy = true
|
2022-11-30 22:14:16 +00:00
|
|
|
local spec = Plugin.Spec.new({ "foo/bar" })
|
2023-01-02 13:35:36 +00:00
|
|
|
assert(#spec.notifs == 0)
|
2022-11-30 22:14:16 +00:00
|
|
|
Config.plugins = spec.plugins
|
|
|
|
Plugin.update_state()
|
2022-12-01 10:06:44 +00:00
|
|
|
assert(spec.plugins.bar.lazy == true)
|
2022-11-30 22:14:16 +00:00
|
|
|
end
|
|
|
|
do
|
2022-12-01 10:06:44 +00:00
|
|
|
Config.options.defaults.lazy = false
|
2022-11-30 22:14:16 +00:00
|
|
|
local spec = Plugin.Spec.new({ "foo/bar" })
|
|
|
|
Config.plugins = spec.plugins
|
|
|
|
Plugin.update_state()
|
2022-12-01 10:06:44 +00:00
|
|
|
assert(spec.plugins.bar.lazy == false)
|
2022-11-30 22:14:16 +00:00
|
|
|
end
|
|
|
|
end)
|
|
|
|
|
2022-11-29 18:58:23 +00:00
|
|
|
it("handles opt from dep", function()
|
2022-12-01 10:06:44 +00:00
|
|
|
Config.options.defaults.lazy = false
|
2022-12-02 08:23:27 +00:00
|
|
|
local spec = Plugin.Spec.new({ "foo/bar", event = "foo" })
|
2023-01-02 13:35:36 +00:00
|
|
|
assert(#spec.notifs == 0)
|
2022-11-29 23:18:59 +00:00
|
|
|
Config.plugins = spec.plugins
|
|
|
|
Plugin.update_state()
|
2022-11-29 18:58:23 +00:00
|
|
|
assert.same(1, vim.tbl_count(spec.plugins))
|
2022-12-02 16:09:40 +00:00
|
|
|
assert(spec.plugins.bar._.dep ~= true)
|
2022-12-01 10:06:44 +00:00
|
|
|
assert(spec.plugins.bar.lazy == true)
|
2022-11-29 18:58:23 +00:00
|
|
|
end)
|
|
|
|
|
2022-11-29 18:51:37 +00:00
|
|
|
it("merges lazy loaders", function()
|
|
|
|
local tests = {
|
2022-12-02 08:23:27 +00:00
|
|
|
{ { "foo/bar", event = "mod1" }, { "foo/bar", event = "mod2" } },
|
|
|
|
{ { "foo/bar", event = { "mod1" } }, { "foo/bar", event = { "mod2" } } },
|
|
|
|
{ { "foo/bar", event = "mod1" }, { "foo/bar", event = { "mod2" } } },
|
2022-11-29 18:51:37 +00:00
|
|
|
}
|
|
|
|
for _, test in ipairs(tests) do
|
|
|
|
local spec = Plugin.Spec.new(test)
|
2023-01-02 13:35:36 +00:00
|
|
|
assert(#spec.notifs == 0)
|
2022-11-29 18:51:37 +00:00
|
|
|
assert(vim.tbl_count(spec.plugins) == 1)
|
2022-12-02 08:23:27 +00:00
|
|
|
assert(type(spec.plugins.bar.event) == "table")
|
|
|
|
assert(#spec.plugins.bar.event == 2)
|
|
|
|
assert(vim.tbl_contains(spec.plugins.bar.event, "mod1"))
|
|
|
|
assert(vim.tbl_contains(spec.plugins.bar.event, "mod2"))
|
2022-11-29 18:51:37 +00:00
|
|
|
end
|
|
|
|
end)
|
2023-01-03 09:34:53 +00:00
|
|
|
|
|
|
|
it("handles disabled", function()
|
|
|
|
local tests = {
|
|
|
|
[{ { "foo/bar" }, { "foo/bar", enabled = false } }] = false,
|
|
|
|
[{ { "foo/bar", enabled = false }, { "foo/bar" } }] = false,
|
|
|
|
[{ { "foo/bar", enabled = false }, { "foo/bar", enabled = true } }] = true,
|
|
|
|
[{ { "foo/bar" }, { "foo/bar", enabled = true } }] = true,
|
|
|
|
}
|
|
|
|
for test, ret in pairs(tests) do
|
|
|
|
local spec = Plugin.Spec.new(test)
|
|
|
|
assert(#spec.notifs == 0)
|
|
|
|
if ret then
|
|
|
|
assert(spec.plugins.bar)
|
|
|
|
assert(not spec.disabled.bar)
|
|
|
|
else
|
|
|
|
assert(not spec.plugins.bar)
|
|
|
|
assert(spec.disabled.bar)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end)
|
2023-07-22 09:20:52 +01:00
|
|
|
|
|
|
|
it("handles the optional keyword", function()
|
|
|
|
local tests = {
|
|
|
|
[{ { "foo/bax" }, { "foo/bar", optional = true, dependencies = "foo/dep1" } }] = false,
|
|
|
|
[{ { "foo/bax", dependencies = "foo/dep1" }, { "foo/bar", optional = true, dependencies = "foo/dep1" } }] = true,
|
|
|
|
}
|
|
|
|
for test, ret in pairs(tests) do
|
|
|
|
local spec = Plugin.Spec.new(test)
|
|
|
|
assert(#spec.notifs == 0)
|
|
|
|
assert(spec.plugins.bax)
|
|
|
|
assert(not spec.plugins.bar)
|
|
|
|
assert(#spec.disabled == 0)
|
|
|
|
if ret then
|
|
|
|
assert(spec.plugins.dep1)
|
|
|
|
else
|
|
|
|
assert(not spec.plugins.opt1)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end)
|
2022-11-29 18:51:37 +00:00
|
|
|
end)
|
2023-01-08 14:01:49 +00:00
|
|
|
|
|
|
|
describe("plugin opts", function()
|
|
|
|
it("correctly parses opts", function()
|
|
|
|
---@type {spec:LazySpec, opts:table}[]
|
|
|
|
local tests = {
|
|
|
|
{
|
|
|
|
spec = { { "foo/foo", opts = { a = 1, b = 1 } }, { "foo/foo", opts = { a = 2 } } },
|
|
|
|
opts = { a = 2, b = 1 },
|
|
|
|
},
|
|
|
|
{
|
|
|
|
spec = { { "foo/foo", config = { a = 1, b = 1 } }, { "foo/foo", opts = { a = 2 } } },
|
|
|
|
opts = { a = 2, b = 1 },
|
|
|
|
},
|
|
|
|
{
|
|
|
|
spec = { { "foo/foo", opts = { a = 1, b = 1 } }, { "foo/foo", config = { a = 2 } } },
|
|
|
|
opts = { a = 2, b = 1 },
|
|
|
|
},
|
|
|
|
{
|
|
|
|
spec = { { "foo/foo", config = { a = 1, b = 1 } }, { "foo/foo", config = { a = 2 } } },
|
|
|
|
opts = { a = 2, b = 1 },
|
|
|
|
},
|
|
|
|
{
|
|
|
|
spec = { { "foo/foo", config = { a = 1, b = 1 } }, { "foo/foo", config = { a = vim.NIL } } },
|
|
|
|
opts = { b = 1 },
|
|
|
|
},
|
2023-01-08 17:45:30 +00:00
|
|
|
{
|
|
|
|
spec = { { "foo/foo", config = { a = 1, b = 1 } }, { "foo/foo" } },
|
|
|
|
opts = { a = 1, b = 1 },
|
|
|
|
},
|
|
|
|
{
|
|
|
|
spec = { { "foo/foo" }, { "foo/foo" } },
|
|
|
|
opts = {},
|
|
|
|
},
|
2023-01-08 14:01:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
for _, test in ipairs(tests) do
|
|
|
|
local spec = Plugin.Spec.new(test.spec)
|
|
|
|
assert(spec.plugins.foo)
|
2023-01-12 12:13:45 +00:00
|
|
|
assert.same(test.opts, Plugin.values(spec.plugins.foo, "opts"))
|
2023-01-08 14:01:49 +00:00
|
|
|
end
|
|
|
|
end)
|
|
|
|
end)
|