use super::boolean::effective_boolean_value;
use super::error::XPathError;
use crate::types::value::XmlValue;
pub fn some(values: &[XmlValue]) -> Result<bool, XPathError> {
for value in values {
if effective_boolean_value(value)? {
return Ok(true);
}
}
Ok(false)
}
pub fn every(values: &[XmlValue]) -> Result<bool, XPathError> {
for value in values {
if !effective_boolean_value(value)? {
return Ok(false);
}
}
Ok(true)
}
pub fn some_with<F>(values: &[XmlValue], predicate: F) -> bool
where
F: FnMut(&XmlValue) -> bool,
{
values.iter().any(predicate)
}
pub fn every_with<F>(values: &[XmlValue], predicate: F) -> bool
where
F: FnMut(&XmlValue) -> bool,
{
values.iter().all(predicate)
}
pub fn some_true(values: &[bool]) -> bool {
values.iter().any(|&v| v)
}
pub fn every_true(values: &[bool]) -> bool {
values.iter().all(|&v| v)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_some_with_true_values() {
let values = vec![
XmlValue::boolean(false),
XmlValue::boolean(true),
XmlValue::boolean(false),
];
assert!(some(&values).unwrap());
}
#[test]
fn test_some_with_all_false() {
let values = vec![XmlValue::boolean(false), XmlValue::boolean(false)];
assert!(!some(&values).unwrap());
}
#[test]
fn test_some_empty_sequence() {
let values: Vec<XmlValue> = vec![];
assert!(!some(&values).unwrap());
}
#[test]
fn test_every_with_all_true() {
let values = vec![XmlValue::boolean(true), XmlValue::boolean(true)];
assert!(every(&values).unwrap());
}
#[test]
fn test_every_with_some_false() {
let values = vec![
XmlValue::boolean(true),
XmlValue::boolean(false),
XmlValue::boolean(true),
];
assert!(!every(&values).unwrap());
}
#[test]
fn test_every_empty_sequence() {
let values: Vec<XmlValue> = vec![];
assert!(every(&values).unwrap());
}
#[test]
fn test_some_with_strings() {
let values = vec![XmlValue::string(""), XmlValue::string("hello")];
assert!(some(&values).unwrap());
}
#[test]
fn test_every_with_strings() {
let values = vec![XmlValue::string("a"), XmlValue::string("b")];
assert!(every(&values).unwrap());
let values = vec![XmlValue::string("a"), XmlValue::string("")];
assert!(!every(&values).unwrap());
}
#[test]
fn test_some_with_predicate() {
let values = vec![
XmlValue::string("apple"),
XmlValue::string("banana"),
XmlValue::string("cherry"),
];
assert!(some_with(&values, |v| v.to_string_value().starts_with('b')));
assert!(!some_with(&values, |v| v
.to_string_value()
.starts_with('z')));
}
#[test]
fn test_every_with_predicate() {
let values = vec![
XmlValue::string("apple"),
XmlValue::string("avocado"),
XmlValue::string("apricot"),
];
assert!(every_with(&values, |v| v
.to_string_value()
.starts_with('a')));
assert!(!every_with(&values, |v| v.to_string_value().len() == 5));
}
#[test]
fn test_some_true_bool_slice() {
assert!(some_true(&[false, true, false]));
assert!(!some_true(&[false, false]));
assert!(!some_true(&[]));
}
#[test]
fn test_every_true_bool_slice() {
assert!(every_true(&[true, true, true]));
assert!(!every_true(&[true, false, true]));
assert!(every_true(&[])); }
}