biguint_scalar.rs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. use num_bigint::BigUint;
  2. use num_traits::{One, ToPrimitive, Zero};
  3. use std::panic::catch_unwind;
  4. mod consts;
  5. use crate::consts::*;
  6. #[macro_use]
  7. mod macros;
  8. #[test]
  9. fn test_scalar_add() {
  10. fn check(x: &BigUint, y: &BigUint, z: &BigUint) {
  11. let (x, y, z) = (x.clone(), y.clone(), z.clone());
  12. assert_unsigned_scalar_op!(x + y == z);
  13. assert_unsigned_scalar_assign_op!(x += y == z);
  14. }
  15. for elm in SUM_TRIPLES.iter() {
  16. let (a_vec, b_vec, c_vec) = *elm;
  17. let a = BigUint::from_slice(a_vec);
  18. let b = BigUint::from_slice(b_vec);
  19. let c = BigUint::from_slice(c_vec);
  20. check(&a, &b, &c);
  21. check(&b, &a, &c);
  22. }
  23. }
  24. #[test]
  25. fn test_scalar_sub() {
  26. fn check(x: &BigUint, y: &BigUint, z: &BigUint) {
  27. let (x, y, z) = (x.clone(), y.clone(), z.clone());
  28. assert_unsigned_scalar_op!(x - y == z);
  29. assert_unsigned_scalar_assign_op!(x -= y == z);
  30. }
  31. for elm in SUM_TRIPLES.iter() {
  32. let (a_vec, b_vec, c_vec) = *elm;
  33. let a = BigUint::from_slice(a_vec);
  34. let b = BigUint::from_slice(b_vec);
  35. let c = BigUint::from_slice(c_vec);
  36. check(&c, &a, &b);
  37. check(&c, &b, &a);
  38. }
  39. }
  40. #[test]
  41. fn test_scalar_mul() {
  42. fn check(x: &BigUint, y: &BigUint, z: &BigUint) {
  43. let (x, y, z) = (x.clone(), y.clone(), z.clone());
  44. assert_unsigned_scalar_op!(x * y == z);
  45. assert_unsigned_scalar_assign_op!(x *= y == z);
  46. }
  47. for elm in MUL_TRIPLES.iter() {
  48. let (a_vec, b_vec, c_vec) = *elm;
  49. let a = BigUint::from_slice(a_vec);
  50. let b = BigUint::from_slice(b_vec);
  51. let c = BigUint::from_slice(c_vec);
  52. check(&a, &b, &c);
  53. check(&b, &a, &c);
  54. }
  55. }
  56. #[test]
  57. fn test_scalar_rem_noncommutative() {
  58. assert_eq!(5u8 % BigUint::from(7u8), BigUint::from(5u8));
  59. assert_eq!(BigUint::from(5u8) % 7u8, BigUint::from(5u8));
  60. }
  61. #[test]
  62. fn test_scalar_div_rem() {
  63. fn check(x: &BigUint, y: &BigUint, z: &BigUint, r: &BigUint) {
  64. let (x, y, z, r) = (x.clone(), y.clone(), z.clone(), r.clone());
  65. assert_unsigned_scalar_op!(x / y == z);
  66. assert_unsigned_scalar_op!(x % y == r);
  67. assert_unsigned_scalar_assign_op!(x /= y == z);
  68. assert_unsigned_scalar_assign_op!(x %= y == r);
  69. }
  70. for elm in MUL_TRIPLES.iter() {
  71. let (a_vec, b_vec, c_vec) = *elm;
  72. let a = BigUint::from_slice(a_vec);
  73. let b = BigUint::from_slice(b_vec);
  74. let c = BigUint::from_slice(c_vec);
  75. if !a.is_zero() {
  76. check(&c, &a, &b, &Zero::zero());
  77. }
  78. if !b.is_zero() {
  79. check(&c, &b, &a, &Zero::zero());
  80. }
  81. }
  82. for elm in DIV_REM_QUADRUPLES.iter() {
  83. let (a_vec, b_vec, c_vec, d_vec) = *elm;
  84. let a = BigUint::from_slice(a_vec);
  85. let b = BigUint::from_slice(b_vec);
  86. let c = BigUint::from_slice(c_vec);
  87. let d = BigUint::from_slice(d_vec);
  88. if !b.is_zero() {
  89. check(&a, &b, &c, &d);
  90. assert_unsigned_scalar_op!(a / b == c);
  91. assert_unsigned_scalar_op!(a % b == d);
  92. assert_unsigned_scalar_assign_op!(a /= b == c);
  93. assert_unsigned_scalar_assign_op!(a %= b == d);
  94. }
  95. }
  96. }
  97. #[test]
  98. fn test_scalar_div_rem_zero() {
  99. catch_unwind(|| BigUint::zero() / 0u32).unwrap_err();
  100. catch_unwind(|| BigUint::zero() % 0u32).unwrap_err();
  101. catch_unwind(|| BigUint::one() / 0u32).unwrap_err();
  102. catch_unwind(|| BigUint::one() % 0u32).unwrap_err();
  103. }