use std::path::PathBuf; use std::process::Command; use tempfile::tempdir; use vid_repair_core::config::Config; use vid_repair_core::rules::RuleSet; use vid_repair_core::scan::scan_file; fn command_available(cmd: &str) -> bool { Command::new(cmd) .arg("-version") .output() .map(|out| out.status.success()) .unwrap_or(false) } fn ruleset_dir() -> PathBuf { let manifest_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")); manifest_dir .parent() .expect("workspace root") .join("rulesets") } #[test] fn scan_clean_fixture_has_no_issues() { if !command_available("ffmpeg") || !command_available("ffprobe") { eprintln!("ffmpeg/ffprobe not available; skipping fixture test"); return; } let dir = tempdir().expect("tempdir"); let output = dir.path().join("clean.mp4"); let status = Command::new("ffmpeg") .args([ "-y", "-hide_banner", "-loglevel", "error", "-f", "lavfi", "-i", "testsrc=size=128x72:rate=30", "-f", "lavfi", "-i", "sine=frequency=1000:sample_rate=44100", "-t", "1", "-c:v", "libx264", "-pix_fmt", "yuv420p", "-c:a", "aac", "-movflags", "+faststart", output.to_str().unwrap(), ]) .status() .expect("ffmpeg run"); if !status.success() { eprintln!("ffmpeg failed to create fixture"); return; } let config = Config::default(); let ruleset = RuleSet::load_from_dir(&ruleset_dir()).expect("ruleset load"); let scan = scan_file(&output, &config, &ruleset).expect("scan file"); assert!(scan.issues.is_empty(), "Expected no issues, got {}", scan.issues.len()); }