Add jj and herdr

This commit is contained in:
2026-07-29 08:36:58 +02:00
parent 3f66debcc7
commit 75f2079ddf
111 changed files with 5855 additions and 0 deletions

View File

@@ -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 '<nil>' }
vim.env.HERDR_ENV = '1'
vim.env.HERDR_PANE_ID = ''
local empty = { herdr.is_in_session(), herdr.current_pane_id() or '<nil>' }
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, '<nil>' },
empty = { false, '<nil>' },
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 '<nil>' or value
end
return { values = values, calls = calls }
end)
expect.equality(result.values, {
true, false, '<nil>', '<nil>', '<nil>', '<nil>', '<nil>', '<nil>', '<nil>',
})
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 '<nil>' or value
end
return { values = values, calls = calls }
end)
expect.equality(result.values, {
true, false, '<nil>', '<nil>', '<nil>', '<nil>', '<nil>', '<nil>',
})
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 '<nil>' or value }
end
for _ = 1, 3 do
local ok, value = pcall(herdr.current_pane_is_zoomed)
values[#values + 1] = { ok, value == nil and '<nil>' or value }
end
return values
end)
expect.equality(result, {
{ true, '<nil>' },
{ true, '<nil>' },
{ true, '<nil>' },
{ true, '<nil>' },
{ true, '<nil>' },
{ true, '<nil>' },
})
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