use bevy::{app::PluginGroupBuilder, prelude::*};
mod step;
mod teleport;
pub mod prelude {
pub use super::{
MovementPlugins,
step::{Step, StepAcrossChunk, StepIntent, path::StepPath},
teleport::{Teleport, TeleportAcrossChunk, TeleportIntent},
};
pub(crate) use super::step::timer::StepTimer;
}
pub struct MovementPlugins;
impl PluginGroup for MovementPlugins {
fn build(self) -> PluginGroupBuilder {
PluginGroupBuilder::start::<Self>()
.add(step::StepPlugin)
.add(teleport::TeleportPlugin)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn should_build_movement_plugin_group() {
let mut app = App::new();
app.add_plugins(MinimalPlugins);
app.add_plugins(MovementPlugins);
app.update();
assert!(
std::mem::size_of::<MovementPlugins>() == 0,
"The movement plugin group should remain a zero-sized configuration marker"
);
}
#[test]
fn should_allow_prelude_imports_for_public_movement_types() {
use crate::prelude::{
MovementPlugins, Step, StepAcrossChunk, StepIntent, StepPath, Teleport,
TeleportAcrossChunk, TeleportIntent,
};
use suon_position::direction::Direction;
let _ = std::mem::size_of::<MovementPlugins>();
let _ = std::mem::size_of::<Step>();
let _ = std::mem::size_of::<StepAcrossChunk>();
let _ = std::mem::size_of::<StepIntent>();
let _ = std::mem::size_of::<StepPath>();
let _ = std::mem::size_of::<Teleport>();
let _ = std::mem::size_of::<TeleportAcrossChunk>();
let _ = std::mem::size_of::<TeleportIntent>();
assert_eq!(
Direction::North.offset(),
(0, 1),
"The prelude should expose step direction helpers"
);
}
}