From 75f2079ddf60f8901bd436e1cb908c189a8a9037 Mon Sep 17 00:00:00 2001 From: Pablu Date: Wed, 29 Jul 2026 08:36:58 +0200 Subject: Add jj and herdr --- .../herdr-splits-d880c4924f2b/tests/test_herdr.lua | 267 +++++++++++++++++++++ 1 file changed, 267 insertions(+) create mode 100644 dot_config/herdr/plugins/github/herdr-splits-d880c4924f2b/tests/test_herdr.lua (limited to 'dot_config/herdr/plugins/github/herdr-splits-d880c4924f2b/tests/test_herdr.lua') diff --git a/dot_config/herdr/plugins/github/herdr-splits-d880c4924f2b/tests/test_herdr.lua b/dot_config/herdr/plugins/github/herdr-splits-d880c4924f2b/tests/test_herdr.lua new file mode 100644 index 0000000..aecd3e0 --- /dev/null +++ b/dot_config/herdr/plugins/github/herdr-splits-d880c4924f2b/tests/test_herdr.lua @@ -0,0 +1,267 @@ +local T +local expect = MiniTest.expect +local child = MiniTest.new_child_neovim() + +local source = debug.getinfo(1, 'S').source +local root = vim.fn.fnamemodify(source:sub(2), ':p:h:h') + +T = MiniTest.new_set({ + hooks = { + pre_case = function() + child.restart({ '--noplugin', '-u', 'NONE', '-i', 'NONE' }) + child.cmd('set runtimepath^=' .. vim.fn.fnameescape(root)) + end, + post_case = function() + child.stop() + end, + }, +}) + +T['resolves the binary and requires a complete session environment'] = function() + local result = child.lua_func(function() + local config = require('herdr-splits.config') + local herdr = require('herdr-splits.herdr') + + vim.env.HERDR_BIN_PATH = '/env/herdr' + config.herdr_bin = nil + local from_env = herdr.herdr_bin() + config.herdr_bin = '/config/herdr' + local from_config = herdr.herdr_bin() + config.herdr_bin = nil + vim.env.HERDR_BIN_PATH = nil + local fallback = herdr.herdr_bin() + + vim.env.HERDR_ENV = nil + vim.env.HERDR_PANE_ID = nil + local absent = { herdr.is_in_session(), herdr.current_pane_id() or '' } + vim.env.HERDR_ENV = '1' + vim.env.HERDR_PANE_ID = '' + local empty = { herdr.is_in_session(), herdr.current_pane_id() or '' } + vim.env.HERDR_PANE_ID = 'pane-7' + local present = { herdr.is_in_session(), herdr.current_pane_id() } + + return { + binaries = { from_env, from_config, fallback }, + absent = absent, + empty = empty, + present = present, + } + end) + + expect.equality(result, { + binaries = { '/env/herdr', '/config/herdr', 'herdr' }, + absent = { false, '' }, + empty = { false, '' }, + present = { true, 'pane-7' }, + }) +end + +T['parses edge responses and rejects invalid command output'] = function() + local result = child.lua_func(function() + vim.env.HERDR_ENV = '1' + vim.env.HERDR_PANE_ID = 'pane-7' + local config = require('herdr-splits.config') + config.herdr_bin = '/fake/herdr' + + local queue = { + { stdout = vim.json.encode({ result = { edges = { left = true } } }), stderr = '', code = 0 }, + { stdout = vim.json.encode({ result = { edges = { left = false } } }), stderr = '', code = 0 }, + { stdout = '{bad', stderr = '', code = 0 }, + { stdout = '', stderr = '', code = 0 }, + { stdout = vim.json.encode({ result = {} }), stderr = '', code = 0 }, + { stdout = '{}', stderr = 'failed', code = 2 }, + { stdout = vim.json.encode({ result = { edges = {} } }), stderr = '', code = 0 }, + { stdout = '{"result":{"edges":{"left":null}}}', stderr = '', code = 0 }, + { stdout = vim.json.encode({ result = { edges = { left = 'yes' } } }), stderr = '', code = 0 }, + } + local calls = {} + vim.system = function(argv, opts) + calls[#calls + 1] = { argv = vim.deepcopy(argv), opts = vim.deepcopy(opts) } + local item = table.remove(queue, 1) + return { wait = function() return item end } + end + + package.loaded['herdr-splits.herdr'] = nil + local herdr = require('herdr-splits.herdr') + local values = {} + for i = 1, 9 do + local value = herdr.current_pane_at_edge('left') + values[i] = value == nil and '' or value + end + return { values = values, calls = calls } + end) + + expect.equality(result.values, { + true, false, '', '', '', '', '', '', '', + }) + expect.equality(#result.calls, 9) + for _, call in ipairs(result.calls) do + expect.equality(call, { + argv = { '/fake/herdr', 'pane', 'edges', '--current' }, + opts = { text = true }, + }) + end +end + +T['parses zoom responses and rejects invalid command output'] = function() + local result = child.lua_func(function() + vim.env.HERDR_ENV = '1' + vim.env.HERDR_PANE_ID = 'pane-7' + local queue = { + { stdout = vim.json.encode({ result = { layout = { zoomed = true } } }), stderr = '', code = 0 }, + { stdout = vim.json.encode({ result = { layout = { zoomed = false } } }), stderr = '', code = 0 }, + { stdout = '{bad', stderr = '', code = 0 }, + { stdout = vim.json.encode({ result = {} }), stderr = '', code = 0 }, + { stdout = '{}', stderr = '', code = 1 }, + { stdout = vim.json.encode({ result = { layout = {} } }), stderr = '', code = 0 }, + { stdout = '{"result":{"layout":{"zoomed":null}}}', stderr = '', code = 0 }, + { stdout = vim.json.encode({ result = { layout = { zoomed = 1 } } }), stderr = '', code = 0 }, + } + local calls = {} + vim.system = function(argv, opts) + calls[#calls + 1] = { argv = vim.deepcopy(argv), opts = vim.deepcopy(opts) } + local item = table.remove(queue, 1) + return { wait = function() return item end } + end + + package.loaded['herdr-splits.herdr'] = nil + local herdr = require('herdr-splits.herdr') + local values = {} + for i = 1, 8 do + local value = herdr.current_pane_is_zoomed() + values[i] = value == nil and '' or value + end + return { values = values, calls = calls } + end) + + expect.equality(result.values, { + true, false, '', '', '', '', '', '', + }) + expect.equality(#result.calls, 8) + for _, call in ipairs(result.calls) do + expect.equality(call.argv, { 'herdr', 'pane', 'layout', '--current' }) + expect.equality(call.opts, { text = true }) + end +end + +T['rejects JSON null for pane queries'] = function() + local result = child.lua_func(function() + vim.env.HERDR_ENV = '1' + vim.env.HERDR_PANE_ID = 'pane-7' + local queue = { + 'null', + '{"result":null}', + '{"result":{"edges":null}}', + 'null', + '{"result":null}', + '{"result":{"layout":null}}', + } + vim.system = function() + local stdout = table.remove(queue, 1) + return { + wait = function() + return { stdout = stdout, stderr = '', code = 0 } + end, + } + end + + package.loaded['herdr-splits.herdr'] = nil + local herdr = require('herdr-splits.herdr') + local values = {} + for _ = 1, 3 do + local ok, value = pcall(herdr.current_pane_at_edge, 'left') + values[#values + 1] = { ok, value == nil and '' or value } + end + for _ = 1, 3 do + local ok, value = pcall(herdr.current_pane_is_zoomed) + values[#values + 1] = { ok, value == nil and '' or value } + end + return values + end) + + expect.equality(result, { + { true, '' }, + { true, '' }, + { true, '' }, + { true, '' }, + { true, '' }, + { true, '' }, + }) +end + +T['focus and unzoom use exact commands and report exit status'] = function() + local result = child.lua_func(function() + vim.env.HERDR_ENV = '1' + vim.env.HERDR_PANE_ID = 'pane-7' + local queue = { + { stdout = '', stderr = '', code = 0 }, + { stdout = '', stderr = 'no neighbor', code = 1 }, + { stdout = '', stderr = '', code = 0 }, + { stdout = '', stderr = 'failed', code = 1 }, + } + local calls = {} + vim.system = function(argv, opts) + calls[#calls + 1] = { argv = vim.deepcopy(argv), opts = vim.deepcopy(opts) } + local item = table.remove(queue, 1) + return { wait = function() return item end } + end + + package.loaded['herdr-splits.herdr'] = nil + local herdr = require('herdr-splits.herdr') + return { + values = { + herdr.focus_pane('right'), + herdr.focus_pane('left'), + herdr.unzoom(), + herdr.unzoom(), + }, + calls = calls, + } + end) + + expect.equality(result.values, { true, false, true, false }) + expect.equality(result.calls, { + { argv = { 'herdr', 'pane', 'focus', '--direction', 'right', '--current' }, opts = { text = true } }, + { argv = { 'herdr', 'pane', 'focus', '--direction', 'left', '--current' }, opts = { text = true } }, + { argv = { 'herdr', 'pane', 'zoom', '--off', '--current' }, opts = { text = true } }, + { argv = { 'herdr', 'pane', 'zoom', '--off', '--current' }, opts = { text = true } }, + }) +end + +T['resize formats ratios and reports exit status'] = function() + local result = child.lua_func(function() + vim.env.HERDR_ENV = '1' + vim.env.HERDR_PANE_ID = 'pane-7' + local queue = { + { stdout = '', stderr = '', code = 0 }, + { stdout = '', stderr = 'failed', code = 1 }, + } + local calls = {} + vim.system = function(argv, opts) + calls[#calls + 1] = { argv = vim.deepcopy(argv), opts = vim.deepcopy(opts) } + local item = table.remove(queue, 1) + return { wait = function() return item end } + end + + package.loaded['herdr-splits.herdr'] = nil + local herdr = require('herdr-splits.herdr') + return { + values = { herdr.resize_pane('down', 0.03), herdr.resize_pane('left', 1 / 3) }, + calls = calls, + } + end) + + expect.equality(result.values, { true, false }) + expect.equality(result.calls, { + { + argv = { 'herdr', 'pane', 'resize', '--direction', 'down', '--amount', '0.0300', '--current' }, + opts = { text = true }, + }, + { + argv = { 'herdr', 'pane', 'resize', '--direction', 'left', '--amount', '0.3333', '--current' }, + opts = { text = true }, + }, + }) +end + +return T -- cgit 1.3.1