# ManualClock
*Requires feature `time`.*
A deterministic clock for tests and simulation. Time only advances when
you explicitly call [`set`](#set) or [`advance`](#advance).
## Construction
```rust
use ready_active_safe::time::{Clock, Instant, ManualClock};
let clock = ManualClock::new(Instant::from_nanos(0));
assert_eq!(clock.now().as_nanos(), 0);
```
## `set` — jump to an instant
```rust
use ready_active_safe::time::{Clock, Instant, ManualClock};
let clock = ManualClock::new(Instant::from_nanos(0));
clock.set(Instant::from_nanos(5_000_000_000));
assert_eq!(clock.now().as_nanos(), 5_000_000_000);
```
## `advance` — step forward by a duration
```rust
use ready_active_safe::time::{Clock, Instant, ManualClock};
use std::time::Duration;
let clock = ManualClock::new(Instant::from_nanos(0));
clock.advance(Duration::from_secs(1));
assert_eq!(clock.now().as_nanos(), 1_000_000_000);
clock.advance(Duration::from_millis(500));
assert_eq!(clock.now().as_nanos(), 1_500_000_000);
```
## Edge Cases
`advance` saturates at `u64::MAX` on overflow instead of panicking:
```rust
use ready_active_safe::time::{Clock, Instant, ManualClock};
use std::time::Duration;
let clock = ManualClock::new(Instant::from_nanos(u64::MAX - 1));
clock.advance(Duration::from_nanos(100));
assert_eq!(clock.now().as_nanos(), u64::MAX);
```
## See Also
- [`Clock`](clock.md) — the trait `ManualClock` implements
- [`SystemClock`](system_clock.md) — monotonic wall clock for production
- [`Deadline`](deadline.md) — use with `ManualClock` for timeout testing