use crate::core::{ext_int, int_int_narrow};
int_int_narrow!(ISZEI008, isize, i8);
int_int_narrow!(ISZEI016, isize, i16);
ext_int!(ISZEI128, isize, i128);
#[cfg(test)]
mod tests {
use super::*;
use crate::extended::Extended;
use crate::prop::conn as conn_laws;
use proptest::prelude::*;
#[test]
fn iszei008_saturates_and_fixes_up() {
assert_eq!(ISZEI008.ceil(isize::MAX), i8::MAX);
assert_eq!(ISZEI008.ceil(isize::MIN), i8::MIN);
assert_eq!(ISZEI008.upper(i8::MAX), isize::MAX); assert_eq!(ISZEI008.upper(i8::MIN), i8::MIN as isize); assert_eq!(ISZEI008.ceil(-100), -100);
assert_eq!(ISZEI008.upper(-100), -100);
}
#[test]
fn iszei016_saturates_and_fixes_up() {
assert_eq!(ISZEI016.ceil(isize::MAX), i16::MAX);
assert_eq!(ISZEI016.ceil(isize::MIN), i16::MIN);
assert_eq!(ISZEI016.upper(i16::MAX), isize::MAX);
assert_eq!(ISZEI016.upper(i16::MIN), i16::MIN as isize);
assert_eq!(ISZEI016.ceil(-1_000), -1_000);
assert_eq!(ISZEI016.upper(-1_000), -1_000);
}
#[test]
fn iszei128_extends_to_one_above() {
assert_eq!(ISZEI128.ceil(Extended::PosInf), (isize::MAX as i128) + 1);
assert_eq!(ISZEI128.ceil(Extended::NegInf), i128::MIN);
assert_eq!(ISZEI128.ceil(Extended::Finite(-42)), -42);
assert_eq!(ISZEI128.upper(-42), Extended::Finite(-42));
}
fn arb_isize() -> impl Strategy<Value = isize> {
prop_oneof![
Just(0isize),
Just(isize::MIN),
Just(isize::MAX),
Just(i8::MIN as isize),
Just(i8::MAX as isize),
Just(i16::MIN as isize),
Just(i16::MAX as isize),
any::<isize>(),
]
}
fn arb_i8() -> impl Strategy<Value = i8> {
prop_oneof![Just(i8::MIN), Just(0i8), Just(i8::MAX), any::<i8>()]
}
fn arb_i16() -> impl Strategy<Value = i16> {
prop_oneof![Just(i16::MIN), Just(0i16), Just(i16::MAX), any::<i16>()]
}
fn arb_ext_isize() -> impl Strategy<Value = Extended<isize>> {
prop_oneof![
1 => Just(Extended::NegInf),
1 => Just(Extended::PosInf),
1 => Just(Extended::Finite(isize::MIN)),
1 => Just(Extended::Finite(isize::MAX)),
8 => any::<isize>().prop_map(Extended::Finite),
]
}
proptest! {
#[test]
fn iszei008_galois_l(a in arb_isize(), b in arb_i8()) {
prop_assert!(conn_laws::galois_l(&ISZEI008, a, b));
}
#[test]
fn iszei008_kernel_l(b in arb_i8()) {
prop_assert!(conn_laws::kernel_l(&ISZEI008, b));
}
#[test]
fn iszei016_galois_l(a in arb_isize(), b in arb_i16()) {
prop_assert!(conn_laws::galois_l(&ISZEI016, a, b));
}
#[test]
fn iszei016_kernel_l(b in arb_i16()) {
prop_assert!(conn_laws::kernel_l(&ISZEI016, b));
}
#[test]
fn iszei128_galois_l(a in arb_ext_isize(), b in any::<i128>()) {
prop_assert!(conn_laws::galois_l(&ISZEI128, a, b));
}
#[test]
fn iszei128_kernel_l(b in any::<i128>()) {
prop_assert!(conn_laws::kernel_l(&ISZEI128, b));
}
}
}