Skip to content

Commit 02ad161

Browse files
committed
add tests to validate the expected outcome of the call context
1 parent 33f8f18 commit 02ad161

File tree

1 file changed

+77
-0
lines changed

1 file changed

+77
-0
lines changed

itest/rust/src/builtin_tests/containers/callable_test.rs

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)