aerial.nvim/tests/attach_and_events_spec.lua

266 lines
8.1 KiB
Lua

require("plenary.async").tests.add_to_env()
local aerial = require("aerial")
local sleep = require("plenary.async.util").sleep
local loading = require("aerial.loading")
local test_util = require("tests.test_util")
local util = require("aerial.util")
---@param bufnr integer
---@return boolean
local function has_no_symbols(bufnr)
for _, line in ipairs(vim.api.nvim_buf_get_lines(bufnr, 0, -1, true)) do
if line:match("^%s*No symbols%s*$") then
return true
elseif not line:match("^%s*$") then
return false
end
end
return false
end
---@return integer
local function num_wins()
return #vim.api.nvim_tabpage_list_wins(0)
end
---@return integer
local function num_aerial_wins()
local ret = 0
for _, winid in ipairs(vim.api.nvim_tabpage_list_wins(0)) do
if util.is_aerial_win(winid) then
ret = ret + 1
end
end
return ret
end
a.describe("config attach_mode = 'window'", function()
after_each(function()
test_util.reset_editor()
end)
a.it("opens one aerial window per source window", function()
aerial.setup({
attach_mode = "window",
})
vim.cmd.edit({ args = { "README.md" } })
aerial.open({ focus = false })
vim.cmd.vsplit()
aerial.toggle()
assert.equals(4, num_wins())
assert.equals(2, num_aerial_wins())
end)
a.it("updates symbols when changing to unsupported buffer", function()
aerial.setup({
lazy_load = false,
attach_mode = "window",
})
vim.cmd.edit({ args = { "README.md" } })
aerial.toggle({ focus = false })
local aerial_win = util.get_aerial_win(0)
assert.is_not_nil(aerial_win)
-- Wait for symbols to populate
sleep(1)
assert.falsy(has_no_symbols(vim.api.nvim_win_get_buf(aerial_win)))
vim.cmd.edit({ args = { "LICENSE" } })
-- Wait for autocmd to run and attached buffer to switch
sleep(10)
local aerial_buf = vim.api.nvim_win_get_buf(aerial_win)
assert.truthy(loading.is_loading(aerial_buf))
sleep(50)
assert.falsy(loading.is_loading(aerial_buf))
assert.truthy(has_no_symbols(vim.api.nvim_win_get_buf(aerial_win)))
end)
a.it(
"close_automatic_events = 'unsupported' closes aerial when entering unsupported buffer",
function()
aerial.setup({
lazy_load = false,
attach_mode = "window",
close_automatic_events = { "unsupported" },
})
vim.cmd.edit({ args = { "README.md" } })
aerial.toggle({ focus = false })
local aerial_win = util.get_aerial_win(0)
assert.is_not_nil(aerial_win)
-- Wait for symbols to populate
sleep(1)
vim.cmd.edit({ args = { "LICENSE" } })
-- Wait for autocmd to run and attached buffer to switch
sleep(50)
assert.falsy(vim.api.nvim_win_is_valid(aerial_win))
end
)
a.it("close_automatic_events = 'unfocus' closes aerial when leaving window", function()
aerial.setup({
lazy_load = false,
attach_mode = "window",
close_automatic_events = { "unfocus" },
})
vim.cmd.edit({ args = { "README.md" } })
local main_win = vim.api.nvim_get_current_win()
aerial.toggle({ focus = true })
local aerial_win = vim.api.nvim_get_current_win()
assert.is_not.equals(main_win, aerial_win)
assert.truthy(vim.api.nvim_win_is_valid(aerial_win))
-- Wait for symbols to populate
sleep(1)
vim.api.nvim_set_current_win(main_win)
sleep(10)
assert.truthy(vim.api.nvim_win_is_valid(aerial_win))
vim.cmd.vsplit()
sleep(10)
assert.falsy(vim.api.nvim_win_is_valid(aerial_win))
end)
a.it(
"close_automatic_events = 'switch_buffer' closes aerial when buffer in window changes",
function()
aerial.setup({
lazy_load = false,
attach_mode = "window",
close_automatic_events = { "switch_buffer" },
})
vim.cmd.edit({ args = { "README.md" } })
aerial.toggle({ focus = false })
local aerial_win = util.get_aerial_win(0)
assert.truthy(vim.api.nvim_win_is_valid(aerial_win))
-- Wait for symbols to populate
sleep(1)
vim.cmd.edit({ args = { "doc/api.md" } })
sleep(10)
assert.falsy(vim.api.nvim_win_is_valid(aerial_win))
end
)
end)
a.describe("config attach_mode = 'global'", function()
after_each(function()
test_util.reset_editor()
end)
a.it("opens one aerial window ever", function()
aerial.setup({
attach_mode = "global",
})
vim.cmd.edit({ args = { "README.md" } })
aerial.open({ focus = false })
vim.cmd.vsplit()
sleep(10)
aerial.open()
assert.equals(3, num_wins())
assert.equals(1, num_aerial_wins())
end)
a.it("updates symbols when changing to unsupported buffer", function()
aerial.setup({
lazy_load = false,
attach_mode = "global",
})
vim.cmd.edit({ args = { "README.md" } })
aerial.toggle({ focus = false })
local aerial_win = util.get_aerial_win(0)
assert.is_not_nil(aerial_win)
-- Wait for symbols to populate
sleep(1)
assert.falsy(has_no_symbols(vim.api.nvim_win_get_buf(aerial_win)))
vim.cmd.edit({ args = { "LICENSE" } })
-- Wait for autocmd to run and attached buffer to switch
sleep(10)
local aerial_buf = vim.api.nvim_win_get_buf(aerial_win)
assert.truthy(loading.is_loading(aerial_buf))
sleep(50)
assert.falsy(loading.is_loading(aerial_buf))
assert.truthy(has_no_symbols(vim.api.nvim_win_get_buf(aerial_win)))
end)
a.it(
"close_automatic_events = 'unsupported' closes aerial when entering unsupported buffer",
function()
aerial.setup({
lazy_load = false,
attach_mode = "global",
close_automatic_events = { "unsupported" },
})
vim.cmd.edit({ args = { "README.md" } })
aerial.toggle({ focus = false })
local aerial_win = util.get_aerial_win(0)
assert.is_not_nil(aerial_win)
-- Wait for symbols to populate
sleep(1)
vim.cmd.edit({ args = { "LICENSE" } })
-- Wait for autocmd to run and attached buffer to switch
sleep(50)
assert.falsy(vim.api.nvim_win_is_valid(aerial_win))
end
)
a.it("close_automatic_events = 'unfocus' closes aerial when leaving window", function()
aerial.setup({
lazy_load = false,
attach_mode = "global",
close_automatic_events = { "unfocus" },
})
vim.cmd.edit({ args = { "README.md" } })
local main_win = vim.api.nvim_get_current_win()
aerial.toggle({ focus = true })
local aerial_win = vim.api.nvim_get_current_win()
assert.is_not.equals(main_win, aerial_win)
assert.truthy(vim.api.nvim_win_is_valid(aerial_win))
-- Wait for symbols to populate
sleep(1)
vim.api.nvim_set_current_win(main_win)
sleep(10)
assert.truthy(vim.api.nvim_win_is_valid(aerial_win))
vim.cmd.vsplit()
sleep(10)
assert.falsy(vim.api.nvim_win_is_valid(aerial_win))
end)
a.it(
"close_automatic_events = 'switch_buffer' closes aerial when buffer in window changes",
function()
aerial.setup({
lazy_load = false,
attach_mode = "global",
close_automatic_events = { "switch_buffer" },
})
vim.cmd.edit({ args = { "README.md" } })
aerial.toggle({ focus = false })
local aerial_win = util.get_aerial_win(0)
assert.truthy(vim.api.nvim_win_is_valid(aerial_win))
-- Wait for symbols to populate
sleep(1)
vim.cmd.edit({ args = { "doc/api.md" } })
sleep(10)
assert.falsy(vim.api.nvim_win_is_valid(aerial_win))
end
)
a.it("open_automatic = true opens aerial when entering supported buffer", function()
aerial.setup({
lazy_load = false,
attach_mode = "global",
open_automatic = true,
})
vim.cmd.edit({ args = { "README.md" } })
sleep(30)
local aerial_win = util.get_aerial_win(0)
assert.truthy(vim.api.nvim_win_is_valid(aerial_win))
end)
a.it("open_automatic = true does not open aerial when entering unsupported buffer", function()
aerial.setup({
lazy_load = false,
attach_mode = "global",
open_automatic = true,
})
vim.cmd.edit({ args = { "LICENSE" } })
sleep(30)
local aerial_win = util.get_aerial_win(0)
assert.is_nil(aerial_win)
end)
end)