#![cfg(kani)]
#![cfg(feature = "chrono")]
use chrono::{DateTime, Duration, NaiveDateTime, Utc};
use elicitation::{DateTimeUtcGenerationMode, DateTimeUtcGenerator, Generator};
use elicitation::{NaiveDateTimeGenerationMode, NaiveDateTimeGenerator};
#[kani::proof]
fn verify_datetime_utc_generator_unix_epoch() {
let mode = DateTimeUtcGenerationMode::UnixEpoch;
let reference = DateTime::UNIX_EPOCH;
let generator = DateTimeUtcGenerator::with_reference(mode, reference);
let dt = generator.generate();
assert_eq!(
dt,
DateTime::UNIX_EPOCH,
"UnixEpoch mode produces UNIX_EPOCH"
);
}
#[kani::proof]
fn verify_datetime_utc_generator_offset_positive() {
let seconds: i64 = kani::any();
kani::assume(seconds > 0);
kani::assume(seconds < 100_000);
let mode = DateTimeUtcGenerationMode::Offset { seconds };
let reference = DateTime::UNIX_EPOCH;
let generator = DateTimeUtcGenerator::with_reference(mode, reference);
let dt = generator.generate();
assert!(dt > reference, "Positive offset produces future time");
}
#[kani::proof]
fn verify_datetime_utc_generator_offset_negative() {
let seconds: i64 = kani::any();
kani::assume(seconds < 0);
kani::assume(seconds > -100_000);
let mode = DateTimeUtcGenerationMode::Offset { seconds };
let reference = DateTime::UNIX_EPOCH + Duration::try_seconds(200_000).unwrap();
let generator = DateTimeUtcGenerator::with_reference(mode, reference);
let dt = generator.generate();
assert!(dt < reference, "Negative offset produces past time");
}
#[kani::proof]
fn verify_datetime_utc_generator_offset_zero() {
let mode = DateTimeUtcGenerationMode::Offset { seconds: 0 };
let reference = DateTime::UNIX_EPOCH;
let generator = DateTimeUtcGenerator::with_reference(mode, reference);
let dt = generator.generate();
assert_eq!(dt, reference, "Zero offset returns reference unchanged");
}
#[kani::proof]
fn verify_datetime_utc_generator_mode_preserved() {
let mode = DateTimeUtcGenerationMode::UnixEpoch;
let reference = DateTime::UNIX_EPOCH;
let generator = DateTimeUtcGenerator::with_reference(mode, reference);
assert_eq!(generator.mode(), mode, "Generator preserves mode");
}
#[kani::proof]
fn verify_datetime_utc_generator_reference_preserved() {
let mode = DateTimeUtcGenerationMode::UnixEpoch;
let reference = DateTime::UNIX_EPOCH;
let generator = DateTimeUtcGenerator::with_reference(mode, reference);
assert_eq!(
generator.reference(),
reference,
"Generator preserves reference"
);
}
#[kani::proof]
fn verify_naive_datetime_generator_unix_epoch() {
let mode = NaiveDateTimeGenerationMode::UnixEpoch;
let reference = NaiveDateTime::UNIX_EPOCH;
let generator = NaiveDateTimeGenerator::with_reference(mode, reference);
let dt = generator.generate();
assert_eq!(
dt,
NaiveDateTime::UNIX_EPOCH,
"UnixEpoch mode produces UNIX_EPOCH"
);
}
#[kani::proof]
fn verify_naive_datetime_generator_offset_positive() {
let seconds: i64 = kani::any();
kani::assume(seconds > 0);
kani::assume(seconds < 100_000);
let mode = NaiveDateTimeGenerationMode::Offset { seconds };
let reference = NaiveDateTime::UNIX_EPOCH;
let generator = NaiveDateTimeGenerator::with_reference(mode, reference);
let dt = generator.generate();
assert!(dt > reference, "Positive offset produces future time");
}
#[kani::proof]
fn verify_naive_datetime_generator_offset_negative() {
let seconds: i64 = kani::any();
kani::assume(seconds < 0);
kani::assume(seconds > -100_000);
let mode = NaiveDateTimeGenerationMode::Offset { seconds };
let reference = NaiveDateTime::UNIX_EPOCH + Duration::try_seconds(200_000).unwrap();
let generator = NaiveDateTimeGenerator::with_reference(mode, reference);
let dt = generator.generate();
assert!(dt < reference, "Negative offset produces past time");
}
#[kani::proof]
fn verify_naive_datetime_generator_offset_zero() {
let mode = NaiveDateTimeGenerationMode::Offset { seconds: 0 };
let reference = NaiveDateTime::UNIX_EPOCH;
let generator = NaiveDateTimeGenerator::with_reference(mode, reference);
let dt = generator.generate();
assert_eq!(dt, reference, "Zero offset returns reference unchanged");
}
#[kani::proof]
fn verify_naive_datetime_generator_mode_preserved() {
let mode = NaiveDateTimeGenerationMode::UnixEpoch;
let reference = NaiveDateTime::UNIX_EPOCH;
let generator = NaiveDateTimeGenerator::with_reference(mode, reference);
assert_eq!(generator.mode(), mode, "Generator preserves mode");
}
#[kani::proof]
fn verify_naive_datetime_generator_reference_preserved() {
let mode = NaiveDateTimeGenerationMode::UnixEpoch;
let reference = NaiveDateTime::UNIX_EPOCH;
let generator = NaiveDateTimeGenerator::with_reference(mode, reference);
assert_eq!(
generator.reference(),
reference,
"Generator preserves reference"
);
}