mul.rs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. use core::{
  2. fmt::Debug,
  3. ops::{Mul, MulAssign},
  4. };
  5. use ibig::{ibig, ubig};
  6. fn test_mul<'a, T>(a: &'a T, b: &'a T, c: &'a T)
  7. where
  8. T: Mul<T, Output = T>,
  9. T: Mul<&'a T, Output = T>,
  10. &'a T: Mul<T, Output = T>,
  11. &'a T: Mul<&'a T, Output = T>,
  12. T: MulAssign<T>,
  13. T: MulAssign<&'a T>,
  14. T: Clone,
  15. T: Debug,
  16. T: Eq,
  17. {
  18. assert_eq!(a * b, *c);
  19. assert_eq!(a.clone() * b, *c);
  20. assert_eq!(a * b.clone(), *c);
  21. assert_eq!(a.clone() * b.clone(), *c);
  22. let mut x = a.clone();
  23. x *= b;
  24. assert_eq!(x, *c);
  25. let mut x = a.clone();
  26. x *= b.clone();
  27. assert_eq!(x, *c);
  28. }
  29. #[test]
  30. fn test_mul_ubig() {
  31. let test_cases = [
  32. (ubig!(0), ubig!(4), ubig!(0)),
  33. (ubig!(3), ubig!(4), ubig!(12)),
  34. (ubig!(0x123456789abc), ubig!(0x444333222111fff), ubig!(0x4daae4d8531f8de7e1fb5ae544)),
  35. (ubig!(0), ubig!(1) << 100, ubig!(0)),
  36. (
  37. ubig!(1),
  38. ubig!(_0x123456789123456789123456789123456789),
  39. ubig!(_0x123456789123456789123456789123456789)
  40. ),
  41. (
  42. ubig!(0x10),
  43. ubig!(_0x123456789123456789123456789123456789),
  44. ubig!(_0x1234567891234567891234567891234567890)
  45. ),
  46. (
  47. ubig!(0x1000000000000000),
  48. ubig!(_0x123456789123456789123456789123456789),
  49. ubig!(_0x123456789123456789123456789123456789000000000000000)
  50. ),
  51. (
  52. ubig!(_0x123456789123456789123456789123456789123456789123456789),
  53. ubig!(_0xabcdefabcdefabcdefabcdefabcdef),
  54. ubig!(_0xc379ab6dbd40ef67e528bfffd3039491348e20491348e20491348d5ccf67db24c3a1cca8f7891375de7)
  55. ),
  56. ];
  57. for (a, b, c) in &test_cases {
  58. test_mul(a, b, c);
  59. test_mul(b, a, c);
  60. }
  61. }
  62. #[test]
  63. fn test_mul_ibig() {
  64. let test_cases = [
  65. (ibig!(3), ibig!(4), ibig!(12)),
  66. (ibig!(-3), ibig!(4), ibig!(-12)),
  67. (ibig!(-3), ibig!(-4), ibig!(12)),
  68. ];
  69. for (a, b, c) in &test_cases {
  70. test_mul(a, b, c);
  71. test_mul(b, a, c);
  72. }
  73. }
  74. #[test]
  75. #[allow(clippy::op_ref, clippy::erasing_op)]
  76. fn test_mul_ubig_primitive() {
  77. assert_eq!(ubig!(3) * 4u8, ubig!(12));
  78. assert_eq!(ubig!(3) * &4u8, ubig!(12));
  79. assert_eq!(&ubig!(3) * 4u8, ubig!(12));
  80. assert_eq!(&ubig!(3) * &4u8, ubig!(12));
  81. assert_eq!(4u8 * ubig!(3), ubig!(12));
  82. assert_eq!(4u8 * &ubig!(3), ubig!(12));
  83. assert_eq!(&4u8 * ubig!(3), ubig!(12));
  84. assert_eq!(&4u8 * &ubig!(3), ubig!(12));
  85. let mut x = ubig!(3);
  86. x *= 2u8;
  87. x *= &2u8;
  88. assert_eq!(x, ubig!(12));
  89. assert_eq!(ubig!(3) * 4, ubig!(12));
  90. assert_eq!(ubig!(3) * &4, ubig!(12));
  91. assert_eq!(&ubig!(3) * 4, ubig!(12));
  92. assert_eq!(&ubig!(3) * &4, ubig!(12));
  93. assert_eq!(4 * ubig!(3), ubig!(12));
  94. assert_eq!(4 * &ubig!(3), ubig!(12));
  95. assert_eq!(&4 * ubig!(3), ubig!(12));
  96. assert_eq!(&4 * &ubig!(3), ubig!(12));
  97. let mut x = ubig!(3);
  98. x *= 2;
  99. x *= &2;
  100. assert_eq!(x, ubig!(12));
  101. assert_eq!(ubig!(0) * -1, ubig!(0));
  102. assert_eq!(ubig!(5) * 0, ubig!(0));
  103. }
  104. #[test]
  105. #[should_panic]
  106. fn test_mul_ubig_primitive_overflow() {
  107. let _ = ubig!(3) * (-5);
  108. }
  109. #[test]
  110. #[allow(clippy::op_ref)]
  111. fn test_mul_ibig_primitive() {
  112. assert_eq!(ibig!(-3) * 4u8, ibig!(-12));
  113. assert_eq!(ibig!(-3) * &4u8, ibig!(-12));
  114. assert_eq!(&ibig!(-3) * 4u8, ibig!(-12));
  115. assert_eq!(&ibig!(-3) * &4u8, ibig!(-12));
  116. assert_eq!(4u8 * ibig!(-3), ibig!(-12));
  117. assert_eq!(4u8 * &ibig!(-3), ibig!(-12));
  118. assert_eq!(&4u8 * ibig!(-3), ibig!(-12));
  119. assert_eq!(&4u8 * &ibig!(-3), ibig!(-12));
  120. let mut x = ibig!(-3);
  121. x *= 2u8;
  122. x *= &2u8;
  123. assert_eq!(x, ibig!(-12));
  124. assert_eq!(ibig!(-3) * -4, ibig!(12));
  125. assert_eq!(ibig!(-3) * &-4, ibig!(12));
  126. assert_eq!(&ibig!(-3) * -4, ibig!(12));
  127. assert_eq!(&ibig!(-3) * &-4, ibig!(12));
  128. assert_eq!(-4 * ibig!(-3), ibig!(12));
  129. assert_eq!(-4 * &ibig!(-3), ibig!(12));
  130. assert_eq!(&-4 * ibig!(-3), ibig!(12));
  131. assert_eq!(&-4 * &ibig!(-3), ibig!(12));
  132. let mut x = ibig!(-3);
  133. x *= 2;
  134. x *= &-2;
  135. assert_eq!(x, ibig!(12));
  136. }