#[macro_export]
macro_rules! assert_contains_as_result {
($container:expr, $containee:expr $(,)?) => {
match (&$container, &$containee) {
(container, containee) => {
if (container).contains(*containee) {
Ok(())
} else {
Err(format!(
concat!(
"assertion failed: `assert_contains!(container, containee)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_contains.html\n",
" container label: `{}`,\n",
" container debug: `{:?}`,\n",
" containee label: `{}`,\n",
" containee debug: `{:?}`",
),
stringify!($container),
container,
stringify!($containee),
containee,
))
}
}
}
};
}
#[cfg(test)]
mod test_assert_contains_as_result {
use std::panic;
use std::sync::Once;
mod str {
use super::*;
#[test]
fn success() {
let a: &'static str = "alfa";
let b: &'static str = "lf";
for _ in 0..1 {
let actual = assert_contains_as_result!(a, b);
assert_eq!(actual.unwrap(), ());
}
}
#[test]
fn success_once() {
static A: Once = Once::new();
fn a() -> &'static str {
if A.is_completed() {
panic!("A.is_completed()")
} else {
A.call_once(|| {})
}
"alfa"
}
static B: Once = Once::new();
fn b() -> &'static str {
if B.is_completed() {
panic!("B.is_completed()")
} else {
B.call_once(|| {})
}
"lf"
}
assert_eq!(A.is_completed(), false);
assert_eq!(B.is_completed(), false);
let result = assert_contains_as_result!(a(), b());
assert!(result.is_ok());
assert_eq!(A.is_completed(), true);
assert_eq!(B.is_completed(), true);
}
#[test]
fn failure() {
let a: &'static str = "alfa";
let b: &'static str = "xx";
let actual = assert_contains_as_result!(a, b);
let message = concat!(
"assertion failed: `assert_contains!(container, containee)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_contains.html\n",
" container label: `a`,\n",
" container debug: `\"alfa\"`,\n",
" containee label: `b`,\n",
" containee debug: `\"xx\"`"
);
assert_eq!(actual.unwrap_err(), message);
}
}
mod range_i32 {
use super::*;
use std::ops::Range;
#[test]
fn success() {
let a: Range<i32> = 1..3;
let b: i32 = 2;
for _ in 0..1 {
let actual = assert_contains_as_result!(a, &b);
assert_eq!(actual.unwrap(), ());
}
}
#[test]
fn success_once() {
static A: Once = Once::new();
fn a() -> Range<i32> {
if A.is_completed() {
panic!("A.is_completed()")
} else {
A.call_once(|| {})
}
1..3
}
static B: Once = Once::new();
fn b() -> i32 {
if B.is_completed() {
panic!("B.is_completed()")
} else {
B.call_once(|| {})
}
2
}
assert_eq!(A.is_completed(), false);
assert_eq!(B.is_completed(), false);
let result = assert_contains_as_result!(a(), &b());
assert!(result.is_ok());
assert_eq!(A.is_completed(), true);
assert_eq!(B.is_completed(), true);
}
#[test]
fn failure() {
let a: Range<i32> = 1..3;
let b: i32 = 4;
let actual = assert_contains_as_result!(a, &b);
let message = concat!(
"assertion failed: `assert_contains!(container, containee)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_contains.html\n",
" container label: `a`,\n",
" container debug: `1..3`,\n",
" containee label: `&b`,\n",
" containee debug: `4`"
);
assert_eq!(actual.unwrap_err(), message);
}
}
mod range_string {
use super::*;
use std::ops::Range;
#[test]
fn success() {
let a: Range<String> = String::from("1")..String::from("3");
let b: String = String::from("2");
for _ in 0..1 {
let actual = assert_contains_as_result!(a, &b);
assert_eq!(actual.unwrap(), ());
}
}
#[test]
fn success_once() {
static A: Once = Once::new();
fn a() -> Range<String> {
if A.is_completed() {
panic!("A.is_completed()")
} else {
A.call_once(|| {})
}
String::from("1")..String::from("3")
}
static B: Once = Once::new();
fn b() -> String {
if B.is_completed() {
panic!("B.is_completed()")
} else {
B.call_once(|| {})
}
String::from("2")
}
assert_eq!(A.is_completed(), false);
assert_eq!(B.is_completed(), false);
let result = assert_contains_as_result!(a(), &b());
assert!(result.is_ok());
assert_eq!(A.is_completed(), true);
assert_eq!(B.is_completed(), true);
}
#[test]
fn failure() {
let a: Range<String> = String::from("1")..String::from("3");
let b: String = String::from("4");
let actual = assert_contains_as_result!(a, &b);
let message = concat!(
"assertion failed: `assert_contains!(container, containee)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_contains.html\n",
" container label: `a`,\n",
" container debug: `\"1\"..\"3\"`,\n",
" containee label: `&b`,\n",
" containee debug: `\"4\"`"
);
assert_eq!(actual.unwrap_err(), message);
}
}
mod vec_i32 {
use super::*;
#[test]
fn success() {
let a: Vec<i32> = vec![1, 2, 3];
let b: i32 = 2;
for _ in 0..1 {
let actual = assert_contains_as_result!(a, &b);
assert_eq!(actual.unwrap(), ());
}
}
#[test]
fn success_once() {
static A: Once = Once::new();
fn a() -> Vec<i32> {
if A.is_completed() {
panic!("A.is_completed()")
} else {
A.call_once(|| {})
}
vec![1, 2, 3]
}
static B: Once = Once::new();
fn b() -> i32 {
if B.is_completed() {
panic!("B.is_completed()")
} else {
B.call_once(|| {})
}
2
}
assert_eq!(A.is_completed(), false);
assert_eq!(B.is_completed(), false);
let result = assert_contains_as_result!(a(), &b());
assert!(result.is_ok());
assert_eq!(A.is_completed(), true);
assert_eq!(B.is_completed(), true);
}
#[test]
fn failure() {
let a: Vec<i32> = vec![1, 2, 3];
let b: i32 = 4;
let actual = assert_contains_as_result!(a, &b);
let message = concat!(
"assertion failed: `assert_contains!(container, containee)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_contains.html\n",
" container label: `a`,\n",
" container debug: `[1, 2, 3]`,\n",
" containee label: `&b`,\n",
" containee debug: `4`"
);
assert_eq!(actual.unwrap_err(), message);
}
}
mod vec_string {
use super::*;
#[test]
fn success() {
let a: Vec<String> = vec![String::from("1"), String::from("2"), String::from("3")];
let b: String = String::from("2");
for _ in 0..1 {
let actual = assert_contains_as_result!(a, &b);
assert_eq!(actual.unwrap(), ());
}
}
#[test]
fn success_once() {
static A: Once = Once::new();
fn a() -> Vec<String> {
if A.is_completed() {
panic!("A.is_completed()")
} else {
A.call_once(|| {})
}
vec![String::from("1"), String::from("2"), String::from("3")]
}
static B: Once = Once::new();
fn b() -> String {
if B.is_completed() {
panic!("B.is_completed()")
} else {
B.call_once(|| {})
}
String::from("2")
}
assert_eq!(A.is_completed(), false);
assert_eq!(B.is_completed(), false);
let result = assert_contains_as_result!(a(), &b());
assert!(result.is_ok());
assert_eq!(A.is_completed(), true);
assert_eq!(B.is_completed(), true);
}
#[test]
fn failure() {
let a: Vec<String> = vec![String::from("1"), String::from("2"), String::from("3")];
let b: String = String::from("4");
let actual = assert_contains_as_result!(a, &b);
let message = concat!(
"assertion failed: `assert_contains!(container, containee)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_contains.html\n",
" container label: `a`,\n",
" container debug: `[\"1\", \"2\", \"3\"]`,\n",
" containee label: `&b`,\n",
" containee debug: `\"4\"`"
);
assert_eq!(actual.unwrap_err(), message);
}
}
mod hashset_string {
use super::*;
use std::collections::HashSet;
#[test]
fn success() {
let a: HashSet<String> = [String::from("1")].into();
let b: String = String::from("1");
for _ in 0..1 {
let actual = assert_contains_as_result!(a, &b);
assert_eq!(actual.unwrap(), ());
}
}
#[test]
fn success_once() {
static A: Once = Once::new();
fn a() -> HashSet<String> {
if A.is_completed() {
panic!("A.is_completed()")
} else {
A.call_once(|| {})
}
[String::from("1")].into()
}
static B: Once = Once::new();
fn b() -> String {
if B.is_completed() {
panic!("B.is_completed()")
} else {
B.call_once(|| {})
}
String::from("1")
}
assert_eq!(A.is_completed(), false);
assert_eq!(B.is_completed(), false);
let result = assert_contains_as_result!(a(), &b());
assert!(result.is_ok());
assert_eq!(A.is_completed(), true);
assert_eq!(B.is_completed(), true);
}
#[test]
fn failure() {
let a: HashSet<String> = [String::from("1")].into();
let b: String = String::from("2");
let actual = assert_contains_as_result!(a, &b);
let message = concat!(
"assertion failed: `assert_contains!(container, containee)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_contains.html\n",
" container label: `a`,\n",
" container debug: `{\"1\"}`,\n",
" containee label: `&b`,\n",
" containee debug: `\"2\"`"
);
assert_eq!(actual.unwrap_err(), message);
}
}
mod hashset_string_with_str_automatic_borrow_optimization {
use super::*;
use std::collections::HashSet;
#[test]
fn success() {
let a: HashSet<String> = [String::from("1")].into();
let b: &'static str = "1";
for _ in 0..1 {
let actual = assert_contains_as_result!(a, b);
assert_eq!(actual.unwrap(), ());
}
}
#[test]
fn success_once() {
static A: Once = Once::new();
fn a() -> HashSet<String> {
if A.is_completed() {
panic!("A.is_completed()")
} else {
A.call_once(|| {})
}
[String::from("1")].into()
}
static B: Once = Once::new();
fn b() -> &'static str {
if B.is_completed() {
panic!("B.is_completed()")
} else {
B.call_once(|| {})
}
"1"
}
assert_eq!(A.is_completed(), false);
assert_eq!(B.is_completed(), false);
let result = assert_contains_as_result!(a(), b());
assert!(result.is_ok());
assert_eq!(A.is_completed(), true);
assert_eq!(B.is_completed(), true);
}
#[test]
fn failure() {
let a: HashSet<String> = [String::from("1")].into();
let b: &'static str = "2";
let actual = assert_contains_as_result!(a, b);
let message = concat!(
"assertion failed: `assert_contains!(container, containee)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_contains.html\n",
" container label: `a`,\n",
" container debug: `{\"1\"}`,\n",
" containee label: `b`,\n",
" containee debug: `\"2\"`"
);
assert_eq!(actual.unwrap_err(), message);
}
}
}
#[macro_export]
macro_rules! assert_contains {
($container:expr, $containee:expr $(,)?) => {
match $crate::assert_contains_as_result!($container, $containee) {
Ok(()) => (),
Err(err) => panic!("{}", err),
}
};
($container:expr, $containee:expr, $($message:tt)+) => {
match $crate::assert_contains_as_result!($container, $containee) {
Ok(()) => (),
Err(err) => panic!("{}\n{}", format_args!($($message)+), err),
}
};
}
#[cfg(test)]
mod test_assert_contains {
use std::panic;
mod str {
use super::*;
#[test]
fn success() {
let a: &'static str = "alfa";
let b: &'static str = "lf";
for _ in 0..1 {
let actual = assert_contains!(a, b);
let expect = ();
assert_eq!(actual, expect);
}
}
#[test]
fn failure() {
let a: &'static str = "alfa";
let b: &'static str = "xx";
let result = panic::catch_unwind(|| {
let _actual = assert_contains!(a, b);
});
let message = concat!(
"assertion failed: `assert_contains!(container, containee)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_contains.html\n",
" container label: `a`,\n",
" container debug: `\"alfa\"`,\n",
" containee label: `b`,\n",
" containee debug: `\"xx\"`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}
mod range_i32 {
use super::*;
use std::ops::Range;
#[test]
fn success() {
let a: Range<i32> = 1..3;
let b: i32 = 2;
for _ in 0..1 {
let actual = assert_contains!(a, &b);
let expect = ();
assert_eq!(actual, expect);
}
}
#[test]
fn failure() {
let a: Range<i32> = 1..3;
let b: i32 = 4;
let result = panic::catch_unwind(|| {
let _actual = assert_contains!(a, &b);
});
let message = concat!(
"assertion failed: `assert_contains!(container, containee)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_contains.html\n",
" container label: `a`,\n",
" container debug: `1..3`,\n",
" containee label: `&b`,\n",
" containee debug: `4`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}
mod range_string {
use super::*;
use std::ops::Range;
#[test]
fn success() {
let a: Range<String> = String::from("1")..String::from("3");
let b: String = String::from("2");
for _ in 0..1 {
let actual = assert_contains!(a, &b);
let expect = ();
assert_eq!(actual, expect);
}
}
#[test]
fn failure() {
let a: Range<String> = String::from("1")..String::from("3");
let b: String = String::from("4");
let result = panic::catch_unwind(|| {
let _actual = assert_contains!(a, &b);
});
let message = concat!(
"assertion failed: `assert_contains!(container, containee)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_contains.html\n",
" container label: `a`,\n",
" container debug: `\"1\"..\"3\"`,\n",
" containee label: `&b`,\n",
" containee debug: `\"4\"`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}
mod vec_i32 {
use super::*;
#[test]
fn success() {
let a: Vec<i32> = vec![1, 2, 3];
let b: i32 = 2;
for _ in 0..1 {
let actual = assert_contains!(a, &b);
let expect = ();
assert_eq!(actual, expect);
}
}
#[test]
fn failure() {
let a: Vec<i32> = vec![1, 2, 3];
let b: i32 = 4;
let result = panic::catch_unwind(|| {
let _actual = assert_contains!(a, &b);
});
let message = concat!(
"assertion failed: `assert_contains!(container, containee)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_contains.html\n",
" container label: `a`,\n",
" container debug: `[1, 2, 3]`,\n",
" containee label: `&b`,\n",
" containee debug: `4`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}
mod vec_string {
use super::*;
#[test]
fn success() {
let a: Vec<String> = vec![String::from("1"), String::from("2"), String::from("3")];
let b: String = String::from("2");
for _ in 0..1 {
let actual = assert_contains!(a, &b);
let expect = ();
assert_eq!(actual, expect);
}
}
#[test]
fn failure() {
let a = vec![String::from("1"), String::from("2"), String::from("3")];
let b: String = String::from("4");
let result = panic::catch_unwind(|| {
let _actual = assert_contains!(a, &b);
});
let message = concat!(
"assertion failed: `assert_contains!(container, containee)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_contains.html\n",
" container label: `a`,\n",
" container debug: `[\"1\", \"2\", \"3\"]`,\n",
" containee label: `&b`,\n",
" containee debug: `\"4\"`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}
mod hashset_string {
use super::*;
use std::collections::HashSet;
#[test]
fn success() {
let a: HashSet<String> = [String::from("1")].into();
let b: String = String::from("1");
for _ in 0..1 {
let actual = assert_contains!(a, &b);
let expect = ();
assert_eq!(actual, expect);
}
}
#[test]
fn failure() {
let a: HashSet<String> = [String::from("1")].into();
let b: String = String::from("2");
let result = panic::catch_unwind(|| {
let _actual = assert_contains!(a, &b);
});
let message = concat!(
"assertion failed: `assert_contains!(container, containee)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_contains.html\n",
" container label: `a`,\n",
" container debug: `{\"1\"}`,\n",
" containee label: `&b`,\n",
" containee debug: `\"2\"`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}
mod hashset_string_with_str_automatic_borrow_optimization {
use super::*;
use std::collections::HashSet;
#[test]
fn success() {
let a: HashSet<String> = [String::from("1")].into();
let b: &'static str = "1";
for _ in 0..1 {
let actual = assert_contains!(a, b);
let expect = ();
assert_eq!(actual, expect);
}
}
#[test]
fn failure() {
let a: HashSet<String> = [String::from("1")].into();
let b: &'static str = "2";
let result = panic::catch_unwind(|| {
let _actual = assert_contains!(a, b);
});
let message = concat!(
"assertion failed: `assert_contains!(container, containee)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_contains.html\n",
" container label: `a`,\n",
" container debug: `{\"1\"}`,\n",
" containee label: `b`,\n",
" containee debug: `\"2\"`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}
}
#[macro_export]
macro_rules! debug_assert_contains {
($($arg:tt)*) => {
if cfg!(debug_assertions) {
$crate::assert_contains!($($arg)*);
}
};
}
#[cfg(test)]
mod test_debug_assert_contains {
use std::panic;
mod str {
use super::*;
#[test]
fn success() {
let a: &'static str = "alfa";
let b: &'static str = "lf";
for _ in 0..1 {
let _actual = debug_assert_contains!(a, b);
let _expect = ();
}
}
#[test]
fn failure() {
let a: &'static str = "alfa";
let b: &'static str = "xx";
let result = panic::catch_unwind(|| {
let _actual = debug_assert_contains!(a, b);
});
let message = concat!(
"assertion failed: `assert_contains!(container, containee)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_contains.html\n",
" container label: `a`,\n",
" container debug: `\"alfa\"`,\n",
" containee label: `b`,\n",
" containee debug: `\"xx\"`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}
mod range_i32 {
use super::*;
use std::ops::Range;
#[test]
fn success() {
let a: Range<i32> = 1..3;
let b: i32 = 2;
for _ in 0..1 {
let _actual = debug_assert_contains!(a, &b);
let _expect = ();
}
}
#[test]
fn failure() {
let a: Range<i32> = 1..3;
let b: i32 = 4;
let result = panic::catch_unwind(|| {
let _actual = debug_assert_contains!(a, &b);
});
let message = concat!(
"assertion failed: `assert_contains!(container, containee)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_contains.html\n",
" container label: `a`,\n",
" container debug: `1..3`,\n",
" containee label: `&b`,\n",
" containee debug: `4`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}
mod range_string {
use super::*;
use std::ops::Range;
#[test]
fn success() {
let a: Range<String> = String::from("1")..String::from("3");
let b: String = String::from("2");
for _ in 0..1 {
let _actual = debug_assert_contains!(a, &b);
let _expect = ();
}
}
#[test]
fn failure() {
let a: Range<String> = String::from("1")..String::from("3");
let b: String = String::from("4");
let result = panic::catch_unwind(|| {
let _actual = debug_assert_contains!(a, &b);
});
let message = concat!(
"assertion failed: `assert_contains!(container, containee)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_contains.html\n",
" container label: `a`,\n",
" container debug: `\"1\"..\"3\"`,\n",
" containee label: `&b`,\n",
" containee debug: `\"4\"`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}
mod vec_i32 {
use super::*;
#[test]
fn success() {
let a: Vec<i32> = vec![1, 2, 3];
let b: i32 = 2;
for _ in 0..1 {
let _actual = debug_assert_contains!(a, &b);
let _expect = ();
}
}
#[test]
fn failure() {
let a: Vec<i32> = vec![1, 2, 3];
let b: i32 = 4;
let result = panic::catch_unwind(|| {
let _actual = debug_assert_contains!(a, &b);
});
let message = concat!(
"assertion failed: `assert_contains!(container, containee)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_contains.html\n",
" container label: `a`,\n",
" container debug: `[1, 2, 3]`,\n",
" containee label: `&b`,\n",
" containee debug: `4`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}
mod vec_string {
use super::*;
#[test]
fn success() {
let a: Vec<String> = vec![String::from("1"), String::from("2"), String::from("3")];
let b: String = String::from("2");
for _ in 0..1 {
let _actual = debug_assert_contains!(a, &b);
let _expect = ();
}
}
#[test]
fn failure() {
let a = vec![String::from("1"), String::from("2"), String::from("3")];
let b: String = String::from("4");
let result = panic::catch_unwind(|| {
let _actual = debug_assert_contains!(a, &b);
});
let message = concat!(
"assertion failed: `assert_contains!(container, containee)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_contains.html\n",
" container label: `a`,\n",
" container debug: `[\"1\", \"2\", \"3\"]`,\n",
" containee label: `&b`,\n",
" containee debug: `\"4\"`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}
mod hashset_string {
use super::*;
use std::collections::HashSet;
#[test]
fn success() {
let a: HashSet<String> = [String::from("1")].into();
let b: String = String::from("1");
for _ in 0..1 {
let _actual = debug_assert_contains!(a, &b);
let _expect = ();
}
}
#[test]
fn failure() {
let a: HashSet<String> = [String::from("1")].into();
let b: String = String::from("2");
let result = panic::catch_unwind(|| {
let _actual = debug_assert_contains!(a, &b);
});
let message = concat!(
"assertion failed: `assert_contains!(container, containee)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_contains.html\n",
" container label: `a`,\n",
" container debug: `{\"1\"}`,\n",
" containee label: `&b`,\n",
" containee debug: `\"2\"`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}
mod hashset_string_with_str_automatic_borrow_optimization {
use super::*;
use std::collections::HashSet;
#[test]
fn success() {
let a: HashSet<String> = [String::from("1")].into();
let b: &'static str = "1";
for _ in 0..1 {
let _actual = debug_assert_contains!(a, b);
let _expect = ();
}
}
#[test]
fn failure() {
let a: HashSet<String> = [String::from("1")].into();
let b: &'static str = "2";
let result = panic::catch_unwind(|| {
let _actual = debug_assert_contains!(a, b);
});
let message = concat!(
"assertion failed: `assert_contains!(container, containee)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_contains.html\n",
" container label: `a`,\n",
" container debug: `{\"1\"}`,\n",
" containee label: `b`,\n",
" containee debug: `\"2\"`"
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}
}