use crate::decoder::{Decoder, DecoderState};
use crate::header::MAGIC;
fn make_minimal_jbig2(width: u32, height: u32) -> Vec<u8> {
let mut buf = Vec::new();
buf.extend_from_slice(&MAGIC);
buf.push(0x01); buf.extend_from_slice(&1u32.to_be_bytes());
buf.extend_from_slice(&0u32.to_be_bytes()); buf.push(48); buf.push(0x00); buf.push(1); buf.extend_from_slice(&19u32.to_be_bytes());
buf.extend_from_slice(&width.to_be_bytes());
buf.extend_from_slice(&height.to_be_bytes());
buf.extend_from_slice(&0u32.to_be_bytes()); buf.extend_from_slice(&0u32.to_be_bytes()); buf.push(0); buf.extend_from_slice(&0u16.to_be_bytes());
buf.extend_from_slice(&1u32.to_be_bytes()); buf.push(49); buf.push(0x00);
buf.push(1); buf.extend_from_slice(&0u32.to_be_bytes());
buf.extend_from_slice(&2u32.to_be_bytes());
buf.push(51);
buf.push(0x00);
buf.push(0); buf.extend_from_slice(&0u32.to_be_bytes());
buf
}
#[test]
fn sequential_state_machine() {
let data = make_minimal_jbig2(8, 8);
let mut dec = Decoder::new();
dec.write(&data).unwrap();
assert_eq!(dec.state, DecoderState::Eof);
let page = dec.page_out();
assert!(page.is_some());
let img = page.unwrap();
assert_eq!(img.width, 8);
assert_eq!(img.height, 8);
}
#[test]
fn embedded_mode() {
let mut dec = Decoder::new_embedded();
assert_eq!(dec.state, DecoderState::SequentialHeader);
let mut buf = Vec::new();
buf.extend_from_slice(&0u32.to_be_bytes());
buf.push(48);
buf.push(0x00);
buf.push(1);
buf.extend_from_slice(&19u32.to_be_bytes());
buf.extend_from_slice(&16u32.to_be_bytes()); buf.extend_from_slice(&4u32.to_be_bytes()); buf.extend_from_slice(&0u32.to_be_bytes()); buf.extend_from_slice(&0u32.to_be_bytes()); buf.push(0);
buf.extend_from_slice(&0u16.to_be_bytes());
buf.extend_from_slice(&1u32.to_be_bytes());
buf.push(49);
buf.push(0x00);
buf.push(1);
buf.extend_from_slice(&0u32.to_be_bytes());
buf.extend_from_slice(&2u32.to_be_bytes());
buf.push(51);
buf.push(0x00);
buf.push(0);
buf.extend_from_slice(&0u32.to_be_bytes());
dec.write(&buf).unwrap();
let page = dec.page_out();
assert!(page.is_some());
let img = page.unwrap();
assert_eq!(img.width, 16);
assert_eq!(img.height, 4);
}
#[test]
fn incremental_write() {
let data = make_minimal_jbig2(4, 4);
let mut dec = Decoder::new();
for &b in &data {
dec.write(&[b]).unwrap();
}
assert_eq!(dec.state, DecoderState::Eof);
assert!(dec.page_out().is_some());
}
#[test]
fn no_page_before_complete() {
let mut buf = Vec::new();
buf.extend_from_slice(&MAGIC);
buf.push(0x01);
buf.extend_from_slice(&1u32.to_be_bytes());
let mut dec = Decoder::new();
dec.write(&buf).unwrap();
assert!(dec.page_out().is_none());
}