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}