//// Simulated clock helpers for `aion/testing`. //// //// Advancing the clock updates process-scoped harness state only. It never uses //// wall-clock timers, so sleeps and durable timers exercised by workflow tests //// complete instantly under `gleam test`. import aion/duration import aion/error import aion/internal/ffi import gleam/int /// Advance the current process's logical clock by `by`. /// /// The test FFI double marks any recorded sleeps or timers whose deadline is now /// reached as fired and returns immediately without wall-clock waiting. pub fn advance( env: env, by: duration.Duration, ) -> Result(env, error.EngineError) { let raw_duration = by |> duration.to_milliseconds |> int.to_string case ffi.testing_advance(raw_duration) { Ok(_) -> Ok(env) Error(raw_error) -> Error(error.EngineFailure(raw_error)) } } /// Return the current logical clock value for the current process. pub fn current_time_milliseconds(_env: env) -> Result(Int, error.EngineError) { case ffi.now() { Ok(raw_timestamp) -> parse_int(raw_timestamp) Error(raw_error) -> Error(error.EngineFailure(raw_error)) } } fn parse_int(raw: String) -> Result(Int, error.EngineError) { case int.parse(raw) { Ok(value) -> Ok(value) Error(_) -> Error(error.EngineFailure("Invalid test clock timestamp: " <> raw)) } }