use bebytes::{BeBytes, BeBytesError};
mod error_display {
use super::*;
#[test]
fn test_error_display_formatting() {
let err = BeBytesError::EmptyBuffer;
assert_eq!(err.to_string(), "No bytes provided");
let err = BeBytesError::InsufficientData {
expected: 10,
actual: 5,
};
assert_eq!(err.to_string(), "Not enough bytes: expected 10, got 5");
let err = BeBytesError::InvalidDiscriminant {
value: 42,
type_name: "TestEnum",
};
assert_eq!(err.to_string(), "Invalid discriminant 42 for type TestEnum");
let err = BeBytesError::InvalidBitField {
value: 256,
max: 255,
field: "test_field",
};
assert_eq!(
err.to_string(),
"Value 256 exceeds maximum 255 for field test_field"
);
}
#[test]
fn test_error_traits() {
let err = BeBytesError::EmptyBuffer;
let debug_str = format!("{:?}", err);
assert_eq!(debug_str, "EmptyBuffer");
let cloned = err.clone();
assert_eq!(cloned, err);
assert_eq!(err, BeBytesError::EmptyBuffer);
assert_ne!(
err,
BeBytesError::InsufficientData {
expected: 1,
actual: 0
}
);
}
}
mod error_variants {
use super::*;
#[derive(BeBytes, Debug, PartialEq)]
struct TestStruct {
field1: u32,
field2: u16,
}
#[test]
fn test_empty_buffer_error() {
let empty_bytes: Vec<u8> = vec![];
let result = TestStruct::try_from_be_bytes(&empty_bytes);
match result {
Err(BeBytesError::EmptyBuffer) => {
}
_ => panic!("Expected EmptyBuffer error"),
}
}
#[test]
fn test_insufficient_data_error() {
let short_bytes = vec![0x12, 0x34]; let result = TestStruct::try_from_be_bytes(&short_bytes);
match result {
Err(BeBytesError::InsufficientData { expected, actual }) => {
assert_eq!(expected, 4); assert_eq!(actual, 2); }
_ => panic!("Expected InsufficientData error"),
}
}
#[derive(BeBytes, Debug, PartialEq, Clone, Copy)]
enum TestEnum {
A = 0,
B = 1,
C = 2,
}
#[test]
fn test_invalid_discriminant_error() {
match TestEnum::try_from(5u8) {
Err(BeBytesError::InvalidDiscriminant { value, type_name }) => {
assert_eq!(value, 5);
assert_eq!(type_name, "TestEnum");
}
_ => panic!("Expected InvalidDiscriminant error"),
}
}
#[test]
fn test_auto_enum_invalid_value() {
#[derive(BeBytes, Debug, PartialEq)]
struct EnumPacket {
#[bits(4)]
prefix: u8,
#[bits(2)] value: u8,
#[bits(2)] padding: u8,
}
let bytes = vec![0b0000_1100];
let (packet, _) = EnumPacket::try_from_be_bytes(&bytes).unwrap();
assert_eq!(packet.prefix, 0);
assert_eq!(packet.value, 3); assert_eq!(packet.padding, 0);
}
}
mod custom_result_alias {
use super::*;
type Result<T> = std::result::Result<T, String>;
#[derive(BeBytes, Debug, PartialEq)]
struct Packet {
header: u32,
data: u16,
}
#[test]
fn test_works_with_custom_result_alias() {
fn process_packet(bytes: &[u8]) -> Result<Packet> {
match Packet::try_from_be_bytes(bytes) {
Ok((packet, _)) => Ok(packet),
Err(e) => Err(format!("Failed to parse packet: {}", e)),
}
}
let bytes = vec![0xDE, 0xAD, 0xBE, 0xEF, 0x12, 0x34];
let result = process_packet(&bytes);
assert!(result.is_ok());
let short_bytes = vec![0x12, 0x34];
let result = process_packet(&short_bytes);
assert!(result.is_err());
assert!(result.unwrap_err().contains("Not enough bytes"));
}
}
mod error_propagation {
use super::*;
#[derive(BeBytes, Debug, PartialEq, Clone)]
struct Inner {
value: u32,
}
#[derive(BeBytes, Debug, PartialEq)]
struct Outer {
inner: Inner,
extra: u16,
}
#[test]
fn test_nested_error_propagation() {
let short_bytes = vec![0x12, 0x34];
match Outer::try_from_be_bytes(&short_bytes) {
Err(BeBytesError::InsufficientData { expected, actual }) => {
assert_eq!(expected, 4); assert_eq!(actual, 2);
}
_ => panic!("Expected error to propagate from Inner"),
}
}
#[derive(BeBytes, Debug, PartialEq)]
struct VectorPacket {
count: u8,
#[FromField(count)]
items: Vec<Inner>,
}
#[test]
fn test_vector_item_error_propagation() {
let bytes = vec![
2, 0x12, 0x34, 0x56, 0x78, 0xAB, 0xCD, ];
match VectorPacket::try_from_be_bytes(&bytes) {
Ok((packet, consumed)) => {
assert_eq!(packet.count, 2);
assert_eq!(packet.items.len(), 1);
assert_eq!(packet.items[0].value, 0x12345678);
assert_eq!(consumed, 5); }
Err(e) => panic!("Unexpected error: {:?}", e),
}
}
}
mod no_std_compatibility {
use super::*;
#[test]
fn test_error_display_no_std() {
#[cfg(not(feature = "std"))]
{
extern crate alloc;
use alloc::format;
let err = BeBytesError::EmptyBuffer;
let formatted = format!("{}", err);
assert_eq!(formatted, "No bytes provided");
}
#[cfg(feature = "std")]
{
let err = BeBytesError::EmptyBuffer;
let _formatted = format!("{}", err);
}
}
#[test]
fn test_error_size() {
use core::mem::size_of;
let size = size_of::<BeBytesError>();
println!("BeBytesError size: {} bytes", size);
assert!(size <= 64); }
}