use crate::validation::ValidationError;
pub fn compare_test_results(
actual: &Result<(), Vec<ValidationError>>,
expected: &Result<(), Vec<ValidationError>>,
csaf_version: &str,
test_id: &str,
case_num: &str,
) -> Result<(), String> {
match (actual, expected) {
(Ok(()), Ok(())) => {
Ok(())
},
(Err(actual_errs), Err(expected_errs)) => {
let mut errors: Vec<String> = Vec::new();
if actual_errs.len() != expected_errs.len() {
errors.push(format!(
"CSAF {csaf_version}: Test {test_id} case {case_num}: Error count mismatch - expected {} error(s) but got {}",
expected_errs.len(),
actual_errs.len()
));
}
for expected_err in expected_errs {
if !actual_errs.iter().any(|actual_err| {
actual_err.message == expected_err.message && actual_err.instance_path == expected_err.instance_path
}) {
errors.push(format!(
"CSAF {csaf_version}: Test {test_id} case {case_num}: Expected error not found: '{}', path: '{}'",
expected_err.message, expected_err.instance_path
));
}
}
for actual_err in actual_errs {
if !expected_errs.iter().any(|expected_err| {
expected_err.message == actual_err.message && expected_err.instance_path == actual_err.instance_path
}) {
errors.push(format!(
"CSAF {csaf_version}: Test {test_id} case {case_num}: Found not expected error: '{}', path: '{}'",
actual_err.message, actual_err.instance_path
));
}
}
if errors.is_empty() {
Ok(())
} else {
Err(errors.join("\n"))
}
},
(Ok(()), Err(expected_errors)) => {
let mut errors: Vec<String> = Vec::new();
errors.push(format!(
"CSAF {csaf_version}: Test {test_id} case {case_num}: Expected failure but validation passed."
));
for err in expected_errors {
errors.push(format!(
"CSAF {csaf_version}: Test {test_id} case {case_num}: Expected error: '{}', path: '{}'",
err.message, err.instance_path
));
}
Err(errors.join("\n"))
},
(Err(actual_errs), Ok(())) => {
let mut errors: Vec<String> = Vec::new();
errors.push(format!(
"CSAF {csaf_version}: Test {test_id} case {case_num}: Expected success but validation failed with {} error(s).",
actual_errs.len()
));
for err in actual_errs {
errors.push(format!(
"CSAF {csaf_version}: Test {test_id} case {case_num}: Not expected error: '{}', path: '{}'",
err.message, err.instance_path
));
}
Err(errors.join("\n"))
},
}
}