#[cfg(test)] mod tests { use std::sync::Arc; use async_std::task::block_on; use armature::{Commutator, Store}; extern crate armature_macro; use armature_macro::{event, stator}; #[event] pub enum Event { PositionUpdate(Arc) } #[derive(Default, Debug, Clone)] pub struct Position { x: isize, y: isize } #[stator] pub mod joystick { use super::*; #[stator_struct] #[derive(Clone, Default, Debug)] pub struct Joystick { #[sender] pub position: Store, } #[stator_states] impl Joystick { const INIT: State = Self::read; fn read(&mut self, event: &Event) -> Response { match event { Event::OnEntry => { let position = Position { x: 11, y: -54 }; self.position.mutate(position); self.publish(Event::Detach(self.get_id().unwrap())); Response::Handled } _ => Response::Handled } } } #[stator_lifecycle] impl Joystick { fn on_attach(&mut self) { self.position.on_mutate = |this| { this.publish(Event::PositionUpdate(Arc::new(this.value.clone()))) } } } } #[stator] pub mod cursor { use armature::Response; use super::*; #[stator_struct] #[derive(Clone, Default, Debug)] pub struct Cursor { pub position: Arc } #[stator_states] impl Cursor { const INIT: State = Self::draw; fn draw(&mut self, event: &Event) -> Response { match event { Event::PositionUpdate(position) => { self.position = Arc::clone(position); println!("{:#?}", &self.position); self.publish(Event::Detach(self.get_id().unwrap())); Response::Handled } _ => Response::Handled } } } } #[test] fn store_mutation() { let joystick = joystick::Joystick::default(); let cursor = cursor::Cursor::default(); let mut commutator = Commutator::new(); commutator.attach(Box::new(joystick)); commutator.attach(Box::new(cursor)); let timeout = std::time::Duration::from_millis(1000); assert!(block_on(async_std::future::timeout(timeout, commutator.run())).is_ok()); assert!(commutator.drain().len() == 0); } }