feat(ui): test editor
This commit is contained in:
parent
181fff42de
commit
b736fd0131
1 changed files with 174 additions and 4 deletions
|
|
@ -21,12 +21,48 @@ local utils = require('cp.utils')
|
||||||
---@type EditState?
|
---@type EditState?
|
||||||
local edit_state = nil
|
local edit_state = nil
|
||||||
|
|
||||||
local function setup_keybindings(buf)
|
local setup_keybindings
|
||||||
vim.keymap.set('n', 'q', function()
|
|
||||||
M.toggle_edit()
|
---@param bufnr integer
|
||||||
end, { buffer = buf, silent = true, desc = 'Save and exit test editor' })
|
---@return integer? test_index
|
||||||
|
local function get_current_test_index(bufnr)
|
||||||
|
if not edit_state then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
for i, pair in ipairs(edit_state.test_buffers) do
|
||||||
|
if pair.input_buf == bufnr or pair.expected_buf == bufnr then
|
||||||
|
return i
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
---@param index integer
|
||||||
|
local function jump_to_test(index)
|
||||||
|
if not edit_state then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local pair = edit_state.test_buffers[index]
|
||||||
|
if pair and vim.api.nvim_win_is_valid(pair.input_win) then
|
||||||
|
vim.api.nvim_set_current_win(pair.input_win)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param delta integer
|
||||||
|
local function navigate_test(delta)
|
||||||
|
local current_buf = vim.api.nvim_get_current_buf()
|
||||||
|
local current_index = get_current_test_index(current_buf)
|
||||||
|
if not current_index or not edit_state then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local new_index = current_index + delta
|
||||||
|
if new_index < 1 or new_index > #edit_state.test_buffers then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
jump_to_test(new_index)
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param test_index integer
|
||||||
local function load_test_into_buffer(test_index)
|
local function load_test_into_buffer(test_index)
|
||||||
if not edit_state then
|
if not edit_state then
|
||||||
return
|
return
|
||||||
|
|
@ -49,6 +85,140 @@ local function load_test_into_buffer(test_index)
|
||||||
vim.api.nvim_buf_set_name(pair.expected_buf, string.format('cp://test-%d-expected', test_index))
|
vim.api.nvim_buf_set_name(pair.expected_buf, string.format('cp://test-%d-expected', test_index))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function delete_current_test()
|
||||||
|
if not edit_state then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
if #edit_state.test_buffers == 1 then
|
||||||
|
logger.log('Cannot have 0 problem tests.', vim.log.levels.ERROR)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local current_buf = vim.api.nvim_get_current_buf()
|
||||||
|
local current_index = get_current_test_index(current_buf)
|
||||||
|
if not current_index then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local pair = edit_state.test_buffers[current_index]
|
||||||
|
if vim.api.nvim_win_is_valid(pair.input_win) then
|
||||||
|
vim.api.nvim_win_close(pair.input_win, true)
|
||||||
|
end
|
||||||
|
if vim.api.nvim_win_is_valid(pair.expected_win) then
|
||||||
|
vim.api.nvim_win_close(pair.expected_win, true)
|
||||||
|
end
|
||||||
|
if vim.api.nvim_buf_is_valid(pair.input_buf) then
|
||||||
|
vim.api.nvim_buf_delete(pair.input_buf, { force = true })
|
||||||
|
end
|
||||||
|
if vim.api.nvim_buf_is_valid(pair.expected_buf) then
|
||||||
|
vim.api.nvim_buf_delete(pair.expected_buf, { force = true })
|
||||||
|
end
|
||||||
|
|
||||||
|
table.remove(edit_state.test_buffers, current_index)
|
||||||
|
table.remove(edit_state.test_cases, current_index)
|
||||||
|
|
||||||
|
for i = current_index, #edit_state.test_buffers do
|
||||||
|
load_test_into_buffer(i)
|
||||||
|
end
|
||||||
|
|
||||||
|
local next_index = math.min(current_index, #edit_state.test_buffers)
|
||||||
|
jump_to_test(next_index)
|
||||||
|
|
||||||
|
logger.log(('Deleted test %d'):format(current_index))
|
||||||
|
end
|
||||||
|
|
||||||
|
local function add_new_test()
|
||||||
|
if not edit_state then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local last_pair = edit_state.test_buffers[#edit_state.test_buffers]
|
||||||
|
if not last_pair or not vim.api.nvim_win_is_valid(last_pair.input_win) then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
vim.api.nvim_set_current_win(last_pair.input_win)
|
||||||
|
vim.cmd.vsplit()
|
||||||
|
local input_win = vim.api.nvim_get_current_win()
|
||||||
|
local input_buf = utils.create_buffer_with_options()
|
||||||
|
vim.api.nvim_win_set_buf(input_win, input_buf)
|
||||||
|
vim.bo[input_buf].modifiable = true
|
||||||
|
vim.bo[input_buf].readonly = false
|
||||||
|
vim.bo[input_buf].buftype = 'nofile'
|
||||||
|
vim.bo[input_buf].buflisted = false
|
||||||
|
helpers.clearcol(input_buf)
|
||||||
|
|
||||||
|
vim.api.nvim_set_current_win(last_pair.expected_win)
|
||||||
|
vim.cmd.vsplit()
|
||||||
|
local expected_win = vim.api.nvim_get_current_win()
|
||||||
|
local expected_buf = utils.create_buffer_with_options()
|
||||||
|
vim.api.nvim_win_set_buf(expected_win, expected_buf)
|
||||||
|
vim.bo[expected_buf].modifiable = true
|
||||||
|
vim.bo[expected_buf].readonly = false
|
||||||
|
vim.bo[expected_buf].buftype = 'nofile'
|
||||||
|
vim.bo[expected_buf].buflisted = false
|
||||||
|
helpers.clearcol(expected_buf)
|
||||||
|
|
||||||
|
local new_index = #edit_state.test_buffers + 1
|
||||||
|
local new_pair = {
|
||||||
|
input_buf = input_buf,
|
||||||
|
expected_buf = expected_buf,
|
||||||
|
input_win = input_win,
|
||||||
|
expected_win = expected_win,
|
||||||
|
}
|
||||||
|
table.insert(edit_state.test_buffers, new_pair)
|
||||||
|
table.insert(edit_state.test_cases, { index = new_index, input = '', expected = '' })
|
||||||
|
|
||||||
|
setup_keybindings(input_buf)
|
||||||
|
setup_keybindings(expected_buf)
|
||||||
|
load_test_into_buffer(new_index)
|
||||||
|
|
||||||
|
vim.api.nvim_set_current_win(input_win)
|
||||||
|
logger.log(('Added test %d'):format(new_index))
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param buf integer
|
||||||
|
setup_keybindings = function(buf)
|
||||||
|
local config = config_module.get_config()
|
||||||
|
local keys = config.ui.edit
|
||||||
|
|
||||||
|
if keys.save_and_exit_key then
|
||||||
|
vim.keymap.set('n', keys.save_and_exit_key, function()
|
||||||
|
M.toggle_edit()
|
||||||
|
end, { buffer = buf, silent = true, desc = 'Save and exit test editor' })
|
||||||
|
end
|
||||||
|
|
||||||
|
if keys.next_test_key then
|
||||||
|
vim.keymap.set('n', keys.next_test_key, function()
|
||||||
|
navigate_test(1)
|
||||||
|
end, { buffer = buf, silent = true, desc = 'Next test' })
|
||||||
|
end
|
||||||
|
|
||||||
|
if keys.prev_test_key then
|
||||||
|
vim.keymap.set('n', keys.prev_test_key, function()
|
||||||
|
navigate_test(-1)
|
||||||
|
end, { buffer = buf, silent = true, desc = 'Previous test' })
|
||||||
|
end
|
||||||
|
|
||||||
|
if keys.delete_test_key then
|
||||||
|
vim.keymap.set(
|
||||||
|
'n',
|
||||||
|
keys.delete_test_key,
|
||||||
|
delete_current_test,
|
||||||
|
{ buffer = buf, silent = true, desc = 'Delete test' }
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
if keys.add_test_key then
|
||||||
|
vim.keymap.set(
|
||||||
|
'n',
|
||||||
|
keys.add_test_key,
|
||||||
|
add_new_test,
|
||||||
|
{ buffer = buf, silent = true, desc = 'Add test' }
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local function save_all_tests()
|
local function save_all_tests()
|
||||||
if not edit_state then
|
if not edit_state then
|
||||||
return
|
return
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue