use super::{Directive, Intent};
use crate::model::{Expectation, Mutant, Outcome, Suppression};
pub fn suppress(mutants: &mut [Mutant], found: &[Directive]) -> usize {
let mut count = 0;
for mutant in mutants.iter_mut() {
let Some(directive) = found
.iter()
.filter(|directive| directive.intent == Some(Intent::Skip))
.find(|directive| directive.governs(mutant))
else {
continue;
};
mutant.outcome = Outcome::Ignored;
mutant.suppression = Some(Suppression {
channel: directive.channel,
reason: directive.reason.clone(),
tag: directive.tag.clone(),
line: Some(directive.line),
});
count += 1;
}
for mutant in mutants.iter_mut() {
let expecting = found
.iter()
.filter(|directive| matches!(directive.intent, Some(Intent::ExpectKilled | Intent::ExpectSurvived)))
.find(|directive| directive.governs(mutant));
if let Some(directive) = expecting {
mutant.expectation = Some(Expectation {
killed: directive.intent == Some(Intent::ExpectKilled),
line: directive.line,
reason: directive.reason.clone(),
});
}
}
for mutant in mutants.iter_mut() {
let timing = found
.iter()
.filter(|directive| directive.test_timeout_multiplier.is_some())
.find(|directive| directive.governs(mutant));
if let Some(directive) = timing {
mutant.test_timeout_multiplier = directive.test_timeout_multiplier;
}
}
count
}