#![cfg(kani)]
#![cfg(feature = "jiff")]
use elicitation::{Generator, TimestampGenerationMode, TimestampGenerator};
use jiff::Timestamp;
#[kani::proof]
fn verify_timestamp_generator_unix_epoch() {
let mode = TimestampGenerationMode::UnixEpoch;
let reference = Timestamp::UNIX_EPOCH;
let generator = TimestampGenerator::with_reference(mode, reference);
let ts = generator.generate();
assert_eq!(
ts,
Timestamp::UNIX_EPOCH,
"UnixEpoch mode produces UNIX_EPOCH"
);
}
#[kani::proof]
fn verify_timestamp_generator_offset_positive_logic() {
let seconds: i64 = kani::any();
kani::assume(seconds > 0);
kani::assume(seconds < 100_000);
let mode = TimestampGenerationMode::Offset { seconds };
match mode {
TimestampGenerationMode::Now => {
assert!(false, "Wrong branch");
}
TimestampGenerationMode::UnixEpoch => {
assert!(false, "Wrong branch");
}
TimestampGenerationMode::Offset { seconds: s } => {
assert!(s > 0, "Positive seconds");
assert_eq!(s, seconds);
}
}
}
#[kani::proof]
fn verify_timestamp_generator_offset_negative_logic() {
let seconds: i64 = kani::any();
kani::assume(seconds < 0);
kani::assume(seconds > -100_000);
let mode = TimestampGenerationMode::Offset { seconds };
match mode {
TimestampGenerationMode::Offset { seconds: s } => {
assert!(s < 0, "Negative seconds");
assert_eq!(s, seconds);
}
_ => assert!(false, "Wrong branch"),
}
}
#[kani::proof]
fn verify_timestamp_generator_offset_zero_logic() {
let mode = TimestampGenerationMode::Offset { seconds: 0 };
match mode {
TimestampGenerationMode::Offset { seconds } => {
assert_eq!(seconds, 0);
}
_ => assert!(false, "Wrong branch"),
}
}
#[kani::proof]
fn verify_timestamp_generator_mode_preserved() {
let mode = TimestampGenerationMode::UnixEpoch;
let reference = Timestamp::UNIX_EPOCH;
let generator = TimestampGenerator::with_reference(mode, reference);
assert_eq!(generator.mode(), mode, "Generator preserves mode");
}
#[kani::proof]
fn verify_timestamp_generator_reference_preserved() {
let mode = TimestampGenerationMode::UnixEpoch;
let reference = Timestamp::UNIX_EPOCH;
let generator = TimestampGenerator::with_reference(mode, reference);
assert_eq!(
generator.reference(),
reference,
"Generator preserves reference"
);
}