use crate::image::{ComposeOp, Jbig2Image};
#[test]
fn new_dimensions() {
let img = Jbig2Image::new(17, 5);
assert_eq!(img.width, 17);
assert_eq!(img.height, 5);
assert_eq!(img.stride, 3);
assert_eq!(img.data.len(), 15); assert!(img.data.iter().all(|&b| b == 0));
}
#[test]
fn get_set_pixel() {
let mut img = Jbig2Image::new(16, 4);
assert_eq!(img.get_pixel(0, 0), 0);
assert_eq!(img.get_pixel(15, 3), 0);
img.set_pixel(0, 0, 1);
assert_eq!(img.get_pixel(0, 0), 1);
img.set_pixel(7, 0, 1);
assert_eq!(img.get_pixel(7, 0), 1);
assert_eq!(img.get_pixel(6, 0), 0);
img.set_pixel(15, 3, 1);
assert_eq!(img.get_pixel(15, 3), 1);
img.set_pixel(0, 0, 0);
assert_eq!(img.get_pixel(0, 0), 0);
}
#[test]
fn clear_white() {
let mut img = Jbig2Image::new(8, 2);
img.set_pixel(3, 1, 1);
img.clear(0);
assert_eq!(img.get_pixel(3, 1), 0);
assert!(img.data.iter().all(|&b| b == 0));
}
#[test]
fn clear_black() {
let mut img = Jbig2Image::new(8, 2);
img.clear(1);
assert_eq!(img.get_pixel(0, 0), 1);
assert_eq!(img.get_pixel(7, 1), 1);
assert!(img.data.iter().all(|&b| b == 0xFF));
}
#[test]
fn out_of_bounds() {
let mut img = Jbig2Image::new(8, 4);
assert_eq!(img.get_pixel(8, 0), 0);
assert_eq!(img.get_pixel(0, 4), 0);
assert_eq!(img.get_pixel(100, 100), 0);
img.set_pixel(8, 0, 1);
img.set_pixel(0, 4, 1);
img.set_pixel(100, 100, 1);
}
fn make_pattern(bits: u8) -> Jbig2Image {
let mut img = Jbig2Image::new(8, 1);
img.data[0] = bits;
img
}
#[test]
fn compose_or() {
let mut dst = make_pattern(0b1010_0000);
let src = make_pattern(0b1100_0000);
dst.compose(&src, 0, 0, ComposeOp::Or).unwrap();
assert_eq!(dst.data[0], 0b1110_0000);
}
#[test]
fn compose_and() {
let mut dst = make_pattern(0b1010_0000);
let src = make_pattern(0b1100_0000);
dst.compose(&src, 0, 0, ComposeOp::And).unwrap();
assert_eq!(dst.data[0], 0b1000_0000);
}
#[test]
fn compose_xor() {
let mut dst = make_pattern(0b1010_0000);
let src = make_pattern(0b1100_0000);
dst.compose(&src, 0, 0, ComposeOp::Xor).unwrap();
assert_eq!(dst.data[0], 0b0110_0000);
}
#[test]
fn compose_xnor() {
let mut dst = make_pattern(0b1010_0000);
let src = make_pattern(0b1100_0000);
dst.compose(&src, 0, 0, ComposeOp::Xnor).unwrap();
assert_eq!(dst.data[0] & 0xF0, 0b1001_0000);
}
#[test]
fn compose_replace() {
let mut dst = make_pattern(0b1111_0000);
let src = make_pattern(0b1010_0000);
dst.compose(&src, 0, 0, ComposeOp::Replace).unwrap();
assert_eq!(dst.data[0], 0b1010_0000);
}
#[test]
fn compose_offset() {
let mut dst = Jbig2Image::new(4, 2);
let mut src = Jbig2Image::new(2, 1);
src.set_pixel(0, 0, 1);
src.set_pixel(1, 0, 1);
dst.compose(&src, 2, 1, ComposeOp::Or).unwrap();
assert_eq!(dst.get_pixel(2, 1), 1);
assert_eq!(dst.get_pixel(3, 1), 1);
assert_eq!(dst.get_pixel(0, 0), 0);
assert_eq!(dst.get_pixel(1, 0), 0);
assert_eq!(dst.get_pixel(0, 1), 0);
assert_eq!(dst.get_pixel(1, 1), 0);
}
#[test]
fn compose_clipping() {
let mut dst = Jbig2Image::new(4, 4);
let mut src = Jbig2Image::new(4, 4);
src.clear(1);
dst.compose(&src, 2, 2, ComposeOp::Or).unwrap();
assert_eq!(dst.get_pixel(2, 2), 1);
assert_eq!(dst.get_pixel(3, 3), 1);
assert_eq!(dst.get_pixel(1, 1), 0);
let mut dst2 = Jbig2Image::new(4, 4);
dst2.compose(&src, -2, -2, ComposeOp::Or).unwrap();
assert_eq!(dst2.get_pixel(0, 0), 1);
assert_eq!(dst2.get_pixel(1, 1), 1);
assert_eq!(dst2.get_pixel(2, 0), 0); }
#[test]
fn compose_no_overlap() {
let mut dst = Jbig2Image::new(4, 4);
let mut src = Jbig2Image::new(2, 2);
src.clear(1);
dst.compose(&src, 10, 10, ComposeOp::Or).unwrap();
assert!(dst.data.iter().all(|&b| b == 0));
dst.compose(&src, -10, -10, ComposeOp::Or).unwrap();
assert!(dst.data.iter().all(|&b| b == 0));
}