fparkan/vendor/weezl/tests/roundtrip.rs
Valentin Popov 1b6a04ca55
Initial vendor packages
Signed-off-by: Valentin Popov <valentin@popov.link>
2024-01-08 01:21:28 +04:00

67 lines
1.8 KiB
Rust

use std::{env, fs};
use weezl::{decode, encode, BitOrder};
#[derive(Clone, Copy, Debug)]
enum Flavor {
Gif,
Tiff,
}
#[test]
fn roundtrip_all() {
let file = env::args().next().unwrap();
let data = fs::read(file).unwrap();
for &flavor in &[Flavor::Gif, Flavor::Tiff] {
for &bit_order in &[BitOrder::Lsb, BitOrder::Msb] {
for bit_width in 2..8 {
let data: Vec<_> = data
.iter()
.copied()
.map(|b| b & ((1 << bit_width) - 1))
.collect();
println!("Roundtrip test {:?} {:?} {}", flavor, bit_order, bit_width);
assert_roundtrips(&*data, flavor, bit_width, bit_order);
}
}
}
}
fn assert_roundtrips(data: &[u8], flavor: Flavor, bit_width: u8, bit_order: BitOrder) {
let (c, d): (
fn(BitOrder, u8) -> encode::Encoder,
fn(BitOrder, u8) -> decode::Decoder,
) = match flavor {
Flavor::Gif => (encode::Encoder::new, decode::Decoder::new),
Flavor::Tiff => (
encode::Encoder::with_tiff_size_switch,
decode::Decoder::with_tiff_size_switch,
),
};
let mut encoder = c(bit_order, bit_width);
let mut buffer = Vec::with_capacity(2 * data.len() + 40);
let _ = encoder.into_stream(&mut buffer).encode_all(data);
let mut decoder = d(bit_order, bit_width);
let mut compare = vec![];
let result = decoder
.into_stream(&mut compare)
.decode_all(buffer.as_slice());
assert!(
result.status.is_ok(),
"{:?}, {}, {:?}",
bit_order,
bit_width,
result.status
);
assert!(
data == &*compare,
"{:?}, {}\n{:?}\n{:?}",
bit_order,
bit_width,
data,
compare
);
}