#![cfg(test)]
#![allow(
clippy::unwrap_used,
clippy::expect_used,
reason = "test modules may unwrap"
)]
use super::*;
#[test]
fn parse_bits_converts_bit_strings_to_value_and_length() {
assert_eq!(parse_bits("1"), (1, 1));
assert_eq!(parse_bits("01"), (1, 2));
assert_eq!(parse_bits("000101"), (5, 6));
assert_eq!(parse_bits(""), (0, 0));
}
#[test]
fn decode_4x4_residual_handles_empty_block() {
let data = [0b1000_0000u8];
let mut reader = BitReader::new(&data);
let residual = decode_4x4_residual(&mut reader, 0, false).unwrap();
assert_eq!(residual.total_coeff, 0);
assert_eq!(residual.raster, [0; 16]);
}
#[test]
fn decode_4x4_residual_places_single_dc_coefficient() {
let data = [0b0101_0000u8];
let mut reader = BitReader::new(&data);
let residual = decode_4x4_residual(&mut reader, 0, false).unwrap();
assert_eq!(residual.total_coeff, 1);
let mut expected = [0i32; 16];
expected[0] = 1;
assert_eq!(residual.raster, expected);
}
#[test]
fn decode_4x4_residual_places_two_coefficients_with_a_zero_gap() {
let data = [0x2E, 0x00];
let mut reader = BitReader::new(&data);
let residual = decode_4x4_residual(&mut reader, 0, false).unwrap();
assert_eq!(residual.total_coeff, 2);
let mut expected = [0i32; 16];
expected[0] = -1; expected[4] = 1; assert_eq!(residual.raster, expected);
}
#[test]
fn decode_4x4_residual_ac_only_skips_the_dc_scan_position() {
let data = [0x48];
let mut reader = BitReader::new(&data);
let residual = decode_4x4_residual(&mut reader, 0, true).unwrap();
assert_eq!(residual.total_coeff, 1);
let mut expected = [0i32; 16];
expected[8] = 1; assert_eq!(residual.raster, expected);
}
#[test]
fn decode_4x4_residual_uses_fixed_length_code_for_nc_at_least_8() {
let data = [0b0000_0000u8];
let mut reader = BitReader::new(&data);
let err = decode_4x4_residual(&mut reader, 9, false);
assert_eq!(err, Err(H264Error::UnexpectedEof));
}
#[test]
fn decode_4x4_residual_rejects_total_coeff_above_max_num_coeff() {
let data = [0b1111_1100u8];
let mut reader = BitReader::new(&data);
assert_eq!(
decode_4x4_residual(&mut reader, 9, true),
Err(H264Error::InvalidCavlcCode)
);
}
#[test]
fn decode_4x4_residual_errors_on_empty_input() {
let mut reader = BitReader::new(&[]);
assert_eq!(
decode_4x4_residual(&mut reader, 0, false),
Err(H264Error::UnexpectedEof)
);
}
#[test]
fn decode_vlc_rejects_unmatched_codeword_within_bit_budget() {
let data = [0u8; 4];
let mut reader = BitReader::new(&data);
assert_eq!(
decode_4x4_residual(&mut reader, 0, false),
Err(H264Error::InvalidCavlcCode)
);
}
#[test]
fn decode_chroma_dc_residual_places_single_coefficient() {
let data = [0x90u8];
let mut reader = BitReader::new(&data);
let residual = decode_chroma_dc_residual(&mut reader).unwrap();
assert_eq!(residual.total_coeff, 1);
assert_eq!(residual.c, [0, 1, 0, 0]);
}
#[test]
fn decode_chroma_dc_residual_handles_empty_block() {
let data = [0b0100_0000u8];
let mut reader = BitReader::new(&data);
let residual = decode_chroma_dc_residual(&mut reader).unwrap();
assert_eq!(residual.total_coeff, 0);
assert_eq!(residual.c, [0; 4]);
}