blob: c4393e81b3a56a9a9a7e5e6d658de48f3592afad [file] [log] [blame]
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(),
);
}
#[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());
}