use eventbus_tiny::{EventBus, Subscription};
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
struct EventA(u32);
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
struct EventB(u64);
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
struct EventC(u128);
#[test]
fn test() {
let bus = EventBus::new();
let subscriber_a: Subscription<usize> = bus.subscribe(64);
let subscriber_b: Subscription<usize> = bus.subscribe(64);
assert_eq!(bus.publish(1usize), 2);
assert_eq!(bus.publish(4usize), 2);
assert_eq!(bus.publish(7usize), 2);
assert_eq!(subscriber_a.recv(), Ok(1usize));
assert_eq!(subscriber_a.recv(), Ok(4usize));
assert_eq!(subscriber_a.recv(), Ok(7usize));
assert_eq!(subscriber_b.recv(), Ok(1usize));
assert_eq!(subscriber_b.recv(), Ok(4usize));
assert_eq!(subscriber_b.recv(), Ok(7usize));
drop(bus);
assert!(subscriber_a.recv().is_err());
assert!(subscriber_b.recv().is_err());
}
#[test]
fn spam() {
const SPAM_COUNT: u32 = 3 * 1024;
let bus = EventBus::new();
let subscribers_a: Vec<_> = (0..SPAM_COUNT).map(|_| bus.subscribe::<EventA>(SPAM_COUNT as usize)).collect();
let subscribers_b: Vec<_> = (0..SPAM_COUNT).map(|_| bus.subscribe::<EventB>(SPAM_COUNT as usize)).collect();
let subscribers_c: Vec<_> = (0..SPAM_COUNT).map(|_| bus.subscribe::<EventC>(SPAM_COUNT as usize)).collect();
for index in 0..SPAM_COUNT {
assert_eq!(bus.publish(EventA(index)), SPAM_COUNT as usize);
assert_eq!(bus.publish(EventB(index as u64)), SPAM_COUNT as usize);
assert_eq!(bus.publish(EventC(index as u128)), SPAM_COUNT as usize);
}
for index in 0..SPAM_COUNT {
for subscriber in &subscribers_a {
let event = subscriber.recv().expect("failed to receive event");
assert_eq!(event, EventA(index));
}
for subscriber in &subscribers_b {
let event = subscriber.recv().expect("failed to receive event");
assert_eq!(event, EventB(index as u64));
}
for subscriber in &subscribers_c {
let event = subscriber.recv().expect("failed to receive event");
assert_eq!(event, EventC(index as u128));
}
}
}