use binrw::{BinRead, BinWrite};
use crate::chunk_id::ChunkId;
#[derive(Debug, Clone, Copy, BinRead, BinWrite)]
#[brw(little)]
pub struct ChunkHeader {
pub id: ChunkId,
pub size: u32,
}
impl ChunkHeader {
#[must_use]
pub const fn total_size(&self) -> u64 {
self.size as u64 + 8
}
#[must_use]
pub fn is_chunk(&self, expected: ChunkId) -> bool {
self.id.0 == expected.0
}
}
#[cfg(test)]
mod tests {
use super::*;
use binrw::BinRead;
use std::io::Cursor;
#[test]
fn parse_chunk_header() {
let data = [
0x52, 0x45, 0x56, 0x4D, 0x04, 0x00, 0x00, 0x00, ];
let mut cursor = Cursor::new(&data);
let header = ChunkHeader::read(&mut cursor).expect("parse chunk header");
assert_eq!(header.id, ChunkId::from_str("MVER").unwrap());
assert_eq!(header.size, 4);
assert_eq!(header.total_size(), 12);
}
#[test]
fn total_size_calculation() {
let header = ChunkHeader {
id: ChunkId::from_str("TEST").unwrap(),
size: 100,
};
assert_eq!(header.total_size(), 108);
}
#[test]
fn is_chunk_validation() {
let header = ChunkHeader {
id: ChunkId::from_str("MVER").unwrap(),
size: 4,
};
assert!(header.is_chunk(ChunkId::from_str("MVER").unwrap()));
assert!(!header.is_chunk(ChunkId::from_str("MHDR").unwrap()));
}
#[test]
fn zero_size_chunk() {
let data = [
0x54, 0x53, 0x45, 0x54, 0x00, 0x00, 0x00, 0x00, ];
let mut cursor = Cursor::new(&data);
let header = ChunkHeader::read(&mut cursor).expect("parse zero size chunk");
assert_eq!(header.size, 0);
assert_eq!(header.total_size(), 8);
}
}