use std::io::Cursor;
use ppt_rs::core::{validate_package_bytes, PackageValidationReport, ValidationCategory};
use zip::ZipArchive;
pub fn assert_package_valid(bytes: &[u8], label: &str) {
let report = validate_package_bytes(bytes);
assert_package_report_valid(&report, label);
}
pub fn assert_package_file_valid(path: &std::path::Path, label: &str) {
let bytes = std::fs::read(path).unwrap_or_else(|e| panic!("{label}: read {}: {e}", path.display()));
assert_package_valid(&bytes, label);
}
pub fn assert_package_report_valid(report: &PackageValidationReport, label: &str) {
if report.is_valid() {
return;
}
let errors: Vec<_> = report
.issues
.iter()
.filter(|i| i.severity == ppt_rs::core::ValidationSeverity::Error)
.map(|i| format!("{:?}: {}", i.category, i.message))
.collect();
panic!("{label} failed package validation:\n - {}", errors.join("\n - "));
}
pub fn list_parts(bytes: &[u8]) -> Vec<String> {
let cursor = Cursor::new(bytes);
let mut archive = ZipArchive::new(cursor).expect("valid zip");
let mut names = Vec::new();
for i in 0..archive.len() {
if let Ok(f) = archive.by_index(i) {
if !f.is_dir() {
names.push(f.name().to_string());
}
}
}
names.sort();
names
}
pub fn issues_in_category<'a>(
report: &'a PackageValidationReport,
category: ValidationCategory,
) -> Vec<&'a ppt_rs::core::PackageValidationIssue> {
report.issues_in_category(category).collect()
}