use crate::spec::law::{AlgebraicLaw, LawViolation};
#[cfg(not(loom))]
use rayon::prelude::*;
use super::support::{check_unary_law_exhaustive_u8, check_unary_law_witnessed_u32};
use super::rebuild::{minimize_binary_violation, minimize_unary_violation};
use super::{check_binary_law_exhaustive_u8, LawResult, VerificationLevel};
fn verify_one_law_exhaustive(
op_id: &str,
cpu_fn: fn(&[u8]) -> Vec<u8>,
law: &AlgebraicLaw,
is_binary: bool,
) -> LawResult {
let (cases, violation) = if is_binary {
check_binary_law_exhaustive_u8(op_id, cpu_fn, law)
} else {
check_unary_law_exhaustive_u8(op_id, cpu_fn, law)
};
let violation = violation.map(|v| {
if is_binary {
match minimize_binary_violation(op_id, cpu_fn, law, v.a, v.b, v.c) {
Ok(minimized) => minimized.unwrap_or(v),
Err(rebuild_err) => rebuild_err,
}
} else {
match minimize_unary_violation(op_id, cpu_fn, law, v.a) {
Ok(minimized) => minimized.unwrap_or(v),
Err(rebuild_err) => rebuild_err,
}
}
});
LawResult {
op_id: op_id.to_string(),
law_name: law.name().to_string(),
level: VerificationLevel::ExhaustiveU8,
cases_tested: cases,
violation,
}
}