lets_expect_assertions/
iterator.rs

1use std::slice::Iter;
2
3use lets_expect_core::assertions::{
4    assertion_error::AssertionError, assertion_result::AssertionResult,
5};
6
7pub fn all<R>(
8    assertion: impl Fn(&R) -> AssertionResult,
9) -> impl FnOnce(&mut Iter<R>) -> AssertionResult {
10    move |iter| {
11        let results: Vec<AssertionResult> = iter.map(assertion).collect();
12
13        if results.iter().all(|result| result.is_ok()) {
14            Ok(())
15        } else {
16            let mut errors = vec![];
17            for result in results {
18                if let Err(err) = result {
19                    errors.push(err.message.join(" "));
20                }
21            }
22            Err(AssertionError::new(errors))
23        }
24    }
25}
26
27pub fn any<R>(
28    assertion: impl Fn(&R) -> AssertionResult,
29) -> impl FnOnce(&mut dyn Iterator<Item = &R>) -> AssertionResult {
30    move |iter| {
31        let results: Vec<AssertionResult> = iter.map(assertion).collect();
32
33        if results.iter().any(|result| result.is_ok()) {
34            Ok(())
35        } else {
36            let mut errors = vec![];
37            for result in results {
38                if let Err(err) = result {
39                    errors.push(err.message.join(" "));
40                }
41            }
42            Err(AssertionError::new(errors))
43        }
44    }
45}
46
47#[cfg(test)]
48mod tests {
49    use super::*;
50
51    #[test]
52    fn test_all_ones() {
53        assert!(all(|&x| if x == 1 {
54            Ok(())
55        } else {
56            Err(AssertionError::new(vec!["err".to_string()]))
57        })(&mut vec![1, 1, 1].iter())
58        .is_ok());
59    }
60
61    #[test]
62    fn test_not_all_ones() {
63        assert!(all(|&x| if x == 1 {
64            Ok(())
65        } else {
66            Err(AssertionError::new(vec!["err".to_string()]))
67        })(&mut vec![1, 2, 1].iter())
68        .is_err());
69    }
70
71    #[test]
72    fn test_any_success() {
73        assert!(any(|&x| if x == 1 {
74            Ok(())
75        } else {
76            Err(AssertionError::new(vec!["err".to_string()]))
77        })(&mut vec![1, 0, 0].iter())
78        .is_ok());
79    }
80
81    #[test]
82    fn test_any_failure() {
83        assert!(any(|&x| if x == 1 {
84            Ok(())
85        } else {
86            Err(AssertionError::new(vec!["err".to_string()]))
87        })(&mut vec![0, 0, 0].iter())
88        .is_ok());
89    }
90}