use bebytes::BeBytes;
#[derive(Debug, Clone, PartialEq, BeBytes)]
struct FixedSizeSegments {
header: u8,
#[With(size(3))]
#[UntilMarker(0xFF)]
segments: Vec<Vec<u8>>,
footer: u8,
}
#[test]
fn test_fixed_size_segments() {
let msg = FixedSizeSegments {
header: 0x42,
segments: vec![
vec![0x01, 0x02], vec![0x03, 0x04, 0x05], vec![0x06], ],
footer: 0x99,
};
let bytes = msg.to_be_bytes();
let expected = vec![
0x42, 0x01, 0x02, 0xFF, 0x03, 0x04, 0x05, 0xFF, 0x06, 0xFF, 0x99, ];
assert_eq!(bytes, expected);
let (parsed, consumed) = FixedSizeSegments::try_from_be_bytes(&bytes).unwrap();
assert_eq!(consumed, bytes.len());
assert_eq!(parsed, msg);
}
#[derive(Debug, Clone, PartialEq, BeBytes)]
struct VariableSizeSegments {
version: u8,
segment_count: u8,
#[FromField(segment_count)]
#[UntilMarker(0xAA)]
data_segments: Vec<Vec<u8>>,
checksum: u16,
}
#[test]
fn test_variable_size_segments() {
let msg = VariableSizeSegments {
version: 1,
segment_count: 2,
data_segments: vec![
vec![0x11, 0x22, 0x33], vec![0x44, 0x55], ],
checksum: 0x1234,
};
let bytes = msg.to_be_bytes();
let expected = vec![
1, 2, 0x11, 0x22, 0x33, 0xAA, 0x44, 0x55, 0xAA, 0x12, 0x34, ];
assert_eq!(bytes, expected);
let (parsed, consumed) = VariableSizeSegments::try_from_be_bytes(&bytes).unwrap();
assert_eq!(consumed, bytes.len());
assert_eq!(parsed, msg);
}
#[derive(Debug, Clone, PartialEq, BeBytes)]
struct EmptySegments {
count: u8,
#[FromField(count)]
#[UntilMarker(0x00)]
segments: Vec<Vec<u8>>,
}
#[test]
fn test_empty_segments() {
let msg = EmptySegments {
count: 3,
segments: vec![
vec![0x01], vec![], vec![0x02, 0x03], ],
};
let bytes = msg.to_be_bytes();
let expected = vec![
3, 0x01, 0x00, 0x00, 0x02, 0x03, 0x00, ];
assert_eq!(bytes, expected);
let (parsed, consumed) = EmptySegments::try_from_be_bytes(&bytes).unwrap();
assert_eq!(consumed, bytes.len());
assert_eq!(parsed, msg);
}
#[derive(Debug, Clone, PartialEq, BeBytes)]
struct ComplexProtocol {
magic: u32,
version: u8,
option_count: u8,
#[FromField(option_count)]
#[UntilMarker(0xFE)]
options: Vec<Vec<u8>>,
payload_len: u16,
#[FromField(payload_len)]
payload: Vec<u8>,
}
#[test]
fn test_complex_protocol_round_trip() {
let original = ComplexProtocol {
magic: 0x12345678,
version: 2,
option_count: 3,
options: vec![
vec![0x01, 0x02], vec![0x03, 0x04, 0x05], vec![0x06], ],
payload_len: 4,
payload: vec![0xAA, 0xBB, 0xCC, 0xDD],
};
let bytes = original.to_be_bytes();
let (parsed, consumed) = ComplexProtocol::try_from_be_bytes(&bytes).unwrap();
assert_eq!(consumed, bytes.len());
assert_eq!(parsed, original);
let bytes2 = parsed.to_be_bytes();
assert_eq!(bytes, bytes2);
}