use std::sync::Arc;
use std::sync::atomic::{AtomicUsize, Ordering};
use jaeb::{EventBus, HandlerResult, SyncEventHandler};
#[derive(Clone, Debug)]
struct Signal;
struct Counter {
count: Arc<AtomicUsize>,
}
impl SyncEventHandler<Signal> for Counter {
fn handle(&self, _event: &Signal) -> HandlerResult {
self.count.fetch_add(1, Ordering::SeqCst);
Ok(())
}
}
#[tokio::test]
async fn cloned_bus_shares_state() {
let bus = EventBus::new(16).expect("valid config");
let count = Arc::new(AtomicUsize::new(0));
let _ = bus.subscribe(Counter { count: Arc::clone(&count) }).await.expect("subscribe");
let bus2 = bus.clone();
bus2.publish(Signal).await.expect("publish via clone");
assert_eq!(count.load(Ordering::SeqCst), 1);
bus.publish(Signal).await.expect("publish via original");
assert_eq!(count.load(Ordering::SeqCst), 2);
bus.shutdown().await.expect("shutdown");
}