macro_rules! test_average { ($I:ident, $U:ident) => { mod $I { mod ceil { use num_integer::Average; #[test] fn same_sign() { assert_eq!((14 as $I).average_ceil(&16), 15 as $I); assert_eq!((14 as $I).average_ceil(&17), 16 as $I); let max = std::$I::MAX; assert_eq!((max - 3).average_ceil(&(max - 1)), max - 2); assert_eq!((max - 3).average_ceil(&(max - 2)), max - 2); } #[test] fn different_sign() { assert_eq!((14 as $I).average_ceil(&-4), 5 as $I); assert_eq!((14 as $I).average_ceil(&-5), 5 as $I); let min = std::$I::MIN; let max = std::$I::MAX; assert_eq!(min.average_ceil(&max), 0 as $I); } } mod floor { use num_integer::Average; #[test] fn same_sign() { assert_eq!((14 as $I).average_floor(&16), 15 as $I); assert_eq!((14 as $I).average_floor(&17), 15 as $I); let max = std::$I::MAX; assert_eq!((max - 3).average_floor(&(max - 1)), max - 2); assert_eq!((max - 3).average_floor(&(max - 2)), max - 3); } #[test] fn different_sign() { assert_eq!((14 as $I).average_floor(&-4), 5 as $I); assert_eq!((14 as $I).average_floor(&-5), 4 as $I); let min = std::$I::MIN; let max = std::$I::MAX; assert_eq!(min.average_floor(&max), -1 as $I); } } } mod $U { mod ceil { use num_integer::Average; #[test] fn bounded() { assert_eq!((14 as $U).average_ceil(&16), 15 as $U); assert_eq!((14 as $U).average_ceil(&17), 16 as $U); } #[test] fn overflow() { let max = std::$U::MAX; assert_eq!((max - 3).average_ceil(&(max - 1)), max - 2); assert_eq!((max - 3).average_ceil(&(max - 2)), max - 2); } } mod floor { use num_integer::Average; #[test] fn bounded() { assert_eq!((14 as $U).average_floor(&16), 15 as $U); assert_eq!((14 as $U).average_floor(&17), 15 as $U); } #[test] fn overflow() { let max = std::$U::MAX; assert_eq!((max - 3).average_floor(&(max - 1)), max - 2); assert_eq!((max - 3).average_floor(&(max - 2)), max - 3); } } } }; } test_average!(i8, u8); test_average!(i16, u16); test_average!(i32, u32); test_average!(i64, u64); test_average!(i128, u128); test_average!(isize, usize);