extern crate alloc;
use alloc::vec::Vec;
use super::super::super::super::support::dot;
use super::have;
use crate::metis::{DotSet, HaveSetDecodeBudget, HaveSetDecodeError};
#[test]
fn test_have_set_from_prefix_splits_the_tail() {
let set = have(&[(1, 1), (1, 2), (1, 4)]);
let mut framed = set.to_bytes();
let tail: &[u8] = &[0xDE, 0xAD, 0xBE, 0xEF];
framed.extend_from_slice(tail);
let (decoded, rest) = DotSet::from_prefix(&framed).expect("prefix decodes");
assert_eq!(decoded, set);
assert_eq!(rest, tail);
assert!(matches!(
DotSet::from_bytes(&framed),
Err(HaveSetDecodeError::UnexpectedLength { .. })
));
}
#[test]
fn test_explicit_prefix_budget_is_independent_of_tail_length() {
let mut set = DotSet::new();
for counter in 2..=100 {
assert!(set.insert(dot(1, counter)));
}
let frame = set.to_bytes();
let budget = HaveSetDecodeBudget::new(set.exceptions_len());
for tail in [&[][..], &[0; 1][..], &[0; 128][..]] {
let mut bytes = frame.clone();
bytes.extend_from_slice(tail);
let (decoded, rest) = DotSet::from_prefix_with_budget(&bytes, budget)
.expect("validated exception budget admits the dense frame");
assert_eq!(decoded, set);
assert_eq!(rest, tail);
}
}
#[test]
fn test_have_set_from_bytes_rejects_unknown_version() {
let mut frame = have(&[(1, 1)]).to_bytes();
frame[0] = 0x02;
assert_eq!(
DotSet::from_bytes(&frame),
Err(HaveSetDecodeError::UnknownVersion(0x02))
);
}
#[test]
fn test_have_set_from_bytes_rejects_short_input() {
assert!(matches!(
DotSet::from_bytes(&[0x01, 0x00]),
Err(HaveSetDecodeError::UnexpectedLength { .. })
));
assert!(matches!(
DotSet::from_bytes(&[0x01, 0xFF, 0xFF, 0xFF, 0xFF]),
Err(HaveSetDecodeError::UnexpectedLength { .. })
));
let mut runaway = Vec::new();
runaway.push(0x01u8);
runaway.extend_from_slice(&1u32.to_be_bytes()); runaway.extend_from_slice(&7u32.to_be_bytes()); runaway.extend_from_slice(&0u64.to_be_bytes()); runaway.extend_from_slice(&u32::MAX.to_be_bytes()); assert!(matches!(
DotSet::from_bytes(&runaway),
Err(HaveSetDecodeError::UnexpectedLength { .. })
));
}