From 628b7b77372231bebae06aa092baccdf13e4cabb Mon Sep 17 00:00:00 2001 From: Stephen Waits Date: Sat, 11 Apr 2026 16:35:53 -0600 Subject: [PATCH] config: default options table with deep merge --- lua/tiny-debugger/config.lua | 68 +++++++++++++++++++++++++++++++++++- tests/test_config.lua | 37 ++++++++++++++++++++ 2 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 tests/test_config.lua diff --git a/lua/tiny-debugger/config.lua b/lua/tiny-debugger/config.lua index 9ea5a51..cba3471 100644 --- a/lua/tiny-debugger/config.lua +++ b/lua/tiny-debugger/config.lua @@ -1,5 +1,71 @@ local M = {} -M.defaults = {} +M.defaults = { + help_on_enter = true, + builtin_adapters = true, + + keys = { + continue = "c", + step_over = "s", + step_into = "d", + step_out = "r", + run_to_cursor = "C", + breakpoint = "x", + cond_breakpoint = "X", + watch = "W", + hover = "K", + eval = "E", + terminate = "q", + restart = "R", + help = "?", + }, + + dapui = { + controls = { enabled = false }, + layouts = { + { + position = "right", + size = 40, + elements = { + { id = "scopes", size = 0.50 }, + { id = "watches", size = 0.25 }, + { id = "stacks", size = 0.25 }, + }, + }, + { + position = "bottom", + size = 12, + elements = { + { id = "repl", size = 0.50 }, + { id = "console", size = 0.50 }, + }, + }, + }, + }, + + virtual_text = { + commented = true, + highlight_changed_variables = true, + only_first_definition = false, + all_frames = false, + }, + + adapters = {}, +} + +M.opts = vim.deepcopy(M.defaults) + +function M.merge(user_opts) + M.opts = vim.tbl_deep_extend("force", vim.deepcopy(M.defaults), user_opts or {}) + -- preserve false values for disabled keys (tbl_deep_extend drops them) + if user_opts and user_opts.keys then + for k, v in pairs(user_opts.keys) do + if v == false then + M.opts.keys[k] = false + end + end + end + return M.opts +end return M diff --git a/tests/test_config.lua b/tests/test_config.lua new file mode 100644 index 0000000..8efa5be --- /dev/null +++ b/tests/test_config.lua @@ -0,0 +1,37 @@ +-- tests for config module +local config = require("tiny-debugger.config") + +local function assert_eq(a, b, msg) + if a ~= b then + error(string.format("FAIL: %s — expected %s, got %s", msg, vim.inspect(b), vim.inspect(a))) + end +end + +-- test 1: defaults unchanged after empty merge +local opts = config.merge({}) +assert_eq(opts.keys.continue, "c", "default continue key") +assert_eq(opts.help_on_enter, true, "default help_on_enter") +assert_eq(opts.builtin_adapters, true, "default builtin_adapters") +assert_eq(#opts.dapui.layouts, 2, "default layout count") + +-- test 2: partial key override +opts = config.merge({ keys = { continue = "g" } }) +assert_eq(opts.keys.continue, "g", "overridden continue key") +assert_eq(opts.keys.step_over, "s", "preserved step_over key") +assert_eq(opts.keys.terminate, "q", "preserved terminate key") + +-- test 3: disable a key with false +opts = config.merge({ keys = { continue = false } }) +assert_eq(opts.keys.continue, false, "disabled continue key") +assert_eq(opts.keys.step_over, "s", "preserved step_over after disable") + +-- test 4: override help_on_enter +opts = config.merge({ help_on_enter = false }) +assert_eq(opts.help_on_enter, false, "overridden help_on_enter") +assert_eq(opts.keys.continue, "c", "keys preserved after help override") + +-- test 5: merge doesn't mutate defaults +config.merge({ keys = { continue = "z" } }) +assert_eq(config.defaults.keys.continue, "c", "defaults not mutated") + +print("ALL CONFIG TESTS PASSED")