diff --git a/library/coretests/tests/lib.rs b/library/coretests/tests/lib.rs index dd7cdd79c0d60..92b920dd775ed 100644 --- a/library/coretests/tests/lib.rs +++ b/library/coretests/tests/lib.rs @@ -30,6 +30,7 @@ #![feature(duration_constructors)] #![feature(duration_constructors_lite)] #![feature(error_generic_member_access)] +#![feature(exact_div)] #![feature(exact_size_is_empty)] #![feature(extend_one)] #![feature(extern_types)] diff --git a/library/coretests/tests/num/int_macros.rs b/library/coretests/tests/num/int_macros.rs index 0d9fb9e797e1f..41d399c1ad9f5 100644 --- a/library/coretests/tests/num/int_macros.rs +++ b/library/coretests/tests/num/int_macros.rs @@ -683,5 +683,43 @@ macro_rules! int_module { assert_eq_const_safe!($T: <$T>::unbounded_shr(17, SHIFT_AMOUNT_OVERFLOW3), 0); } } + + const EXACT_DIV_SUCCESS_DIVIDEND1: $T = 42; + const EXACT_DIV_SUCCESS_DIVISOR1: $T = 6; + const EXACT_DIV_SUCCESS_QUOTIENT1: $T = 7; + const EXACT_DIV_SUCCESS_DIVIDEND2: $T = 18; + const EXACT_DIV_SUCCESS_DIVISOR2: $T = 3; + const EXACT_DIV_SUCCESS_QUOTIENT2: $T = 6; + const EXACT_DIV_SUCCESS_DIVIDEND3: $T = -91; + const EXACT_DIV_SUCCESS_DIVISOR3: $T = 13; + const EXACT_DIV_SUCCESS_QUOTIENT3: $T = -7; + const EXACT_DIV_SUCCESS_DIVIDEND4: $T = -57; + const EXACT_DIV_SUCCESS_DIVISOR4: $T = -3; + const EXACT_DIV_SUCCESS_QUOTIENT4: $T = 19; + + test_runtime_and_compiletime! { + fn test_exact_div() { + // 42 / 6 + assert_eq_const_safe!(Option<$T>: <$T>::checked_exact_div(EXACT_DIV_SUCCESS_DIVIDEND1, EXACT_DIV_SUCCESS_DIVISOR1), Some(EXACT_DIV_SUCCESS_QUOTIENT1)); + assert_eq_const_safe!($T: <$T>::exact_div(EXACT_DIV_SUCCESS_DIVIDEND1, EXACT_DIV_SUCCESS_DIVISOR1), EXACT_DIV_SUCCESS_QUOTIENT1); + + // 18 / 3 + assert_eq_const_safe!(Option<$T>: <$T>::checked_exact_div(EXACT_DIV_SUCCESS_DIVIDEND2, EXACT_DIV_SUCCESS_DIVISOR2), Some(EXACT_DIV_SUCCESS_QUOTIENT2)); + assert_eq_const_safe!($T: <$T>::exact_div(EXACT_DIV_SUCCESS_DIVIDEND2, EXACT_DIV_SUCCESS_DIVISOR2), EXACT_DIV_SUCCESS_QUOTIENT2); + + // -91 / 13 + assert_eq_const_safe!(Option<$T>: <$T>::checked_exact_div(EXACT_DIV_SUCCESS_DIVIDEND3, EXACT_DIV_SUCCESS_DIVISOR3), Some(EXACT_DIV_SUCCESS_QUOTIENT3)); + assert_eq_const_safe!($T: <$T>::exact_div(EXACT_DIV_SUCCESS_DIVIDEND3, EXACT_DIV_SUCCESS_DIVISOR3), EXACT_DIV_SUCCESS_QUOTIENT3); + + // -57 / -3 + assert_eq_const_safe!(Option<$T>: <$T>::checked_exact_div(EXACT_DIV_SUCCESS_DIVIDEND4, EXACT_DIV_SUCCESS_DIVISOR4), Some(EXACT_DIV_SUCCESS_QUOTIENT4)); + assert_eq_const_safe!($T: <$T>::exact_div(EXACT_DIV_SUCCESS_DIVIDEND4, EXACT_DIV_SUCCESS_DIVISOR4), EXACT_DIV_SUCCESS_QUOTIENT4); + + // failures + assert_eq_const_safe!(Option<$T>: <$T>::checked_exact_div(1, 2), None); + assert_eq_const_safe!(Option<$T>: <$T>::checked_exact_div(<$T>::MIN, -1), None); + assert_eq_const_safe!(Option<$T>: <$T>::checked_exact_div(0, 0), None); + } + } }; } diff --git a/library/coretests/tests/num/uint_macros.rs b/library/coretests/tests/num/uint_macros.rs index 2e35e8bf5342a..6f3d160964f14 100644 --- a/library/coretests/tests/num/uint_macros.rs +++ b/library/coretests/tests/num/uint_macros.rs @@ -516,5 +516,28 @@ macro_rules! uint_module { assert_eq_const_safe!($T: <$T>::unbounded_shr(17, SHIFT_AMOUNT_OVERFLOW3), 0); } } + + const EXACT_DIV_SUCCESS_DIVIDEND1: $T = 42; + const EXACT_DIV_SUCCESS_DIVISOR1: $T = 6; + const EXACT_DIV_SUCCESS_QUOTIENT1: $T = 7; + const EXACT_DIV_SUCCESS_DIVIDEND2: $T = 18; + const EXACT_DIV_SUCCESS_DIVISOR2: $T = 3; + const EXACT_DIV_SUCCESS_QUOTIENT2: $T = 6; + + test_runtime_and_compiletime! { + fn test_exact_div() { + // 42 / 6 + assert_eq_const_safe!(Option<$T>: <$T>::checked_exact_div(EXACT_DIV_SUCCESS_DIVIDEND1, EXACT_DIV_SUCCESS_DIVISOR1), Some(EXACT_DIV_SUCCESS_QUOTIENT1)); + assert_eq_const_safe!($T: <$T>::exact_div(EXACT_DIV_SUCCESS_DIVIDEND1, EXACT_DIV_SUCCESS_DIVISOR1), EXACT_DIV_SUCCESS_QUOTIENT1); + + // 18 / 3 + assert_eq_const_safe!(Option<$T>: <$T>::checked_exact_div(EXACT_DIV_SUCCESS_DIVIDEND2, EXACT_DIV_SUCCESS_DIVISOR2), Some(EXACT_DIV_SUCCESS_QUOTIENT2)); + assert_eq_const_safe!($T: <$T>::exact_div(EXACT_DIV_SUCCESS_DIVIDEND2, EXACT_DIV_SUCCESS_DIVISOR2), EXACT_DIV_SUCCESS_QUOTIENT2); + + // failures + assert_eq_const_safe!(Option<$T>: <$T>::checked_exact_div(1, 2), None); + assert_eq_const_safe!(Option<$T>: <$T>::checked_exact_div(0, 0), None); + } + } }; }