From b544bbdf40214e9601aaff374b9f1ee2723e2189 Mon Sep 17 00:00:00 2001 From: Jackson Moore Date: Fri, 4 Sep 2026 11:11:22 +0200 Subject: Verify reverse request matrix --- lua/clever_f/repeat_resolver.lua | 22 +++++++++++++--------- tests/run.lua | 27 +++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/lua/clever_f/repeat_resolver.lua b/lua/clever_f/repeat_resolver.lua index 6b2b2f6..5f6a160 100644 --- a/lua/clever_f/repeat_resolver.lua +++ b/lua/clever_f/repeat_resolver.lua @@ -198,22 +198,26 @@ local function sampled_fixed_direction(resolver) return fixed end -function M.primary_direction(stored_descriptor, pressed_key, fix_key_direction) +function M.reverse_request(stored_descriptor, pressed_key, fix_key_direction) local stored = domain.Descriptor.from_string(stored_descriptor) local pressed = domain.Descriptor.from_string(pressed_key) if type(fix_key_direction) ~= "boolean" then fail("fix_key_direction must be a Boolean", 2) end - if not fix_key_direction then - if domain.Descriptor.is_lowercase(pressed) then - return stored - end - return domain.Descriptor.swap(stored) + + local reverse = domain.Descriptor.is_uppercase(pressed) + if fix_key_direction and domain.Descriptor.is_uppercase(stored) then + reverse = not reverse end - if domain.Descriptor.is_lowercase(pressed) then - return domain.Descriptor.lowercase(stored) + return reverse +end + +function M.primary_direction(stored_descriptor, pressed_key, fix_key_direction) + local stored = domain.Descriptor.from_string(stored_descriptor) + if M.reverse_request(stored, pressed_key, fix_key_direction) then + return domain.Descriptor.swap(stored) end - return domain.Descriptor.uppercase(stored) + return stored end M.resolve_primary_direction = M.primary_direction diff --git a/tests/run.lua b/tests/run.lua index 1609593..598ea2b 100644 --- a/tests/run.lua +++ b/tests/run.lua @@ -4059,6 +4059,33 @@ test("Fixed upper-case keys use the upper-case stored form", function() end end) +test("Reverse-request algorithm matches every direction matrix pair", function() + local descriptors = { "f", "F", "t", "T" } + for _, fixed in ipairs({ false, true }) do + local pairs_checked = 0 + for _, stored in ipairs(descriptors) do + for _, pressed in ipairs(descriptors) do + local expected + if fixed then + expected = domain.Descriptor.is_lowercase(pressed) + and domain.Descriptor.lowercase(stored) + or domain.Descriptor.uppercase(stored) + else + expected = domain.Descriptor.is_lowercase(pressed) + and domain.Descriptor.from_string(stored) + or domain.Descriptor.swap(stored) + end + local reverse = repeat_resolver.reverse_request(stored, pressed, fixed) + local effective = repeat_resolver.primary_direction(stored, pressed, fixed) + same(expected, effective, stored .. "/" .. pressed .. "/" .. tostring(fixed)) + same(reverse, effective == domain.Descriptor.swap(stored)) + pairs_checked = pairs_checked + 1 + end + end + same(16, pairs_checked) + end +end) + for _, item in ipairs(tests) do local ok, failure = xpcall(item.body, debug.traceback) if not ok then -- cgit v1.2.3