use elicitation::I8Positive;
#[kani::proof]
fn verify_affirm_returns_boolean() {
use elicitation::Contract;
use elicitation::verification::mechanisms::AffirmReturnsBoolean;
let contract = AffirmReturnsBoolean;
let output_true = true;
assert!(
AffirmReturnsBoolean::requires(&output_true),
"Affirm has no preconditions"
);
assert!(
AffirmReturnsBoolean::ensures(&output_true, &output_true),
"Affirm ensures true is valid"
);
assert!(contract.invariant(), "Affirm invariant holds");
let output_false = false;
assert!(
AffirmReturnsBoolean::ensures(&output_false, &output_false),
"Affirm ensures false is valid"
);
let any_bool: bool = kani::any();
assert!(
AffirmReturnsBoolean::ensures(&any_bool, &any_bool),
"Affirm ensures any boolean is valid"
);
}
#[kani::proof]
fn verify_survey_returns_valid_variant() {
use elicitation::Contract;
use elicitation::verification::mechanisms::SurveyReturnsValidVariant;
let contract = SurveyReturnsValidVariant::<bool>::new();
assert!(contract.invariant(), "Survey invariant holds");
let value_true = true;
let value_false = false;
assert!(
SurveyReturnsValidVariant::<bool>::requires(&value_true),
"Survey has no preconditions for true"
);
assert!(
SurveyReturnsValidVariant::<bool>::ensures(&value_true, &value_true),
"Survey ensures true is valid variant"
);
assert!(
SurveyReturnsValidVariant::<bool>::ensures(&value_false, &value_false),
"Survey ensures false is valid variant"
);
let any_bool: bool = kani::any();
assert!(
SurveyReturnsValidVariant::<bool>::ensures(&any_bool, &any_bool),
"Survey ensures any bool variant is valid"
);
}
#[kani::proof]
fn verify_mechanism_type_composition() {
let value: i8 = kani::any();
if let Ok(positive) = I8Positive::new(value) {
let val: i8 = positive.get();
assert!(val > 0, "Type contract holds");
assert!(
val > 0,
"Composed verification: type + mechanism both proven"
);
}
}
#[kani::proof]
fn verify_select_returns_valid_option() {
#[derive(Debug, Clone, Copy, PartialEq)]
enum Color {
Red,
Green,
Blue,
}
let any_color = if kani::any() {
if kani::any() {
Color::Red
} else {
Color::Green
}
} else {
Color::Blue
};
let is_valid = any_color == Color::Red || any_color == Color::Green || any_color == Color::Blue;
assert!(is_valid, "Select returns valid option");
}
#[kani::proof]
fn verify_mechanism_preserves_trenchcoat() {
let value: i8 = kani::any();
if let Ok(positive) = I8Positive::new(value) {
let unwrapped: i8 = positive.into_inner();
assert!(
unwrapped == value && unwrapped > 0,
"Mechanism + trenchcoat composition proven"
);
}
}