require("plenary.async").tests.add_to_env() local fs = require("oil.fs") local oil = require("oil") local test_util = require("tests.test_util") a.describe("Alternate buffer", function() after_each(function() test_util.reset_editor() end) a.it("sets previous buffer as alternate", function() vim.cmd.edit({ args = { "foo" } }) oil.open() test_util.wait_for_autocmd({ "User", pattern = "OilEnter" }) vim.cmd.edit({ args = { "bar" } }) assert.equals("foo", vim.fn.expand("#")) end) a.it("sets previous buffer as alternate when editing url file", function() vim.cmd.edit({ args = { "foo" } }) oil.open() test_util.wait_for_autocmd({ "User", pattern = "OilEnter" }) local readme = fs.join(vim.fn.getcwd(), "README.md") vim.cmd.edit({ args = { "oil://" .. fs.os_to_posix_path(readme) } }) -- We're gonna jump around to 2 different buffers test_util.wait_for_autocmd("BufEnter") test_util.wait_for_autocmd("BufEnter") assert.equals(readme, vim.api.nvim_buf_get_name(0)) assert.equals("foo", vim.fn.expand("#")) end) a.it("sets previous buffer as alternate when editing oil://", function() vim.cmd.edit({ args = { "foo" } }) vim.cmd.edit({ args = { "oil://" .. fs.os_to_posix_path(vim.fn.getcwd()) } }) test_util.wait_for_autocmd({ "User", pattern = "OilEnter" }) vim.cmd.edit({ args = { "bar" } }) assert.equals("foo", vim.fn.expand("#")) end) a.it("preserves alternate buffer if editing the same file", function() vim.cmd.edit({ args = { "foo" } }) vim.cmd.edit({ args = { "bar" } }) oil.open() test_util.wait_for_autocmd({ "User", pattern = "OilEnter" }) vim.cmd.edit({ args = { "bar" } }) assert.equals("foo", vim.fn.expand("#")) end) a.it("preserves alternate buffer if discarding changes", function() vim.cmd.edit({ args = { "foo" } }) vim.cmd.edit({ args = { "bar" } }) oil.open() test_util.wait_for_autocmd({ "User", pattern = "OilEnter" }) oil.close() assert.equals("bar", vim.fn.expand("%")) assert.equals("foo", vim.fn.expand("#")) end) a.it("sets previous buffer as alternate after multi-dir hops", function() vim.cmd.edit({ args = { "foo" } }) oil.open() test_util.wait_for_autocmd({ "User", pattern = "OilEnter" }) oil.open() test_util.wait_for_autocmd({ "User", pattern = "OilEnter" }) oil.open() test_util.wait_for_autocmd({ "User", pattern = "OilEnter" }) oil.open() test_util.wait_for_autocmd({ "User", pattern = "OilEnter" }) vim.cmd.edit({ args = { "bar" } }) assert.equals("foo", vim.fn.expand("#")) end) a.it("sets previous buffer as alternate when inside oil buffer", function() vim.cmd.edit({ args = { "foo" } }) oil.open() test_util.wait_for_autocmd({ "User", pattern = "OilEnter" }) assert.equals("foo", vim.fn.expand("#")) vim.cmd.edit({ args = { "bar" } }) assert.equals("foo", vim.fn.expand("#")) oil.open() assert.equals("bar", vim.fn.expand("#")) end) a.it("preserves alternate when traversing oil dirs", function() vim.cmd.edit({ args = { "foo" } }) oil.open() test_util.wait_for_autocmd({ "User", pattern = "OilEnter" }) assert.equals("foo", vim.fn.expand("#")) vim.wait(1000, function() return oil.get_cursor_entry() end, 10) vim.api.nvim_win_set_cursor(0, { 1, 1 }) oil.select() test_util.wait_for_autocmd({ "User", pattern = "OilEnter" }) assert.equals("foo", vim.fn.expand("#")) end) a.it("preserves alternate when opening preview", function() vim.cmd.edit({ args = { "foo" } }) oil.open() test_util.wait_for_autocmd({ "User", pattern = "OilEnter" }) assert.equals("foo", vim.fn.expand("#")) vim.wait(1000, function() return oil.get_cursor_entry() end, 10) vim.api.nvim_win_set_cursor(0, { 1, 1 }) oil.open_preview() test_util.wait_for_autocmd({ "User", pattern = "OilEnter" }) assert.equals("foo", vim.fn.expand("#")) end) a.describe("floating window", function() a.it("sets previous buffer as alternate", function() vim.cmd.edit({ args = { "foo" } }) oil.open_float() test_util.wait_for_autocmd({ "User", pattern = "OilEnter" }) -- This is lazy, but testing the actual select logic is more difficult. We can simply -- replicate it by closing the current window and then doing the edit vim.api.nvim_win_close(0, true) vim.cmd.edit({ args = { "bar" } }) assert.equals("foo", vim.fn.expand("#")) end) a.it("preserves alternate buffer if editing the same file", function() vim.cmd.edit({ args = { "foo" } }) vim.cmd.edit({ args = { "bar" } }) oil.open_float() test_util.wait_for_autocmd({ "User", pattern = "OilEnter" }) -- This is lazy, but testing the actual select logic is more difficult. We can simply -- replicate it by closing the current window and then doing the edit vim.api.nvim_win_close(0, true) vim.cmd.edit({ args = { "bar" } }) assert.equals("foo", vim.fn.expand("#")) end) a.it("preserves alternate buffer if discarding changes", function() vim.cmd.edit({ args = { "foo" } }) vim.cmd.edit({ args = { "bar" } }) oil.open_float() test_util.wait_for_autocmd({ "User", pattern = "OilEnter" }) oil.close() assert.equals("foo", vim.fn.expand("#")) end) a.it("preserves alternate when traversing to a new file", function() vim.cmd.edit({ args = { "foo" } }) oil.open_float() test_util.wait_for_autocmd({ "User", pattern = "OilEnter" }) assert.equals("foo", vim.fn.expand("#")) test_util.feedkeys({ "/LICENSE" }, 10) oil.select() test_util.wait_for_autocmd("BufEnter") assert.equals("LICENSE", vim.fn.expand("%:.")) assert.equals("foo", vim.fn.expand("#")) end) end) end)