From 614d93dc0047614b59179c6458e782bc00c42043 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Mon, 1 Dec 2025 10:16:38 +0100 Subject: [PATCH 1/2] Report number of non-matching diffs In addition to the first non-matching diff, the test now also reports the fixture it came from and the number of total as well as non-matching diffs. This makes the slider test more suitable as a benchmark for comparing different slider heuristics. --- gix-diff/tests/diff/blob/slider.rs | 37 ++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/gix-diff/tests/diff/blob/slider.rs b/gix-diff/tests/diff/blob/slider.rs index f152f00ffb2..fb0970a25b7 100644 --- a/gix-diff/tests/diff/blob/slider.rs +++ b/gix-diff/tests/diff/blob/slider.rs @@ -2,6 +2,7 @@ use gix_diff::blob::intern::TokenSource; use gix_diff::blob::unified_diff::ContextSize; use gix_diff::blob::{Algorithm, UnifiedDiff}; use gix_testtools::bstr::{BString, ByteVec}; +use pretty_assertions::StrComparison; #[test] fn baseline() -> gix_testtools::Result { @@ -10,7 +11,8 @@ fn baseline() -> gix_testtools::Result { let dir = std::fs::read_dir(&worktree_path)?; - let mut count = 0; + let mut diffs = Vec::new(); + for entry in dir { let entry = entry?; let file_name = entry.file_name().into_string().expect("to be string"); @@ -18,7 +20,6 @@ fn baseline() -> gix_testtools::Result { if !file_name.ends_with(".baseline") { continue; } - count += 1; let parts: Vec<_> = file_name.split('.').collect(); let [name, algorithm, ..] = parts[..] else { @@ -53,7 +54,7 @@ fn baseline() -> gix_testtools::Result { ), )?; - let baseline_path = worktree_path.join(file_name); + let baseline_path = worktree_path.join(&file_name); let baseline = std::fs::read(baseline_path)?; let baseline = baseline::Baseline::new(&baseline); @@ -80,13 +81,39 @@ fn baseline() -> gix_testtools::Result { }) .to_string(); - pretty_assertions::assert_eq!(actual, baseline); + let actual_matches_baseline = actual == baseline; + diffs.push((actual, baseline, actual_matches_baseline, file_name)); } - if count == 0 { + if diffs.is_empty() { eprintln!("Slider baseline isn't setup - look at ./gix-diff/tests/README.md for instructions"); } + let total_diffs = diffs.len(); + let matching_diffs = diffs + .iter() + .filter(|(_, _, actual_matches_baseline, _)| *actual_matches_baseline) + .count(); + + assert!( + matching_diffs == total_diffs, + "assertion failed: total diffs {} == matching diffs {}\n\n{}", + total_diffs, + matching_diffs, + { + let first_non_matching_diff = diffs + .iter() + .find(|(_, _, actual_matches_baseline, _)| !actual_matches_baseline) + .expect("at least one non-matching diff to be there"); + + format!( + "affected baseline: `{}`\n\n{}", + first_non_matching_diff.3, + StrComparison::new(&first_non_matching_diff.0, &first_non_matching_diff.1) + ) + } + ); + Ok(()) } From c60267a6efaba7bcb8c89c9c710f3d7369624692 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Tue, 2 Dec 2025 08:07:06 +0100 Subject: [PATCH 2/2] Use assert_eq! and add percentage --- gix-diff/tests/diff/blob/slider.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/gix-diff/tests/diff/blob/slider.rs b/gix-diff/tests/diff/blob/slider.rs index fb0970a25b7..b43f7b8f0ff 100644 --- a/gix-diff/tests/diff/blob/slider.rs +++ b/gix-diff/tests/diff/blob/slider.rs @@ -95,11 +95,13 @@ fn baseline() -> gix_testtools::Result { .filter(|(_, _, actual_matches_baseline, _)| *actual_matches_baseline) .count(); - assert!( - matching_diffs == total_diffs, - "assertion failed: total diffs {} == matching diffs {}\n\n{}", + assert_eq!( + matching_diffs, total_diffs, + "matching diffs {} == total diffs {} [{:.2} %]\n\n{}", matching_diffs, + total_diffs, + ((matching_diffs as f32) / (total_diffs as f32) * 100.0), { let first_non_matching_diff = diffs .iter()