use jbig2enc::arith::{ArithEncoder, STATE_TABLE};
#[test]
fn state_table_has_92_entries() {
assert_eq!(STATE_TABLE.len(), 92);
}
#[test]
fn state_table_first_entry_mps0() {
let e = STATE_TABLE[0];
assert_eq!(e.qe, 0x5601);
assert_eq!(e.mps, 1);
assert_eq!(e.lps, 47);
}
#[test]
fn state_table_entry_5_mps0() {
let e = STATE_TABLE[5];
assert_eq!(e.qe, 0x0221);
assert_eq!(e.mps, 38);
assert_eq!(e.lps, 33);
}
#[test]
fn state_table_entry_6_mps0() {
let e = STATE_TABLE[6];
assert_eq!(e.qe, 0x5601);
assert_eq!(e.mps, 7);
assert_eq!(e.lps, 52);
}
#[test]
fn state_table_entry_45_mps0() {
let e = STATE_TABLE[45];
assert_eq!(e.qe, 0x0001);
assert_eq!(e.mps, 45);
assert_eq!(e.lps, 43);
}
#[test]
fn state_table_first_entry_mps1() {
let e = STATE_TABLE[46];
assert_eq!(e.qe, 0x5601);
assert_eq!(e.mps, 47);
assert_eq!(e.lps, 1);
}
#[test]
fn state_table_entry_51_mps1() {
let e = STATE_TABLE[51];
assert_eq!(e.qe, 0x0221);
assert_eq!(e.mps, 84);
assert_eq!(e.lps, 79);
}
#[test]
fn state_table_entry_91_mps1() {
let e = STATE_TABLE[91];
assert_eq!(e.qe, 0x0001);
assert_eq!(e.mps, 91);
assert_eq!(e.lps, 89);
}
#[test]
fn state_table_symmetry() {
for i in 0..46 {
assert_eq!(
STATE_TABLE[i].qe,
STATE_TABLE[i + 46].qe,
"qe mismatch at state {i}"
);
}
}
#[test]
fn encoder_new_initial_state() {
let enc = ArithEncoder::new();
assert_eq!(enc.data_size(), 0);
}
#[test]
fn encoder_reset_clears_state() {
let mut enc = ArithEncoder::new();
let mut ctx = vec![0u8; 1];
enc.encode_bit(&mut ctx, 0, 0);
enc.encode_bit(&mut ctx, 0, 1);
enc.reset();
}
#[test]
fn encoder_flush_clears_output() {
let mut enc = ArithEncoder::new();
let mut ctx = vec![0u8; 1];
enc.encode_bit(&mut ctx, 0, 0);
enc.encode_final();
assert!(enc.data_size() > 0);
enc.flush();
assert_eq!(enc.data_size(), 0);
}
#[test]
fn encoder_h2_test_vector() {
let input: [u8; 32] = [
0x00, 0x02, 0x00, 0x51, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x52, 0x87, 0x2a, 0xaa, 0xaa, 0xaa,
0xaa, 0x82, 0xc0, 0x20, 0x00, 0xfc, 0xd7, 0x9e, 0xf6, 0xbf, 0x7f, 0xed, 0x90, 0x4f, 0x46,
0xa3, 0xbf,
];
let mut enc = ArithEncoder::new();
let mut ctx = vec![0u8; 65536];
for byte in &input {
for bit in (0..8).rev() {
let d = (byte >> bit) & 1;
enc.encode_bit(&mut ctx, 0, d);
}
}
enc.encode_final();
let output = enc.to_vec();
assert!(!output.is_empty(), "H.2 test should produce output");
}
#[test]
fn encoder_all_zeros() {
let mut enc = ArithEncoder::new();
let mut ctx = vec![0u8; 1];
for _ in 0..100 {
enc.encode_bit(&mut ctx, 0, 0);
}
enc.encode_final();
let output = enc.to_vec();
assert!(!output.is_empty());
}
#[test]
fn encoder_all_ones() {
let mut enc = ArithEncoder::new();
let mut ctx = vec![0u8; 1];
for _ in 0..100 {
enc.encode_bit(&mut ctx, 0, 1);
}
enc.encode_final();
let output = enc.to_vec();
assert!(!output.is_empty());
}
#[test]
fn encoder_final_marker() {
let mut enc = ArithEncoder::new();
let mut ctx = vec![0u8; 1];
enc.encode_bit(&mut ctx, 0, 0);
enc.encode_final();
let output = enc.to_vec();
assert!(output.len() >= 2);
assert_eq!(output[output.len() - 2], 0xFF);
assert_eq!(output[output.len() - 1], 0xAC);
}
#[test]
fn encoder_to_vec_size_matches_data_size() {
let mut enc = ArithEncoder::new();
let mut ctx = vec![0u8; 1];
for _ in 0..50 {
enc.encode_bit(&mut ctx, 0, 0);
}
enc.encode_final();
assert_eq!(enc.to_vec().len(), enc.data_size());
}