pub struct MockNanoClock { /* private fields */ }Expand description
A nanosecond-precision controllable clock implementation for testing.
MockNanoClock is the high-precision counterpart of
MockClock. It implements Clock, NanoClock,
and ControllableClock. Readings are frozen after construction by
default. set_time() reanchors the logical
time without changing the current progression mode or auto-advance settings.
§Features
- Align the logical current time to a specific time
- Advance the clock by a chrono duration or raw nanoseconds
- Automatically advance nanoseconds on each call
- Switch between frozen and monotonic progression
- Reset to the initial creation state
§Thread Safety
This type is thread-safe, using Arc<Mutex<>> internally to protect its
mutable state.
§Examples
use chrono::{DateTime, Duration, Utc};
use qubit_clock::{ControllableClock, MockNanoClock, NanoClock};
let clock = MockNanoClock::new();
let fixed_time = DateTime::parse_from_rfc3339(
"2024-01-01T00:00:00.000000123Z"
).unwrap().with_timezone(&Utc);
clock.set_time(fixed_time);
assert_eq!(clock.time_precise(), fixed_time);
clock.advance_nanos(1);
assert_eq!(
clock.time_precise(),
fixed_time + Duration::nanoseconds(1)
);Implementations§
Source§impl MockNanoClock
impl MockNanoClock
Sourcepub fn new() -> Self
pub fn new() -> Self
Creates a new MockNanoClock.
The clock is initialized with the current system time at nanosecond precision and remains frozen at that instant until adjusted by the control methods or switched to monotonic progression.
§Returns
A new MockNanoClock instance.
§Examples
use qubit_clock::MockNanoClock;
let clock = MockNanoClock::new();Sourcepub fn with_progression(progression: MockClockProgression) -> Self
pub fn with_progression(progression: MockClockProgression) -> Self
Creates a new MockNanoClock with the specified progression mode.
The clock starts at the current system time. In
Frozen mode, readings stay fixed until
explicitly advanced. In Monotonic
mode, readings progress naturally from the initial system time.
§Arguments
progression- The initial progression mode.
§Examples
use qubit_clock::{MockClockProgression, MockNanoClock};
let clock = MockNanoClock::with_progression(MockClockProgression::Monotonic);
assert_eq!(clock.progression(), MockClockProgression::Monotonic);Sourcepub fn progression(&self) -> MockClockProgression
pub fn progression(&self) -> MockClockProgression
Returns the current progression mode.
§Examples
use qubit_clock::{MockClockProgression, MockNanoClock};
let clock = MockNanoClock::new();
assert_eq!(clock.progression(), MockClockProgression::Frozen);Sourcepub fn set_progression(&self, progression: MockClockProgression)
pub fn set_progression(&self, progression: MockClockProgression)
Switches the clock progression mode without changing the current reading.
The current logical reading is first folded into the clock’s base state, so changing between frozen and monotonic modes does not cause an immediate time jump.
§Arguments
progression- The new progression mode.
§Examples
use qubit_clock::{MockClockProgression, MockNanoClock};
let clock = MockNanoClock::new();
clock.set_progression(MockClockProgression::Monotonic);
assert_eq!(clock.progression(), MockClockProgression::Monotonic);Sourcepub fn monotonic_progression_enabled(&self) -> bool
pub fn monotonic_progression_enabled(&self) -> bool
Returns whether monotonic progression is enabled.
§Examples
use qubit_clock::MockNanoClock;
let clock = MockNanoClock::new();
assert!(!clock.monotonic_progression_enabled());Sourcepub fn set_monotonic_progression_enabled(&self, enabled: bool)
pub fn set_monotonic_progression_enabled(&self, enabled: bool)
Enables or disables monotonic progression.
This is a boolean convenience wrapper around
set_progression().
§Arguments
enabled-trueto use monotonic progression,falseto freeze.
§Examples
use qubit_clock::MockNanoClock;
let clock = MockNanoClock::new();
clock.set_monotonic_progression_enabled(true);
assert!(clock.monotonic_progression_enabled());Sourcepub fn add_nanos(&self, nanos: i128, add_every_time: bool)
pub fn add_nanos(&self, nanos: i128, add_every_time: bool)
Adds a fixed amount of nanoseconds to the clock.
§Arguments
nanos- The number of nanoseconds to add.add_every_time- Iftrue, the specified nanoseconds will be added after every call tonanos(). Iffalse, the nanoseconds are added only once.
§Examples
use qubit_clock::{MockNanoClock, NanoClock};
let clock = MockNanoClock::new();
let before = clock.nanos();
clock.add_nanos(1_000, false);
assert_eq!(clock.nanos(), before + 1_000);
clock.add_nanos(100, true);
let t1 = clock.nanos();
let t2 = clock.nanos();
assert_eq!(t2 - t1, 100);Sourcepub fn advance_nanos(&self, nanos: i128)
pub fn advance_nanos(&self, nanos: i128)
Advances the clock by a fixed nanosecond amount once.
This method updates the offset used by nanos()
without enabling auto-advance. If the accumulated offset exceeds the
i128 range, it saturates at the nearest boundary.
§Arguments
nanos- The nanoseconds to add once.
§Examples
use qubit_clock::{MockNanoClock, NanoClock};
let clock = MockNanoClock::new();
let before = clock.nanos();
clock.advance_nanos(1_000);
assert_eq!(clock.nanos(), before + 1_000);Sourcepub fn set_auto_advance_nanos(&self, nanos: i128)
pub fn set_auto_advance_nanos(&self, nanos: i128)
Enables auto-advance after each read operation.
After calling this method, each call to nanos(),
millis(), or time_precise()
returns the current logical time and advances the next read by nanos.
§Arguments
nanos- The nanoseconds to advance on each read.
§Examples
use qubit_clock::{MockNanoClock, NanoClock};
let clock = MockNanoClock::new();
clock.set_auto_advance_nanos(100);
let t1 = clock.nanos();
let t2 = clock.nanos();
assert_eq!(t2 - t1, 100);Sourcepub fn clear_auto_advance(&self)
pub fn clear_auto_advance(&self)
Disables auto-advance behavior.
This method clears the per-read advance setting. Subsequent read operations will no longer mutate the clock state.
§Examples
use qubit_clock::{MockNanoClock, NanoClock};
let clock = MockNanoClock::new();
clock.set_auto_advance_nanos(100);
let _ = clock.nanos();
clock.clear_auto_advance();
let t1 = clock.nanos();
let t2 = clock.nanos();
assert_eq!(t2, t1);Trait Implementations§
Source§impl Clock for MockNanoClock
impl Clock for MockNanoClock
Source§impl Clone for MockNanoClock
impl Clone for MockNanoClock
Source§fn clone(&self) -> MockNanoClock
fn clone(&self) -> MockNanoClock
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more