use crate::conn::Conn;
pub const USZEU008: Conn<usize, u8> = {
fn ceil(x: usize) -> u8 {
u8::try_from(x).unwrap_or(u8::MAX)
}
fn inner(y: u8) -> usize {
if y == u8::MAX {
usize::MAX
} else {
usize::from(y)
}
}
Conn::new_l(ceil, inner)
};
pub const USZEU016: Conn<usize, u16> = {
fn ceil(x: usize) -> u16 {
u16::try_from(x).unwrap_or(u16::MAX)
}
fn inner(y: u16) -> usize {
if y == u16::MAX {
usize::MAX
} else {
usize::from(y)
}
}
Conn::new_l(ceil, inner)
};
pub const USZEU032: Conn<usize, u32> = {
fn ceil(x: usize) -> u32 {
u32::try_from(x).unwrap_or(u32::MAX)
}
fn inner(y: u32) -> usize {
if y == u32::MAX {
usize::MAX
} else {
usize::try_from(y).unwrap_or(usize::MAX)
}
}
Conn::new_l(ceil, inner)
};
pub const USZEU064: Conn<usize, u64> = {
fn ceil(x: usize) -> u64 {
u64::try_from(x).unwrap_or(u64::MAX)
}
fn inner(y: u64) -> usize {
usize::try_from(y).unwrap_or(usize::MAX)
}
Conn::new_l(ceil, inner)
};
pub const USZEU128: Conn<usize, u128> = {
fn ceil(x: usize) -> u128 {
u128::try_from(x).unwrap_or(u128::MAX)
}
fn inner(y: u128) -> usize {
usize::try_from(y).unwrap_or(usize::MAX)
}
Conn::new_l(ceil, inner)
};
#[cfg(test)]
mod tests {
use super::*;
use crate::prop::conn as conn_laws;
use proptest::prelude::*;
#[test]
fn uszeu008_saturates_and_fixes_up() {
assert_eq!(USZEU008.ceil(usize::MAX), u8::MAX);
assert_eq!(USZEU008.upper(u8::MAX), usize::MAX);
assert_eq!(USZEU008.upper(0), 0);
assert_eq!(USZEU008.ceil(200), 200);
assert_eq!(USZEU008.upper(200), 200);
}
#[test]
fn uszeu016_saturates_and_fixes_up() {
assert_eq!(USZEU016.ceil(usize::MAX), u16::MAX);
assert_eq!(USZEU016.upper(u16::MAX), usize::MAX);
assert_eq!(USZEU016.upper(0), 0);
assert_eq!(USZEU016.ceil(1_000), 1_000);
assert_eq!(USZEU016.upper(1_000), 1_000);
}
#[test]
fn uszeu032_saturates_and_fixes_up() {
assert_eq!(USZEU032.upper(u32::MAX), usize::MAX);
assert_eq!(USZEU032.upper(0), 0);
assert_eq!(USZEU032.ceil(1_000), 1_000);
assert_eq!(USZEU032.upper(1_000), 1_000);
#[cfg(target_pointer_width = "64")]
{
assert_eq!(USZEU032.ceil(usize::MAX), u32::MAX);
assert_eq!(USZEU032.ceil(u32::MAX as usize + 1), u32::MAX);
}
}
#[test]
fn uszeu064_embeds_and_saturates() {
assert_eq!(USZEU064.upper(u64::MAX), usize::MAX);
for v in [0usize, 1, 1_000, usize::MAX - 1, usize::MAX] {
assert_eq!(USZEU064.ceil(v), v as u64);
assert_eq!(USZEU064.upper(v as u64), v);
}
}
#[test]
fn uszeu128_embeds_and_saturates() {
assert_eq!(USZEU128.upper(u128::MAX), usize::MAX);
for v in [0usize, 1, 1_000, usize::MAX - 1, usize::MAX] {
assert_eq!(USZEU128.ceil(v), v as u128);
assert_eq!(USZEU128.upper(v as u128), v);
}
}
fn arb_usize() -> impl Strategy<Value = usize> {
prop_oneof![
Just(0usize),
Just(usize::MAX),
Just(u8::MAX as usize),
Just(u16::MAX as usize),
Just(u32::MAX as usize),
any::<usize>(),
]
}
fn arb_u8() -> impl Strategy<Value = u8> {
prop_oneof![Just(0u8), Just(u8::MAX), any::<u8>()]
}
fn arb_u16() -> impl Strategy<Value = u16> {
prop_oneof![Just(0u16), Just(u16::MAX), any::<u16>()]
}
fn arb_u32() -> impl Strategy<Value = u32> {
prop_oneof![Just(0u32), Just(u32::MAX), any::<u32>()]
}
fn arb_u64() -> impl Strategy<Value = u64> {
prop_oneof![
Just(0u64),
Just(u64::MAX),
Just(usize::MAX as u64),
any::<u64>()
]
}
fn arb_u128() -> impl Strategy<Value = u128> {
prop_oneof![
Just(0u128),
Just(u128::MAX),
Just(usize::MAX as u128),
any::<u128>(),
]
}
proptest! {
#[test]
fn uszeu008_galois_l(a in arb_usize(), b in arb_u8()) {
prop_assert!(conn_laws::galois_l(&USZEU008, a, b));
}
#[test]
fn uszeu008_kernel_l(b in arb_u8()) {
prop_assert!(conn_laws::kernel_l(&USZEU008, b));
}
#[test]
fn uszeu016_galois_l(a in arb_usize(), b in arb_u16()) {
prop_assert!(conn_laws::galois_l(&USZEU016, a, b));
}
#[test]
fn uszeu016_kernel_l(b in arb_u16()) {
prop_assert!(conn_laws::kernel_l(&USZEU016, b));
}
#[test]
fn uszeu032_galois_l(a in arb_usize(), b in arb_u32()) {
prop_assert!(conn_laws::galois_l(&USZEU032, a, b));
}
#[test]
fn uszeu032_kernel_l(b in arb_u32()) {
prop_assert!(conn_laws::kernel_l(&USZEU032, b));
}
#[test]
fn uszeu064_galois_l(a in arb_usize(), b in arb_u64()) {
prop_assert!(conn_laws::galois_l(&USZEU064, a, b));
}
#[test]
fn uszeu064_kernel_l(b in arb_u64()) {
prop_assert!(conn_laws::kernel_l(&USZEU064, b));
}
#[test]
fn uszeu128_galois_l(a in arb_usize(), b in arb_u128()) {
prop_assert!(conn_laws::galois_l(&USZEU128, a, b));
}
#[test]
fn uszeu128_kernel_l(b in arb_u128()) {
prop_assert!(conn_laws::kernel_l(&USZEU128, b));
}
}
}