use elicitation::{
CharAlphanumeric, DurationPositive, F32NonNegative, F32Positive, F64NonNegative, I8Positive,
OptionSome, Tuple2,
};
#[kani::proof]
fn verify_duration_positive() {
let secs: u64 = kani::any();
let nanos: u32 = kani::any();
kani::assume(nanos < 1_000_000_000);
let duration = std::time::Duration::new(secs, nanos);
match DurationPositive::new(duration) {
Ok(positive) => {
assert!(duration.as_nanos() > 0, "DurationPositive invariant");
let retrieved = DurationPositive::get(&positive);
assert!(retrieved.as_nanos() > 0, "get() preserves invariant");
}
Err(_) => {
assert!(
duration.as_nanos() == 0,
"Construction rejects zero duration"
);
}
}
}
#[kani::proof]
fn verify_tuple2_composition() {
let v1: i8 = kani::any();
let v2: i8 = kani::any();
kani::assume(v1 > 0); kani::assume(v2 > 0);
let first = I8Positive::new(v1).unwrap();
let second = I8Positive::new(v2).unwrap();
let tuple = Tuple2::new(first, second);
assert!(tuple.first().get() > 0, "First element preserves contract");
assert!(
tuple.second().get() > 0,
"Second element preserves contract"
);
}
#[kani::proof]
fn verify_option_some() {
let value: i32 = kani::any();
let opt = Some(value);
match OptionSome::<i32>::new(opt) {
Ok(some) => {
let val: &i32 = OptionSome::get(&some);
assert!(*val == value, "OptionSome unwraps correctly");
}
Err(_) => {
unreachable!("OptionSome::new(Some) should never fail");
}
}
}
#[kani::proof]
fn verify_option_some_rejects_none() {
let opt: Option<i32> = None;
match OptionSome::new(opt) {
Ok(_) => {
unreachable!("OptionSome::new(None) should never succeed");
}
Err(_) => {
}
}
}
#[kani::proof]
fn verify_trenchcoat_pattern() {
let value: i8 = kani::any();
kani::assume(value > 0);
let wrapped = I8Positive::new(value).unwrap();
assert!(wrapped.get() > 0, "Contract guarantees positive");
let unwrapped = wrapped.into_inner();
assert!(unwrapped > 0, "Unwrapped value remains positive");
assert!(unwrapped == value, "Unwrap preserves value identity");
}
#[kani::proof]
fn verify_f32_non_negative() {
let value: f32 = kani::any();
let _result = F32NonNegative::new(value);
}
#[kani::proof]
fn verify_f64_non_negative() {
let value: f64 = kani::any();
let _result = F64NonNegative::new(value);
}
#[kani::proof]
fn verify_f32_positive() {
let value: f32 = kani::any();
let _result = F32Positive::new(value);
}
#[kani::proof]
fn verify_char_alphanumeric() {
let value: char = kani::any();
let _result = CharAlphanumeric::new(value);
}