use bebytes::BeBytes;
#[test]
fn test_derive_generates_working_code() {
#[derive(BeBytes)]
struct Critical {
value: u32,
}
let test = Critical { value: 0x12345678 };
let bytes = test.to_be_bytes();
assert_eq!(bytes.len(), 4);
assert_eq!(bytes, vec![0x12, 0x34, 0x56, 0x78]);
let (parsed, consumed) = Critical::try_from_be_bytes(&bytes).unwrap();
assert_eq!(consumed, 4);
assert_eq!(parsed.value, 0x12345678);
assert_eq!(Critical::field_size(), 4);
}
#[test]
fn test_all_primitive_sizes_work() {
#[derive(BeBytes, Debug, PartialEq)]
struct U8Test {
value: u8,
}
assert_eq!(U8Test::field_size(), 1);
let test = U8Test { value: 0xFF };
let bytes = test.to_be_bytes();
assert_eq!(bytes.len(), 1);
#[derive(BeBytes, Debug, PartialEq)]
struct U16Test {
value: u16,
}
assert_eq!(U16Test::field_size(), 2);
let test = U16Test { value: 0xFFFF };
let bytes = test.to_be_bytes();
assert_eq!(bytes.len(), 2);
#[derive(BeBytes, Debug, PartialEq)]
struct U32Test {
value: u32,
}
assert_eq!(U32Test::field_size(), 4);
let test = U32Test { value: 0xFFFFFFFF };
let bytes = test.to_be_bytes();
assert_eq!(bytes.len(), 4);
#[derive(BeBytes, Debug, PartialEq)]
struct U64Test {
value: u64,
}
assert_eq!(U64Test::field_size(), 8);
let test = U64Test {
value: 0xFFFFFFFFFFFFFFFF,
};
let bytes = test.to_be_bytes();
assert_eq!(bytes.len(), 8);
#[derive(BeBytes, Debug, PartialEq)]
struct U128Test {
value: u128,
}
assert_eq!(U128Test::field_size(), 16);
let test = U128Test {
value: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
};
let bytes = test.to_be_bytes();
assert_eq!(bytes.len(), 16);
}
#[test]
fn test_bit_arithmetic_multiplication() {
#[derive(BeBytes, Debug, PartialEq)]
struct BitMultiplyTest {
array: [u8; 10], }
assert_eq!(BitMultiplyTest::field_size(), 10);
let test = BitMultiplyTest { array: [0xAA; 10] };
let bytes = test.to_be_bytes();
assert_eq!(bytes.len(), 10);
assert_eq!(bytes, vec![0xAA; 10]);
}
#[test]
fn test_bit_position_addition() {
#[derive(BeBytes, Debug, PartialEq)]
struct BitAddTest {
#[bits(4)]
first: u8,
#[bits(4)]
second: u8,
#[bits(8)]
third: u8,
}
assert_eq!(BitAddTest::field_size(), 2);
let test = BitAddTest {
first: 0xF,
second: 0xF,
third: 0xFF,
};
let bytes = test.to_be_bytes();
assert_eq!(bytes.len(), 2);
assert_eq!(bytes[0], 0xFF); assert_eq!(bytes[1], 0xFF); }
#[test]
fn test_byte_boundary_arithmetic() {
#[derive(BeBytes, Debug, PartialEq)]
struct ByteBoundaryTest {
#[bits(7)]
seven: u8,
#[bits(9)]
nine: u16,
}
assert_eq!(ByteBoundaryTest::field_size(), 2);
let test = ByteBoundaryTest {
seven: 0x7F,
nine: 0x1FF,
};
let bytes = test.to_be_bytes();
assert_eq!(bytes.len(), 2);
}
#[test]
fn test_field_type_determination() {
#[derive(BeBytes, Debug, PartialEq)]
struct TypeDetectionTest {
array_field: [u8; 5],
primitive_field: u32,
}
assert_eq!(TypeDetectionTest::field_size(), 5 + 4);
let test = TypeDetectionTest {
array_field: [1, 2, 3, 4, 5],
primitive_field: 0x12345678,
};
let bytes = test.to_be_bytes();
assert_eq!(bytes.len(), 9);
let (parsed, consumed) = TypeDetectionTest::try_from_be_bytes(&bytes).unwrap();
assert_eq!(consumed, 9);
assert_eq!(parsed, test);
}
#[test]
fn test_enum_size_calculation() {
#[derive(BeBytes, Debug, PartialEq, Clone, Copy)]
enum TestEnum {
A = 0,
B = 127,
C = 255,
}
#[derive(BeBytes, Debug, PartialEq)]
struct EnumSizeTest {
value: TestEnum,
}
assert_eq!(EnumSizeTest::field_size(), 1);
for variant in [TestEnum::A, TestEnum::B, TestEnum::C] {
let test = EnumSizeTest { value: variant };
let bytes = test.to_be_bytes();
assert_eq!(bytes.len(), 1);
let (parsed, _) = EnumSizeTest::try_from_be_bytes(&bytes).unwrap();
assert_eq!(parsed.value as u8, variant as u8);
}
}
#[test]
fn test_bit_shift_operations() {
#[derive(BeBytes, Debug, PartialEq)]
struct BitShiftTest {
#[bits(1)]
bit0: u8,
#[bits(1)]
bit1: u8,
#[bits(1)]
bit2: u8,
#[bits(1)]
bit3: u8,
#[bits(1)]
bit4: u8,
#[bits(1)]
bit5: u8,
#[bits(1)]
bit6: u8,
#[bits(1)]
bit7: u8,
}
let test = BitShiftTest {
bit0: 1,
bit1: 0,
bit2: 1,
bit3: 0,
bit4: 1,
bit5: 0,
bit6: 1,
bit7: 0,
};
let bytes = test.to_be_bytes();
assert_eq!(bytes[0], 0xAA);
let (parsed, _) = BitShiftTest::try_from_be_bytes(&bytes).unwrap();
assert_eq!(parsed.bit0, 1);
assert_eq!(parsed.bit1, 0);
assert_eq!(parsed.bit2, 1);
assert_eq!(parsed.bit3, 0);
assert_eq!(parsed.bit4, 1);
assert_eq!(parsed.bit5, 0);
assert_eq!(parsed.bit6, 1);
assert_eq!(parsed.bit7, 0);
}
#[test]
fn test_boundary_conditions() {
#[derive(BeBytes, Debug, PartialEq)]
struct BoundaryConditionTest {
#[bits(8)]
exactly_one_byte: u8,
#[bits(16)]
exactly_two_bytes: u16,
}
assert_eq!(BoundaryConditionTest::field_size(), 3);
let test = BoundaryConditionTest {
exactly_one_byte: 255,
exactly_two_bytes: 65535,
};
let bytes = test.to_be_bytes();
assert_eq!(bytes.len(), 3);
let (parsed, _) = BoundaryConditionTest::try_from_be_bytes(&bytes).unwrap();
assert_eq!(parsed.exactly_one_byte, 255);
assert_eq!(parsed.exactly_two_bytes, 65535);
}
#[test]
fn test_attribute_parsing() {
#[derive(BeBytes, Debug, PartialEq)]
struct AttributeTest {
#[bits(5)]
five_bit_field: u8,
#[bits(3)]
three_bit_field: u8,
#[bits(16)]
sixteen_bit_field: u16,
}
let test = AttributeTest {
five_bit_field: 31, three_bit_field: 7, sixteen_bit_field: 0xFFFF,
};
assert_eq!(AttributeTest::field_size(), 3);
let bytes = test.to_be_bytes();
assert_eq!(bytes.len(), 3);
let (parsed, _) = AttributeTest::try_from_be_bytes(&bytes).unwrap();
assert_eq!(parsed.five_bit_field, 31);
assert_eq!(parsed.three_bit_field, 7);
assert_eq!(parsed.sixteen_bit_field, 0xFFFF);
}