use proptest::prelude::*;
pub fn arb_f64() -> impl Strategy<Value = f64> {
prop_oneof![
1 => any::<f64>(),
2 => prop_oneof![
Just(f64::NAN),
Just(f64::INFINITY),
Just(f64::NEG_INFINITY),
Just(0.0_f64),
Just(-0.0_f64),
Just(f64::MIN_POSITIVE),
Just(f64::MAX),
Just(f64::MIN),
Just(f64::EPSILON),
Just(f64::from_bits(1)),
Just(2.0_f64.powi(53) - 1.0),
Just(2.0_f64.powi(53)),
Just(2.0_f64.powi(53) + 1.0),
],
]
}
pub fn arb_f32() -> impl Strategy<Value = f32> {
prop_oneof![
1 => any::<f32>(),
2 => prop_oneof![
Just(f32::NAN),
Just(f32::INFINITY),
Just(f32::NEG_INFINITY),
Just(0.0_f32),
Just(-0.0_f32),
Just(f32::MIN_POSITIVE),
Just(f32::MAX),
Just(f32::MIN),
Just(f32::EPSILON),
Just(f32::from_bits(1)),
Just(2.0_f32.powi(24) - 1.0),
Just(2.0_f32.powi(24)),
Just(2.0_f32.powi(24) + 1.0),
],
]
}
pub fn arb_f64_bounded() -> impl Strategy<Value = f64> {
prop_oneof![
1 => -1.0e9_f64..1.0e9_f64,
2 => prop_oneof![
Just(f64::NAN),
Just(f64::INFINITY),
Just(f64::NEG_INFINITY),
Just(0.0_f64),
Just(-0.0_f64),
Just(f64::MIN_POSITIVE),
Just(f64::MAX),
Just(f64::MIN),
Just(f64::EPSILON),
Just(f64::from_bits(1)),
Just(2.0_f64.powi(63)),
Just(-2.0_f64.powi(63)),
Just(f64::from_bits(2.0_f64.powi(63).to_bits() + 1)),
Just(2.0_f64.powi(64)),
Just(f64::from_bits(2.0_f64.powi(64).to_bits() + 1)),
Just(2.0_f64.powi(127)),
Just(-2.0_f64.powi(127)),
Just(f64::from_bits(2.0_f64.powi(127).to_bits() + 1)),
Just(2.0_f64.powi(128)),
Just(f64::from_bits(2.0_f64.powi(128).to_bits() + 1)),
],
]
}
#[cfg(feature = "f16")]
pub fn arb_f16() -> impl Strategy<Value = f16> {
prop_oneof![
1 => Just(f16::NAN),
1 => Just(f16::INFINITY),
1 => Just(f16::NEG_INFINITY),
1 => Just(0.0_f16),
1 => Just(-0.0_f16),
1 => Just(f16::MIN_POSITIVE),
1 => Just(f16::from_bits(1)),
1 => Just(f16::MAX),
1 => Just(f16::MIN),
2 => (-65504.0_f32..=65504.0_f32).prop_map(|x| x as f16),
]
}
use crate::float::N5;
use crate::extended::Extended;
pub fn extended_float_f64() -> impl Strategy<Value = N5<f64>> {
prop_oneof![
1 => Just(N5::new(f64::NAN)),
1 => Just(N5::new(f64::NEG_INFINITY)),
1 => Just(N5::new(f64::INFINITY)),
3 => arb_f64_bounded().prop_map(N5::new),
]
}
pub fn arb_f32_bounded() -> impl Strategy<Value = f32> {
prop_oneof![
1 => -10.0_f32..10.0_f32,
2 => prop_oneof![
Just(f32::NAN),
Just(f32::INFINITY),
Just(f32::NEG_INFINITY),
Just(0.0_f32),
Just(-0.0_f32),
Just(f32::MIN_POSITIVE),
Just(f32::MAX),
Just(f32::MIN),
Just(f32::EPSILON),
Just(f32::from_bits(1)),
Just(2.0_f32.powi(31)),
Just(-2.0_f32.powi(31)),
Just(f32::from_bits(2.0_f32.powi(31).to_bits() + 1)),
Just(2.0_f32.powi(32)),
Just(f32::from_bits(2.0_f32.powi(32).to_bits() + 1)),
Just(2.0_f32.powi(63)),
Just(f32::from_bits(2.0_f32.powi(63).to_bits() + 1)),
Just(2.0_f32.powi(64)),
Just(f32::from_bits(2.0_f32.powi(64).to_bits() + 1)),
Just(2.0_f32.powi(127)),
Just(-2.0_f32.powi(127)),
Just(f32::from_bits(2.0_f32.powi(127).to_bits() + 1)),
],
]
}
pub fn extended_float_f32() -> impl Strategy<Value = N5<f32>> {
prop_oneof![
1 => Just(N5::new(f32::NAN)),
1 => Just(N5::new(f32::NEG_INFINITY)),
1 => Just(N5::new(f32::INFINITY)),
3 => arb_f32_bounded().prop_map(N5::new),
]
}
#[cfg(feature = "time")]
pub fn arb_extended_duration() -> impl Strategy<Value = Extended<Duration>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
2 => arb_duration().prop_map(Extended::Finite),
]
}
#[cfg(feature = "time")]
pub fn arb_duration_bounded_f64() -> impl Strategy<Value = Duration> {
prop_oneof![
1 => Just(Duration::ZERO),
1 => Just(Duration::seconds(1_000_000_000)),
1 => Just(Duration::seconds(-1_000_000_000)),
1 => Just(Duration::seconds(-1) - Duration::nanoseconds(1)),
1 => Just(Duration::seconds(0) + Duration::nanoseconds(1)),
1 => Just(Duration::seconds(1) - Duration::nanoseconds(1)),
1 => Just(Duration::nanoseconds(1)),
1 => Just(Duration::nanoseconds(-1)),
12 => (-1_000_000_000_i64..=1_000_000_000_i64, -999_999_999_i32..=999_999_999_i32)
.prop_map(|(s, n)| Duration::new(s, n)),
]
}
#[cfg(feature = "time")]
pub fn arb_duration_bounded_f32() -> impl Strategy<Value = Duration> {
prop_oneof![
1 => Just(Duration::ZERO),
1 => Just(Duration::seconds(10)),
1 => Just(Duration::seconds(-10)),
1 => Just(Duration::seconds(-1) - Duration::nanoseconds(1)),
1 => Just(Duration::seconds(0) + Duration::nanoseconds(1)),
1 => Just(Duration::seconds(1) - Duration::nanoseconds(1)),
1 => Just(Duration::nanoseconds(1)),
1 => Just(Duration::nanoseconds(-1)),
12 => (-10_i64..=10_i64, -999_999_999_i32..=999_999_999_i32)
.prop_map(|(s, n)| Duration::new(s, n)),
]
}
#[cfg(feature = "time")]
pub fn arb_extended_duration_bounded_f64() -> impl Strategy<Value = Extended<Duration>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
2 => arb_duration_bounded_f64().prop_map(Extended::Finite),
]
}
#[cfg(feature = "time")]
pub fn arb_extended_duration_bounded_f32() -> impl Strategy<Value = Extended<Duration>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
2 => arb_duration_bounded_f32().prop_map(Extended::Finite),
]
}
pub fn arb_std_duration() -> impl Strategy<Value = std::time::Duration> {
prop_oneof![
1 => Just(std::time::Duration::ZERO),
1 => Just(std::time::Duration::MAX),
1 => Just(std::time::Duration::from_nanos(1)),
1 => Just(std::time::Duration::from_secs(1)),
1 => Just(std::time::Duration::new(1, 999_999_999)),
1 => Just(std::time::Duration::from_secs(u64::MAX)),
1 => Just(std::time::Duration::MAX - std::time::Duration::from_nanos(1)),
9 => (any::<u64>(), 0_u32..=999_999_999_u32)
.prop_map(|(s, n)| std::time::Duration::new(s, n)),
]
}
pub fn arb_extended_std_duration() -> impl Strategy<Value = Extended<std::time::Duration>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
2 => arb_std_duration().prop_map(Extended::Finite),
]
}
pub fn arb_std_duration_bounded_f64() -> impl Strategy<Value = std::time::Duration> {
prop_oneof![
1 => Just(std::time::Duration::ZERO),
1 => Just(std::time::Duration::from_secs(1_000_000_000)),
1 => Just(std::time::Duration::from_nanos(1)),
1 => Just(std::time::Duration::from_secs(1) - std::time::Duration::from_nanos(1)),
1 => Just(std::time::Duration::from_secs(1)),
12 => (0_u64..=1_000_000_000_u64, 0_u32..=999_999_999_u32)
.prop_map(|(s, n)| std::time::Duration::new(s, n)),
]
}
pub fn arb_std_duration_bounded_f32() -> impl Strategy<Value = std::time::Duration> {
prop_oneof![
1 => Just(std::time::Duration::ZERO),
1 => Just(std::time::Duration::from_secs(10)),
1 => Just(std::time::Duration::from_nanos(1)),
1 => Just(std::time::Duration::from_secs(1) - std::time::Duration::from_nanos(1)),
1 => Just(std::time::Duration::from_secs(1)),
12 => (0_u64..=10_u64, 0_u32..=999_999_999_u32)
.prop_map(|(s, n)| std::time::Duration::new(s, n)),
]
}
pub fn arb_extended_std_duration_bounded_f64()
-> impl Strategy<Value = Extended<std::time::Duration>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
2 => arb_std_duration_bounded_f64().prop_map(Extended::Finite),
]
}
pub fn arb_extended_std_duration_bounded_f32()
-> impl Strategy<Value = Extended<std::time::Duration>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
2 => arb_std_duration_bounded_f32().prop_map(Extended::Finite),
]
}
pub fn arb_extended_u64() -> impl Strategy<Value = Extended<u64>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
1 => Just(Extended::Finite(0_u64)),
1 => Just(Extended::Finite(u64::MAX)),
8 => any::<u64>().prop_map(Extended::Finite),
]
}
pub fn arb_extended_u128() -> impl Strategy<Value = Extended<u128>> {
let max_dur_nanos = std::time::Duration::MAX.as_nanos();
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
1 => Just(Extended::Finite(0_u128)),
1 => Just(Extended::Finite(u128::MAX)),
1 => Just(Extended::Finite(max_dur_nanos)),
8 => any::<u128>().prop_map(Extended::Finite),
]
}
pub fn arb_extended_sdur_nanos_in_range() -> impl Strategy<Value = Extended<u128>> {
let max_dur_nanos = std::time::Duration::MAX.as_nanos();
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
1 => Just(Extended::Finite(0_u128)),
1 => Just(Extended::Finite(max_dur_nanos)),
1 => Just(Extended::Finite(1_500_000_000_u128)),
8 => (0_u128..=max_dur_nanos).prop_map(Extended::Finite),
]
}
#[cfg(feature = "f16")]
pub fn extended_float_f16() -> impl Strategy<Value = N5<f16>> {
prop_oneof![
1 => Just(N5::new(f16::NAN)),
1 => Just(N5::new(f16::NEG_INFINITY)),
1 => Just(N5::new(f16::INFINITY)),
3 => arb_f16().prop_map(N5::new),
]
}
#[cfg(feature = "time")]
use time::{Date, Duration, Month, OffsetDateTime, PrimitiveDateTime, Time, UtcOffset, Weekday};
#[cfg(feature = "time")]
pub fn arb_date() -> impl Strategy<Value = Date> {
let min_jd = Date::MIN.to_julian_day();
let max_jd = Date::MAX.to_julian_day();
prop_oneof![
1 => Just(Date::MIN),
1 => Just(Date::MAX),
1 => Just(Date::from_julian_day(0).expect("jd 0 is in range")),
1 => Just(Date::from_calendar_date(1970, Month::January, 1).expect("epoch")),
1 => Just(Date::from_calendar_date(2038, Month::January, 19).expect("Y2038")),
1 => Just(Date::from_calendar_date(9999, Month::December, 31).expect("Y10K-1")),
10 => (min_jd..=max_jd).prop_map(|jd| Date::from_julian_day(jd).expect("jd in [MIN..=MAX]")),
]
}
#[cfg(feature = "time")]
pub fn arb_time() -> impl Strategy<Value = Time> {
const NS_PER_DAY: i64 = 86_400 * 1_000_000_000;
prop_oneof![
1 => Just(Time::MIDNIGHT),
1 => Just(Time::MIDNIGHT + Duration::nanoseconds(NS_PER_DAY - 1)),
1 => Just(Time::MIDNIGHT + Duration::seconds(1)),
1 => Just(Time::MIDNIGHT + Duration::nanoseconds(1)),
1 => Just(Time::from_hms(12, 0, 0).expect("noon")),
8 => (0..NS_PER_DAY).prop_map(|ns| Time::MIDNIGHT + Duration::nanoseconds(ns)),
]
}
#[cfg(feature = "time")]
pub fn arb_duration() -> impl Strategy<Value = Duration> {
prop_oneof![
1 => Just(Duration::ZERO),
1 => Just(Duration::MIN),
1 => Just(Duration::MAX),
1 => Just(Duration::seconds(-1) - Duration::nanoseconds(1)),
1 => Just(Duration::seconds(0) + Duration::nanoseconds(1)),
1 => Just(Duration::seconds(1) - Duration::nanoseconds(1)),
1 => Just(Duration::seconds(i64::MAX)),
1 => Just(Duration::seconds(i64::MIN)),
1 => Just(Duration::nanoseconds(1)),
1 => Just(Duration::nanoseconds(-1)),
1 => Just(Duration::MAX - Duration::nanoseconds(1)),
1 => Just(Duration::MIN + Duration::nanoseconds(1)),
12 => (any::<i64>(), -999_999_999_i32..=999_999_999_i32)
.prop_map(|(s, n)| Duration::new(s, n)),
]
}
#[cfg(feature = "time")]
pub fn arb_primitive_dt() -> impl Strategy<Value = PrimitiveDateTime> {
(arb_date(), arb_time()).prop_map(|(d, t)| PrimitiveDateTime::new(d, t))
}
#[cfg(feature = "time")]
pub fn arb_extended_date() -> impl Strategy<Value = Extended<Date>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
2 => arb_date().prop_map(Extended::Finite),
]
}
#[cfg(feature = "time")]
pub fn arb_jd_in_range() -> impl Strategy<Value = i32> {
let min_jd = Date::MIN.to_julian_day();
let max_jd = Date::MAX.to_julian_day();
prop_oneof![
1 => Just(min_jd),
1 => Just(max_jd),
1 => Just(0_i32),
8 => min_jd..=max_jd,
]
}
#[cfg(feature = "time")]
pub fn arb_extended_time() -> impl Strategy<Value = Extended<Time>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
2 => arb_time().prop_map(Extended::Finite),
]
}
#[cfg(feature = "time")]
pub fn arb_ns_in_range() -> impl Strategy<Value = i64> {
const NS_MAX: i64 = 86_400 * 1_000_000_000 - 1;
prop_oneof![
1 => Just(0_i64),
1 => Just(NS_MAX),
1 => Just(1_i64),
1 => Just(43_200_000_000_000_i64),
8 => 0..=NS_MAX,
]
}
#[cfg(feature = "time")]
pub fn arb_secs_in_range() -> impl Strategy<Value = i64> {
const SECS_MAX: i64 = 86_400 - 1;
prop_oneof![
1 => Just(0_i64),
1 => Just(SECS_MAX),
1 => Just(43_200_i64),
8 => 0..=SECS_MAX,
]
}
pub fn arb_extended_i64() -> impl Strategy<Value = Extended<i64>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
1 => Just(Extended::Finite(i64::MIN)),
1 => Just(Extended::Finite(i64::MAX)),
8 => any::<i64>().prop_map(Extended::Finite),
]
}
pub fn arb_extended_u8() -> impl Strategy<Value = Extended<u8>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
1 => Just(Extended::Finite(0_u8)),
1 => Just(Extended::Finite(u8::MAX)),
8 => any::<u8>().prop_map(Extended::Finite),
]
}
pub fn arb_extended_u16() -> impl Strategy<Value = Extended<u16>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
1 => Just(Extended::Finite(0_u16)),
1 => Just(Extended::Finite(u16::MAX)),
8 => any::<u16>().prop_map(Extended::Finite),
]
}
pub fn arb_extended_i8() -> impl Strategy<Value = Extended<i8>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
1 => Just(Extended::Finite(i8::MIN)),
1 => Just(Extended::Finite(i8::MAX)),
8 => any::<i8>().prop_map(Extended::Finite),
]
}
pub fn arb_extended_i16() -> impl Strategy<Value = Extended<i16>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
1 => Just(Extended::Finite(i16::MIN)),
1 => Just(Extended::Finite(i16::MAX)),
8 => any::<i16>().prop_map(Extended::Finite),
]
}
pub fn arb_extended_i32() -> impl Strategy<Value = Extended<i32>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
1 => Just(Extended::Finite(i32::MIN)),
1 => Just(Extended::Finite(i32::MAX)),
8 => any::<i32>().prop_map(Extended::Finite),
]
}
#[cfg(feature = "time")]
pub fn arb_utc_offset() -> impl Strategy<Value = UtcOffset> {
prop_oneof![
1 => Just(UtcOffset::UTC),
1 => Just(UtcOffset::from_whole_seconds( 93599).expect("+25:59:59")),
1 => Just(UtcOffset::from_whole_seconds(-93599).expect("-25:59:59")),
1 => Just(UtcOffset::from_hms( 1, 0, 0).expect("+01:00")),
1 => Just(UtcOffset::from_hms( 5, 30, 0).expect("+05:30 India")),
1 => Just(UtcOffset::from_hms( 5, 45, 0).expect("+05:45 Nepal")),
1 => Just(UtcOffset::from_hms( 9, 0, 0).expect("+09:00 Japan")),
1 => Just(UtcOffset::from_hms(12, 45, 0).expect("+12:45 Chatham")),
1 => Just(UtcOffset::from_hms(-8, 0, 0).expect("-08:00 Pacific")),
1 => Just(UtcOffset::from_hms(-4, 0, 0).expect("-04:00 Eastern")),
10 => (-93599_i32..=93599_i32)
.prop_map(|s| UtcOffset::from_whole_seconds(s).expect("in range")),
]
}
#[cfg(feature = "time")]
pub fn arb_extended_utc_offset() -> impl Strategy<Value = Extended<UtcOffset>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
2 => arb_utc_offset().prop_map(Extended::Finite),
]
}
#[cfg(feature = "time")]
pub fn arb_offset_dt() -> impl Strategy<Value = OffsetDateTime> {
let y2038 =
OffsetDateTime::from_unix_timestamp(2_147_483_648).expect("Y2038 in OffsetDateTime range");
let min_ns = OffsetDateTime::new_in_offset(Date::MIN, Time::MIDNIGHT, UtcOffset::UTC)
.unix_timestamp_nanos();
let max_ns = OffsetDateTime::new_in_offset(
Date::MAX,
Time::from_hms_nano(23, 59, 59, 999_999_999).expect("end-of-day"),
UtcOffset::UTC,
)
.unix_timestamp_nanos();
let order_margin_ns = 2_i128 * 24 * 60 * 60 * 1_000_000_000;
let safe_min_ns = min_ns + order_margin_ns;
let safe_max_ns = max_ns - order_margin_ns;
let landmarks = prop_oneof![
1 => Just(OffsetDateTime::UNIX_EPOCH),
1 => Just(OffsetDateTime::from_unix_timestamp_nanos(1).expect("epoch + 1ns")),
1 => Just(OffsetDateTime::from_unix_timestamp_nanos(-1).expect("epoch - 1ns")),
1 => Just(y2038),
];
let safe_extremes = prop_oneof![
1 => Just(OffsetDateTime::from_unix_timestamp_nanos(safe_min_ns).expect("safe min")),
1 => Just(OffsetDateTime::from_unix_timestamp_nanos(safe_max_ns).expect("safe max")),
];
let utc_body = (safe_min_ns..=safe_max_ns)
.prop_map(|ns| OffsetDateTime::from_unix_timestamp_nanos(ns).expect("safe nanos"));
let offset_body = ((safe_min_ns)..=(safe_max_ns), arb_utc_offset()).prop_map(|(ns, offset)| {
OffsetDateTime::from_unix_timestamp_nanos(ns)
.expect("safe nanos")
.to_offset(offset)
});
prop_oneof![
2 => landmarks,
1 => safe_extremes,
7 => utc_body,
2 => offset_body,
]
}
#[cfg(feature = "time")]
pub fn arb_extended_offset_dt() -> impl Strategy<Value = Extended<OffsetDateTime>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
2 => arb_offset_dt().prop_map(Extended::Finite),
]
}
#[cfg(feature = "time")]
pub fn arb_weekday() -> impl Strategy<Value = Weekday> {
prop_oneof![
Just(Weekday::Monday),
Just(Weekday::Tuesday),
Just(Weekday::Wednesday),
Just(Weekday::Thursday),
Just(Weekday::Friday),
Just(Weekday::Saturday),
Just(Weekday::Sunday),
]
}
#[cfg(feature = "time")]
pub fn arb_extended_weekday() -> impl Strategy<Value = Extended<Weekday>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
1 => arb_weekday().prop_map(Extended::Finite),
]
}
#[cfg(feature = "time")]
pub fn arb_month() -> impl Strategy<Value = Month> {
prop_oneof![
Just(Month::January),
Just(Month::February),
Just(Month::March),
Just(Month::April),
Just(Month::May),
Just(Month::June),
Just(Month::July),
Just(Month::August),
Just(Month::September),
Just(Month::October),
Just(Month::November),
Just(Month::December),
]
}
#[cfg(feature = "time")]
pub fn arb_extended_month() -> impl Strategy<Value = Extended<Month>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
1 => arb_month().prop_map(Extended::Finite),
]
}
#[cfg(feature = "time")]
pub fn arb_unix_nanos_in_range() -> impl Strategy<Value = i128> {
let min_ns = OffsetDateTime::new_in_offset(Date::MIN, Time::MIDNIGHT, UtcOffset::UTC)
.unix_timestamp_nanos();
let max_ns = OffsetDateTime::new_in_offset(
Date::MAX,
Time::from_hms_nano(23, 59, 59, 999_999_999).expect("end-of-day"),
UtcOffset::UTC,
)
.unix_timestamp_nanos();
prop_oneof![
1 => Just(min_ns),
1 => Just(max_ns),
1 => Just(0_i128),
1 => Just( 1_000_000_000_i128),
1 => Just(-1_000_000_000_i128),
1 => Just( 2_147_483_648_000_000_000_i128), 10 => min_ns..=max_ns,
]
}
#[cfg(feature = "time")]
pub fn arb_unix_secs_in_range() -> impl Strategy<Value = i64> {
let min_s =
OffsetDateTime::new_in_offset(Date::MIN, Time::MIDNIGHT, UtcOffset::UTC).unix_timestamp();
let max_s = OffsetDateTime::new_in_offset(
Date::MAX,
Time::from_hms_nano(23, 59, 59, 999_999_999).expect("end-of-day"),
UtcOffset::UTC,
)
.unix_timestamp();
prop_oneof![
1 => Just(min_s),
1 => Just(max_s),
1 => Just(0_i64),
1 => Just(1_i64),
1 => Just(-1_i64),
1 => Just(2_147_483_648_i64), 10 => min_s..=max_s,
]
}
#[cfg(feature = "time")]
pub fn arb_offset_secs_in_range() -> impl Strategy<Value = i32> {
prop_oneof![
1 => Just(-93599_i32),
1 => Just( 93599_i32),
1 => Just(0_i32),
1 => Just( 19800_i32), 1 => Just( 20700_i32), 1 => Just(-28800_i32), 10 => -93599_i32..=93599_i32,
]
}
#[cfg(feature = "time")]
pub fn arb_iso_weekday_byte() -> impl Strategy<Value = u8> {
1_u8..=7
}
#[cfg(feature = "time")]
pub fn arb_month_byte() -> impl Strategy<Value = u8> {
1_u8..=12
}
pub fn arb_char() -> impl Strategy<Value = char> {
prop_oneof![
1 => Just('\u{0}'),
1 => Just('\u{D7FF}'),
1 => Just('\u{E000}'),
1 => Just('\u{10FFFF}'),
1 => Just('A'),
1 => Just('\n'),
10 => proptest::char::any(),
]
}
pub fn arb_extended_char() -> impl Strategy<Value = Extended<char>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
2 => arb_char().prop_map(Extended::Finite),
]
}
pub fn arb_extended_u32() -> impl Strategy<Value = Extended<u32>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
1 => Just(Extended::Finite(0_u32)),
1 => Just(Extended::Finite(u32::MAX)),
1 => Just(Extended::Finite(0xD7FF)),
1 => Just(Extended::Finite(0xD800)),
1 => Just(Extended::Finite(0xDFFF)),
1 => Just(Extended::Finite(0xE000)),
1 => Just(Extended::Finite(0x10FFFF)),
1 => Just(Extended::Finite(0x110000)),
8 => any::<u32>().prop_map(Extended::Finite),
]
}
pub fn arb_ipv4() -> impl Strategy<Value = std::net::Ipv4Addr> {
prop_oneof![
1 => Just(std::net::Ipv4Addr::UNSPECIFIED),
1 => Just(std::net::Ipv4Addr::BROADCAST),
1 => Just(std::net::Ipv4Addr::new(127, 0, 0, 1)),
1 => Just(std::net::Ipv4Addr::new(192, 168, 1, 1)),
8 => any::<u32>().prop_map(std::net::Ipv4Addr::from_bits),
]
}
pub fn arb_extended_ipv4() -> impl Strategy<Value = Extended<std::net::Ipv4Addr>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
2 => arb_ipv4().prop_map(Extended::Finite),
]
}
pub fn arb_ipv6() -> impl Strategy<Value = std::net::Ipv6Addr> {
let v4mapped_lo: u128 = 0x0000_0000_0000_0000_0000_FFFF_0000_0000;
let v4mapped_hi: u128 = 0x0000_0000_0000_0000_0000_FFFF_FFFF_FFFF;
prop_oneof![
1 => Just(std::net::Ipv6Addr::UNSPECIFIED),
1 => Just(std::net::Ipv6Addr::LOCALHOST),
1 => Just(std::net::Ipv6Addr::from_bits(v4mapped_lo - 1)),
1 => Just(std::net::Ipv6Addr::from_bits(v4mapped_lo)),
1 => Just(std::net::Ipv6Addr::from_bits(v4mapped_hi)),
1 => Just(std::net::Ipv6Addr::from_bits(v4mapped_hi + 1)),
1 => Just(std::net::Ipv6Addr::from_bits(u128::MAX)),
8 => any::<u128>().prop_map(std::net::Ipv6Addr::from_bits),
]
}
pub fn arb_extended_ipv6() -> impl Strategy<Value = Extended<std::net::Ipv6Addr>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
2 => arb_ipv6().prop_map(Extended::Finite),
]
}
pub fn arb_ip_addr() -> impl Strategy<Value = std::net::IpAddr> {
prop_oneof![
1 => arb_ipv4().prop_map(std::net::IpAddr::V4),
2 => arb_ipv6().prop_map(std::net::IpAddr::V6),
]
}
pub fn arb_socket_addr_v4() -> impl Strategy<Value = std::net::SocketAddrV4> {
let port = prop_oneof![
1 => Just(0_u16),
1 => Just(u16::MAX),
1 => Just(80_u16),
1 => Just(443_u16),
6 => any::<u16>(),
];
(arb_ipv4(), port).prop_map(|(ip, p)| std::net::SocketAddrV4::new(ip, p))
}
pub fn arb_extended_socket_addr_v4() -> impl Strategy<Value = Extended<std::net::SocketAddrV4>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
2 => arb_socket_addr_v4().prop_map(Extended::Finite),
]
}
pub fn arb_socket_addr_v6() -> impl Strategy<Value = std::net::SocketAddrV6> {
let port = prop_oneof![
1 => Just(0_u16),
1 => Just(u16::MAX),
1 => Just(80_u16),
6 => any::<u16>(),
];
let flowinfo = prop_oneof![
2 => Just(0_u32),
1 => Just(u32::MAX),
4 => any::<u32>(),
];
let scope_id = prop_oneof![
2 => Just(0_u32),
1 => Just(u32::MAX),
4 => any::<u32>(),
];
(arb_ipv6(), port, flowinfo, scope_id)
.prop_map(|(ip, p, fi, si)| std::net::SocketAddrV6::new(ip, p, fi, si))
}
pub fn arb_extended_socket_addr_v6() -> impl Strategy<Value = Extended<std::net::SocketAddrV6>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
2 => arb_socket_addr_v6().prop_map(Extended::Finite),
]
}
pub fn arb_socket_addr() -> impl Strategy<Value = std::net::SocketAddr> {
prop_oneof![
1 => arb_socket_addr_v4().prop_map(std::net::SocketAddr::V4),
2 => arb_socket_addr_v6().prop_map(std::net::SocketAddr::V6),
]
}
pub fn arb_ordering() -> impl Strategy<Value = core::cmp::Ordering> {
prop_oneof![
Just(core::cmp::Ordering::Less),
Just(core::cmp::Ordering::Equal),
Just(core::cmp::Ordering::Greater),
]
}
#[cfg(feature = "hifi")]
mod hifi_dur {
use super::*;
use crate::extended::Extended;
use hifitime::Duration as HD;
pub fn arb_hifi_duration() -> impl Strategy<Value = HD> {
prop_oneof![
1 => Just(HD::ZERO),
1 => Just(HD::MIN),
1 => Just(HD::MAX),
1 => Just(HD::EPSILON),
1 => Just(HD::MIN_NEGATIVE),
1 => Just(HD::from_total_nanoseconds(1_000_000_000 - 1)),
1 => Just(HD::from_total_nanoseconds(1_000_000_000 + 1)),
1 => Just(HD::from_total_nanoseconds(-(1_000_000_000 - 1))),
1 => Just(HD::from_total_nanoseconds(-(1_000_000_000 + 1))),
1 => Just(HD::from_seconds(1.0)),
1 => Just(HD::from_seconds(-1.0)),
1 => Just(HD::from_total_nanoseconds(HD::MAX.total_nanoseconds() - 1)),
1 => Just(HD::from_total_nanoseconds(HD::MIN.total_nanoseconds() + 1)),
11 => (HD::MIN.total_nanoseconds()..=HD::MAX.total_nanoseconds())
.prop_map(HD::from_total_nanoseconds),
1 => any::<i128>().prop_map(HD::from_total_nanoseconds),
]
}
pub fn arb_extended_hifi_duration() -> impl Strategy<Value = Extended<HD>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
2 => arb_hifi_duration().prop_map(Extended::Finite),
]
}
pub fn arb_hifi_duration_bounded_f64() -> impl Strategy<Value = HD> {
const SECS_BOUND: i128 = 1_000_000_000; const NANOS_BOUND: i128 = SECS_BOUND * 1_000_000_000;
prop_oneof![
1 => Just(HD::ZERO),
1 => Just(HD::EPSILON),
1 => Just(HD::MIN_NEGATIVE),
1 => Just(HD::from_seconds(1.0)),
1 => Just(HD::from_seconds(-1.0)),
8 => (-NANOS_BOUND..=NANOS_BOUND).prop_map(HD::from_total_nanoseconds),
]
}
pub fn arb_hifi_duration_bounded_f32() -> impl Strategy<Value = HD> {
const NANOS_BOUND: i128 = 10 * 1_000_000_000; prop_oneof![
1 => Just(HD::ZERO),
1 => Just(HD::EPSILON),
1 => Just(HD::MIN_NEGATIVE),
1 => Just(HD::from_seconds(1.0)),
1 => Just(HD::from_seconds(-1.0)),
8 => (-NANOS_BOUND..=NANOS_BOUND).prop_map(HD::from_total_nanoseconds),
]
}
pub fn arb_extended_hifi_duration_bounded_f64() -> impl Strategy<Value = Extended<HD>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
2 => arb_hifi_duration_bounded_f64().prop_map(Extended::Finite),
]
}
pub fn arb_extended_hifi_duration_bounded_f32() -> impl Strategy<Value = Extended<HD>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
2 => arb_hifi_duration_bounded_f32().prop_map(Extended::Finite),
]
}
pub fn arb_hifi_total_nanos_in_range() -> impl Strategy<Value = i128> {
let min_n = HD::MIN.total_nanoseconds();
let max_n = HD::MAX.total_nanoseconds();
prop_oneof![
1 => Just(min_n),
1 => Just(max_n),
1 => Just(0_i128),
1 => Just(1_i128),
1 => Just(-1_i128),
8 => min_n..=max_n,
]
}
pub fn arb_hifi_total_secs_in_range() -> impl Strategy<Value = i64> {
let min_s = (HD::MIN.total_nanoseconds() / 1_000_000_000) as i64;
let max_s = (HD::MAX.total_nanoseconds() / 1_000_000_000) as i64;
prop_oneof![
1 => Just(min_s),
1 => Just(max_s),
1 => Just(0_i64),
1 => Just(1_i64),
1 => Just(-1_i64),
8 => min_s..=max_s,
]
}
}
#[cfg(feature = "hifi")]
pub use hifi_dur::{
arb_extended_hifi_duration, arb_extended_hifi_duration_bounded_f32,
arb_extended_hifi_duration_bounded_f64, arb_hifi_duration, arb_hifi_duration_bounded_f32,
arb_hifi_duration_bounded_f64, arb_hifi_total_nanos_in_range, arb_hifi_total_secs_in_range,
};
#[cfg(feature = "hifi")]
mod hifi_epoch {
use super::*;
use crate::extended::Extended;
use hifitime::{
BDT_REF_EPOCH, Duration as HD, Epoch, GPST_REF_EPOCH, GST_REF_EPOCH, J1900_REF_EPOCH,
J2000_REF_EPOCH, QZSST_REF_EPOCH, UNIX_REF_EPOCH,
};
pub fn arb_hifi_epoch() -> impl Strategy<Value = Epoch> {
prop_oneof![
1 => Just(J1900_REF_EPOCH),
1 => Just(J2000_REF_EPOCH),
1 => Just(UNIX_REF_EPOCH),
1 => Just(GPST_REF_EPOCH),
1 => Just(GST_REF_EPOCH),
1 => Just(BDT_REF_EPOCH),
1 => Just(QZSST_REF_EPOCH),
1 => Just(Epoch::from_tai_duration(HD::MIN)),
1 => Just(Epoch::from_tai_duration(HD::MAX)),
1 => Just(Epoch::from_tai_duration(HD::ZERO)),
1 => Just(Epoch::from_tai_duration(HD::EPSILON)),
1 => Just(Epoch::from_tai_duration(HD::MIN_NEGATIVE)),
12 => super::arb_hifi_duration().prop_map(Epoch::from_tai_duration),
]
}
pub fn arb_extended_hifi_epoch() -> impl Strategy<Value = Extended<Epoch>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
2 => arb_hifi_epoch().prop_map(Extended::Finite),
]
}
pub fn arb_hifi_epoch_bounded_f64() -> impl Strategy<Value = Epoch> {
super::arb_hifi_duration_bounded_f64().prop_map(Epoch::from_tai_duration)
}
pub fn arb_extended_hifi_epoch_bounded_f64() -> impl Strategy<Value = Extended<Epoch>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
2 => arb_hifi_epoch_bounded_f64().prop_map(Extended::Finite),
]
}
pub fn arb_hifi_tai_nanos_in_range() -> impl Strategy<Value = i128> {
super::arb_hifi_total_nanos_in_range()
}
pub fn arb_hifi_unix_nanos_in_range() -> impl Strategy<Value = i128> {
let unix_off = UNIX_REF_EPOCH.to_utc_duration().total_nanoseconds();
let min_n = HD::MIN.total_nanoseconds();
let max_n = HD::MAX.total_nanoseconds() - unix_off;
prop_oneof![
1 => Just(min_n),
1 => Just(min_n + 1), 1 => Just(max_n - 1), 1 => Just(max_n),
1 => Just(0_i128),
1 => Just(1_000_000_000_i128), 1 => Just(2_147_483_648_000_000_000_i128), 1 => Just(-1_i128),
8 => min_n..=max_n,
]
}
fn arb_hifi_scale_nanos_in_range(offset_ns: i128) -> impl Strategy<Value = i128> {
let min_n = HD::MIN.total_nanoseconds();
let max_n = HD::MAX.total_nanoseconds() - offset_ns;
prop_oneof![
1 => Just(min_n),
1 => Just(min_n + 1),
1 => Just(max_n - 1),
1 => Just(max_n),
1 => Just(0_i128),
1 => Just(1_i128),
1 => Just(-1_i128),
8 => min_n..=max_n,
]
}
pub fn arb_hifi_gpst_nanos_in_range() -> impl Strategy<Value = i128> {
arb_hifi_scale_nanos_in_range(GPST_REF_EPOCH.to_tai_duration().total_nanoseconds())
}
pub fn arb_hifi_gst_nanos_in_range() -> impl Strategy<Value = i128> {
arb_hifi_scale_nanos_in_range(GST_REF_EPOCH.to_tai_duration().total_nanoseconds())
}
pub fn arb_hifi_bdt_nanos_in_range() -> impl Strategy<Value = i128> {
arb_hifi_scale_nanos_in_range(BDT_REF_EPOCH.to_tai_duration().total_nanoseconds())
}
pub fn arb_hifi_qzsst_nanos_in_range() -> impl Strategy<Value = i128> {
arb_hifi_scale_nanos_in_range(QZSST_REF_EPOCH.to_tai_duration().total_nanoseconds())
}
}
#[cfg(feature = "hifi")]
pub use hifi_epoch::{
arb_extended_hifi_epoch, arb_extended_hifi_epoch_bounded_f64, arb_hifi_bdt_nanos_in_range,
arb_hifi_epoch, arb_hifi_epoch_bounded_f64, arb_hifi_gpst_nanos_in_range,
arb_hifi_gst_nanos_in_range, arb_hifi_qzsst_nanos_in_range, arb_hifi_tai_nanos_in_range,
arb_hifi_unix_nanos_in_range,
};
#[cfg(feature = "hifi")]
mod hifi_calendar {
use super::*;
use crate::extended::Extended;
use hifitime::{MonthName, Weekday};
pub fn arb_hifi_month() -> impl Strategy<Value = MonthName> {
prop_oneof![
Just(MonthName::January),
Just(MonthName::February),
Just(MonthName::March),
Just(MonthName::April),
Just(MonthName::May),
Just(MonthName::June),
Just(MonthName::July),
Just(MonthName::August),
Just(MonthName::September),
Just(MonthName::October),
Just(MonthName::November),
Just(MonthName::December),
]
}
pub fn arb_extended_hifi_month() -> impl Strategy<Value = Extended<MonthName>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
4 => arb_hifi_month().prop_map(Extended::Finite),
]
}
pub fn arb_hifi_weekday() -> impl Strategy<Value = Weekday> {
prop_oneof![
Just(Weekday::Monday),
Just(Weekday::Tuesday),
Just(Weekday::Wednesday),
Just(Weekday::Thursday),
Just(Weekday::Friday),
Just(Weekday::Saturday),
Just(Weekday::Sunday),
]
}
pub fn arb_extended_hifi_weekday() -> impl Strategy<Value = Extended<Weekday>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
4 => arb_hifi_weekday().prop_map(Extended::Finite),
]
}
}
#[cfg(feature = "hifi")]
pub use hifi_calendar::{
arb_extended_hifi_month, arb_extended_hifi_weekday, arb_hifi_month, arb_hifi_weekday,
};