xc3_write 0.21.0

xc3_lib binary writing and layout
Documentation
use std::io::Cursor;

use hexlit::hex;
use xc3_write::{Endian, WriteFull, Xc3Write, Xc3WriteOffsets, assert_hex_eq};

#[test]
fn write_offset() {
    #[derive(Xc3Write, Xc3WriteOffsets)]
    struct Test {
        #[xc3(offset(u32))]
        a: u32,
    }

    let value = Test { a: 1 };

    let mut writer = Cursor::new(Vec::new());
    value.xc3_write(&mut writer, Endian::Little).unwrap();

    assert_hex_eq!(hex!(00000000), writer.into_inner());
}

#[test]
fn write_offset_full() {
    #[derive(Xc3Write, Xc3WriteOffsets)]
    struct Test {
        #[xc3(offset(u32))]
        inner: Inner,
    }

    #[derive(Xc3Write, Xc3WriteOffsets)]
    #[xc3(align(8))]
    struct Inner {
        a: u32,
    }

    let value = Test {
        inner: Inner { a: 1 },
    };

    let mut writer = Cursor::new(Vec::new());
    let mut data_ptr = 0;
    value
        .write_full(&mut writer, 0, &mut data_ptr, Endian::Little, ())
        .unwrap();

    assert_hex_eq!(hex!(08000000 00000000 01000000), writer.into_inner());
    assert_eq!(12, data_ptr);
}

#[test]
fn write_offset_full_align_0x0() {
    #[derive(Xc3Write, Xc3WriteOffsets)]
    struct Test {
        #[xc3(offset(u32), align(8))]
        a: u32,
    }

    let value = Test { a: 1 };

    let mut writer = Cursor::new(Vec::new());
    let mut data_ptr = 0;
    value
        .write_full(&mut writer, 0, &mut data_ptr, Endian::Little, ())
        .unwrap();

    assert_hex_eq!(hex!(08000000 00000000 01000000), writer.into_inner());
    assert_eq!(12, data_ptr);
}

#[test]
fn write_offset_full_align_0xff() {
    #[derive(Xc3Write, Xc3WriteOffsets)]
    struct Test {
        #[xc3(offset(u32), align(8, 0xff))]
        a: u32,
    }

    let value = Test { a: 1 };

    let mut writer = Cursor::new(Vec::new());
    let mut data_ptr = 0;
    value
        .write_full(&mut writer, 0, &mut data_ptr, Endian::Little, ())
        .unwrap();

    assert_hex_eq!(hex!(08000000 ffffffff 01000000), writer.into_inner());
    assert_eq!(12, data_ptr);
}

#[test]
fn write_offset_full_optional_offset_some() {
    #[derive(Xc3Write, Xc3WriteOffsets)]
    struct Test {
        #[xc3(offset(u32))]
        a: Option<u32>,
    }

    let value = Test { a: Some(1) };

    let mut writer = Cursor::new(Vec::new());
    let mut data_ptr = 0;
    value
        .write_full(&mut writer, 0, &mut data_ptr, Endian::Little, ())
        .unwrap();

    assert_hex_eq!(hex!(04000000 01000000), writer.into_inner());
    assert_eq!(8, data_ptr);
}

#[test]
fn write_offset_full_optional_offset_none() {
    #[derive(Xc3Write, Xc3WriteOffsets)]
    struct Test {
        #[xc3(offset(u32))]
        a: Option<u32>,
    }

    // This should still write a null offset.
    let value = Test { a: None };

    let mut writer = Cursor::new(Vec::new());
    let mut data_ptr = 0;
    value
        .write_full(&mut writer, 0, &mut data_ptr, Endian::Little, ())
        .unwrap();

    assert_hex_eq!(hex!(00000000), writer.into_inner());
    assert_eq!(4, data_ptr);
}