use crate::park::{Step, Waiter};
fn polls_until_sleep(w: &mut Waiter) -> u32 {
let mut n = 0;
while w.step() == Step::Poll {
n += 1;
assert!(n < 10_000_000, "never sleeps");
}
n
}
#[test]
fn a_wait_spins_its_budget_then_yields_sixteen_times_then_sleeps() {
for budget in [0u32, 1, 63, 64, 1000] {
let mut w = Waiter::new(budget);
assert_eq!(polls_until_sleep(&mut w), budget + 16, "budget {budget}");
assert!(w.slept());
assert_eq!(w.step(), Step::Sleep);
}
}
#[test]
fn a_descheduled_spinner_keeps_its_budget() {
let mut w = Waiter::new(1_000);
for _ in 0..64 {
assert_eq!(w.step(), Step::Poll);
}
std::thread::sleep(std::time::Duration::from_millis(2));
assert_eq!(polls_until_sleep(&mut w), 1_000 - 64 + 16);
}