use eyre::Result;
use generic_array::{typenum::U9, GenericArray};
use std::{io, iter::repeat_with};
use tinyvec::ArrayVec;
use crate::{impl_bin_fields, Binable};
#[derive(Debug, Default, PartialEq)]
struct Primitives {
uints: (u8, u16, u32, u64, u128),
ints: (i8, i16, i32, i64, i128),
floats: (f32, f64),
}
impl Primitives {
fn rand() -> Self {
Primitives {
uints: (
fastrand::u8(..),
fastrand::u16(..),
fastrand::u32(..),
fastrand::u64(..),
fastrand::u128(..),
),
ints: (
fastrand::i8(..),
fastrand::i16(..),
fastrand::i32(..),
fastrand::i64(..),
fastrand::i128(..),
),
floats: (fastrand::f32(), fastrand::f64()),
}
}
}
impl Binable for Primitives {
impl_bin_fields! {uints, ints, floats}
}
#[test]
fn primitives() -> Result<()> {
let prims: Vec<_> = repeat_with(|| Primitives::rand()).take(9).collect();
let mut buf = io::Cursor::new(Vec::new());
prims.encode_into(&mut buf)?;
buf.set_position(0);
assert_eq!(prims, Vec::<_>::decode_from(&mut buf)?);
Ok(())
}
#[test]
fn tinyvec() -> Result<()> {
let prims: ArrayVec<[Primitives; 9]> = repeat_with(|| Primitives::rand()).take(9).collect();
let mut buf = io::Cursor::new(Vec::new());
prims.encode_into(&mut buf)?;
buf.set_position(0);
assert_eq!(prims, ArrayVec::decode_from(&mut buf)?);
Ok(())
}
#[test]
fn genarr() -> Result<()> {
let prims: GenericArray<Primitives, U9> = repeat_with(|| Primitives::rand()).take(9).collect();
let mut buf = io::Cursor::new(Vec::new());
prims.encode_into(&mut buf)?;
buf.set_position(0);
assert_eq!(prims, GenericArray::decode_from(&mut buf)?);
Ok(())
}