diff options
| -rw-r--r-- | lua/clever_f/repeat_resolver.lua | 19 | ||||
| -rw-r--r-- | tests/run.lua | 5 |
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 |
