summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJackson Moore <jacksonmoore@tuta.io>2026-09-04 11:11:22 +0200
committerJackson Moore <jacksonmoore@tuta.io>2026-09-04 11:11:22 +0200
commitb544bbdf40214e9601aaff374b9f1ee2723e2189 (patch)
tree6a9e9ebdf96d85bfc2301187ed5ef9ffdc49962e
parent4c3258c8c8ce623a9b6381bd408792d3f713e54a (diff)
Verify reverse request matrix
-rw-r--r--lua/clever_f/repeat_resolver.lua22
-rw-r--r--tests/run.lua27
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