use super::*;
#[test]
fn encode_decode_round_trips() {
let bounds = [
(BlockOffset(0), (10u64, 20u64)),
(BlockOffset(4096), (5, 5)),
(BlockOffset(9000), (0, 1_000_000)),
];
let mut buf = Vec::new();
encode_seqno_bounds(&mut buf, &bounds).expect("encode");
let map = SeqnoBoundsMap::decode(&buf).expect("decode");
assert_eq!(map.len(), 3);
assert_eq!(map.bounds_for(0), Some((10, 20)));
assert_eq!(map.bounds_for(4096), Some((5, 5)));
assert_eq!(map.bounds_for(9000), Some((0, 1_000_000)));
assert_eq!(map.bounds_for(1), None);
assert_eq!(map.bounds_for(5000), None);
}
#[test]
fn decode_empty_section_is_empty_map() {
let mut buf = Vec::new();
encode_seqno_bounds(&mut buf, &[]).expect("encode");
let map = SeqnoBoundsMap::decode(&buf).expect("decode empty");
assert!(map.is_empty());
assert_eq!(map.bounds_for(0), None);
}
#[test]
fn decode_rejects_non_ascending_offsets() {
let mut buf = Vec::new();
buf.extend_from_slice(&2u32.to_le_bytes());
for (off, lo, hi) in [(100u64, 1u64, 2u64), (50, 1, 2)] {
buf.extend_from_slice(&off.to_le_bytes());
buf.extend_from_slice(&lo.to_le_bytes());
buf.extend_from_slice(&hi.to_le_bytes());
}
assert!(SeqnoBoundsMap::decode(&buf).is_err());
}
#[test]
fn decode_rejects_inverted_bounds() {
let mut buf = Vec::new();
buf.extend_from_slice(&1u32.to_le_bytes());
buf.extend_from_slice(&0u64.to_le_bytes());
buf.extend_from_slice(&9u64.to_le_bytes()); buf.extend_from_slice(&3u64.to_le_bytes()); assert!(SeqnoBoundsMap::decode(&buf).is_err());
}
#[test]
fn decode_rejects_truncated_payload() {
let buf = 1u32.to_le_bytes().to_vec();
assert!(SeqnoBoundsMap::decode(&buf).is_err());
}
#[test]
fn decode_rejects_trailing_bytes_after_last_entry() {
let mut buf = Vec::new();
encode_seqno_bounds(&mut buf, &[(BlockOffset(0), (1u64, 2u64))]).expect("encode");
buf.push(0xAB); assert!(SeqnoBoundsMap::decode(&buf).is_err());
}
#[test]
fn decode_rejects_count_larger_than_payload() {
let mut buf = Vec::new();
buf.extend_from_slice(&100_000u32.to_le_bytes()); buf.extend_from_slice(&0u64.to_le_bytes()); assert!(SeqnoBoundsMap::decode(&buf).is_err());
}