include!("includes/common.rs");
use rapt::*;
use serde::Serialize;
use std::thread;
use std::time::Duration;
#[derive(Clone, Serialize, Default, Debug)]
struct Datapoint {
indicator: u32,
}
#[derive(Instruments)]
struct TestInstruments<L: Listener> {
datapoint: Instrument<Datapoint, L>,
}
impl<L: Listener> Default for TestInstruments<L> {
fn default() -> Self {
TestInstruments{ datapoint: Instrument::default() }
}
}
#[test]
#[cfg(feature = "timestamp_instruments")]
fn timestamp_changes() {
let i = TestInstruments::<()>::default();
let mut ser = serde_json::Serializer::new(Vec::with_capacity(128)) ;
assert!(i.serialize_reading("datapoint", &mut ser).is_ok());
let val1 = ser.into_inner();
thread::sleep(Duration::from_millis(1));
let mut ser = serde_json::Serializer::new(Vec::with_capacity(128)) ;
assert!(i.serialize_reading("datapoint", &mut ser).is_ok());
let val2 = ser.into_inner();
assert_eq!(val1, val2);
assert!(i.datapoint.update(|v| v.indicator = Default::default() ).is_ok());
let mut ser = serde_json::Serializer::new(Vec::with_capacity(128)) ;
assert!(i.serialize_reading("datapoint", &mut ser).is_ok());
let val3 = ser.into_inner();
assert_ne!(val1, val3);
}
#[test]
fn multithread() {
let i = TestInstruments::<()>::default();
let i_ = i.datapoint.clone();
let i__ = i.datapoint.clone();
let t1 = thread::spawn(move || {
for _ in 0..10000 {
i_.update(|v| v.indicator += 1).unwrap();
}
});
let t2 = thread::spawn(move || {
for _ in 0..10000 {
i__.update(|v| v.indicator += 1).unwrap();
}
});
let _ = t1.join().unwrap();
let _ = t2.join().unwrap();
assert_eq!(i.datapoint.read().unwrap().indicator, 20000);
}
use std::sync::mpsc;
#[test]
fn listener() {
let (tx, rx) = mpsc::channel();
let mut i = TestInstruments::default();
i.wire_listener(tx);
let res = rx.recv_timeout(Duration::from_millis(100));
assert!(res.is_ok());
assert_eq!(res.unwrap(), "datapoint");
assert!(rx.try_recv().is_err());
let _ = i.datapoint.update(|v| v.indicator = 100).unwrap();
let res = rx.recv_timeout(Duration::from_millis(100));
assert!(res.is_ok());
assert_eq!(res.unwrap(), "datapoint");
}