@@ -654,6 +654,83 @@ pub mod custom_callable {
654654 assert ! ( result. is_nil( ) ) ;
655655 }
656656
657+ #[ itest]
658+ fn callable_context_custom_panic ( ) {
659+ let old_hook = std:: panic:: take_hook ( ) ;
660+
661+ let panic_message = Arc :: new ( Mutex :: new ( None ) ) ;
662+ let panic_message_clone = panic_message. clone ( ) ;
663+
664+ std:: panic:: set_hook ( Box :: new ( move |panic_info| {
665+ let error_message = godot:: private:: format_panic_message ( panic_info) ;
666+ * panic_message_clone. lock ( ) . unwrap ( ) = Some ( error_message) ;
667+ } ) ) ;
668+
669+ let received = Arc :: new ( AtomicU32 :: new ( 0 ) ) ;
670+ let callable = Callable :: from_custom ( PanicCallable ( received) ) ;
671+ callable. callv ( & varray ! [ ] ) ;
672+
673+ let function_name = if cfg ! ( debug_assertions) {
674+ "test"
675+ } else {
676+ "<optimed out>"
677+ } ;
678+ let expected_msg = format ! ( "Context: <Callable>::{}" , function_name) ;
679+
680+ let panic_message = panic_message
681+ . lock ( )
682+ . unwrap ( )
683+ . clone ( )
684+ . expect ( "panic message absent" ) ;
685+ let context_line = panic_message
686+ . lines ( )
687+ . last ( )
688+ . expect ( "empty panic message" )
689+ . trim ( ) ;
690+
691+ assert_eq ! ( context_line, expected_msg) ;
692+
693+ std:: panic:: set_hook ( old_hook) ;
694+ }
695+
696+ #[ itest]
697+ fn callable_context_rust_fn_panic ( ) {
698+ let old_hook = std:: panic:: take_hook ( ) ;
699+
700+ let panic_message = Arc :: new ( Mutex :: new ( None ) ) ;
701+ let panic_message_clone = panic_message. clone ( ) ;
702+
703+ std:: panic:: set_hook ( Box :: new ( move |panic_info| {
704+ let error_message = godot:: private:: format_panic_message ( panic_info) ;
705+ * panic_message_clone. lock ( ) . unwrap ( ) = Some ( error_message) ;
706+ } ) ) ;
707+
708+ let callable = Callable :: from_local_fn ( "test" , |_args| -> Variant { panic ! ( "ahh" ) } ) ;
709+ callable. callv ( & varray ! [ ] ) ;
710+
711+ let function_name = if cfg ! ( debug_assertions) {
712+ "test"
713+ } else {
714+ "<optimed out>"
715+ } ;
716+ let expected_msg = format ! ( "Context: <Callable>::{}" , function_name) ;
717+
718+ let panic_message = panic_message
719+ . lock ( )
720+ . unwrap ( )
721+ . clone ( )
722+ . expect ( "panic message absent" ) ;
723+ let context_line = panic_message
724+ . lines ( )
725+ . last ( )
726+ . expect ( "empty panic message" )
727+ . trim ( ) ;
728+
729+ assert_eq ! ( context_line, expected_msg) ;
730+
731+ std:: panic:: set_hook ( old_hook) ;
732+ }
733+
657734 // ------------------------------------------------------------------------------------------------------------------------------------------
658735 // Helper structs and functions for custom callables
659736
0 commit comments