use crate::Assert;
const DEFAULT_ERROR: &str = "-";
pub struct Multiple<T: Assert> {
asserts: Vec<T>,
}
impl<T: Assert> Multiple<T> {
pub fn new(iterator: impl Iterator<Item = T>) -> Self {
Self {
asserts: iterator.collect(),
}
}
}
impl<T: Assert> Assert for Multiple<T> {
fn success(&self) -> bool {
self.asserts.iter().all(Assert::success)
}
fn error_message(&self) -> String {
let index = self.asserts.iter().position(|assert| !assert.success());
if let Some(failed_assert_index) = index {
self.asserts[failed_assert_index].error_message()
} else {
DEFAULT_ERROR.into()
}
}
}
#[cfg(test)]
mod tests {
use crate::asserts::assert::Assert;
use crate::{Equal, Multiple, NotEqual};
#[test]
fn test_all_ok() {
let assert = Multiple::new((0..10).map(|i| NotEqual::new(i, 11)));
assert!(assert.success())
}
#[test]
fn test_one_fail() {
let assert = Multiple::new((0..10).map(|i| NotEqual::new(i, 7)));
assert!(!assert.success())
}
#[test]
fn test_all_fail() {
let assert = Multiple::new((0..10).map(|i| Equal::new(i, 11)));
assert!(!assert.success())
}
}