#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum PassMode {
All,
Any,
AtLeast(usize),
}
pub fn pass_k(passed_per_run: &[bool], mode: PassMode) -> bool {
if passed_per_run.is_empty() {
return false;
}
let n_pass = passed_per_run.iter().filter(|&&b| b).count();
match mode {
PassMode::All => n_pass == passed_per_run.len(),
PassMode::Any => n_pass > 0,
PassMode::AtLeast(k) => n_pass >= k,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn modes() {
let runs = [true, true, false, true];
assert!(!pass_k(&runs, PassMode::All));
assert!(pass_k(&runs, PassMode::Any));
assert!(pass_k(&runs, PassMode::AtLeast(3)));
assert!(!pass_k(&runs, PassMode::AtLeast(4)));
assert!(pass_k(&[true, true, true], PassMode::All));
assert!(!pass_k(&[], PassMode::Any));
}
}