use crate::spec::law::canonical_law_id;
use crate::spec::minimums::MIN_LAWS;
use crate::spec::Verification;
use crate::OpSpec;
use super::error::CoverageError;
pub(super) fn check_laws(spec: &OpSpec, errors: &mut Vec<CoverageError>) {
if spec.laws.len() < MIN_LAWS {
errors.push(CoverageError::EmptyLawSet {
op_id: spec.id.to_string(),
});
}
}
pub(super) fn check_declared_laws(spec: &OpSpec, errors: &mut Vec<CoverageError>) {
use std::collections::HashMap;
let mut laws_ms: HashMap<String, usize> = HashMap::new();
for l in &spec.laws {
*laws_ms.entry(canonical_law_id(l)).or_insert(0) += 1;
}
let mut declared_ms: HashMap<String, usize> = HashMap::new();
for d in &spec.declared_laws {
*declared_ms.entry(canonical_law_id(&d.law)).or_insert(0) += 1;
}
if laws_ms != declared_ms {
errors.push(CoverageError::LawListDrift {
op_id: spec.id.to_string(),
});
}
for declared in &spec.declared_laws {
if let Verification::WitnessedU32 { count: 0, .. } = declared.verified_by {
errors.push(CoverageError::ZeroWitnesses {
op_id: spec.id.to_string(),
law: declared.law.name().to_string(),
});
}
}
}