use bebytes::BeBytes;
#[derive(Debug, Clone, PartialEq, BeBytes)]
struct InsufficientDataTest {
count: u8,
#[FromField(count)]
#[UntilMarker(0xAA)]
segments: Vec<Vec<u8>>,
}
#[test]
fn test_insufficient_data() {
let bytes = vec![
3, 0x01, 0x02, 0xAA, 0x03, 0x04,
0xAA, ];
let result = InsufficientDataTest::try_from_be_bytes(&bytes);
match result {
Err(bebytes::BeBytesError::MarkerNotFound { marker, field }) => {
assert_eq!(marker, 0xAA);
assert_eq!(field, "segments");
}
Ok(_) => panic!("Expected MarkerNotFound error"),
Err(e) => panic!("Wrong error type: {:?}", e),
}
}
#[derive(Debug, Clone, PartialEq, BeBytes)]
struct MissingMarkersTest {
count: u8,
#[FromField(count)]
#[UntilMarker(0xBB)]
segments: Vec<Vec<u8>>,
}
#[test]
fn test_missing_markers() {
let bytes = vec![
2, 0x11, 0x22, 0x33, 0x44, ];
let result = MissingMarkersTest::try_from_be_bytes(&bytes);
match result {
Err(bebytes::BeBytesError::MarkerNotFound { marker, field }) => {
assert_eq!(marker, 0xBB);
assert_eq!(field, "segments");
}
Ok(_) => panic!("Expected MarkerNotFound error"),
Err(e) => panic!("Wrong error type: {:?}", e),
}
}
#[derive(Debug, Clone, PartialEq, BeBytes)]
struct ZeroSegmentsTest {
count: u8,
#[FromField(count)]
#[UntilMarker(0xCC)]
segments: Vec<Vec<u8>>,
footer: u8,
}
#[test]
fn test_zero_segments() {
let msg = ZeroSegmentsTest {
count: 0,
segments: vec![],
footer: 0x99,
};
let bytes = msg.to_be_bytes();
let expected = vec![0, 0x99];
assert_eq!(bytes, expected);
let (parsed, consumed) = ZeroSegmentsTest::try_from_be_bytes(&bytes).unwrap();
assert_eq!(consumed, bytes.len());
assert_eq!(parsed, msg);
assert_eq!(parsed.segments.len(), 0);
}
#[derive(Debug, Clone, PartialEq, BeBytes)]
struct AllEmptySegments {
#[With(size(3))]
#[UntilMarker(0xEE)]
segments: Vec<Vec<u8>>,
}
#[test]
fn test_all_empty_segments() {
let msg = AllEmptySegments {
segments: vec![vec![], vec![], vec![]],
};
let bytes = msg.to_be_bytes();
let expected = vec![0xEE, 0xEE, 0xEE];
assert_eq!(bytes, expected);
let (parsed, consumed) = AllEmptySegments::try_from_be_bytes(&bytes).unwrap();
assert_eq!(consumed, bytes.len());
assert_eq!(parsed, msg);
assert_eq!(parsed.segments.len(), 3);
assert!(parsed.segments.iter().all(|seg| seg.is_empty()));
}
#[derive(Debug, Clone, PartialEq, BeBytes)]
struct MarkerInDataTest {
#[With(size(2))]
#[UntilMarker(0xFF)]
segments: Vec<Vec<u8>>,
}
#[test]
fn test_marker_in_data_terminates_segment() {
let bytes = vec![
0x01, 0xFF, 0x02, 0xFF, 0x33, ];
let (parsed, consumed) = MarkerInDataTest::try_from_be_bytes(&bytes).unwrap();
assert_eq!(consumed, 4); assert_eq!(parsed.segments.len(), 2);
assert_eq!(parsed.segments[0], vec![0x01]);
assert_eq!(parsed.segments[1], vec![0x02]);
}
#[derive(Debug, Clone, PartialEq, BeBytes)]
struct LargeSegmentCount {
count: u8,
#[FromField(count)]
#[UntilMarker(0x00)]
segments: Vec<Vec<u8>>,
}
#[test]
fn test_large_segment_count() {
let mut segments = Vec::new();
let mut expected_bytes = vec![255];
for i in 1..=255 {
segments.push(vec![i as u8]);
expected_bytes.push(i as u8);
expected_bytes.push(0x00); }
let msg = LargeSegmentCount {
count: 255,
segments,
};
let bytes = msg.to_be_bytes();
assert_eq!(bytes, expected_bytes);
assert_eq!(bytes.len(), 1 + 255 * 2);
let (parsed, consumed) = LargeSegmentCount::try_from_be_bytes(&bytes).unwrap();
assert_eq!(consumed, bytes.len());
assert_eq!(parsed, msg);
assert_eq!(parsed.segments.len(), 255);
}