use super::{Alternative, Error, SplitMix64, monte_carlo_estimate, monte_carlo_p_value};
#[kani::proof]
#[kani::unwind(2)]
fn resampling_mc_estimate_rejects_small_n() {
let n_sims: usize = kani::any();
kani::assume(n_sims < 2);
let state: u64 = kani::any();
let mut rng = SplitMix64::new(state);
let result = monte_carlo_estimate(n_sims, &mut rng, |_r| 0.0);
assert!(
matches!(result, Err(Error::InsufficientData)),
"n_sims < 2 must be rejected with InsufficientData"
);
}
#[kani::proof]
fn resampling_mc_p_value_rejects_zero_n() {
let observed: f64 = kani::any();
let state: u64 = kani::any();
let mut rng = SplitMix64::new(state);
let result = monte_carlo_p_value(observed, 0, &mut rng, |_r| 0.0, Alternative::Greater);
assert!(
matches!(result, Err(Error::InsufficientData)),
"n_sims == 0 must be rejected with InsufficientData"
);
}
#[kani::proof]
#[kani::unwind(4)]
fn resampling_mc_p_value_bounded() {
let observed: f64 = kani::any();
kani::assume(observed.is_finite());
let state: u64 = kani::any();
let mut rng = SplitMix64::new(state);
let result = monte_carlo_p_value(
observed,
2,
&mut rng,
|_r| {
let x: f64 = kani::any();
kani::assume(x.is_finite());
x
},
Alternative::Greater,
);
assert!(result.is_ok(), "n_sims >= 1 must produce a p-value");
if let Ok(p) = result {
assert!(
p > 0.0,
"Phipson–Smyth p-value must be strictly positive: {p}"
);
assert!(p <= 1.0, "p-value must not exceed one: {p}");
}
}