use criterion::{black_box, criterion_group, criterion_main, Criterion};
use proptest::{prelude::*, test_runner::TestRunner};
use proptest_derive::Arbitrary;
#[derive(Arbitrary, Debug)]
#[proptest(no_params)]
enum LargeEnum1 {
V1(String),
V2(String),
V3(String),
V4(String),
V5(String),
V6(String),
V7(String),
V8(String),
V9(String),
V10(String),
V11(String),
V12(String),
V13(String),
V14(String),
V15(String),
V16(String),
}
#[derive(Arbitrary, Debug)]
#[proptest(no_params)]
enum LargeEnum2 {
V1(LargeEnum1),
V2(LargeEnum1),
V3(LargeEnum1),
V4(LargeEnum1),
V5(LargeEnum1),
V6(LargeEnum1),
V7(LargeEnum1),
V8(LargeEnum1),
V9(LargeEnum1),
V10(LargeEnum1),
V11(LargeEnum1),
V12(LargeEnum1),
V13(LargeEnum1),
V14(LargeEnum1),
V15(LargeEnum1),
V16(LargeEnum1),
}
fn enum1_bench(runner: &mut TestRunner) {
let strategy = any::<LargeEnum1>();
let _ = black_box(strategy.new_tree(runner));
}
fn enum2_bench(runner: &mut TestRunner) {
let strategy = any::<LargeEnum2>();
let _ = black_box(strategy.new_tree(runner));
}
fn enum_benchmark(c: &mut Criterion) {
c.bench_function("enum 1", |b| {
let mut runner = TestRunner::default();
b.iter(|| enum1_bench(&mut runner))
});
c.bench_function("enum 2", |b| {
let mut runner = TestRunner::default();
b.iter(|| enum2_bench(&mut runner))
});
}
criterion_group!(benches, enum_benchmark);
criterion_main!(benches);