mithril_common/test/assert/
iters_equivalent.rs1pub 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#[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
27pub 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}