use std::path::PathBuf;
use dnoise::frame::FlatFrame;
use dnoise::{FilterParams, RunContext, Stages, denoise};
use timsrust::readers::FrameReader;
fn canonical(mut pts: Vec<(u32, u32, u32)>) -> Vec<(u32, u32, u32)> {
pts.sort_unstable();
pts
}
fn flat_points(flat: &FlatFrame) -> Vec<(u32, u32, u32)> {
(0..flat.len())
.map(|j| (flat.scan[j], flat.tof[j], flat.intensity[j]))
.collect()
}
#[test]
#[ignore = "requires DNOISE_PARITY_DOTD pointing at a real .d"]
fn streaming_matches_writer() {
let input = match std::env::var("DNOISE_PARITY_DOTD") {
Ok(p) => PathBuf::from(p),
Err(_) => panic!(
"DNOISE_PARITY_DOTD unset — set it to a real .d to run the writer/streaming parity test"
),
};
let params = FilterParams::default();
let stages = Stages::default();
let out = std::env::temp_dir().join("dnoise_parity_out.d");
denoise(&input, &out, ¶ms, &stages, true).expect("writer denoise");
let ctx = RunContext::open(&input, ¶ms, &stages).expect("open streaming context");
let out_reader = FrameReader::new(&out).expect("open written .d");
for i in 0..ctx.len() {
let streamed = canonical(ctx.process(i).expect("stream frame").survivors);
match out_reader.get(i) {
Ok(frame) => {
let written = canonical(flat_points(&FlatFrame::from_frame(&frame)));
assert_eq!(
written, streamed,
"frame {i}: writer survivors differ from RunContext survivors"
);
}
Err(_) => assert!(
streamed.is_empty(),
"frame {i}: writer emitted empty but RunContext kept {} points",
streamed.len()
),
}
}
}