From 07b7768e3b9c8abce39fe589e887db28be82f198 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Tue, 20 Feb 2024 21:10:40 -0600 Subject: [PATCH] fix(snap): Show correct line numbers for term-svg --- crates/snapbox/src/report/diff.rs | 84 +++++++++++++++++++++++++++---- 1 file changed, 73 insertions(+), 11 deletions(-) diff --git a/crates/snapbox/src/report/diff.rs b/crates/snapbox/src/report/diff.rs index df17fd98..aea1f1a4 100644 --- a/crates/snapbox/src/report/diff.rs +++ b/crates/snapbox/src/report/diff.rs @@ -11,17 +11,35 @@ pub fn write_diff( #[allow(unused_mut)] let mut rendered = false; #[cfg(feature = "diff")] - if let (Some(expected), Some(actual)) = (expected.relevant(), actual.relevant()) { + if let (Some(expected_relevant), Some(actual_relevant)) = + (expected.relevant(), actual.relevant()) + { + let expected_rendered = expected.render().unwrap(); + let expected_line_offset = expected_rendered[..expected_rendered + .find(expected_relevant) + .unwrap_or(expected_rendered.len())] + .lines() + .count(); + let actual_rendered = actual.render().unwrap(); + let actual_line_offset = actual_rendered[..actual_rendered + .find(actual_relevant) + .unwrap_or(actual_rendered.len())] + .lines() + .count(); write_diff_inner( writer, - expected, - actual, + expected_relevant, + actual_relevant, expected_name, actual_name, palette, + expected_line_offset, + actual_line_offset, )?; rendered = true; } else if let (Some(expected), Some(actual)) = (expected.render(), actual.render()) { + let expected_line_offset = 0; + let actual_line_offset = 0; write_diff_inner( writer, &expected, @@ -29,6 +47,8 @@ pub fn write_diff( expected_name, actual_name, palette, + expected_line_offset, + actual_line_offset, )?; rendered = true; } @@ -58,6 +78,8 @@ fn write_diff_inner( expected_name: Option<&dyn std::fmt::Display>, actual_name: Option<&dyn std::fmt::Display>, palette: crate::report::Palette, + expected_line_offset: usize, + actual_line_offset: usize, ) -> Result<(), std::fmt::Error> { let timeout = std::time::Duration::from_millis(500); let min_elide = 20; @@ -147,7 +169,16 @@ fn write_diff_inner( elided = false; match change.tag() { similar::ChangeTag::Insert => { - write_change(writer, change, "+", palette.actual, palette.info, palette)?; + write_change( + writer, + change, + "+", + palette.actual, + palette.info, + palette, + expected_line_offset, + actual_line_offset, + )?; } similar::ChangeTag::Delete => { write_change( @@ -157,10 +188,21 @@ fn write_diff_inner( palette.expected, palette.error, palette, + expected_line_offset, + actual_line_offset, )?; } similar::ChangeTag::Equal => { - write_change(writer, change, "|", palette.hint, palette.hint, palette)?; + write_change( + writer, + change, + "|", + palette.hint, + palette.hint, + palette, + expected_line_offset, + actual_line_offset, + )?; } } } @@ -177,14 +219,24 @@ fn write_change( em_style: crate::report::Style, style: crate::report::Style, palette: crate::report::Palette, + expected_line_offset: usize, + actual_line_offset: usize, ) -> Result<(), std::fmt::Error> { if let Some(index) = change.old_index() { - write!(writer, "{:>4} ", palette.hint(index + 1),)?; + write!( + writer, + "{:>4} ", + palette.hint(index + 1 + expected_line_offset), + )?; } else { write!(writer, "{:>4} ", " ",)?; } if let Some(index) = change.new_index() { - write!(writer, "{:>4} ", palette.hint(index + 1),)?; + write!( + writer, + "{:>4} ", + palette.hint(index + 1 + actual_line_offset), + )?; } else { write!(writer, "{:>4} ", " ",)?; } @@ -221,6 +273,8 @@ mod test { Some(&expected_name), Some(&actual_name), palette, + 0, + 0, ) .unwrap(); let expected_diff = " @@ -250,6 +304,8 @@ mod test { Some(&expected_name), Some(&actual_name), palette, + 0, + 0, ) .unwrap(); let expected_diff = " @@ -279,6 +335,8 @@ mod test { Some(&expected_name), Some(&actual_name), palette, + 0, + 0, ) .unwrap(); let expected_diff = " @@ -309,6 +367,8 @@ mod test { Some(&expected_name), Some(&actual_name), palette, + 0, + 0, ) .unwrap(); let expected_diff = " @@ -363,6 +423,8 @@ mod test { Some(&expected_name), Some(&actual_name), palette, + 0, + 0, ) .unwrap(); let expected_diff = " @@ -432,10 +494,10 @@ Hello World let expected_diff = " ---- expected: A ++++ actual: B - 1 1 | - 2 - Hello Moon - 2 + Hello World - 3 3 | + 2 2 | + 3 - Hello Moon + 3 + Hello World + 4 4 | "; assert_eq!(expected_diff, actual_diff);