#![cfg(feature = "derive")]
use bincode_next::BitPacked;
#[derive(BitPacked, Debug, PartialEq)]
enum SimpleEnum {
A,
B,
C,
}
#[derive(BitPacked, Debug, PartialEq)]
enum ComplexEnum {
Empty,
Single(u8),
Tuple(#[bincode(bits = 2)] u8, #[bincode(bits = 4)] u8),
StructLike {
#[bincode(bits = 1)]
flag: bool,
normal: u16,
#[bincode(bits = 3)]
tiny: u8,
},
}
#[test]
fn test_simple_enum() {
let config = bincode_next::config::legacy().with_bit_packing();
let encoded = bincode_next::encode_to_vec(SimpleEnum::C, config).unwrap();
assert_eq!(encoded.len(), 1);
let decoded: SimpleEnum = bincode_next::decode_from_slice(&encoded, config).unwrap().0;
assert_eq!(decoded, SimpleEnum::C);
}
#[test]
fn test_complex_enum_empty() {
let config = bincode_next::config::legacy().with_bit_packing();
let encoded = bincode_next::encode_to_vec(ComplexEnum::Empty, config).unwrap();
assert_eq!(encoded.len(), 1);
let decoded: ComplexEnum = bincode_next::decode_from_slice(&encoded, config).unwrap().0;
assert_eq!(decoded, ComplexEnum::Empty);
}
#[test]
fn test_complex_enum_tuple() {
let config = bincode_next::config::legacy().with_bit_packing();
let val = ComplexEnum::Tuple(3, 15);
let encoded = bincode_next::encode_to_vec(&val, config).unwrap();
assert_eq!(
encoded.len(),
1,
"Tuple should be tightly combined with discriminant and be 1 byte long"
);
let decoded: ComplexEnum = bincode_next::decode_from_slice(&encoded, config).unwrap().0;
assert_eq!(decoded, val);
}
#[test]
fn test_complex_enum_struct() {
let config = bincode_next::config::legacy().with_bit_packing();
let val = ComplexEnum::StructLike {
flag: true,
normal: 65000,
tiny: 7,
};
let encoded = bincode_next::encode_to_vec(&val, config).unwrap();
assert_eq!(
encoded.len(),
4,
"StructLike variant should be 4 bytes long"
);
let decoded: ComplexEnum = bincode_next::decode_from_slice(&encoded, config).unwrap().0;
assert_eq!(decoded, val);
}