assertions.rs

 1pub enum SetEqError<T> {
 2    LeftMissing(T),
 3    RightMissing(T),
 4}
 5
 6impl<T> SetEqError<T> {
 7    pub fn map<R, F: FnOnce(T) -> R>(self, update: F) -> SetEqError<R> {
 8        match self {
 9            SetEqError::LeftMissing(missing) => SetEqError::LeftMissing(update(missing)),
10            SetEqError::RightMissing(missing) => SetEqError::RightMissing(update(missing)),
11        }
12    }
13}
14
15#[macro_export]
16macro_rules! set_eq {
17    ($left:expr,$right:expr) => {{
18        use util::test::*;
19
20        let left = $left;
21        let right = $right;
22
23        let mut result = Ok(());
24        for right_value in right.iter() {
25            if !left.contains(right_value) {
26                result = Err(SetEqError::LeftMissing(right_value.clone()));
27                break;
28            }
29        }
30
31        if result.is_ok() {
32            for left_value in left.iter() {
33                if !right.contains(left_value) {
34                    result = Err(SetEqError::RightMissing(left_value.clone()));
35                }
36            }
37        }
38
39        result
40    }};
41}
42
43#[macro_export]
44macro_rules! assert_set_eq {
45    ($left:expr,$right:expr) => {{
46        use util::test::*;
47        use util::set_eq;
48
49        let left = $left;
50        let right = $right;
51
52        match set_eq!(&left, &right) {
53            Err(SetEqError::LeftMissing(missing)) => {
54                panic!("assertion failed: `(left == right)`\n left: {:?}\nright: {:?}\nleft does not contain {:?}", &left, &right, &missing);
55            },
56            Err(SetEqError::RightMissing(missing)) => {
57                panic!("assertion failed: `(left == right)`\n left: {:?}\nright: {:?}\nright does not contain {:?}", &left, &right, &missing);
58            },
59            _ => {}
60        }
61    }};
62}