diff options
| -rw-r--r-- | lua/clever_f/repeat_resolver.lua | 12 | ||||
| -rw-r--r-- | tests/run.lua | 12 |
2 files changed, 22 insertions, 2 deletions
diff --git a/lua/clever_f/repeat_resolver.lua b/lua/clever_f/repeat_resolver.lua index c62a86f..4155df9 100644 --- a/lua/clever_f/repeat_resolver.lua +++ b/lua/clever_f/repeat_resolver.lua @@ -50,6 +50,16 @@ local function finite_time(value) and value < math.huge end +function M.truncate_elapsed_ms(elapsed_ms) + if not finite_time(elapsed_ms) then + fail("elapsed milliseconds must be finite", 2) + end + local integer_part = math.modf(elapsed_ms) + return integer_part +end + +M.truncate_milliseconds = M.truncate_elapsed_ms + local resolver_metatable = { __index = RepeatResolver, __newindex = function() @@ -141,7 +151,7 @@ function RepeatResolver:evaluate_timeout() fail("repeat clock must return finite milliseconds", 2) end local elapsed_ms = current_time - resolver_records[self].state.repeat_timestamp_ms - return nil, elapsed_ms + return nil, M.truncate_elapsed_ms(elapsed_ms) end RepeatResolver.check_timeout = RepeatResolver.evaluate_timeout diff --git a/tests/run.lua b/tests/run.lua index 437a3ba..d024c8d 100644 --- a/tests/run.lua +++ b/tests/run.lua @@ -3874,7 +3874,7 @@ test("Positive repeat timeout reads the current clock", function() local decision, elapsed_ms = resolver:evaluate_timeout() same(nil, decision) - same(100.5, elapsed_ms) + same(100, elapsed_ms) local reads = 0 for _, operation in ipairs(host:operations()) do if operation.operation == "read_time_ms" then @@ -3884,6 +3884,16 @@ test("Positive repeat timeout reads the current clock", function() same(1, reads) end) +test("Elapsed repeat milliseconds truncate toward zero", function() + same(99, repeat_resolver.truncate_elapsed_ms(99.999)) + same(-99, repeat_resolver.truncate_elapsed_ms(-99.999)) + same(100, repeat_resolver.truncate_elapsed_ms(100)) + same(0, repeat_resolver.truncate_elapsed_ms(-0.75)) + fails(function() + repeat_resolver.truncate_elapsed_ms(0 / 0) + end, "finite") +end) + for _, item in ipairs(tests) do local ok, failure = xpcall(item.body, debug.traceback) if not ok then |
