summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lua/clever_f/repeat_resolver.lua19
-rw-r--r--tests/run.lua5
2 files changed, 21 insertions, 3 deletions
diff --git a/lua/clever_f/repeat_resolver.lua b/lua/clever_f/repeat_resolver.lua
index 4155df9..5368c49 100644
--- a/lua/clever_f/repeat_resolver.lua
+++ b/lua/clever_f/repeat_resolver.lua
@@ -1,5 +1,6 @@
local domain = require("clever_f.domain")
local sequence_state = require("clever_f.sequence_state")
+local state_transitions = require("clever_f.state_transitions")
local M = {}
local RepeatResolver = {}
@@ -43,6 +44,16 @@ local function require_clock(clock)
return clock
end
+local function require_transitions(transitions, state)
+ transitions = transitions or state_transitions.new(state)
+ if type(transitions) ~= "table"
+ or type(transitions.SetRepeatTimestamp) ~= "function"
+ then
+ fail("RepeatResolver transitions must set repeat timestamp", 3)
+ end
+ return transitions
+end
+
local function finite_time(value)
return type(value) == "number"
and value == value
@@ -93,6 +104,10 @@ function RepeatResolver.new(options)
clock = require_clock(options.clock or options.time_provider or options.host),
policy = require_policy(options.policy or options.policy_service),
state = state,
+ transitions = require_transitions(
+ options.transitions or options.state_transitions,
+ state
+ ),
}
return resolver
end
@@ -150,7 +165,9 @@ function RepeatResolver:evaluate_timeout()
if not finite_time(current_time) then
fail("repeat clock must return finite milliseconds", 2)
end
- local elapsed_ms = current_time - resolver_records[self].state.repeat_timestamp_ms
+ local record = resolver_records[self]
+ local elapsed_ms = current_time - record.state.repeat_timestamp_ms
+ record.transitions:SetRepeatTimestamp(current_time)
return nil, M.truncate_elapsed_ms(elapsed_ms)
end
diff --git a/tests/run.lua b/tests/run.lua
index d024c8d..76ac8bf 100644
--- a/tests/run.lua
+++ b/tests/run.lua
@@ -3860,8 +3860,8 @@ test("Repeated primary timeout is sampled from live policy", function()
end, "requires a policy")
end)
-test("Positive repeat timeout reads the current clock", function()
- local _, transitions = fresh_sequence_state()
+test("Positive repeat timeout reads and stores the current clock", function()
+ local state, transitions = fresh_sequence_state()
transitions:SetRepeatTimestamp(25.25)
local host = MemoryHost.new({
configuration = { repeat_timeout_ms = 100 },
@@ -3875,6 +3875,7 @@ test("Positive repeat timeout reads the current clock", function()
local decision, elapsed_ms = resolver:evaluate_timeout()
same(nil, decision)
same(100, elapsed_ms)
+ same(125.75, state.repeat_timestamp_ms)
local reads = 0
for _, operation in ipairs(host:operations()) do
if operation.operation == "read_time_ms" then