use super::*;
use std::thread::sleep;
#[test]
fn peek_is_non_destructive() {
clear_draw_request();
request_draw_after(Duration::from_millis(50));
let first = peek_next_draw_deadline();
assert!(first.is_some(), "first peek sees the pending deadline");
let second = peek_next_draw_deadline();
assert_eq!(
first, second,
"second peek still sees the SAME pending deadline (lost-wakeup fix)"
);
}
#[test]
fn due_deadline_surfaces_then_clears() {
clear_draw_request();
assert!(!wants_draw(), "baseline: nothing pending after clear");
request_draw_after(Duration::from_millis(20));
sleep(Duration::from_millis(40));
assert!(wants_draw(), "a due deadline makes wants_draw() true");
clear_draw_request();
assert!(
!wants_draw(),
"without a re-arm the loop goes idle again after the draw"
);
}
#[test]
fn future_deadline_peeks_but_does_not_want_draw() {
clear_draw_request();
request_draw_after(Duration::from_millis(500));
assert!(
peek_next_draw_deadline().is_some(),
"future deadline is visible to the host's WaitUntil"
);
assert!(
!wants_draw(),
"a future deadline must not force continuous polling"
);
assert!(
peek_next_draw_deadline().is_some(),
"a non-due wants_draw() must not consume the deadline"
);
}
#[test]
fn earliest_deadline_wins() {
clear_draw_request();
request_draw_after(Duration::from_millis(400));
let after_long = peek_next_draw_deadline().expect("long deadline armed");
request_draw_after(Duration::from_millis(20));
let after_short = peek_next_draw_deadline().expect("short deadline armed");
assert!(
after_short < after_long,
"a nearer deadline replaces a farther one"
);
request_draw_after(Duration::from_millis(400));
assert_eq!(
peek_next_draw_deadline(),
Some(after_short),
"arming a farther deadline keeps the earliest"
);
}
#[test]
fn clear_immediate_drops_the_immediate_request() {
clear_draw_request();
request_draw();
clear_immediate_draw_request();
assert!(
!peek_draw_signals().0,
"the immediate draw flag must be cleared"
);
}
#[test]
fn clear_immediate_keeps_the_scheduled_deadline() {
clear_draw_request();
request_draw();
request_draw_after(Duration::from_secs(60));
let deadline = peek_next_draw_deadline();
assert!(deadline.is_some(), "deadline armed");
clear_immediate_draw_request();
assert_eq!(
peek_next_draw_deadline(),
deadline,
"the scheduled deadline must be untouched"
);
}
#[test]
fn clear_immediate_keeps_a_pending_cross_thread_signal() {
clear_draw_request();
let before = ASYNC_STATE_EPOCH.with(|c| c.get());
std::thread::spawn(signal_async_state_change)
.join()
.expect("signal thread");
clear_immediate_draw_request();
assert!(
wants_draw(),
"the cross-thread signal must still surface as a draw request"
);
assert_ne!(
async_state_epoch(),
before,
"the cross-thread signal must still advance the async-state epoch"
);
}