From f386f365121e5d643bc9709812e3106f7661f14b Mon Sep 17 00:00:00 2001 From: Kitsu Date: Fri, 27 Feb 2026 18:03:54 -0300 Subject: [PATCH] Add test suite for matching rendered imgs --- src/lib.rs | 28 ++++++ src/mode.rs | 4 + src/mode/dialog.rs | 4 + tests/fixtures/initial.png | Bin 0 -> 49933 bytes tests/fixtures/nav_down.png | Bin 0 -> 49800 bytes tests/fixtures/search.png | Bin 0 -> 14488 bytes tests/fixtures/search_then_nav.png | Bin 0 -> 20055 bytes tests/regression/main.rs | 39 +++++++++ tests/regression/snap.rs | 136 +++++++++++++++++++++++++++++ 9 files changed, 211 insertions(+) create mode 100644 tests/fixtures/initial.png create mode 100644 tests/fixtures/nav_down.png create mode 100644 tests/fixtures/search.png create mode 100644 tests/fixtures/search_then_nav.png create mode 100644 tests/regression/main.rs create mode 100644 tests/regression/snap.rs diff --git a/src/lib.rs b/src/lib.rs index d7738a1..1ed0488 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -23,3 +23,31 @@ macro_rules! prog_name { "yofi" }; } + +pub fn render_to_buffer( + config: &config::Config, + state: &mut state::State, + scale: u16, + width: i32, + height: i32, + buffer: &mut [u32], +) { + use draw::Drawable; + + let mut dt = DrawTarget::from_backing(width, height, buffer); + let mut space_left = draw::Space { + width: width as f32, + height: height as f32, + }; + let mut point = draw::Point::new(0., 0.); + + let (mut drawables, dyn_space) = draw::make_drawables(config, state, scale); + if let Some(dyn_space) = dyn_space { + space_left.height = space_left.height.min(dyn_space.height); + } + while let Some(d) = drawables.borrowed_next() { + let occupied = d.draw(&mut dt, scale, space_left, point); + point.y += occupied.height; + space_left.height -= occupied.height; + } +} diff --git a/src/mode.rs b/src/mode.rs index 6216781..8e3e4be 100644 --- a/src/mode.rs +++ b/src/mode.rs @@ -72,6 +72,10 @@ impl Mode { dialog::DialogMode::new().map(Self::Dialog) } + pub fn dialog_from_lines(lines: Vec) -> Self { + Self::Dialog(dialog::DialogMode::from_lines(lines)) + } + pub fn fork_eval(&mut self, info: EvalInfo<'_>) -> Result<()> { // Safety: // - no need for signal-safety as we single-thread everywhere; diff --git a/src/mode/dialog.rs b/src/mode/dialog.rs index 3cc67fa..5bf446f 100644 --- a/src/mode/dialog.rs +++ b/src/mode/dialog.rs @@ -15,6 +15,10 @@ impl DialogMode { .map(|lines| Self { lines }) } + pub fn from_lines(lines: Vec) -> Self { + Self { lines } + } + pub fn eval(&mut self, info: EvalInfo<'_>) -> Result { let value = info .index diff --git a/tests/fixtures/initial.png b/tests/fixtures/initial.png new file mode 100644 index 0000000000000000000000000000000000000000..2c0e20bea519bb625974cb0e8da22edf222c8dd0 GIT binary patch literal 49933 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 DW0d&n literal 0 HcmV?d00001 diff --git a/tests/fixtures/nav_down.png b/tests/fixtures/nav_down.png new file mode 100644 index 0000000000000000000000000000000000000000..1054e75690ad63b93e52dba5fc2e6dd9628352e4 GIT binary patch literal 49800 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 PXti^@_qO~k-=F?>GIPVI literal 0 HcmV?d00001 diff --git a/tests/fixtures/search_then_nav.png b/tests/fixtures/search_then_nav.png new file mode 100644 index 0000000000000000000000000000000000000000..0a2e1f923adb2c85b98f4b98501558e35d3f742f GIT binary patch literal 20055 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.new.png` and `.diff.png` are saved next to the fixture for +//! inspection. The diff highlights changed pixels in red. + +mod snap; +use snap::{run_regression, test_entries, Action}; + +#[test] +fn initial() { + run_regression("initial", test_entries(), &[]); +} + +#[test] +fn search() { + run_regression("search", test_entries(), &[Action::Type("fire")]); +} + +#[test] +fn nav_down() { + run_regression( + "nav_down", + test_entries(), + &[Action::NextItem, Action::NextItem], + ); +} + +#[test] +fn search_then_nav() { + run_regression( + "search_then_nav", + test_entries(), + &[Action::Type("te"), Action::NextItem], + ); +} diff --git a/tests/regression/snap.rs b/tests/regression/snap.rs new file mode 100644 index 0000000..735ee26 --- /dev/null +++ b/tests/regression/snap.rs @@ -0,0 +1,136 @@ +use yofi::config::Config; +use yofi::mode::Mode; +use yofi::state::State; +use yofi::window::Params; + +pub enum Action { + Type(&'static str), + NextItem, +} + +pub fn test_entries() -> Vec { + [ + "Firefox", + "Chromium", + "Terminal", + "Files", + "Settings", + "Calculator", + "Text Editor", + "Music Player", + ] + .iter() + .map(|s| s.to_string()) + .collect() +} + +fn unpremultiply_to_rgba(buffer: &[u32]) -> Vec { + let mut rgba = Vec::with_capacity(buffer.len() * 4); + for &px in buffer { + let a = (px >> 24) & 0xff; + let r = (px >> 16) & 0xff; + let g = (px >> 8) & 0xff; + let b = px & 0xff; + if a == 0 { + rgba.extend_from_slice(&[0, 0, 0, 0]); + } else { + rgba.push((r * 255 / a) as u8); + rgba.push((g * 255 / a) as u8); + rgba.push((b * 255 / a) as u8); + rgba.push(a as u8); + } + } + rgba +} + +fn save_png(path: &str, width: u32, height: u32, rgba: &[u8]) { + let file = std::fs::File::create(path).expect("failed to create PNG file"); + let mut encoder = png::Encoder::new(file, width, height); + encoder.set_color(png::ColorType::Rgba); + encoder.set_depth(png::BitDepth::Eight); + let mut writer = encoder.write_header().expect("failed to write PNG header"); + writer + .write_image_data(rgba) + .expect("failed to write PNG data"); +} + +fn make_diff_image(expected: &[u8], actual: &[u8], width: u32, height: u32) -> Vec { + let mut diff = Vec::with_capacity(expected.len()); + for (exp, act) in expected.chunks_exact(4).zip(actual.chunks_exact(4)) { + if exp == act { + // Matching pixel: dim grayscale + let gray = ((exp[0] as u16 + exp[1] as u16 + exp[2] as u16) / 3 / 3) as u8; + diff.extend_from_slice(&[gray, gray, gray, 255]); + } else { + // Differing pixel: bright red + diff.extend_from_slice(&[255, 0, 0, 255]); + } + } + // Pad if sizes differ (dimension mismatch) + let total = (width as usize) * (height as usize) * 4; + diff.resize(total, 0); + diff +} + +fn load_png_rgba(path: &str) -> (u32, u32, Vec) { + let file = std::fs::File::open(path).unwrap_or_else(|_| { + panic!("fixture not found: {path}\nRun with YOFI_BLESS=1 to generate reference snapshots") + }); + let decoder = png::Decoder::new(file); + let mut reader = decoder.read_info().unwrap(); + let mut rgba = vec![0u8; reader.output_buffer_size()]; + let info = reader.next_frame(&mut rgba).unwrap(); + rgba.truncate(info.buffer_size()); + (info.width, info.height, rgba) +} + +pub fn run_regression(name: &str, entries: Vec, actions: &[Action]) { + let config = Config::default(); + + let mode = Mode::dialog_from_lines(entries); + let mut state = State::new(mode); + + for action in actions { + match action { + Action::Type(s) => state.append_to_input(s), + Action::NextItem => state.next_item(), + } + } + + let params: Params = config.param(); + let scale = params.scale.unwrap_or(1); + let w = (params.width * u32::from(scale)) as i32; + let h = (params.height * u32::from(scale)) as i32; + let mut buffer = vec![0u32; (w * h) as usize]; + yofi::render_to_buffer(&config, &mut state, scale, w, h, &mut buffer); + + let actual_rgba = unpremultiply_to_rgba(&buffer); + let w = w as u32; + let h = h as u32; + + let fixture = format!("tests/fixtures/{name}.png"); + let new_file = format!("tests/fixtures/{name}.new.png"); + let diff_file = format!("tests/fixtures/{name}.diff.png"); + + if std::env::var("YOFI_BLESS").is_ok() { + save_png(&fixture, w, h, &actual_rgba); + eprintln!("blessed: {fixture}"); + } else { + let (rw, rh, reference_rgba) = load_png_rgba(&fixture); + assert!( + rw == w && rh == h, + "dimension mismatch for '{name}': expected {rw}x{rh}, got {w}x{h}" + ); + if actual_rgba != reference_rgba { + save_png(&new_file, w, h, &actual_rgba); + let diff = make_diff_image(&reference_rgba, &actual_rgba, w, h); + save_png(&diff_file, w, h, &diff); + panic!( + "pixel mismatch for '{name}'\n \ + new: {new_file}\n \ + diff: {diff_file}\n \ + Run with YOFI_BLESS=1 to update" + ); + } + } +}