summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lua/clever_f/repeat_resolver.lua12
-rw-r--r--tests/run.lua54
2 files changed, 61 insertions, 5 deletions
diff --git a/lua/clever_f/repeat_resolver.lua b/lua/clever_f/repeat_resolver.lua
index 2924bd6..4cb1294 100644
--- a/lua/clever_f/repeat_resolver.lua
+++ b/lua/clever_f/repeat_resolver.lua
@@ -48,8 +48,9 @@ local function require_transitions(transitions, state)
transitions = transitions or state_transitions.new(state)
if type(transitions) ~= "table"
or type(transitions.SetRepeatTimestamp) ~= "function"
+ or type(transitions.PublicReset) ~= "function"
then
- fail("RepeatResolver transitions must set repeat timestamp", 3)
+ fail("RepeatResolver transitions must set repeat time and apply Public Reset", 3)
end
return transitions
end
@@ -151,7 +152,7 @@ end
RepeatResolver.sample_repeat_timeout = RepeatResolver.sample_repeat_timeout_ms
-function RepeatResolver:evaluate_timeout()
+function RepeatResolver:evaluate_timeout(current_window)
local timeout = self:sample_repeat_timeout_ms()
if timeout == 0 then
return M.Decision.REPEAT, nil
@@ -173,7 +174,8 @@ function RepeatResolver:evaluate_timeout()
if elapsed_ms <= timeout then
return M.Decision.REPEAT, elapsed_ms
end
- return nil, elapsed_ms
+ local cleanup = record.transitions:PublicReset(current_window)
+ return M.Decision.ACQUIRE, elapsed_ms, cleanup
end
RepeatResolver.check_timeout = RepeatResolver.evaluate_timeout
@@ -201,8 +203,8 @@ function M.sample_repeat_timeout_ms(options)
return RepeatResolver.new(options):sample_repeat_timeout_ms()
end
-function M.evaluate_timeout(options)
- return RepeatResolver.new(options):evaluate_timeout()
+function M.evaluate_timeout(options, current_window)
+ return RepeatResolver.new(options):evaluate_timeout(current_window)
end
setmetatable(M, {
diff --git a/tests/run.lua b/tests/run.lua
index 17d5b4b..7e5659a 100644
--- a/tests/run.lua
+++ b/tests/run.lua
@@ -3935,6 +3935,60 @@ test("Zero repeat timeout keeps repetition without reading time", function()
end
end)
+test("Expired repeat applies Public Reset and requests acquisition", function()
+ local state, transitions = fresh_sequence_state()
+ local retained_target = target("a")
+ transitions:BeginAcquisition("n", "f")
+ transitions:CommitAcquiredTarget("n", retained_target, 100)
+ transitions:CommitCommandSuccess("n", domain.Position.new(1, 2), true)
+ transitions:CacheMigemo("utf-8", { dictionary = true })
+ transitions:SetHighlightTimer("timer-expired")
+ transitions:AddTargetOverlay("char-current", "window-1", 1)
+ transitions:AddTargetOverlay("char-peer", "window-2", 1)
+ transitions:AddFinalizer("finalizer-retained", "buffer-1")
+
+ local timestamp_at_reset
+ local observed_window
+ local ordered_transitions = {
+ SetRepeatTimestamp = function(_, time_ms)
+ return transitions:SetRepeatTimestamp(time_ms)
+ end,
+ PublicReset = function(_, current_window)
+ timestamp_at_reset = state.repeat_timestamp_ms
+ observed_window = current_window
+ return transitions:PublicReset(current_window)
+ end,
+ }
+ local host = MemoryHost.new({
+ configuration = { repeat_timeout_ms = 100 },
+ time_values_ms = { 201 },
+ })
+ local resolver = repeat_resolver.new({
+ clock = host,
+ policy = policy.new(host),
+ transitions = ordered_transitions,
+ })
+
+ local decision, elapsed_ms, cleanup = resolver:evaluate_timeout("window-1")
+ same(repeat_resolver.Decision.ACQUIRE, decision)
+ same(101, elapsed_ms)
+ same(201, timestamp_at_reset)
+ same("window-1", observed_window)
+ same(nil, state:get_previous_descriptor("n"))
+ same(nil, state:get_previous_landing("n"))
+ same(nil, state:get_first_move("n"))
+ same(retained_target, state:get_previous_target("n"))
+ truthy(state.moved_forward)
+ same(0, state.repeat_timestamp_ms)
+ same(0, map_size(state.migemo_cache))
+ same(nil, state.highlight_timer)
+ same(1, #state.target_overlays)
+ same("window-2", state.target_overlays[1].window)
+ same(1, #state.finalizers)
+ same("timer-expired", cleanup.highlight_timer)
+ same("char-current", cleanup.target_overlays[1].identity)
+end)
+
for _, item in ipairs(tests) do
local ok, failure = xpcall(item.body, debug.traceback)
if not ok then