#![cfg(feature = "test_utilities")]
use std::sync::{Arc, Mutex};
use std::thread;
use event_manager::utilities::subscribers::{
CounterInnerMutSubscriber, CounterSubscriber, CounterSubscriberWithData,
};
use event_manager::{EventManager, EventSubscriber, MutEventSubscriber, SubscriberOps};
#[test]
fn test_diff_type_subscribers() {
let mut event_manager = EventManager::<Arc<Mutex<dyn MutEventSubscriber + Send>>>::new()
.expect("Cannot create event manager.");
let data_subscriber = Arc::new(Mutex::new(CounterSubscriberWithData::new(1)));
data_subscriber.lock().unwrap().trigger_all_counters();
let counter_subscriber = Arc::new(Mutex::new(CounterSubscriber::default()));
counter_subscriber.lock().unwrap().trigger_event();
let ds_id = event_manager.add_subscriber(data_subscriber);
let cs_id = event_manager.add_subscriber(counter_subscriber);
let thread_handle = thread::spawn(move || {
for _ in 0..100 {
let ev_count = event_manager.run().unwrap();
assert_eq!(ev_count, 4);
}
let _ = event_manager.remove_subscriber(ds_id).unwrap();
let _ = event_manager.remove_subscriber(cs_id).unwrap();
});
thread_handle.join().unwrap();
}
#[test]
fn test_one_type_subscriber() {
let mut event_manager =
EventManager::<CounterSubscriberWithData>::new().expect("Cannot create event manager");
let data_subscriber_1 = CounterSubscriberWithData::new(1);
let data_subscriber_2 = CounterSubscriberWithData::new(1999);
let ds_id_1 = event_manager.add_subscriber(data_subscriber_1);
let ds_id_2 = event_manager.add_subscriber(data_subscriber_2);
{
let data_subscriber_1 = event_manager.subscriber_mut(ds_id_1).unwrap();
data_subscriber_1.trigger_all_counters();
let data_subscriber_2 = event_manager.subscriber_mut(ds_id_2).unwrap();
data_subscriber_2.trigger_all_counters();
}
let thread_handle = thread::spawn(move || {
for _ in 0..100 {
let ev_count = event_manager.run().unwrap();
assert_eq!(ev_count, 6);
}
let data_subscriber_1 = event_manager.remove_subscriber(ds_id_1).unwrap();
let data_subscriber_2 = event_manager.remove_subscriber(ds_id_2).unwrap();
let expected_subscriber_counters = vec![100, 100, 100];
assert_eq!(
data_subscriber_1.get_all_counter_values(),
expected_subscriber_counters
);
assert_eq!(
data_subscriber_2.get_all_counter_values(),
expected_subscriber_counters
);
});
thread_handle.join().unwrap();
}
#[test]
fn test_subscriber_inner_mut() {
let mut event_manager = EventManager::<Arc<dyn EventSubscriber + Send + Sync>>::new()
.expect("Cannot create event manager");
let subscriber = Arc::new(CounterInnerMutSubscriber::default());
subscriber.trigger_event();
let subscriber_id = event_manager.add_subscriber(subscriber.clone());
let thread_handle = thread::spawn(move || {
for _ in 0..100 {
let ev_count = event_manager.run().unwrap();
assert_eq!(ev_count, 1);
}
assert!(event_manager.remove_subscriber(subscriber_id).is_ok());
});
thread_handle.join().unwrap();
assert_eq!(subscriber.counter(), 100);
}