lets_expect_assertions/
iterator.rs1use 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}