@@ -33,7 +33,7 @@ impl<I, O> VisitAssetDependencies for Callback<I, O> {
33
33
impl < I : TypePath , O : TypePath > Asset for Callback < I , O > { }
34
34
35
35
// TODO: Add docs
36
- #[ derive( Error ) ]
36
+ #[ derive( Error , PartialEq , Eq ) ]
37
37
pub enum CallbackError < I : TypePath , O : TypePath > {
38
38
// TODO: Add docs
39
39
#[ error( "Callback {0:?} was not found" ) ]
@@ -380,4 +380,28 @@ mod tests {
380
380
let _ = app. world . run_callback ( nested_id) ;
381
381
assert_eq ! ( * app. world. resource:: <Counter >( ) , Counter ( 5 ) ) ;
382
382
}
383
+
384
+ #[ test]
385
+ fn error_on_recursive_call ( ) {
386
+ #[ derive( Component ) ]
387
+ struct Call ( Handle < Callback > ) ;
388
+
389
+ let mut app = App :: new ( ) ;
390
+ app. add_plugins ( AssetPlugin :: default ( ) ) ;
391
+ app. insert_resource ( Counter ( 0 ) ) ;
392
+
393
+ let mut callbacks = app. world . resource_mut :: < Assets < Callback > > ( ) ;
394
+
395
+ let call_self = callbacks. add ( Callback :: from_system ( |world : & mut World | {
396
+ let callbacks = world. resource :: < Assets < Callback > > ( ) ;
397
+ // this is this callback's id because it is the only callback.
398
+ let own_id = callbacks. iter ( ) . next ( ) . unwrap ( ) . 0 . clone ( ) ;
399
+ let own_handle = Handle :: Weak ( own_id) ;
400
+ let result = world. run_callback ( own_handle. clone ( ) ) ;
401
+
402
+ assert_eq ! ( result, Err ( CallbackError :: Recursive ( own_handle) ) ) ;
403
+ } ) ) ;
404
+
405
+ let _ = app. world . run_callback ( call_self) ;
406
+ }
383
407
}
0 commit comments