You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
2.7 KiB
115 lines
2.7 KiB
#![allow(clippy::wildcard_imports)]
|
|
|
|
mod common;
|
|
mod drop;
|
|
|
|
use self::common::*;
|
|
use self::drop::{DetectDrop, Flag};
|
|
use anyhow::Error;
|
|
use std::error::Error as StdError;
|
|
use std::fmt::{self, Display};
|
|
use std::io;
|
|
|
|
#[test]
|
|
fn test_downcast() {
|
|
assert_eq!(
|
|
"oh no!",
|
|
bail_literal().unwrap_err().downcast::<&str>().unwrap(),
|
|
);
|
|
assert_eq!(
|
|
"oh no!",
|
|
bail_fmt().unwrap_err().downcast::<String>().unwrap(),
|
|
);
|
|
assert_eq!(
|
|
"oh no!",
|
|
bail_error()
|
|
.unwrap_err()
|
|
.downcast::<io::Error>()
|
|
.unwrap()
|
|
.to_string(),
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn test_downcast_ref() {
|
|
assert_eq!(
|
|
"oh no!",
|
|
*bail_literal().unwrap_err().downcast_ref::<&str>().unwrap(),
|
|
);
|
|
assert_eq!(
|
|
"oh no!",
|
|
bail_fmt().unwrap_err().downcast_ref::<String>().unwrap(),
|
|
);
|
|
assert_eq!(
|
|
"oh no!",
|
|
bail_error()
|
|
.unwrap_err()
|
|
.downcast_ref::<io::Error>()
|
|
.unwrap()
|
|
.to_string(),
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn test_downcast_mut() {
|
|
assert_eq!(
|
|
"oh no!",
|
|
*bail_literal().unwrap_err().downcast_mut::<&str>().unwrap(),
|
|
);
|
|
assert_eq!(
|
|
"oh no!",
|
|
bail_fmt().unwrap_err().downcast_mut::<String>().unwrap(),
|
|
);
|
|
assert_eq!(
|
|
"oh no!",
|
|
bail_error()
|
|
.unwrap_err()
|
|
.downcast_mut::<io::Error>()
|
|
.unwrap()
|
|
.to_string(),
|
|
);
|
|
|
|
let mut bailed = bail_fmt().unwrap_err();
|
|
*bailed.downcast_mut::<String>().unwrap() = "clobber".to_string();
|
|
assert_eq!(bailed.downcast_ref::<String>().unwrap(), "clobber");
|
|
assert_eq!(bailed.downcast_mut::<String>().unwrap(), "clobber");
|
|
assert_eq!(bailed.downcast::<String>().unwrap(), "clobber");
|
|
}
|
|
|
|
#[test]
|
|
fn test_drop() {
|
|
let has_dropped = Flag::new();
|
|
let error = Error::new(DetectDrop::new(&has_dropped));
|
|
drop(error.downcast::<DetectDrop>().unwrap());
|
|
assert!(has_dropped.get());
|
|
}
|
|
|
|
#[test]
|
|
fn test_large_alignment() {
|
|
#[repr(align(64))]
|
|
#[derive(Debug)]
|
|
struct LargeAlignedError(&'static str);
|
|
|
|
impl Display for LargeAlignedError {
|
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
f.write_str(self.0)
|
|
}
|
|
}
|
|
|
|
impl StdError for LargeAlignedError {}
|
|
|
|
let error = Error::new(LargeAlignedError("oh no!"));
|
|
assert_eq!(
|
|
"oh no!",
|
|
error.downcast_ref::<LargeAlignedError>().unwrap().0
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn test_unsuccessful_downcast() {
|
|
let mut error = bail_error().unwrap_err();
|
|
assert!(error.downcast_ref::<&str>().is_none());
|
|
assert!(error.downcast_mut::<&str>().is_none());
|
|
assert!(error.downcast::<&str>().is_err());
|
|
}
|