use crate::Encode;
use arbitrary::{Arbitrary, Unstructured};
use commonware_conformance::Conformance;
use rand::{Rng, SeedableRng};
use rand_chacha::ChaCha8Rng;
use std::{fmt::Debug, marker::PhantomData};
const ARBITRARY_BUFFER_SIZE: usize = 4096;
pub fn generate_value<T>(seed: u64) -> T
where
T: for<'a> Arbitrary<'a>,
{
let mut rng = ChaCha8Rng::seed_from_u64(seed);
let mut buffer = vec![0u8; ARBITRARY_BUFFER_SIZE];
rng.fill(&mut buffer[..]);
let mut unstructured = Unstructured::new(&buffer);
T::arbitrary(&mut unstructured).expect("failed to generate arbitrary value")
}
#[derive(Debug, Clone, Copy)]
pub struct CodecConformance<T>(PhantomData<T>);
impl<T> Conformance for CodecConformance<T>
where
T: Encode + for<'a> Arbitrary<'a> + Send + Sync,
{
async fn commit(seed: u64) -> Vec<u8> {
let value: T = generate_value(seed);
value.encode().to_vec()
}
}