use std::sync::Arc;
use std::sync::atomic::{AtomicU64, Ordering};
use std::time::Duration;
use taktora_executor::{ControlFlow, Executor, MockClock, item_with_triggers};
const BASE_NS: u64 = 1_000_000; const SPIKE_NS: u64 = 20_000_000;
#[test]
fn min_max_retain_exact_observed_extremes() {
let clock = MockClock::new();
let body_clock = clock.clone();
let cycle_counter = Arc::new(AtomicU64::new(0));
let cc = Arc::clone(&cycle_counter);
let mut exec = Executor::builder()
.worker_threads(0)
.stats_window(256)
.clock(Arc::new(clock))
.build()
.expect("build executor");
exec.add(item_with_triggers(
|d| {
d.interval(Duration::from_millis(1));
Ok(())
},
move |_ctx| {
let n = cc.fetch_add(1, Ordering::Relaxed);
let advance = if n == 4 { SPIKE_NS } else { BASE_NS };
body_clock.advance(advance);
Ok(ControlFlow::Continue)
},
))
.expect("add task");
exec.run_n(20).expect("run_n");
let snap = exec.stats_snapshot();
assert_eq!(snap.per_task.len(), 1, "exactly one task registered");
let s = &snap.per_task[0];
assert_eq!(
s.max_ns, SPIKE_NS,
"max_ns must equal the injected {SPIKE_NS} ns spike exactly (got {})",
s.max_ns
);
assert_eq!(
s.min_ns, BASE_NS,
"min_ns must equal the {BASE_NS} ns ordinary body exactly (got {})",
s.min_ns
);
assert!(
s.min_ns < s.max_ns,
"distinct extremes: min_ns ({}) < max_ns ({})",
s.min_ns,
s.max_ns
);
}