use image::io::Reader as ImageReader; pub fn compare_images(source_pixels: &[u8], target_path: &str) -> bool { let image_buffer = ImageReader::open(target_path) .unwrap() .decode() .unwrap() .to_rgb8(); let (width, _) = image_buffer.dimensions(); for (x, y, pixel) in image_buffer.enumerate_pixels() { let base = ((y * width + x) * 3) as usize; if [ source_pixels[base], source_pixels[base + 1], source_pixels[base + 2], ] != pixel.0 { return false; } } true } #[cfg(test)] mod tests { use boytacean::{ ppu::FRAME_BUFFER_SIZE, test::{run_image_test, TestOptions}, }; use super::compare_images; #[test] fn test_blargg_cpu_instrs() { let result: [u8; FRAME_BUFFER_SIZE] = run_image_test( "../../res/roms/test/blargg/cpu/cpu_instrs.gb", Some(300000000), TestOptions::default(), ); let image_result = compare_images(&result, "res/test/blargg/cpu/cpu_instrs.png"); assert_eq!(image_result, true); } #[test] fn test_dmg_acid2() { let result: [u8; FRAME_BUFFER_SIZE] = run_image_test( "../../res/roms/test/dmg_acid2.gb", Some(50000000), TestOptions::default(), ); let image_result = compare_images(&result, "res/test/dmg_acid2.png"); assert_eq!(image_result, true); } #[test] fn test_firstwhite() { let result: [u8; FRAME_BUFFER_SIZE] = run_image_test( "../../res/roms/test/firstwhite.gb", Some(50000000), TestOptions::default(), ); let image_result = compare_images(&result, "res/test/firstwhite.png"); assert_eq!(image_result, true); } }