1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
use std::cmp::PartialEq; use std::fmt::Debug; use std::{panic::{catch_unwind, UnwindSafe, set_hook, take_hook}}; pub struct Expect<T> where T: PartialEq + Debug, { pub result: T } impl<T> Expect<T> where T: PartialEq + Debug, { pub fn new(expect: T) -> Expect<T> { Expect { result: expect } } pub fn expect(result: T) -> Expect<T> { Expect { result } } pub fn equals(&self, control: T) -> Result<(), String> { if self.result == control { Ok(()) } else { Err(format!("Expected {:#?} to equal {:#?}", self.result, control)) } } pub fn to_equal(&self, control: T) -> Result<(), String> { self.equals(control) } pub fn to_be(&self, control: T) -> Result<(), String> { if self.result == control { Ok(()) } else { Err(format!("Expected {:#?} to be {:#?}", self.result, control)) } } pub fn to_not_equal(&self, control: T) -> Result<(), String> { if self.result != control { Ok(()) } else { Err(format!("Expected {:#?} not to equal {:#?}", self.result, control)) } } pub fn to_not_be(&self, control: T) -> Result<(), String> { if self.result != control { Ok(()) } else { Err(format!("Expected {:#?} not to be {:#?}", self.result, control)) } } } pub fn expect<T>(result: T) -> Expect<T> where T: PartialEq + Debug { Expect::new(result) } pub fn should_panic<T: FnOnce() + UnwindSafe>(closure: T) -> Result<(), String> { set_hook(Box::new(|_| {})); let result = catch_unwind(|| { (closure)() }); let _ = take_hook(); if result.is_ok() { Err("Expected to panic".to_string()) } else { Ok(()) } } pub fn should_not_panic<T: FnOnce() + UnwindSafe>(closure: T) -> Result<(), String> { set_hook(Box::new(|_| {})); let result = catch_unwind(|| { (closure)() }); let _ = take_hook(); if result.is_ok() { Ok(()) } else { Err("Expected not to panic".to_string()) } }