let result = match (&desc.should_panic, task_result) {
(&ShouldPanic::No, Ok(())) | (&ShouldPanic::Yes, Err(_)) => TestResult::TrOk,
(&ShouldPanic::YesWithMessage(msg), Err(ref err)) => {
- if err
+ let maybe_panic_str = err
.downcast_ref::<String>()
.map(|e| &**e)
- .or_else(|| err.downcast_ref::<&'static str>().map(|e| *e))
+ .or_else(|| err.downcast_ref::<&'static str>().map(|e| *e));
+
+ if maybe_panic_str
.map(|e| e.contains(msg))
.unwrap_or(false)
{
if desc.allow_fail {
TestResult::TrAllowedFail
} else {
- TestResult::TrFailedMsg(
- format!("panic did not include expected string '{}'", msg)
- )
+ if let Some(panic_str) = maybe_panic_str{
+ TestResult::TrFailedMsg(
+ format!(r#"panic did not contain expected string
+ panic message: `{:?}`,
+ expected substring: `{:?}`"#, panic_str, &*msg)
+ )
+ } else {
+ TestResult::TrFailedMsg(
+ format!(r#"expected panic with string value,
+ found non-string value: `{:?}`
+ expected substring: `{:?}`"#, (**err).type_id(), &*msg)
+ )
+ }
}
}
}
// TestType, TrFailedMsg, TrIgnored, TrOk,
},
};
+use std::any::TypeId;
use std::sync::mpsc::channel;
use std::time::Duration;
panic!("an error message");
}
let expected = "foobar";
- let failed_msg = "panic did not include expected string";
+ let failed_msg = r#"panic did not contain expected string
+ panic message: `"an error message"`,
+ expected substring: `"foobar"`"#;
let desc = TestDescAndFn {
desc: TestDesc {
name: StaticTestName("whatever"),
let (tx, rx) = channel();
run_test(&TestOpts::new(), false, desc, RunStrategy::InProcess, tx, Concurrent::No);
let result = rx.recv().unwrap().result;
- assert!(result == TrFailedMsg(format!("{} '{}'", failed_msg, expected)));
+ assert_eq!(result, TrFailedMsg(failed_msg.to_string()));
+}
+
+// FIXME: Re-enable emscripten once it can catch panics again (introduced by #65251)
+#[test]
+#[cfg(not(target_os = "emscripten"))]
+fn test_should_panic_non_string_message_type() {
+ use crate::tests::TrFailedMsg;
+ fn f() {
+ panic!(1i32);
+ }
+ let expected = "foobar";
+ let failed_msg = format!(r#"expected panic with string value,
+ found non-string value: `{:?}`
+ expected substring: `"foobar"`"#, TypeId::of::<i32>());
+ let desc = TestDescAndFn {
+ desc: TestDesc {
+ name: StaticTestName("whatever"),
+ ignore: false,
+ should_panic: ShouldPanic::YesWithMessage(expected),
+ allow_fail: false,
+ test_type: TestType::Unknown,
+ },
+ testfn: DynTestFn(Box::new(f)),
+ };
+ let (tx, rx) = channel();
+ run_test(&TestOpts::new(), false, desc, RunStrategy::InProcess, tx, Concurrent::No);
+ let result = rx.recv().unwrap().result;
+ assert_eq!(result, TrFailedMsg(failed_msg));
}
// FIXME: Re-enable emscripten once it can catch panics again (introduced by #65251)