use okee_wheel_timer::{HashedWheelTimer, KeyedHashedWheelTimer};
#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
struct UserEvent {
topic: u32,
source: u32,
}
#[test]
fn core_schedule_and_query_by_id() {
let mut wheel = HashedWheelTimer::new(8);
let created = wheel.schedule(
5,
UserEvent {
topic: 1,
source: 10,
},
);
assert!(wheel.contains(created.id));
assert_eq!(wheel.get(created.id).map(|e| e.tick()), Some(5));
}
#[test]
fn core_schedule_allows_same_payload_many_times() {
let mut wheel = HashedWheelTimer::new(8);
let first = wheel.schedule(
1,
UserEvent {
topic: 1,
source: 10,
},
);
let second = wheel.schedule(
2,
UserEvent {
topic: 1,
source: 10,
},
);
assert!(wheel.contains(first.id));
assert!(wheel.contains(second.id));
assert_eq!(wheel.count_all(), 2);
}
#[test]
fn keyed_schedule_replaces_by_key() {
let mut wheel = KeyedHashedWheelTimer::new(8, |data: &UserEvent| (data.topic, data.source));
let first = wheel.schedule(
1,
UserEvent {
topic: 1,
source: 10,
},
);
let second = wheel.schedule(
2,
UserEvent {
topic: 1,
source: 10,
},
);
assert_eq!(second.replaced_id, Some(first.id));
assert!(!wheel.contains_by_id(first.id));
assert!(wheel.contains_by_id(second.id));
assert_eq!(wheel.id_by_key(&(1, 10)), Some(second.id));
}
#[test]
fn keyed_update_and_remove_by_key() {
let mut wheel = KeyedHashedWheelTimer::new(8, |data: &UserEvent| (data.topic, data.source));
let created = wheel.schedule(
1,
UserEvent {
topic: 1,
source: 10,
},
);
let updated = wheel.update_by_key(
&(1, 10),
3,
UserEvent {
topic: 2,
source: 20,
},
);
assert_eq!(updated.map(|r| r.id), Some(created.id));
assert!(wheel.contains_by_key(&(2, 20)));
let removed = wheel.remove_by_key(&(2, 20));
assert_eq!(removed.map(|e| e.id()), Some(created.id));
assert!(wheel.is_empty());
}