#![allow(clippy::needless_pass_by_value)]
use nexus_rt::testing::TestHarness;
use nexus_rt::{IntoHandler, ResMut, WorldBuilder, new_resource};
new_resource!(Total(u64));
new_resource!(MaxVal(f64));
fn accumulate(mut total: ResMut<Total>, event: u64) {
**total += event;
}
fn track_max(mut max: ResMut<MaxVal>, event: f64) {
if event > **max {
**max = event;
}
}
fn main() {
println!("=== 1. Basic TestHarness ===\n");
let mut builder = WorldBuilder::new();
builder.register(Total(0));
let mut harness = TestHarness::new(builder);
let mut handler = accumulate.into_handler(harness.registry());
harness.dispatch(&mut handler, 10u64);
harness.dispatch(&mut handler, 5u64);
let total = harness.world().resource::<Total>().0;
println!(" total after 10+5: {total}");
assert_eq!(total, 15);
println!("\n=== 2. dispatch_many ===\n");
let mut builder = WorldBuilder::new();
builder.register(MaxVal(f64::NEG_INFINITY));
let mut harness = TestHarness::new(builder);
let mut handler = track_max.into_handler(harness.registry());
harness.dispatch_many(&mut handler, [3.0, 7.0, 2.0, 9.0, 1.0]);
let max = harness.world().resource::<MaxVal>().0;
println!(" max of [3, 7, 2, 9, 1]: {max}");
assert!((max - 9.0).abs() < f64::EPSILON);
println!("\n=== 3. Multiple handlers ===\n");
let mut builder = WorldBuilder::new();
builder.register(Total(0));
builder.register(MaxVal(f64::NEG_INFINITY));
let mut harness = TestHarness::new(builder);
let mut adder = accumulate.into_handler(harness.registry());
let mut maxer = track_max.into_handler(harness.registry());
harness.dispatch(&mut adder, 30u64);
harness.dispatch(&mut maxer, 5.0);
harness.dispatch(&mut adder, 40u64);
harness.dispatch(&mut maxer, 9.0);
harness.dispatch(&mut adder, 50u64);
harness.dispatch(&mut maxer, 3.0);
let total = harness.world().resource::<Total>().0;
let max = harness.world().resource::<MaxVal>().0;
println!(" total: {total}, max: {max}");
assert_eq!(total, 120);
assert!((max - 9.0).abs() < f64::EPSILON);
*harness.world_mut().resource_mut::<Total>() = Total(0);
assert_eq!(harness.world().resource::<Total>().0, 0);
println!(" reset total via world_mut(): 0");
println!("\nDone.");
}