use connections::conn::{
Conn, ConnK, ConnL, ConnR, L, R, interval, median, round, round1, truncate,
};
use connections::core::f064::F064F032;
use connections::float::N5;
use proptest::prelude::*;
fn ext_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)),
8 => (-1.0e6_f64..1.0e6).prop_map(N5::new),
]
}
fn ext_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)),
8 => (-1.0e6_f32..1.0e6).prop_map(N5::new),
]
}
proptest! {
#[test]
fn marker_direct_eq_view_l(a in ext_f64(), b in ext_f32()) {
prop_assert_eq!(F064F032.ceil(a), F064F032.view_l().ceil(a));
prop_assert_eq!(F064F032.ceil(a), F064F032.view_l().ceil(a));
prop_assert_eq!(F064F032.upper(b), F064F032.view_l().upper(b));
prop_assert_eq!(F064F032.upper1(|x| x, a), F064F032.view_l().upper1(|x| x, a));
prop_assert_eq!(F064F032.ceil1(|x| x, b), F064F032.view_l().ceil1(|x| x, b));
}
#[test]
fn marker_direct_eq_view_r(a in ext_f64(), b in ext_f32()) {
prop_assert_eq!(F064F032.floor(a), F064F032.view_r().floor(a));
prop_assert_eq!(F064F032.floor(a), F064F032.view_r().floor(a));
prop_assert_eq!(F064F032.lower(b), F064F032.view_r().lower(b));
prop_assert_eq!(F064F032.lower1(|x| x, a), F064F032.view_r().lower1(|x| x, a));
prop_assert_eq!(F064F032.floor1(|x| x, b), F064F032.view_r().floor1(|x| x, b));
}
#[test]
fn marker_two_sided_eq_free_fn(a in ext_f64(), b in ext_f32()) {
prop_assert_eq!(F064F032.round(a), round(&F064F032, a));
prop_assert_eq!(F064F032.truncate(a), truncate(&F064F032, a));
prop_assert_eq!(F064F032.interval(a), interval(&F064F032, a));
prop_assert_eq!(F064F032.round1(|x| x, b), round1(&F064F032, |x| x, b));
}
}
fn max_i32(p: (i32, i32)) -> i32 {
p.0.max(p.1)
}
fn dup_i32(x: i32) -> (i32, i32) {
(x, x)
}
fn min_i32(p: (i32, i32)) -> i32 {
p.0.min(p.1)
}
connections::conn_k! {
OrdI32Med : (i32, i32) => i32 {
ceil: max_i32,
inner: dup_i32,
floor: min_i32,
}
}
#[test]
fn median_method_eq_free_fn() {
for (x, y, z) in [(1, 2, 3), (3, 1, 2), (5, 5, 1), (-2, 0, 7), (7, 7, 7)] {
assert_eq!(
OrdI32Med.median(x, y, z),
median(&OrdI32Med, x, y, z),
"median method must match the free fn for ({x}, {y}, {z})",
);
}
assert_eq!(OrdI32Med.median(1, 2, 3), 2);
}
fn id_i32(x: i32) -> i32 {
x
}
const VALUE_L: Conn<i32, i32, L> = Conn::new_l(id_i32, id_i32);
const VALUE_SWAPPED: Conn<i32, i32, R> = VALUE_L.swap_l();
#[test]
fn value_accessor_unchanged() {
assert_eq!(VALUE_SWAPPED.floor(5), 5);
assert_eq!(VALUE_L.ceil(5), 5);
}