#![allow(unused_imports)]
use crate::conn::ConnL;
use crate::extended::Extended;
use crate::hifi::{MONTN008, MONTU008, WKDYU008};
use crate::prop::conn as conn_laws;
use ::core::num::NonZeroU8;
use hifitime::{MonthName, Weekday};
fn arb_month() -> MonthName {
let tag: u8 = kani::any();
kani::assume(tag <= 11);
MonthName::from(tag + 1)
}
fn arb_ext_month() -> Extended<MonthName> {
let tag: u8 = kani::any();
match tag % 3 {
0 => Extended::NegInf,
1 => Extended::Finite(arb_month()),
_ => Extended::PosInf,
}
}
fn arb_weekday() -> Weekday {
let tag: u8 = kani::any();
kani::assume(tag <= 6);
Weekday::from(tag)
}
fn arb_ext_weekday() -> Extended<Weekday> {
let tag: u8 = kani::any();
match tag % 3 {
0 => Extended::NegInf,
1 => Extended::Finite(arb_weekday()),
_ => Extended::PosInf,
}
}
fn arb_u8() -> u8 {
kani::any()
}
fn arb_nz_u8() -> NonZeroU8 {
let n: u8 = kani::any();
kani::assume(n != 0);
NonZeroU8::new(n).unwrap()
}
macro_rules! prove_l {
($mod_name:ident, $C:expr, $arb_a:ident, $arb_b:ident) => {
mod $mod_name {
use super::*;
#[kani::proof]
fn galois_l() {
let a = $arb_a();
let b = $arb_b();
assert!(conn_laws::galois_l(&$C, a, b));
}
#[kani::proof]
fn monotone_l() {
let a1 = $arb_a();
let a2 = $arb_a();
assert!(conn_laws::monotone_l(&$C, a1, a2));
}
#[kani::proof]
fn closure_l() {
let a = $arb_a();
assert!(conn_laws::closure_l(&$C, a));
}
#[kani::proof]
fn kernel_l() {
let b = $arb_b();
assert!(conn_laws::kernel_l(&$C, b));
}
#[kani::proof]
fn idempotent_l() {
let a = $arb_a();
assert!(conn_laws::idempotent_l(&$C, a));
}
}
};
}
prove_l!(montu008, MONTU008, arb_ext_month, arb_u8);
prove_l!(montn008, MONTN008, arb_ext_month, arb_nz_u8);
prove_l!(wkdyu008, WKDYU008, arb_ext_weekday, arb_u8);
#[kani::proof]
fn montu008_zero_is_neg_inf() {
let r = MONTU008.upper(0);
assert!(matches!(r, Extended::NegInf));
}
#[kani::proof]
fn montu008_at_least_thirteen_is_pos_inf() {
let n: u8 = kani::any();
kani::assume(n >= 13);
let r = MONTU008.upper(n);
assert!(matches!(r, Extended::PosInf));
}
#[kani::proof]
fn wkdyu008_at_least_seven_is_pos_inf() {
let n: u8 = kani::any();
kani::assume(n >= 7);
let r = WKDYU008.upper(n);
assert!(matches!(r, Extended::PosInf));
}
#[kani::proof]
fn montn008_at_least_thirteen_is_pos_inf() {
let n: u8 = kani::any();
kani::assume(n >= 13);
let nz = NonZeroU8::new(n).unwrap();
let r = MONTN008.upper(nz);
assert!(matches!(r, Extended::PosInf));
}