#![cfg(feature = "arbitrary")]
use crate::{BytesM, ScMap, ScSpecEntry, StringM, VecM, SCSYMBOL_LIMIT};
use arbitrary::{Arbitrary, Unstructured};
use rand::{rngs::StdRng, RngCore, SeedableRng};
#[test]
fn arb() {
let bytes: Vec<u8> = (1u8..255).collect();
let mut unstructured = Unstructured::new(&bytes);
for _ in 1..10 {
let x: ScMap = ScMap::arbitrary(&mut unstructured).unwrap();
eprintln!("{x:?}");
}
}
#[test]
fn arbitrary_stays_within_max() {
let mut bytes = [0u8; 4096];
StdRng::seed_from_u64(0).fill_bytes(&mut bytes);
for start in 0..bytes.len() / 2 {
let mut u = Unstructured::new(&bytes[start..]);
assert!(StringM::<3>::arbitrary(&mut u).unwrap().len() <= 3);
assert!(BytesM::<5>::arbitrary(&mut u).unwrap().len() <= 5);
assert!(VecM::<u32, 2>::arbitrary(&mut u).unwrap().len() <= 2);
}
}
#[test]
fn arbitrary_does_not_consume_past_max() {
let bytes = vec![1u8; 64];
let mut u = Unstructured::new(&bytes);
let v = VecM::<u8, 2>::arbitrary(&mut u).unwrap();
assert_eq!(v.len(), 2);
assert_eq!(bytes.len() - u.len(), 4);
}
#[test]
fn arbitrary_generated_type_stays_within_max() {
let mut bytes = [0u8; 8192];
StdRng::seed_from_u64(0).fill_bytes(&mut bytes);
for start in 0..bytes.len() / 2 {
let mut u = Unstructured::new(&bytes[start..]);
let Ok(entry) = ScSpecEntry::arbitrary(&mut u) else {
continue;
};
if let ScSpecEntry::FunctionV0(f) = entry {
assert!(f.outputs.len() <= 1);
assert!(f.name.len() <= SCSYMBOL_LIMIT as usize);
for i in &*f.inputs {
assert!(i.name.len() <= 30);
}
}
}
}