use std::{cmp::Ordering, fmt, sync::Arc};
use timer_deque_rs::{AbsoluteTime, DequeOnce, OrderTimerDeque, OrderedTimerDequeMode, TimerDequeConsumer, TimerPoll};
#[derive(Debug, PartialEq, Eq, Clone)]
struct TestItem(u64);
impl fmt::Display for TestItem
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result
{
write!(f, "0 = {}", self.0)
}
}
fn main()
{
let ev_watch = TimerPoll::new().unwrap();
let time_list =
OrderTimerDeque
::<DequeOnce, TimerDequeConsumer<Arc<TestItem>, _>>
::new("test_label".into(), 4, false, true).unwrap();
let mut time_list_poll = ev_watch.add(time_list).unwrap();
let abs_time = AbsoluteTime::now();
let tss_set1 = DequeOnce::new(abs_time.clone().add_sec(3));
let ent1 = Arc::new(TestItem(1));
let tss_set2 = DequeOnce::new(abs_time.clone().add_sec(7));
let ent2 = Arc::new(TestItem(2));
let tss_set3 = DequeOnce::new(abs_time.clone().add_sec(10));
let ent3 = Arc::new(TestItem(3));
time_list_poll.get_inner_mut().add(ent1.clone(), tss_set1).unwrap();
time_list_poll.get_inner_mut().add(ent2.clone(), tss_set2).unwrap();
time_list_poll.get_inner_mut().add(ent3.clone(), tss_set3).unwrap();
let res = ev_watch.poll(Option::None).unwrap();
let poll_timeout = AbsoluteTime::now();
println!("poll with result {:?}", res);
assert_eq!(res.is_none(), false);
assert_eq!(res.as_ref().unwrap().len(), 1);
let pet = res.unwrap().pop().unwrap();
let timeout_items = time_list_poll.get_inner_mut().handle_timer_event(pet).unwrap();
println!("timer timeout with result: {:?}", timeout_items);
assert_eq!(timeout_items.is_some(), true);
assert_eq!(timeout_items.as_ref().unwrap().len(), 1); assert_eq!(timeout_items.as_ref().unwrap()[0], ent1);
let timeout_item = timeout_items.unwrap().pop().unwrap();
println!("timer item: {}, timeout: {}, curtime: {}", timeout_item, tss_set1, poll_timeout);
assert_eq!(tss_set1.get_absolut_timeout().seconds_cmp(&poll_timeout) == Ordering::Equal, true);
let rem = time_list_poll.get_inner_mut().remove_from_queue(&ent2).unwrap();
println!("item {:?} removed from shed. queue", rem);
println!("queue len: {}", time_list_poll.get_inner().timer_queue_len());
assert_eq!(rem.is_some(), true);
assert_eq!(rem, Some(ent2));
assert_eq!(time_list_poll.get_inner().timer_queue_len(), 1);
let res = ev_watch.poll(Option::None).unwrap();
let poll_timeout = AbsoluteTime::now();
println!("poll with result {:?}", res);
assert_eq!(res.is_none(), false);
assert_eq!(res.as_ref().unwrap().len(), 1);
let pet = res.unwrap().pop().unwrap();
let timeout_items = time_list_poll.get_inner_mut().handle_timer_event(pet).unwrap();
println!("timer timeout with result: {:?}", timeout_items);
assert_eq!(timeout_items.is_some(), true);
assert_eq!(timeout_items.as_ref().unwrap().len(), 1); assert_eq!(timeout_items.as_ref().unwrap()[0], ent3);
let timeout_item = timeout_items.unwrap().pop().unwrap();
println!("timer item: {}, timeout: {}, curtime: {}", timeout_item, tss_set3, poll_timeout);
assert_eq!(tss_set3.get_absolut_timeout().seconds_cmp(&poll_timeout) == Ordering::Equal, true);
println!("timer queue len: {}", time_list_poll.get_inner().timer_queue_len());
assert_eq!(time_list_poll.get_inner().timer_queue_len(), 0);
return;
}