use alloc::vec::Vec;
use binrw::binrw;
#[binrw]
#[derive(Debug)]
pub(super) struct ForeignDataRaw {
pub n_length: i32,
#[br(count = usize::try_from(n_length.max(0)).unwrap_or(0))]
pub data: Vec<u8>,
}
#[cfg(test)]
mod tests {
use super::*;
use alloc::boxed::Box;
use binrw::BinRead;
use std::io::Cursor;
#[test]
fn foreign_data_empty() -> Result<(), Box<dyn std::error::Error>> {
let bytes: [u8; 4] = [0, 0, 0, 0];
let mut reader = Cursor::new(&bytes[..]);
let raw = ForeignDataRaw::read_le(&mut reader)?;
assert_eq!(raw.n_length, 0);
assert!(raw.data.is_empty());
Ok(())
}
#[test]
fn foreign_data_with_payload() -> Result<(), Box<dyn std::error::Error>> {
let bytes: [u8; 8] = [4, 0, 0, 0, 0xDE, 0xAD, 0xBE, 0xEF];
let mut reader = Cursor::new(&bytes[..]);
let raw = ForeignDataRaw::read_le(&mut reader)?;
assert_eq!(raw.n_length, 4);
assert_eq!(raw.data.len(), 4);
assert_eq!(raw.data.first().copied(), Some(0xDE));
Ok(())
}
#[test]
fn foreign_data_negative_length_yields_empty() -> Result<(), Box<dyn std::error::Error>> {
let bytes: [u8; 4] = [0xFF, 0xFF, 0xFF, 0xFF];
let mut reader = Cursor::new(&bytes[..]);
let raw = ForeignDataRaw::read_le(&mut reader)?;
assert_eq!(raw.n_length, -1);
assert!(raw.data.is_empty());
Ok(())
}
}