use bebytes::BeBytes;
mod basic_bitfields {
use super::*;
#[derive(BeBytes, Debug, PartialEq)]
struct SimpleBitfield {
#[bits(4)]
high_nibble: u8,
#[bits(4)]
low_nibble: u8,
}
#[test]
fn test_single_byte_bitfield() {
let data = SimpleBitfield {
high_nibble: 0xA,
low_nibble: 0x5,
};
let bytes = data.to_be_bytes();
assert_eq!(bytes.len(), 1);
assert_eq!(bytes[0], 0xA5);
let (decoded, _) = SimpleBitfield::try_from_be_bytes(&bytes).unwrap();
assert_eq!(decoded, data);
}
#[test]
fn test_uneven_bitfields() {
#[derive(BeBytes, Debug, PartialEq)]
struct UnevenBits {
#[bits(3)]
three_bits: u8,
#[bits(5)]
five_bits: u8,
}
let data = UnevenBits {
three_bits: 0b101,
five_bits: 0b11010,
};
let bytes = data.to_be_bytes();
assert_eq!(bytes.len(), 1);
assert_eq!(bytes[0], 0b10111010);
let (decoded, _) = UnevenBits::try_from_be_bytes(&bytes).unwrap();
assert_eq!(decoded, data);
}
}
mod boundary_crossing {
use super::*;
#[derive(BeBytes, Debug, PartialEq)]
struct CrossByteBoundary {
#[bits(12)]
twelve_bits: u16,
#[bits(10)]
ten_bits: u16,
#[bits(7)]
seven_bits: u8,
#[bits(3)]
three_bits: u8,
}
#[test]
fn test_boundary_crossing_bitfield() {
let data = CrossByteBoundary {
twelve_bits: 0x123,
ten_bits: 0x1FF,
seven_bits: 65,
three_bits: 2,
};
let bytes = data.to_be_bytes();
assert_eq!(bytes.len(), 4);
let (decoded, consumed) = CrossByteBoundary::try_from_be_bytes(&bytes).unwrap();
assert_eq!(consumed, 4);
assert_eq!(decoded, data);
}
#[test]
fn test_boundary_at_different_positions() {
#[derive(BeBytes, Debug, PartialEq)]
struct BoundaryPositions {
#[bits(7)] field1: u8,
#[bits(6)] field2: u8,
#[bits(3)] field3: u8,
}
let data = BoundaryPositions {
field1: 0x7F, field2: 0x3F, field3: 0x07, };
let bytes = data.to_be_bytes();
assert_eq!(bytes.len(), 2);
let (decoded, _) = BoundaryPositions::try_from_be_bytes(&bytes).unwrap();
assert_eq!(decoded, data);
}
}
mod multibyte_bitfields {
use super::*;
#[derive(BeBytes, Debug, PartialEq)]
struct LargeBitfields {
#[bits(20)]
large_field: u32,
#[bits(12)]
medium_field: u16,
}
#[test]
fn test_large_bitfields() {
let data = LargeBitfields {
large_field: 0xABCDE,
medium_field: 0xFED,
};
let bytes = data.to_be_bytes();
assert_eq!(bytes.len(), 4);
let (decoded, _) = LargeBitfields::try_from_be_bytes(&bytes).unwrap();
assert_eq!(decoded, data);
}
#[test]
fn test_mixed_sizes() {
#[derive(BeBytes, Debug, PartialEq)]
struct MixedSizes {
#[bits(64)]
full_u64: u64,
#[bits(32)]
full_u32: u32,
#[bits(16)]
full_u16: u16,
#[bits(8)]
full_u8: u8,
}
let data = MixedSizes {
full_u64: 0xDEADBEEFCAFEBABE,
full_u32: 0x12345678,
full_u16: 0xABCD,
full_u8: 0xEF,
};
let bytes = data.to_be_bytes();
assert_eq!(bytes.len(), 15);
let (decoded, _) = MixedSizes::try_from_be_bytes(&bytes).unwrap();
assert_eq!(decoded, data);
}
}
mod edge_cases {
use super::*;
#[test]
fn test_single_bit_fields() {
#[derive(BeBytes, Debug, PartialEq)]
struct SingleBits {
#[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 data = SingleBits {
bit0: 1,
bit1: 0,
bit2: 1,
bit3: 0,
bit4: 1,
bit5: 0,
bit6: 1,
bit7: 0,
};
let bytes = data.to_be_bytes();
assert_eq!(bytes.len(), 1);
assert_eq!(bytes[0], 0b10101010);
let (decoded, _) = SingleBits::try_from_be_bytes(&bytes).unwrap();
assert_eq!(decoded, data);
}
#[test]
fn test_max_values() {
#[derive(BeBytes, Debug, PartialEq)]
struct MaxValues {
#[bits(7)]
seven_bits: u8,
#[bits(15)]
fifteen_bits: u16,
#[bits(10)]
ten_bits: u16,
}
let data = MaxValues {
seven_bits: 0x7F, fifteen_bits: 0x7FFF, ten_bits: 0x3FF, };
let bytes = data.to_be_bytes();
let (decoded, _) = MaxValues::try_from_be_bytes(&bytes).unwrap();
assert_eq!(decoded, data);
}
}
mod endianness {
use super::*;
#[derive(BeBytes, Debug, PartialEq)]
struct BitfieldEndian {
#[bits(12)]
field1: u16,
#[bits(20)]
field2: u32,
}
#[test]
fn test_bitfield_endianness() {
let data = BitfieldEndian {
field1: 0xABC,
field2: 0xDEF01,
};
let be_bytes = data.to_be_bytes();
let le_bytes = data.to_le_bytes();
let (be_decoded, _) = BitfieldEndian::try_from_be_bytes(&be_bytes).unwrap();
let (le_decoded, _) = BitfieldEndian::try_from_le_bytes(&le_bytes).unwrap();
assert_eq!(be_decoded, data);
assert_eq!(le_decoded, data);
}
}