xsd_schema/xpath/
quantified.rs1use super::boolean::effective_boolean_value;
8use super::error::XPathError;
9use crate::types::value::XmlValue;
10
11pub fn some(values: &[XmlValue]) -> Result<bool, XPathError> {
24 for value in values {
25 if effective_boolean_value(value)? {
26 return Ok(true);
27 }
28 }
29 Ok(false)
30}
31
32pub fn every(values: &[XmlValue]) -> Result<bool, XPathError> {
45 for value in values {
46 if !effective_boolean_value(value)? {
47 return Ok(false);
48 }
49 }
50 Ok(true)
51}
52
53pub fn some_with<F>(values: &[XmlValue], predicate: F) -> bool
66where
67 F: FnMut(&XmlValue) -> bool,
68{
69 values.iter().any(predicate)
70}
71
72pub fn every_with<F>(values: &[XmlValue], predicate: F) -> bool
85where
86 F: FnMut(&XmlValue) -> bool,
87{
88 values.iter().all(predicate)
89}
90
91pub fn some_true(values: &[bool]) -> bool {
95 values.iter().any(|&v| v)
96}
97
98pub fn every_true(values: &[bool]) -> bool {
102 values.iter().all(|&v| v)
103}
104
105#[cfg(test)]
106mod tests {
107 use super::*;
108
109 #[test]
110 fn test_some_with_true_values() {
111 let values = vec![
112 XmlValue::boolean(false),
113 XmlValue::boolean(true),
114 XmlValue::boolean(false),
115 ];
116 assert!(some(&values).unwrap());
117 }
118
119 #[test]
120 fn test_some_with_all_false() {
121 let values = vec![XmlValue::boolean(false), XmlValue::boolean(false)];
122 assert!(!some(&values).unwrap());
123 }
124
125 #[test]
126 fn test_some_empty_sequence() {
127 let values: Vec<XmlValue> = vec![];
128 assert!(!some(&values).unwrap());
129 }
130
131 #[test]
132 fn test_every_with_all_true() {
133 let values = vec![XmlValue::boolean(true), XmlValue::boolean(true)];
134 assert!(every(&values).unwrap());
135 }
136
137 #[test]
138 fn test_every_with_some_false() {
139 let values = vec![
140 XmlValue::boolean(true),
141 XmlValue::boolean(false),
142 XmlValue::boolean(true),
143 ];
144 assert!(!every(&values).unwrap());
145 }
146
147 #[test]
148 fn test_every_empty_sequence() {
149 let values: Vec<XmlValue> = vec![];
151 assert!(every(&values).unwrap());
152 }
153
154 #[test]
155 fn test_some_with_strings() {
156 let values = vec![XmlValue::string(""), XmlValue::string("hello")];
158 assert!(some(&values).unwrap());
159 }
160
161 #[test]
162 fn test_every_with_strings() {
163 let values = vec![XmlValue::string("a"), XmlValue::string("b")];
165 assert!(every(&values).unwrap());
166
167 let values = vec![XmlValue::string("a"), XmlValue::string("")];
169 assert!(!every(&values).unwrap());
170 }
171
172 #[test]
173 fn test_some_with_predicate() {
174 let values = vec![
175 XmlValue::string("apple"),
176 XmlValue::string("banana"),
177 XmlValue::string("cherry"),
178 ];
179 assert!(some_with(&values, |v| v.to_string_value().starts_with('b')));
180 assert!(!some_with(&values, |v| v
181 .to_string_value()
182 .starts_with('z')));
183 }
184
185 #[test]
186 fn test_every_with_predicate() {
187 let values = vec![
188 XmlValue::string("apple"),
189 XmlValue::string("avocado"),
190 XmlValue::string("apricot"),
191 ];
192 assert!(every_with(&values, |v| v
193 .to_string_value()
194 .starts_with('a')));
195 assert!(!every_with(&values, |v| v.to_string_value().len() == 5));
196 }
197
198 #[test]
199 fn test_some_true_bool_slice() {
200 assert!(some_true(&[false, true, false]));
201 assert!(!some_true(&[false, false]));
202 assert!(!some_true(&[]));
203 }
204
205 #[test]
206 fn test_every_true_bool_slice() {
207 assert!(every_true(&[true, true, true]));
208 assert!(!every_true(&[true, false, true]));
209 assert!(every_true(&[])); }
211}