mithril_common/test/assert/
iters_equivalent.rs

1/// Compare two iterators ignoring the order
2pub fn equivalent_to<T, I1, I2>(a: I1, b: I2) -> bool
3where
4    T: PartialEq + Ord,
5    I1: IntoIterator<Item = T> + Clone,
6    I2: IntoIterator<Item = T> + Clone,
7{
8    let a = as_sorted_vec(a);
9    let b = as_sorted_vec(b);
10    a == b
11}
12
13/// Assert that two iterators are equivalent
14#[macro_export]
15macro_rules! assert_equivalent {
16    ($expected:expr, $actual:expr $(,)?) => {{
17        let expected = $expected;
18        let actual = $actual;
19        assert_eq!(
20            $crate::test::as_sorted_vec(expected),
21            $crate::test::as_sorted_vec(actual)
22        );
23    }};
24}
25pub use assert_equivalent;
26
27/// Create a sorted clone of an iterable.
28pub fn as_sorted_vec<T: Ord, I: IntoIterator<Item = T> + Clone>(iter: I) -> Vec<T> {
29    let mut list: Vec<T> = iter.clone().into_iter().collect();
30    list.sort();
31    list
32}
33
34#[cfg(test)]
35mod tests {
36    use std::collections::HashSet;
37
38    use super::*;
39
40    #[test]
41    fn test_equivalent_to() {
42        assert!(equivalent_to(vec![1, 2, 3], vec![3, 2, 1]));
43        assert!(equivalent_to(vec![1, 2, 3], vec![2, 1, 3]));
44        assert!(!equivalent_to(vec![1, 2, 3], vec![3, 2, 1, 4]));
45        assert!(!equivalent_to(vec![1, 2, 3], vec![3, 2]));
46
47        assert!(equivalent_to([1, 2, 3], vec![3, 2, 1]));
48        assert!(equivalent_to(&[1, 2, 3], &vec![3, 2, 1]));
49        assert!(equivalent_to([1, 2, 3], HashSet::from([3, 2, 1])));
50        assert!(equivalent_to(vec![1, 2, 3], HashSet::from([3, 2, 1])));
51        assert!(equivalent_to(&vec![1, 2, 3], &HashSet::from([3, 2, 1])));
52
53        assert_equivalent!(vec![1, 2, 3], vec![3, 2, 1]);
54        assert_equivalent!(vec![1, 2, 3], vec![2, 1, 3]);
55
56        assert_equivalent!([1, 2, 3], vec![3, 2, 1]);
57        assert_equivalent!(&[1, 2, 3], &vec![3, 2, 1]);
58        assert_equivalent!([1, 2, 3], HashSet::from([3, 2, 1]));
59        assert_equivalent!(vec![1, 2, 3], HashSet::from([3, 2, 1]));
60        assert_equivalent!(&vec![1, 2, 3], &HashSet::from([3, 2, 1]));
61    }
62}