Simplify tests

This commit is contained in:
Christopher Gundler committed 2021-12-22 10:48:52 +01:00
1 parent 99b2aa9b3a
commit bc7be68d0f
1 file changed
+78 -63
+78 -63
View File
@@ -1,88 +1,111 @@
extern crate tiff; extern crate tiff;
use std::io::Cursor; use std::io::{Cursor, Seek, Write};
use tiff::{ use tiff::{
decoder::{Decoder, DecodingResult}, decoder::{Decoder, DecodingResult},
encoder::{colortype, compression::*, TiffEncoder}, encoder::{
tags::Tag, colortype::{self, ColorType},
compression::*,
TiffEncoder, TiffValue,
},
}; };
trait TestImage { trait TestImage<const NUM_CHANNELS: usize>: From<Vec<<Self::Color as ColorType>::Inner>> {
const WIDTH: u32; const WIDTH: u32;
const HEIGHT: u32; const HEIGHT: u32;
type PixelType; type Color: ColorType;
fn generate() -> Vec<Self::PixelType>; fn reference_data(&self) -> &[<Self::Color as ColorType>::Inner];
} fn generate_pixel(x: u32, y: u32) -> [<Self::Color as ColorType>::Inner; NUM_CHANNELS];
struct TestImageColor; fn compress<C: Compression, W: Write + Seek>(
impl TestImage for TestImageColor { &self,
const WIDTH: u32 = 1; encoder: &mut TiffEncoder<W>,
const HEIGHT: u32 = 7; compression: C,
type PixelType = u16; ) where
[<Self::Color as ColorType>::Inner]: TiffValue,
{
let image = encoder
.new_image_with_compression::<Self::Color, C>(Self::WIDTH, Self::HEIGHT, compression)
.unwrap();
image.write_data(self.reference_data()).unwrap();
}
fn generate() -> Vec<Self::PixelType> { fn generate() -> Self {
let mut data: Vec<u16> = Vec::with_capacity((Self::WIDTH * Self::HEIGHT) as usize * 3); assert_eq!(
Self::Color::BITS_PER_SAMPLE.len(),
NUM_CHANNELS,
"Incompatible color type"
);
let mut data = Vec::with_capacity((Self::WIDTH * Self::HEIGHT) as usize * NUM_CHANNELS);
for x in 0..Self::WIDTH { for x in 0..Self::WIDTH {
for y in 0..Self::HEIGHT { for y in 0..Self::HEIGHT {
let val = (x + y) % Self::PixelType::MAX as u32; data.extend(IntoIterator::into_iter(Self::generate_pixel(x, y)));
data.extend(std::iter::repeat(val as Self::PixelType).take(3));
} }
} }
assert_eq!(data.len() as u32, Self::WIDTH * Self::HEIGHT * 3); Self::from(data)
data
} }
} }
struct TestImageGrayscale; struct TestImageColor(Vec<u16>);
impl TestImage for TestImageGrayscale {
impl From<Vec<u16>> for TestImageColor {
fn from(value: Vec<u16>) -> Self {
Self(value)
}
}
impl TestImage<3> for TestImageColor {
const WIDTH: u32 = 1;
const HEIGHT: u32 = 7;
type Color = colortype::RGB16;
fn reference_data(&self) -> &[u16] {
&self.0
}
fn generate_pixel(x: u32, y: u32) -> [<Self::Color as ColorType>::Inner; 3] {
let val = (x + y) % <Self::Color as ColorType>::Inner::MAX as u32;
[val as <Self::Color as ColorType>::Inner; 3]
}
}
struct TestImageGrayscale(Vec<u8>);
impl From<Vec<u8>> for TestImageGrayscale {
fn from(value: Vec<u8>) -> Self {
Self(value)
}
}
impl TestImage<1> for TestImageGrayscale {
const WIDTH: u32 = 21; const WIDTH: u32 = 21;
const HEIGHT: u32 = 10; const HEIGHT: u32 = 10;
type PixelType = u8; type Color = colortype::Gray8;
fn generate() -> Vec<Self::PixelType> { fn reference_data(&self) -> &[u8] {
let mut data: Vec<u8> = Vec::with_capacity((Self::WIDTH * Self::HEIGHT) as usize); &self.0
for x in 0..Self::WIDTH { }
for y in 0..Self::HEIGHT {
let val = (x + y) % Self::PixelType::MAX as u32; fn generate_pixel(x: u32, y: u32) -> [<Self::Color as ColorType>::Inner; 1] {
data.push(val as Self::PixelType); let val = (x + y) % <Self::Color as ColorType>::Inner::MAX as u32;
} [val as <Self::Color as ColorType>::Inner]
}
assert_eq!(data.len() as u32, Self::WIDTH * Self::HEIGHT);
data
} }
} }
fn encode_decode_with_compression<C: Compression + Clone>(compression: C) { fn encode_decode_with_compression<C: Compression + Clone>(compression: C) {
let mut data = Cursor::new(Vec::new()); let mut data = Cursor::new(Vec::new());
let image_data_rgb = TestImageColor::generate(); let image_rgb = TestImageColor::generate();
let image_data_gray = TestImageGrayscale::generate(); let image_grayscale = TestImageGrayscale::generate();
// Encode tiff with compression // Encode tiff with compression
{ {
// Create a multipage image with 2 images // Create a multipage image with 2 images
let mut encoder = TiffEncoder::new(&mut data).unwrap(); let mut encoder = TiffEncoder::new(&mut data).unwrap();
image_rgb.compress(&mut encoder, compression.clone());
// Write first colored image image_grayscale.compress(&mut encoder, compression);
let image_rgb = encoder
.new_image_with_compression::<colortype::RGB16, C>(
TestImageColor::WIDTH,
TestImageColor::HEIGHT,
compression.clone(),
)
.unwrap();
image_rgb.write_data(&image_data_rgb).unwrap();
// Write second grayscale image
let image_gray = encoder
.new_image_with_compression::<colortype::Gray8, C>(
TestImageGrayscale::WIDTH,
TestImageGrayscale::HEIGHT,
compression,
)
.unwrap();
image_gray.write_data(&image_data_gray).unwrap();
} }
// Decode tiff // Decode tiff
@@ -91,20 +114,12 @@ fn encode_decode_with_compression<C: Compression + Clone>(compression: C) {
let mut decoder = Decoder::new(data).unwrap(); let mut decoder = Decoder::new(data).unwrap();
// Check the RGB image // Check the RGB image
assert_eq!(
decoder
.get_tag(Tag::ImageWidth)
.unwrap()
.into_u32()
.unwrap(),
TestImageColor::WIDTH
);
assert_eq!( assert_eq!(
match decoder.read_image() { match decoder.read_image() {
Ok(DecodingResult::U16(image_data)) => image_data, Ok(DecodingResult::U16(image_data)) => image_data,
unexpected => panic!("Descoding RGB failed: {:?}", unexpected), unexpected => panic!("Descoding RGB failed: {:?}", unexpected),
}, },
image_data_rgb image_rgb.reference_data()
); );
// Check the grayscale image // Check the grayscale image
@@ -114,7 +129,7 @@ fn encode_decode_with_compression<C: Compression + Clone>(compression: C) {
Ok(DecodingResult::U8(image_data)) => image_data, Ok(DecodingResult::U8(image_data)) => image_data,
unexpected => panic!("Decoding grayscale failed: {:?}", unexpected), unexpected => panic!("Decoding grayscale failed: {:?}", unexpected),
}, },
image_data_gray image_grayscale.reference_data()
); );
} }
} }