#[cfg(not(feature = "shred-derive"))] use shred::ResourceId; use shred::{Dispatcher, DispatcherBuilder, Read, RunningTime, System, SystemData, World, Write}; fn sleep_short() { use std::{thread::sleep, time::Duration}; sleep(Duration::new(0, 1_000)); } #[derive(Default)] struct Res; #[derive(Default)] struct ResB; #[cfg(feature = "shred-derive")] #[derive(SystemData)] struct DummyData<'a> { _res: Read<'a, Res>, } #[cfg(not(feature = "shred-derive"))] struct DummyData<'a> { _res: Read<'a, Res>, } #[cfg(not(feature = "shred-derive"))] impl<'a> SystemData<'a> for DummyData<'a> { fn setup(world: &mut World) { Read::<'_, Res>::setup(world); } fn fetch(world: &'a World) -> Self { Self { _res: Read::<'_, Res>::fetch(world), } } fn reads() -> Vec { Read::<'_, Res>::reads() } fn writes() -> Vec { Read::<'_, Res>::writes() } } #[cfg(feature = "shred-derive")] #[derive(SystemData)] struct DummyDataMut<'a> { _res: Write<'a, Res>, } #[cfg(not(feature = "shred-derive"))] struct DummyDataMut<'a> { _res: Write<'a, Res>, } #[cfg(not(feature = "shred-derive"))] impl<'a> SystemData<'a> for DummyDataMut<'a> { fn setup(world: &mut World) { Write::<'_, Res>::setup(world); } fn fetch(world: &'a World) -> Self { Self { _res: Write::<'_, Res>::fetch(world), } } fn reads() -> Vec { Write::<'_, Res>::reads() } fn writes() -> Vec { Write::<'_, Res>::writes() } } struct DummySys; impl<'a> System<'a> for DummySys { type SystemData = DummyData<'a>; fn run(&mut self, _data: Self::SystemData) { sleep_short() } } struct DummySysMut; impl<'a> System<'a> for DummySysMut { type SystemData = DummyDataMut<'a>; fn run(&mut self, _data: Self::SystemData) { sleep_short() } } struct Whatever<'a>(&'a i32); impl<'a, 'b> System<'a> for Whatever<'b> { type SystemData = (); fn run(&mut self, _: Self::SystemData) { println!("{}", self.0); } } #[test] fn dispatch_builder() { DispatcherBuilder::new() .with(DummySys, "a", &[]) .with(DummySys, "b", &["a"]) .with(DummySys, "c", &["a"]) .build(); } #[test] #[should_panic(expected = "No such system registered")] fn dispatch_builder_invalid() { DispatcherBuilder::new() .with(DummySys, "a", &[]) .with(DummySys, "b", &["z"]) .build(); } #[test] fn dispatch_basic() { let mut world = World::empty(); world.insert(Res); let number = 5; let mut d: Dispatcher = DispatcherBuilder::new() .with(DummySys, "a", &[]) .with(DummySys, "b", &["a"]) .with(Whatever(&number), "w", &[]) .build(); d.dispatch(&world); } #[test] fn dispatch_ww_block() { let mut world = World::empty(); world.insert(Res); let mut d: Dispatcher = DispatcherBuilder::new() .with(DummySysMut, "a", &[]) .with(DummySysMut, "b", &[]) .build(); d.dispatch(&world); } #[test] fn dispatch_rw_block() { let mut world = World::empty(); world.insert(Res); let mut d: Dispatcher = DispatcherBuilder::new() .with(DummySys, "a", &[]) .with(DummySysMut, "b", &[]) .build(); d.dispatch(&world); } #[test] fn dispatch_rw_block_rev() { let mut world = World::empty(); world.insert(Res); let mut d: Dispatcher = DispatcherBuilder::new() .with(DummySysMut, "a", &[]) .with(DummySys, "b", &[]) .build(); d.dispatch(&world); } #[test] fn dispatch_sequential() { let mut world = World::empty(); world.insert(Res); let mut d: Dispatcher = DispatcherBuilder::new() .with(DummySysMut, "a", &[]) .with(DummySys, "b", &[]) .build(); d.dispatch_seq(&world); } #[cfg(feature = "parallel")] #[test] fn dispatch_async() { let mut res = World::empty(); res.insert(Res); let mut d = DispatcherBuilder::new() .with(DummySysMut, "a", &[]) .with(DummySys, "b", &[]) .build_async(res); d.dispatch(); d.wait(); } #[cfg(feature = "parallel")] #[test] fn dispatch_async_res() { let mut world = World::empty(); world.insert(Res); let mut d = DispatcherBuilder::new() .with(DummySysMut, "a", &[]) .with(DummySys, "b", &[]) .build_async(world); d.dispatch(); let res = d.world_mut(); res.insert(ResB); } #[test] fn dispatch_stage_group() { let mut world = World::empty(); world.insert(Res); world.insert(ResB); struct ReadingFromResB; impl<'a> System<'a> for ReadingFromResB { type SystemData = Read<'a, ResB>; fn run(&mut self, _: Self::SystemData) { sleep_short() } fn running_time(&self) -> RunningTime { RunningTime::Short } } struct WritingToResB; impl<'a> System<'a> for WritingToResB { type SystemData = Write<'a, ResB>; fn run(&mut self, _: Self::SystemData) { sleep_short() } fn running_time(&self) -> RunningTime { RunningTime::VeryShort } } let mut d: Dispatcher = DispatcherBuilder::new() .with(DummySys, "read_a", &[]) .with(ReadingFromResB, "read_b", &[]) .with(WritingToResB, "write_b", &[]) .build(); d.dispatch(&world); }