From 1f31eaa17d7b8c1ee19f0d5be8ac5bda2138abed Mon Sep 17 00:00:00 2001 From: gered Date: Fri, 30 Dec 2022 17:25:10 -0500 Subject: [PATCH] add more pcx bitmap load/save tests --- libretrogd/src/graphics/bitmap/pcx.rs | 35 ++++++++++++++++++++++--- libretrogd/test-assets/test_image2.pcx | Bin 0 -> 44873 bytes 2 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 libretrogd/test-assets/test_image2.pcx diff --git a/libretrogd/src/graphics/bitmap/pcx.rs b/libretrogd/src/graphics/bitmap/pcx.rs index f4db365..b323602 100644 --- a/libretrogd/src/graphics/bitmap/pcx.rs +++ b/libretrogd/src/graphics/bitmap/pcx.rs @@ -284,8 +284,9 @@ pub mod tests { use super::*; - pub static TEST_BMP_PIXELS_RAW: &[u8] = - include_bytes!("../../../test-assets/test_bmp_pixels_raw.bin"); + pub static TEST_BMP_PIXELS_RAW: &[u8] = include_bytes!("../../../test-assets/test_bmp_pixels_raw.bin"); + pub static TEST_LARGE_BMP_PIXELS_RAW: &[u8] = include_bytes!("../../../test-assets/test_large_bmp_pixels_raw.bin"); + pub static TEST_LARGE_BMP_PIXELS_RAW_2: &[u8] = include_bytes!("../../../test-assets/test_large_bmp_pixels_raw2.bin"); #[test] pub fn load_and_save() -> Result<(), PcxError> { @@ -312,10 +313,36 @@ pub mod tests { } #[test] - pub fn load_larger_image() -> Result<(), PcxError> { - let (bmp, _palette) = Bitmap::load_pcx_file(Path::new("./test-assets/test_image.pcx"))?; + pub fn load_and_save_larger_image() -> Result<(), PcxError> { + let tmp_dir = TempDir::new()?; + + // first image + + let (bmp, palette) = Bitmap::load_pcx_file(Path::new("./test-assets/test_image.pcx"))?; assert_eq!(320, bmp.width()); assert_eq!(200, bmp.height()); + assert_eq!(bmp.pixels(), TEST_LARGE_BMP_PIXELS_RAW); + + let save_path = tmp_dir.path().join("test_save.pcx"); + bmp.to_pcx_file(&save_path, &palette)?; + let (reloaded_bmp, _) = Bitmap::load_pcx_file(&save_path)?; + assert_eq!(320, reloaded_bmp.width()); + assert_eq!(200, reloaded_bmp.height()); + assert_eq!(reloaded_bmp.pixels(), TEST_LARGE_BMP_PIXELS_RAW); + + // second image + + let (bmp, palette) = Bitmap::load_pcx_file(Path::new("./test-assets/test_image2.pcx"))?; + assert_eq!(320, bmp.width()); + assert_eq!(200, bmp.height()); + assert_eq!(bmp.pixels(), TEST_LARGE_BMP_PIXELS_RAW_2); + + let save_path = tmp_dir.path().join("test_save_2.pcx"); + bmp.to_pcx_file(&save_path, &palette)?; + let (reloaded_bmp, _) = Bitmap::load_pcx_file(&save_path)?; + assert_eq!(320, reloaded_bmp.width()); + assert_eq!(200, reloaded_bmp.height()); + assert_eq!(reloaded_bmp.pixels(), TEST_LARGE_BMP_PIXELS_RAW_2); Ok(()) } diff --git a/libretrogd/test-assets/test_image2.pcx b/libretrogd/test-assets/test_image2.pcx new file mode 100644 index 0000000000000000000000000000000000000000..1864b113160ad79e8244bc4e12e591d36d8ec24d GIT binary patch literal 44873 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 N+PfLO-kM(E`M*jvq(A@w literal 0 HcmV?d00001