Skip to content

Commit 7abcbc4

Browse files
Tests
1 parent 6f43aa4 commit 7abcbc4

File tree

2 files changed

+52
-14
lines changed

2 files changed

+52
-14
lines changed

crates/bevy_ecs/src/observer/runner.rs

+23-14
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use core::any::Any;
33

44
use crate::{
55
component::{ComponentHook, ComponentId, HookContext, Mutable, StorageType},
6-
error::ErrorContext,
6+
error::{ErrorContext, ErrorHandler},
77
observer::{ObserverDescriptor, ObserverTrigger},
88
prelude::*,
99
query::DebugCheckedUnwrap,
@@ -273,7 +273,7 @@ pub struct Observer {
273273
system: Box<dyn Any + Send + Sync + 'static>,
274274
descriptor: ObserverDescriptor,
275275
hook_on_add: ComponentHook,
276-
error_handler: Option<fn(BevyError, ErrorContext)>,
276+
error_handler: Option<ErrorHandler>,
277277
}
278278

279279
impl Observer {
@@ -380,7 +380,6 @@ fn observer_system_runner<E: Event, B: Bundle, S: ObserverSystem<E, B>>(
380380
.get::<Observer>()
381381
.debug_checked_unwrap()
382382
.error_handler
383-
.debug_checked_unwrap()
384383
};
385384

386385
let trigger: Trigger<E, B> = Trigger::new(
@@ -409,7 +408,8 @@ fn observer_system_runner<E: Event, B: Bundle, S: ObserverSystem<E, B>>(
409408
match (*system).validate_param_unsafe(world) {
410409
Ok(()) => {
411410
if let Err(err) = (*system).run_unsafe(trigger, world) {
412-
error_handler(
411+
let handler = error_handler.unwrap_or_else(|| world.default_error_handler());
412+
handler(
413413
err,
414414
ErrorContext::Observer {
415415
name: (*system).name(),
@@ -421,7 +421,8 @@ fn observer_system_runner<E: Event, B: Bundle, S: ObserverSystem<E, B>>(
421421
}
422422
Err(e) => {
423423
if !e.skipped {
424-
error_handler(
424+
let handler = error_handler.unwrap_or_else(|| world.default_error_handler());
425+
handler(
425426
e.into(),
426427
ErrorContext::Observer {
427428
name: (*system).name(),
@@ -458,15 +459,10 @@ fn hook_on_add<E: Event, B: Bundle, S: ObserverSystem<E, B>>(
458459
..Default::default()
459460
};
460461

461-
let default_error_handler = world.default_error_handler();
462-
463462
// Initialize System
464463
let system: *mut dyn ObserverSystem<E, B> =
465464
if let Some(mut observe) = world.get_mut::<Observer>(entity) {
466465
descriptor.merge(&observe.descriptor);
467-
if observe.error_handler.is_none() {
468-
observe.error_handler = Some(default_error_handler);
469-
}
470466
let system = observe.system.downcast_mut::<S>().unwrap();
471467
&mut *system
472468
} else {
@@ -493,7 +489,11 @@ fn hook_on_add<E: Event, B: Bundle, S: ObserverSystem<E, B>>(
493489
#[cfg(test)]
494490
mod tests {
495491
use super::*;
496-
use crate::{event::Event, observer::Trigger};
492+
use crate::{
493+
error::{ignore, DefaultErrorHandler},
494+
event::Event,
495+
observer::Trigger,
496+
};
497497

498498
#[derive(Event)]
499499
struct TriggerEvent;
@@ -521,11 +521,20 @@ mod tests {
521521
Err("I failed!".into())
522522
}
523523

524+
// Using observer error handler
524525
let mut world = World::default();
525526
world.init_resource::<Ran>();
526-
let observer = Observer::new(system).with_error_handler(crate::error::ignore);
527-
world.spawn(observer);
528-
Schedule::default().run(&mut world);
527+
world.spawn(Observer::new(system).with_error_handler(ignore));
528+
world.trigger(TriggerEvent);
529+
assert!(world.resource::<Ran>().0);
530+
531+
// Using world error handler
532+
let mut world = World::default();
533+
world.init_resource::<Ran>();
534+
world.spawn(Observer::new(system));
535+
// Test that the correct handler is used when the observer was added
536+
// before the default handler
537+
world.insert_resource(DefaultErrorHandler(ignore));
529538
world.trigger(TriggerEvent);
530539
assert!(world.resource::<Ran>().0);
531540
}

crates/bevy_ecs/src/schedule/schedule.rs

+29
Original file line numberDiff line numberDiff line change
@@ -2059,6 +2059,7 @@ mod tests {
20592059
use bevy_ecs_macros::ScheduleLabel;
20602060

20612061
use crate::{
2062+
error::{ignore, panic, DefaultErrorHandler, Result},
20622063
prelude::{ApplyDeferred, Res, Resource},
20632064
schedule::{
20642065
tests::ResMut, IntoScheduleConfigs, Schedule, ScheduleBuildSettings, SystemSet,
@@ -2808,4 +2809,32 @@ mod tests {
28082809
.expect("CheckSystemRan Resource Should Exist");
28092810
assert_eq!(value.0, 2);
28102811
}
2812+
2813+
#[test]
2814+
fn test_default_error_handler() {
2815+
#[derive(Resource, Default)]
2816+
struct Ran(bool);
2817+
2818+
fn system(mut ran: ResMut<Ran>) -> Result {
2819+
ran.0 = true;
2820+
Err("I failed!".into())
2821+
}
2822+
2823+
// Test that the default error handler is used
2824+
let mut world = World::default();
2825+
world.init_resource::<Ran>();
2826+
world.insert_resource(DefaultErrorHandler(ignore));
2827+
let mut schedule = Schedule::default();
2828+
schedule.add_systems(system).run(&mut world);
2829+
assert!(world.resource::<Ran>().0);
2830+
2831+
// Test that the handler doesn't change within the schedule
2832+
schedule.add_systems(
2833+
(|world: &mut World| {
2834+
world.insert_resource(DefaultErrorHandler(panic));
2835+
})
2836+
.before(system),
2837+
);
2838+
schedule.run(&mut world);
2839+
}
28112840
}

0 commit comments

Comments
 (0)