use elicitation::{Generator, SystemTimeGenerationMode, SystemTimeGenerator};
use std::time::{Duration, SystemTime};
#[kani::proof]
pub fn verify_systemtime_unix_epoch() {
let mode = SystemTimeGenerationMode::UnixEpoch;
let reference = SystemTime::UNIX_EPOCH; let generator = SystemTimeGenerator::with_reference(mode, reference);
let time = generator.generate();
assert!(
time == SystemTime::UNIX_EPOCH,
"UnixEpoch mode generates UNIX_EPOCH"
);
}
#[kani::proof]
pub fn verify_systemtime_offset_positive() {
let seconds: i64 = kani::any();
let nanos: u32 = kani::any();
kani::assume(nanos < 1_000_000_000);
kani::assume(seconds >= 0);
kani::assume(seconds < 1_000_000);
let mode = SystemTimeGenerationMode::Offset { seconds, nanos };
let reference = SystemTime::UNIX_EPOCH;
let generator = SystemTimeGenerator::with_reference(mode, reference);
let time = generator.generate();
let expected_duration = Duration::new(seconds as u64, nanos);
let expected = reference + expected_duration;
assert!(
time == expected,
"Positive offset adds duration to reference"
);
}
#[kani::proof]
pub fn verify_systemtime_offset_negative() {
let seconds: i64 = kani::any();
let nanos: u32 = kani::any();
kani::assume(nanos < 1_000_000_000);
kani::assume(seconds < 0);
kani::assume(seconds > -1_000_000);
let mode = SystemTimeGenerationMode::Offset { seconds, nanos };
let reference = SystemTime::UNIX_EPOCH + Duration::from_secs(100_000); let generator = SystemTimeGenerator::with_reference(mode, reference);
let time = generator.generate();
let expected_duration = Duration::new(seconds.unsigned_abs(), nanos);
let expected = reference - expected_duration;
assert!(
time == expected,
"Negative offset subtracts duration from reference"
);
}
#[kani::proof]
pub fn verify_systemtime_offset_zero() {
let mode = SystemTimeGenerationMode::Offset {
seconds: 0,
nanos: 0,
};
let reference = SystemTime::UNIX_EPOCH;
let generator = SystemTimeGenerator::with_reference(mode, reference);
let time = generator.generate();
assert!(
time == reference,
"Zero offset returns reference time unchanged"
);
}
#[kani::proof]
pub fn verify_systemtime_generator_mode_preserved() {
let mode = SystemTimeGenerationMode::UnixEpoch;
let reference = SystemTime::UNIX_EPOCH;
let generator = SystemTimeGenerator::with_reference(mode, reference);
assert!(generator.mode() == mode, "Generator preserves mode");
}
#[kani::proof]
pub fn verify_systemtime_consistent_generation() {
let seconds: i64 = kani::any();
let nanos: u32 = kani::any();
kani::assume(nanos < 1_000_000_000);
kani::assume(seconds >= 0);
kani::assume(seconds < 1000);
let mode = SystemTimeGenerationMode::Offset { seconds, nanos };
let reference = SystemTime::UNIX_EPOCH;
let generator = SystemTimeGenerator::with_reference(mode, reference);
let time1 = generator.generate();
let time2 = generator.generate();
assert!(
time1 == time2,
"Generator produces consistent results for Offset mode"
);
}
#[kani::proof]
pub fn verify_systemtime_reference_preserved() {
let reference = SystemTime::UNIX_EPOCH + Duration::from_secs(42);
let mode = SystemTimeGenerationMode::UnixEpoch;
let generator = SystemTimeGenerator::with_reference(mode, reference);
assert!(
generator.reference() == reference,
"Generator preserves reference time"
);
}