average.rs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. extern crate num_integer;
  2. extern crate num_traits;
  3. macro_rules! test_average {
  4. ($I:ident, $U:ident) => {
  5. mod $I {
  6. mod ceil {
  7. use num_integer::Average;
  8. #[test]
  9. fn same_sign() {
  10. assert_eq!((14 as $I).average_ceil(&16), 15 as $I);
  11. assert_eq!((14 as $I).average_ceil(&17), 16 as $I);
  12. let max = $crate::std::$I::MAX;
  13. assert_eq!((max - 3).average_ceil(&(max - 1)), max - 2);
  14. assert_eq!((max - 3).average_ceil(&(max - 2)), max - 2);
  15. }
  16. #[test]
  17. fn different_sign() {
  18. assert_eq!((14 as $I).average_ceil(&-4), 5 as $I);
  19. assert_eq!((14 as $I).average_ceil(&-5), 5 as $I);
  20. let min = $crate::std::$I::MIN;
  21. let max = $crate::std::$I::MAX;
  22. assert_eq!(min.average_ceil(&max), 0 as $I);
  23. }
  24. }
  25. mod floor {
  26. use num_integer::Average;
  27. #[test]
  28. fn same_sign() {
  29. assert_eq!((14 as $I).average_floor(&16), 15 as $I);
  30. assert_eq!((14 as $I).average_floor(&17), 15 as $I);
  31. let max = $crate::std::$I::MAX;
  32. assert_eq!((max - 3).average_floor(&(max - 1)), max - 2);
  33. assert_eq!((max - 3).average_floor(&(max - 2)), max - 3);
  34. }
  35. #[test]
  36. fn different_sign() {
  37. assert_eq!((14 as $I).average_floor(&-4), 5 as $I);
  38. assert_eq!((14 as $I).average_floor(&-5), 4 as $I);
  39. let min = $crate::std::$I::MIN;
  40. let max = $crate::std::$I::MAX;
  41. assert_eq!(min.average_floor(&max), -1 as $I);
  42. }
  43. }
  44. }
  45. mod $U {
  46. mod ceil {
  47. use num_integer::Average;
  48. #[test]
  49. fn bounded() {
  50. assert_eq!((14 as $U).average_ceil(&16), 15 as $U);
  51. assert_eq!((14 as $U).average_ceil(&17), 16 as $U);
  52. }
  53. #[test]
  54. fn overflow() {
  55. let max = $crate::std::$U::MAX;
  56. assert_eq!((max - 3).average_ceil(&(max - 1)), max - 2);
  57. assert_eq!((max - 3).average_ceil(&(max - 2)), max - 2);
  58. }
  59. }
  60. mod floor {
  61. use num_integer::Average;
  62. #[test]
  63. fn bounded() {
  64. assert_eq!((14 as $U).average_floor(&16), 15 as $U);
  65. assert_eq!((14 as $U).average_floor(&17), 15 as $U);
  66. }
  67. #[test]
  68. fn overflow() {
  69. let max = $crate::std::$U::MAX;
  70. assert_eq!((max - 3).average_floor(&(max - 1)), max - 2);
  71. assert_eq!((max - 3).average_floor(&(max - 2)), max - 3);
  72. }
  73. }
  74. }
  75. };
  76. }
  77. test_average!(i8, u8);
  78. test_average!(i16, u16);
  79. test_average!(i32, u32);
  80. test_average!(i64, u64);
  81. #[cfg(has_i128)]
  82. test_average!(i128, u128);
  83. test_average!(isize, usize);