sixarm_assert/
assert_set_eq.rs

1/// Asserts that two sets are equal to each other.
2///
3/// This implementation uses [`HashSet`] and [`assert_eq!`].
4///
5/// On panic, this macro will print the values of the expressions with their
6/// debug representations.
7///
8/// Like [`assert_eq!`], this macro has a second form, where a custom
9/// panic message can be provided.
10///
11/// # Examples
12///
13/// ```
14/// # #[macro_use] extern crate sixarm_assert; fn main() {
15/// let a = vec![1, 2, 3];
16/// let b = vec![3, 2, 1];
17/// assert_set_eq!(a, b);
18///
19/// assert_set_eq!(a, b, "we are testing with {:#?} and {:#?}", a, b);
20/// # }
21/// ```
22#[macro_export]
23macro_rules! assert_set_eq {
24    ($left:expr, $right:expr $(,)?) => ({
25        match (&$left, &$right) {
26            (left_val, right_val) => {
27                let left_set: ::std::collections::HashSet<_> = left_val.into_iter().collect();
28                let right_set: std::collections::HashSet<_> = right_val.into_iter().collect();
29                assert_eq!(left_set, right_set);
30            }
31        }
32    });
33    ($left:expr, $right:expr, $($arg:tt)+) => ({
34        match (&($left), &($right)) {
35            (left_val, right_val) => {
36                let left_set: std::collections::HashSet<_> = left_val.into_iter().collect();
37                let right_set: std::collections::HashSet<_> = right_val.into_iter().collect();
38                assert_eq!(left_set, right_set, $($arg)+);
39            }
40        }
41    });
42}
43
44#[cfg(test)]
45mod tests {
46
47    #[test]
48    fn test_assert_set_eq_with_arity_2_return_success() {
49        assert_set_eq!(vec![1, 2], vec![1, 2]);
50    } 
51
52    #[test]
53    fn test_assert_set_eq_with_arity_3_return_success() {
54        assert_set_eq!(vec![1, 2], vec![1, 2], "message");
55    } 
56
57    #[test]
58    #[should_panic(expected = "assertion failed")]
59    fn test_assert_set_eq_with_arity_2_return_failure() {
60        assert_set_eq!(vec![1, 2], vec![3, 4]);
61    } 
62
63    #[test]
64    #[should_panic(expected = "assertion failed")]
65    fn test_assert_set_eq_with_arity_3_return_failure() {
66        assert_set_eq!(vec![1, 2], vec![3, 4], "message");
67    } 
68
69}