use rust_alloc::collections::BTreeMap;
use rust_alloc::vec;
use rust_alloc::vec::Vec;
use crate::wire::tag::{DATA_MASK, Kind, Tag};
use crate::{Decode, Encode};
#[derive(Debug, PartialEq, Encode, Decode)]
#[musli(crate, name(type = usize))]
struct Inner {
#[musli(name = 0)]
a: u32,
}
#[derive(Debug, PartialEq, Encode, Decode)]
#[musli(crate, name(type = usize))]
struct Outer {
#[musli(name = 0)]
inner: Inner,
#[musli(name = 1)]
b: u32,
}
fn cont(n: u8) -> u8 {
Tag::new(Kind::Continuation, n).byte()
}
fn odd_inner(header: &[u8]) -> Vec<u8> {
let mut bytes = vec![Tag::new(Kind::Sequence, 4).byte(), cont(0)];
bytes.extend_from_slice(header);
bytes.extend_from_slice(&[cont(0), cont(10), cont(1), cont(20)]);
bytes
}
#[test]
fn odd_struct_len() {
let even = crate::wire::to_vec(&Outer {
inner: Inner { a: 10 },
b: 20,
})
.unwrap();
assert!(crate::wire::from_slice::<Outer>(&even).is_ok());
let bytes = odd_inner(&[Tag::new(Kind::Sequence, 3).byte()]);
let result = crate::wire::from_slice::<Outer>(&bytes);
assert!(result.is_err(), "{result:?}");
let bytes = odd_inner(&[Tag::new(Kind::Sequence, DATA_MASK).byte(), 3]);
let result = crate::wire::from_slice::<Outer>(&bytes);
assert!(result.is_err(), "{result:?}");
}
#[derive(Debug, PartialEq, Encode, Decode)]
#[musli(crate, name(type = usize))]
struct WithMap {
#[musli(name = 0)]
map: BTreeMap<u32, u32>,
#[musli(name = 1)]
b: u32,
}
#[test]
fn odd_map_len() {
let expected = WithMap {
map: BTreeMap::from([(0, 1)]),
b: 20,
};
let even = crate::wire::to_vec(&expected).unwrap();
assert_eq!(crate::wire::from_slice::<WithMap>(&even).unwrap(), expected);
let bytes = vec![
Tag::new(Kind::Sequence, 4).byte(),
cont(0),
Tag::new(Kind::Sequence, 3).byte(),
cont(0),
cont(1),
cont(1),
cont(20),
];
let result = crate::wire::from_slice::<WithMap>(&bytes);
assert!(result.is_err(), "{result:?}");
for len in [1, 3] {
let mut bytes = vec![Tag::new(Kind::Sequence, len).byte()];
bytes.extend((0..len).map(cont));
let result = crate::wire::from_slice::<BTreeMap<u32, u32>>(&bytes);
assert!(result.is_err(), "{len}: {result:?}");
}
}