use std::fmt;
use crate::core::{style, Matcher};
use crate::matchers::collections::MatchElementsMatcher;
use super::{HeaderFormat, SomeFailuresFormat};
pub fn match_elements<'a, PosOut, NegOut, IntoIter>(
matchers: impl IntoIterator<Item = Matcher<'a, IntoIter::Item, PosOut, NegOut>> + 'a,
) -> Matcher<'a, IntoIter, Vec<PosOut>, Vec<NegOut>>
where
IntoIter: fmt::Debug + IntoIterator + 'a,
PosOut: 'a,
NegOut: 'a,
{
Matcher::transform(
MatchElementsMatcher::new(matchers),
HeaderFormat::new(
SomeFailuresFormat::new(),
style::ALL_OK_HEADER,
style::AT_LESAT_ONE_OK_HEADER,
),
)
}
#[cfg(test)]
mod tests {
use crate::{equal, expect, match_elements};
#[test]
fn succeeds_when_all_elements_succeed() {
expect!(["a", "b"]).to(match_elements([equal("a"), equal("b")]));
}
#[test]
fn succeeds_when_some_elements_fail() {
expect!(["a", "b"]).to_not(match_elements([equal("a"), equal("c")]));
}
#[test]
#[should_panic]
fn fails_when_all_elements_succeed() {
expect!(["a", "b"]).to_not(match_elements([equal("a"), equal("b")]));
}
#[test]
#[should_panic]
fn fails_when_some_elements_fail() {
expect!(["a", "b"]).to(match_elements([equal("a"), equal("c")]));
}
}