Files
cdrustanoia/crates/cli/tests/e2e.rs
T
2026-11-04 08:32:00 +01:00

150 lines
5.3 KiB
Rust

use cdrustanoia_core::device::samples_to_bytes;
#[test]
fn end_to_end_image_rip() {
let dir = tempfile::tempdir().unwrap();
let image = dir.path().join("disc.raw");
let out = dir.path().join("out.raw");
let sectors = 24usize;
let mut samples = Vec::with_capacity(sectors * 1176);
for i in 0..sectors * 1176 {
samples.push(((i as i32 * 7919) % 65536 - 32768) as i16);
}
std::fs::write(&image, samples_to_bytes(&samples)).unwrap();
std::env::set_var("CDRUSTANOIA_TEST_IMAGE", &image);
let argv = vec![
"cdparanoia".to_string(),
"-q".to_string(),
"-r".to_string(),
"1".to_string(),
out.to_string_lossy().into_owned(),
];
assert_eq!(cdrustanoia_cli::run(&argv), 0);
let got = std::fs::read(&out).unwrap();
assert_eq!(got, samples_to_bytes(&samples));
// Output formats and sample offsets use the same source data.
let raw_bytes = samples_to_bytes(&samples);
let wav = dir.path().join("format.wav");
let argv = vec![
"cdparanoia".to_string(),
"-q".to_string(),
"-w".to_string(),
"1".to_string(),
wav.to_string_lossy().into_owned(),
];
assert_eq!(cdrustanoia_cli::run(&argv), 0);
let wav_bytes = std::fs::read(&wav).unwrap();
assert_eq!(&wav_bytes[..4], b"RIFF");
assert_eq!(&wav_bytes[44..], raw_bytes.as_slice());
let aiff = dir.path().join("format.aiff");
let argv = vec![
"cdparanoia".to_string(),
"-q".to_string(),
"-f".to_string(),
"1".to_string(),
aiff.to_string_lossy().into_owned(),
];
assert_eq!(cdrustanoia_cli::run(&argv), 0);
let aiff_bytes = std::fs::read(&aiff).unwrap();
assert_eq!(&aiff_bytes[..4], b"FORM");
let mut big_endian = Vec::with_capacity(samples.len() * 2);
for sample in &samples {
big_endian.extend_from_slice(&sample.to_be_bytes());
}
assert_eq!(&aiff_bytes[54..], big_endian.as_slice());
let offset_out = dir.path().join("offset.raw");
let argv = vec![
"cdparanoia".to_string(),
"-q".to_string(),
"-r".to_string(),
"-O".to_string(),
"10".to_string(),
"1".to_string(),
offset_out.to_string_lossy().into_owned(),
];
assert_eq!(cdrustanoia_cli::run(&argv), 0);
let offset_bytes = std::fs::read(&offset_out).unwrap();
assert_eq!(&offset_bytes[..raw_bytes.len() - 40], &raw_bytes[40..]);
for mode in ["-Z", "-Y"] {
let out = dir
.path()
.join(format!("mode{}.raw", mode.trim_start_matches('-')));
let argv = vec![
"cdparanoia".to_string(),
"-q".to_string(),
"-r".to_string(),
mode.to_string(),
"1".to_string(),
out.to_string_lossy().into_owned(),
];
assert_eq!(cdrustanoia_cli::run(&argv), 0);
assert_eq!(std::fs::read(&out).unwrap(), raw_bytes);
}
// The compact image has no simulated cache; -A must complete cleanly.
let analyze_log = dir.path().join("analyze.log");
let analyze_argv = vec![
"cdparanoia".to_string(),
"-A".to_string(),
format!("-L{}", analyze_log.to_string_lossy()),
];
std::env::set_var("CDRUSTANOIA_TEST_IMAGE", &image);
assert_eq!(cdrustanoia_cli::run(&analyze_argv), 0);
let analyze_text = std::fs::read_to_string(&analyze_log).unwrap();
assert!(analyze_text.contains("Checking drive cache/timing behavior"));
std::env::remove_var("CDRUSTANOIA_TEST_IMAGE");
// Multi-track batch mode.
let multi = dir.path().join("multi.raw");
let mut multi_samples = Vec::new();
for i in 0..(48 * 1176) {
multi_samples.push((((i as i64 * 104729) % 65536) as i32 - 32768) as i16);
}
std::fs::write(&multi, samples_to_bytes(&multi_samples)).unwrap();
std::fs::write(dir.path().join("multi.raw.toc"), "0 23 0\n24 47 0\n").unwrap();
std::env::set_var("CDRUSTANOIA_TEST_IMAGE", &multi);
let argv = vec![
"cdparanoia".to_string(),
"-q".to_string(),
"-B".to_string(),
"1-2".to_string(),
format!("{}/", dir.path().display()),
];
assert_eq!(cdrustanoia_cli::run(&argv), 0);
let t1 = std::fs::read(dir.path().join("track01.cdda.wav")).unwrap();
let t2 = std::fs::read(dir.path().join("track02.cdda.wav")).unwrap();
assert_eq!(&t1[44..], &samples_to_bytes(&multi_samples[..24 * 1176]));
assert_eq!(&t2[44..], &samples_to_bytes(&multi_samples[24 * 1176..]));
std::env::remove_var("CDRUSTANOIA_TEST_IMAGE");
}
#[test]
fn version_output_matches_cdparanoia_shape() {
let exe = env!("CARGO_BIN_EXE_cdparanoia");
let out = std::process::Command::new(exe)
.arg("-V")
.output()
.expect("run cdparanoia -V");
assert!(out.status.success());
let expected = format!("{}\n", cdrustanoia_core::VERSION);
assert_eq!(String::from_utf8_lossy(&out.stderr), expected);
}
#[test]
fn help_starts_with_cargo_version() {
let exe = env!("CARGO_BIN_EXE_cdparanoia");
let out = std::process::Command::new(exe)
.arg("--help")
.output()
.expect("run cdparanoia --help");
assert!(out.status.success());
let text = String::from_utf8_lossy(&out.stdout);
let first = text.lines().next().unwrap_or_default();
assert_eq!(first, cdrustanoia_core::VERSION);
assert!(!text.contains("2026-11-03"));
}