use arbitrary::{Arbitrary, Result, Unstructured};
pub trait Config: Arbitrary + Default {
fn max_types(&self) -> usize {
100
}
fn max_imports(&self) -> usize {
100
}
fn max_funcs(&self) -> usize {
100
}
fn max_globals(&self) -> usize {
100
}
fn max_exports(&self) -> usize {
100
}
fn max_element_segments(&self) -> usize {
100
}
fn max_elements(&self) -> usize {
100
}
fn max_data_segments(&self) -> usize {
100
}
fn max_instructions(&self) -> usize {
100
}
fn max_memories(&self) -> u32 {
1
}
fn max_tables(&self) -> u32 {
1
}
fn memory_offset_choices(&self) -> (u32, u32, u32) {
(75, 24, 1)
}
fn min_uleb_size(&self) -> u8 {
1
}
fn bulk_memory_enabled(&self) -> bool {
false
}
fn reference_types_enabled(&self) -> bool {
false
}
}
#[derive(Arbitrary, Debug, Default, Copy, Clone)]
pub struct DefaultConfig;
impl Config for DefaultConfig {}
#[derive(Clone, Debug, Default)]
pub struct SwarmConfig {
max_types: usize,
max_imports: usize,
max_funcs: usize,
max_globals: usize,
max_exports: usize,
max_element_segments: usize,
max_elements: usize,
max_data_segments: usize,
max_instructions: usize,
max_memories: u32,
min_uleb_size: u8,
max_tables: u32,
bulk_memory_enabled: bool,
reference_types_enabled: bool,
}
impl Arbitrary for SwarmConfig {
fn arbitrary(u: &mut Unstructured<'_>) -> Result<Self> {
const MAX_MAXIMUM: usize = 1000;
let reference_types_enabled: bool = u.arbitrary()?;
let max_tables = if reference_types_enabled { 100 } else { 1 };
Ok(SwarmConfig {
max_types: u.int_in_range(0..=MAX_MAXIMUM)?,
max_imports: u.int_in_range(0..=MAX_MAXIMUM)?,
max_funcs: u.int_in_range(0..=MAX_MAXIMUM)?,
max_globals: u.int_in_range(0..=MAX_MAXIMUM)?,
max_exports: u.int_in_range(0..=MAX_MAXIMUM)?,
max_element_segments: u.int_in_range(0..=MAX_MAXIMUM)?,
max_elements: u.int_in_range(0..=MAX_MAXIMUM)?,
max_data_segments: u.int_in_range(0..=MAX_MAXIMUM)?,
max_instructions: u.int_in_range(0..=MAX_MAXIMUM)?,
max_memories: u.int_in_range(0..=100)?,
max_tables,
min_uleb_size: u.int_in_range(0..=5)?,
bulk_memory_enabled: u.arbitrary()?,
reference_types_enabled,
})
}
}
impl Config for SwarmConfig {
fn max_types(&self) -> usize {
self.max_types
}
fn max_imports(&self) -> usize {
self.max_imports
}
fn max_funcs(&self) -> usize {
self.max_funcs
}
fn max_globals(&self) -> usize {
self.max_globals
}
fn max_exports(&self) -> usize {
self.max_exports
}
fn max_element_segments(&self) -> usize {
self.max_element_segments
}
fn max_elements(&self) -> usize {
self.max_elements
}
fn max_data_segments(&self) -> usize {
self.max_data_segments
}
fn max_instructions(&self) -> usize {
self.max_instructions
}
fn max_memories(&self) -> u32 {
self.max_memories
}
fn max_tables(&self) -> u32 {
self.max_tables
}
fn min_uleb_size(&self) -> u8 {
self.min_uleb_size
}
fn bulk_memory_enabled(&self) -> bool {
self.bulk_memory_enabled
}
fn reference_types_enabled(&self) -> bool {
self.reference_types_enabled
}
}