From bcd5a019364cfeeb608fcaed5ac79267bd36897d Mon Sep 17 00:00:00 2001 From: AlephCubed Date: Thu, 24 Apr 2025 11:24:14 -0700 Subject: [PATCH] Moved all tests into tests directory. --- immediate_stats/src/bevy.rs | 74 +-------- immediate_stats/src/bevy/butler.rs | 60 -------- immediate_stats/src/lib.rs | 169 +-------------------- immediate_stats/src/{stat => }/modifier.rs | 57 ------- immediate_stats/src/stat.rs | 131 +--------------- immediate_stats/tests/bevy.rs | 66 ++++++++ immediate_stats/tests/bevy_butler.rs | 60 ++++++++ immediate_stats/tests/derive.rs | 163 ++++++++++++++++++++ immediate_stats/tests/modifier.rs | 55 +++++++ immediate_stats/tests/stat.rs | 125 +++++++++++++++ 10 files changed, 473 insertions(+), 487 deletions(-) delete mode 100644 immediate_stats/src/bevy/butler.rs rename immediate_stats/src/{stat => }/modifier.rs (57%) create mode 100644 immediate_stats/tests/bevy.rs create mode 100644 immediate_stats/tests/bevy_butler.rs create mode 100644 immediate_stats/tests/derive.rs create mode 100644 immediate_stats/tests/modifier.rs create mode 100644 immediate_stats/tests/stat.rs diff --git a/immediate_stats/src/bevy.rs b/immediate_stats/src/bevy.rs index 40234c2..6549259 100644 --- a/immediate_stats/src/bevy.rs +++ b/immediate_stats/src/bevy.rs @@ -1,9 +1,6 @@ -#[cfg(feature = "bevy_butler")] -pub mod butler; - use crate::StatContainer; +use crate::modifier::Modifier; use crate::stat::Stat; -use crate::stat::modifier::Modifier; use bevy_app::{App, Plugin}; use bevy_ecs::component::Mutable; use bevy_ecs::prelude::ReflectComponent; @@ -40,72 +37,3 @@ pub fn reset_resource_modifiers(res: Option); - - let entity = world - .spawn(Health(Stat { - base: 100, - bonus: 50, - multiplier: 2.0, - })) - .id(); - - world.run_system(system).unwrap(); - - assert_eq!( - world.get::(entity), - Some(Health(Stat::new(100))).as_ref() - ); - } - - #[test] - fn pause_component() { - let mut world = World::new(); - let system = world.register_system(reset_component_modifiers::); - - let health = Health(Stat { - base: 100, - bonus: 50, - multiplier: 2.0, - }); - - let entity = world.spawn((health.clone(), PauseStatReset)).id(); - - world.run_system(system).unwrap(); - - assert_eq!(world.get::(entity), Some(health).as_ref()); - } - - #[test] - fn reset_resource() { - let mut world = World::new(); - let system = world.register_system(reset_resource_modifiers::); - - world.insert_resource(Health(Stat { - base: 100, - bonus: 50, - multiplier: 2.0, - })); - - world.run_system(system).unwrap(); - - assert_eq!( - world.get_resource::(), - Some(Health(Stat::new(100))).as_ref() - ); - } -} diff --git a/immediate_stats/src/bevy/butler.rs b/immediate_stats/src/bevy/butler.rs deleted file mode 100644 index eb0f570..0000000 --- a/immediate_stats/src/bevy/butler.rs +++ /dev/null @@ -1,60 +0,0 @@ -#[cfg(test)] -mod tests { - use crate as immediate_stats; - use crate::StatContainer; - use crate::stat::Stat; - use bevy_app::App; - use bevy_butler::*; - use bevy_ecs::prelude::*; - - #[butler_plugin] - struct MyPlugin; - - #[derive(Resource, Component, StatContainer, Default, PartialEq, Debug)] - #[add_component(plugin = MyPlugin)] - #[add_resource(plugin = MyPlugin)] - struct Health(Stat); - - #[test] - fn reset_component_auto() { - let mut app = App::new(); - - app.add_plugins(MyPlugin); - - let entity = app - .world_mut() - .spawn(Health(Stat { - base: 100, - bonus: 50, - multiplier: 2.0, - })) - .id(); - - app.update(); - - assert_eq!( - app.world().get::(entity), - Some(Health(Stat::new(100))).as_ref() - ); - } - - #[test] - fn reset_resource_auto() { - let mut app = App::new(); - - app.add_plugins(MyPlugin); - - app.insert_resource(Health(Stat { - base: 100, - bonus: 50, - multiplier: 2.0, - })); - - app.update(); - - assert_eq!( - app.world().get_resource::(), - Some(Health(Stat::new(100))).as_ref() - ); - } -} diff --git a/immediate_stats/src/lib.rs b/immediate_stats/src/lib.rs index feaa8fc..7f62240 100644 --- a/immediate_stats/src/lib.rs +++ b/immediate_stats/src/lib.rs @@ -2,6 +2,7 @@ #[cfg(feature = "bevy")] pub mod bevy; +pub mod modifier; pub mod stat; // Todo Move into internal module called `__internal` like Bevy Butler. @@ -11,6 +12,7 @@ pub use immediate_stats_macros::StatContainer; #[cfg(feature = "bevy")] pub use bevy::*; +pub use modifier::*; pub use stat::*; /// Types that contain stats that need to be reset. @@ -23,170 +25,3 @@ pub trait StatContainer { /// Resets all stat bonuses to zero, and stat multipliers to one. fn reset_modifiers(&mut self); } - -#[cfg(test)] -mod tests { - use super::*; - use crate::stat::Stat; - use immediate_stats_macros::StatContainer; - - #[derive(StatContainer, PartialEq, Debug)] - struct Movement { - speed: Stat, - other: bool, - } - - #[test] - fn reset() { - for base in 0..10 { - let mut movement = Movement { - speed: Stat { - base, - bonus: 3, - multiplier: 1.5, - }, - other: true, - }; - - movement.reset_modifiers(); - - assert_eq!( - movement, - Movement { - speed: Stat::new(base), - other: true - } - ); - } - } - - #[derive(StatContainer, PartialEq, Debug)] - struct MaxHealth(Stat, bool); - - #[test] - fn reset_tuple_struct() { - for base in 0..10 { - let mut max_health = MaxHealth( - Stat { - base, - bonus: 3, - multiplier: 1.5, - }, - true, - ); - - max_health.reset_modifiers(); - - assert_eq!(max_health.0, Stat::new(base)); - } - } - - #[derive(StatContainer, PartialEq, Debug)] - struct Health { - #[stat] - max: MaxHealth, - current: i32, - } - - #[test] - fn reset_with_attribute() { - for base in 0..10 { - let mut health = Health { - max: MaxHealth( - Stat { - base, - bonus: 3, - multiplier: 1.5, - }, - true, - ), - current: base, - }; - - health.reset_modifiers(); - - assert_eq!(health.max.0, Stat::new(base)); - } - } - - #[derive(StatContainer, PartialEq, Debug)] - struct PartialReset { - #[stat_ignore] - ignored: Stat, - reset: Stat, - } - - #[test] - fn reset_ignored() { - for base in 0..10 { - let stat = Stat { - base, - bonus: 3, - multiplier: 1.5, - }; - - let mut partial = PartialReset { - ignored: stat, - reset: stat, - }; - - partial.reset_modifiers(); - - assert_eq!(partial.ignored, stat); - assert_eq!(partial.reset, Stat::new(base)); - } - } - - #[derive(StatContainer, PartialEq, Debug)] - enum EnumStat { - Named { - stat: Stat, - other: u8, - }, - Unnamed(Stat, u8), - #[expect(dead_code)] - Other, - } - - #[test] - fn reset_enum_named() { - for base in 0..10 { - let mut stat = EnumStat::Named { - stat: Stat { - base, - bonus: 3, - multiplier: 1.5, - }, - other: 0, - }; - - stat.reset_modifiers(); - - assert_eq!( - stat, - EnumStat::Named { - stat: Stat::new(base), - other: 0, - } - ); - } - } - - #[test] - fn reset_enum_unnamed() { - for base in 0..10 { - let mut stat = EnumStat::Unnamed( - Stat { - base, - bonus: 3, - multiplier: 1.5, - }, - 0, - ); - - stat.reset_modifiers(); - - assert_eq!(stat, EnumStat::Unnamed(Stat::new(base), 0)); - } - } -} diff --git a/immediate_stats/src/stat/modifier.rs b/immediate_stats/src/modifier.rs similarity index 57% rename from immediate_stats/src/stat/modifier.rs rename to immediate_stats/src/modifier.rs index 145580b..c5d1b1e 100644 --- a/immediate_stats/src/stat/modifier.rs +++ b/immediate_stats/src/modifier.rs @@ -66,60 +66,3 @@ impl DivAssign for Modifier { self.multiplier /= rhs; } } - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn add() { - let mut modifier = Modifier::default(); - modifier += 5; - assert_eq!( - modifier, - Modifier { - bonus: 5, - multiplier: 1.0, - } - ); - } - - #[test] - fn subtract() { - let mut modifier = Modifier::default(); - modifier -= 5; - assert_eq!( - modifier, - Modifier { - bonus: -5, - multiplier: 1.0, - } - ); - } - - #[test] - fn multiply() { - let mut modifier = Modifier::default(); - modifier *= 2.0; - assert_eq!( - modifier, - Modifier { - bonus: 0, - multiplier: 2.0, - } - ); - } - - #[test] - fn divide() { - let mut modifier = Modifier::default(); - modifier /= 2.0; - assert_eq!( - modifier, - Modifier { - bonus: 0, - multiplier: 0.5, - } - ); - } -} diff --git a/immediate_stats/src/stat.rs b/immediate_stats/src/stat.rs index dee301f..9bb68df 100644 --- a/immediate_stats/src/stat.rs +++ b/immediate_stats/src/stat.rs @@ -1,7 +1,5 @@ -pub mod modifier; - use crate::StatContainer; -use crate::stat::modifier::Modifier; +use crate::modifier::Modifier; use std::ops::{AddAssign, DivAssign, MulAssign, SubAssign}; /// A stat that [resets] to a base value every iteration. @@ -116,130 +114,3 @@ impl DivAssign for Stat { self.multiplier /= rhs; } } - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn reset() { - for i in 0..10 { - let mut stat = Stat { - base: i, - bonus: 4, - multiplier: 1.5, - }; - stat.reset_modifiers(); - - assert_eq!(stat, Stat::new(i)); - } - } - - #[test] - fn add() { - let mut stat = Stat::new(10); - stat += 5; - assert_eq!( - stat, - Stat { - base: 10, - bonus: 5, - multiplier: 1.0, - } - ); - } - - #[test] - fn subtract() { - let mut stat = Stat::new(10); - stat -= 5; - assert_eq!( - stat, - Stat { - base: 10, - bonus: -5, - multiplier: 1.0, - } - ); - } - - #[test] - fn multiply() { - let mut stat = Stat::new(10); - stat *= 2.0; - assert_eq!( - stat, - Stat { - base: 10, - bonus: 0, - multiplier: 2.0, - } - ); - } - - #[test] - fn divide() { - let mut stat = Stat::new(10); - stat /= 2.0; - assert_eq!( - stat, - Stat { - base: 10, - bonus: 0, - multiplier: 0.5, - } - ); - } - - #[test] - fn default_total() { - for i in 0..10 { - assert_eq!(Stat::new(i).total(), i); - } - } - - #[test] - fn total() { - assert_eq!( - Stat { - base: 10, - bonus: 4, - multiplier: 1.5, - } - .total(), - 21 - ) - } - - #[test] - fn total_no_bonus() { - assert_eq!(Stat::new(20).with_multiplier(0.5).total(), 10); - } - - #[test] - fn total_no_multiplier() { - assert_eq!(Stat::new(2).with_bonus(1).total(), 3); - } - - #[test] - fn total_with_modifier() { - assert_eq!(Stat::new(5).with_modifier(Modifier::new(1, 0.5)).total(), 3); - } - - #[test] - fn apply() { - let mut stat = Stat::new(10); - - stat.apply(Modifier::new(2, 2.0)); - stat.apply(Modifier::new(3, 4.0)); - - assert_eq!( - stat, - Stat { - base: 10, - bonus: 5, - multiplier: 8.0, - } - ) - } -} diff --git a/immediate_stats/tests/bevy.rs b/immediate_stats/tests/bevy.rs new file mode 100644 index 0000000..dc8816c --- /dev/null +++ b/immediate_stats/tests/bevy.rs @@ -0,0 +1,66 @@ +#![cfg(feature = "bevy")] +//! Tests the reset systems and `PauseStatReset`. + +use bevy_ecs::prelude::*; +use immediate_stats::*; + +#[derive(Component, Resource, StatContainer, PartialEq, Debug, Clone)] +struct Health(Stat); + +#[test] +fn reset_component() { + let mut world = World::new(); + let system = world.register_system(reset_component_modifiers::); + + let entity = world + .spawn(Health(Stat { + base: 100, + bonus: 50, + multiplier: 2.0, + })) + .id(); + + world.run_system(system).unwrap(); + + assert_eq!( + world.get::(entity), + Some(Health(Stat::new(100))).as_ref() + ); +} + +#[test] +fn pause_component() { + let mut world = World::new(); + let system = world.register_system(reset_component_modifiers::); + + let health = Health(Stat { + base: 100, + bonus: 50, + multiplier: 2.0, + }); + + let entity = world.spawn((health.clone(), PauseStatReset)).id(); + + world.run_system(system).unwrap(); + + assert_eq!(world.get::(entity), Some(health).as_ref()); +} + +#[test] +fn reset_resource() { + let mut world = World::new(); + let system = world.register_system(reset_resource_modifiers::); + + world.insert_resource(Health(Stat { + base: 100, + bonus: 50, + multiplier: 2.0, + })); + + world.run_system(system).unwrap(); + + assert_eq!( + world.get_resource::(), + Some(Health(Stat::new(100))).as_ref() + ); +} diff --git a/immediate_stats/tests/bevy_butler.rs b/immediate_stats/tests/bevy_butler.rs new file mode 100644 index 0000000..71620d6 --- /dev/null +++ b/immediate_stats/tests/bevy_butler.rs @@ -0,0 +1,60 @@ +#![cfg(feature = "bevy_butler")] +//! Tests the `add_component` attribute for automatic system registration. + +use crate::StatContainer; +use crate::stat::Stat; +use bevy_app::App; +use bevy_butler::*; +use bevy_ecs::prelude::*; +use immediate_stats::*; + +#[butler_plugin] +struct MyPlugin; + +#[derive(Resource, Component, StatContainer, Default, PartialEq, Debug)] +#[add_component(plugin = MyPlugin)] +#[add_resource(plugin = MyPlugin)] +struct Health(Stat); + +#[test] +fn reset_component_auto() { + let mut app = App::new(); + + app.add_plugins(MyPlugin); + + let entity = app + .world_mut() + .spawn(Health(Stat { + base: 100, + bonus: 50, + multiplier: 2.0, + })) + .id(); + + app.update(); + + assert_eq!( + app.world().get::(entity), + Some(Health(Stat::new(100))).as_ref() + ); +} + +#[test] +fn reset_resource_auto() { + let mut app = App::new(); + + app.add_plugins(MyPlugin); + + app.insert_resource(Health(Stat { + base: 100, + bonus: 50, + multiplier: 2.0, + })); + + app.update(); + + assert_eq!( + app.world().get_resource::(), + Some(Health(Stat::new(100))).as_ref() + ); +} diff --git a/immediate_stats/tests/derive.rs b/immediate_stats/tests/derive.rs new file mode 100644 index 0000000..d2facd1 --- /dev/null +++ b/immediate_stats/tests/derive.rs @@ -0,0 +1,163 @@ +//! Tests the basic `StatContainer` derive with no extra features. + +use immediate_stats::*; + +#[derive(StatContainer, PartialEq, Debug)] +struct Movement { + speed: Stat, + other: bool, +} + +#[test] +fn reset() { + for base in 0..10 { + let mut movement = Movement { + speed: Stat { + base, + bonus: 3, + multiplier: 1.5, + }, + other: true, + }; + + movement.reset_modifiers(); + + assert_eq!( + movement, + Movement { + speed: Stat::new(base), + other: true + } + ); + } +} + +#[derive(StatContainer, PartialEq, Debug)] +struct MaxHealth(Stat, bool); + +#[test] +fn reset_tuple_struct() { + for base in 0..10 { + let mut max_health = MaxHealth( + Stat { + base, + bonus: 3, + multiplier: 1.5, + }, + true, + ); + + max_health.reset_modifiers(); + + assert_eq!(max_health.0, Stat::new(base)); + } +} + +#[derive(StatContainer, PartialEq, Debug)] +struct Health { + #[stat] + max: MaxHealth, + current: i32, +} + +#[test] +fn reset_with_attribute() { + for base in 0..10 { + let mut health = Health { + max: MaxHealth( + Stat { + base, + bonus: 3, + multiplier: 1.5, + }, + true, + ), + current: base, + }; + + health.reset_modifiers(); + + assert_eq!(health.max.0, Stat::new(base)); + } +} + +#[derive(StatContainer, PartialEq, Debug)] +struct PartialReset { + #[stat_ignore] + ignored: Stat, + reset: Stat, +} + +#[test] +fn reset_ignored() { + for base in 0..10 { + let stat = Stat { + base, + bonus: 3, + multiplier: 1.5, + }; + + let mut partial = PartialReset { + ignored: stat, + reset: stat, + }; + + partial.reset_modifiers(); + + assert_eq!(partial.ignored, stat); + assert_eq!(partial.reset, Stat::new(base)); + } +} + +#[derive(StatContainer, PartialEq, Debug)] +enum EnumStat { + Named { + stat: Stat, + other: u8, + }, + Unnamed(Stat, u8), + #[expect(dead_code)] + Other, +} + +#[test] +fn reset_enum_named() { + for base in 0..10 { + let mut stat = EnumStat::Named { + stat: Stat { + base, + bonus: 3, + multiplier: 1.5, + }, + other: 0, + }; + + stat.reset_modifiers(); + + assert_eq!( + stat, + EnumStat::Named { + stat: Stat::new(base), + other: 0, + } + ); + } +} + +#[test] +fn reset_enum_unnamed() { + for base in 0..10 { + let mut stat = EnumStat::Unnamed( + Stat { + base, + bonus: 3, + multiplier: 1.5, + }, + 0, + ); + + stat.reset_modifiers(); + + assert_eq!(stat, EnumStat::Unnamed(Stat::new(base), 0)); + } +} diff --git a/immediate_stats/tests/modifier.rs b/immediate_stats/tests/modifier.rs new file mode 100644 index 0000000..0e2a435 --- /dev/null +++ b/immediate_stats/tests/modifier.rs @@ -0,0 +1,55 @@ +//! Tests the various methods of `Modifier`. + +use immediate_stats::*; + +#[test] +fn add() { + let mut modifier = Modifier::default(); + modifier += 5; + assert_eq!( + modifier, + Modifier { + bonus: 5, + multiplier: 1.0, + } + ); +} + +#[test] +fn subtract() { + let mut modifier = Modifier::default(); + modifier -= 5; + assert_eq!( + modifier, + Modifier { + bonus: -5, + multiplier: 1.0, + } + ); +} + +#[test] +fn multiply() { + let mut modifier = Modifier::default(); + modifier *= 2.0; + assert_eq!( + modifier, + Modifier { + bonus: 0, + multiplier: 2.0, + } + ); +} + +#[test] +fn divide() { + let mut modifier = Modifier::default(); + modifier /= 2.0; + assert_eq!( + modifier, + Modifier { + bonus: 0, + multiplier: 0.5, + } + ); +} diff --git a/immediate_stats/tests/stat.rs b/immediate_stats/tests/stat.rs new file mode 100644 index 0000000..65dadf9 --- /dev/null +++ b/immediate_stats/tests/stat.rs @@ -0,0 +1,125 @@ +//! Tests the various methods of `Stat`. + +use immediate_stats::*; + +#[test] +fn reset() { + for i in 0..10 { + let mut stat = Stat { + base: i, + bonus: 4, + multiplier: 1.5, + }; + stat.reset_modifiers(); + + assert_eq!(stat, Stat::new(i)); + } +} + +#[test] +fn add() { + let mut stat = Stat::new(10); + stat += 5; + assert_eq!( + stat, + Stat { + base: 10, + bonus: 5, + multiplier: 1.0, + } + ); +} + +#[test] +fn subtract() { + let mut stat = Stat::new(10); + stat -= 5; + assert_eq!( + stat, + Stat { + base: 10, + bonus: -5, + multiplier: 1.0, + } + ); +} + +#[test] +fn multiply() { + let mut stat = Stat::new(10); + stat *= 2.0; + assert_eq!( + stat, + Stat { + base: 10, + bonus: 0, + multiplier: 2.0, + } + ); +} + +#[test] +fn divide() { + let mut stat = Stat::new(10); + stat /= 2.0; + assert_eq!( + stat, + Stat { + base: 10, + bonus: 0, + multiplier: 0.5, + } + ); +} + +#[test] +fn default_total() { + for i in 0..10 { + assert_eq!(Stat::new(i).total(), i); + } +} + +#[test] +fn total() { + assert_eq!( + Stat { + base: 10, + bonus: 4, + multiplier: 1.5, + } + .total(), + 21 + ) +} + +#[test] +fn total_no_bonus() { + assert_eq!(Stat::new(20).with_multiplier(0.5).total(), 10); +} + +#[test] +fn total_no_multiplier() { + assert_eq!(Stat::new(2).with_bonus(1).total(), 3); +} + +#[test] +fn total_with_modifier() { + assert_eq!(Stat::new(5).with_modifier(Modifier::new(1, 0.5)).total(), 3); +} + +#[test] +fn apply() { + let mut stat = Stat::new(10); + + stat.apply(Modifier::new(2, 2.0)); + stat.apply(Modifier::new(3, 4.0)); + + assert_eq!( + stat, + Stat { + base: 10, + bonus: 5, + multiplier: 8.0, + } + ) +} -- 2.51.2