biginteger_test.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. //
  2. // biginteger_test.cpp
  3. // bigdecimal
  4. //
  5. // Created by Sam Jaffe on 5/18/18.
  6. //
  7. #include <gmock/gmock.h>
  8. #include "biginteger.h"
  9. TEST(BigInteger, ConstructFromStringIsSameValueAsFromInt) {
  10. EXPECT_THAT(math::biginteger("1000000"),
  11. math::biginteger(1000000));
  12. }
  13. TEST(BigInteger, AddPastBounds) {
  14. math::biginteger bi{999999999ULL};
  15. EXPECT_THAT((bi+1).to_string(), "1000000000");
  16. }
  17. TEST(BigInteger, AddReciprocalIsZero) {
  18. math::biginteger bi{1000};
  19. EXPECT_THAT((bi+(-bi)).to_string(), "0");
  20. }
  21. TEST(BigInteger, AddNegativeLargerGivesNegative) {
  22. math::biginteger bi{1000};
  23. EXPECT_THAT((bi+(-1001)).to_string(), "-1");
  24. }
  25. TEST(BigInteger, AddNegativeSmallerGivesPositive) {
  26. math::biginteger bi{1000};
  27. EXPECT_THAT((bi+(-999)).to_string(), "1");
  28. }
  29. TEST(BigInteger, SubSelfIsZero) {
  30. math::biginteger bi{1000};
  31. EXPECT_THAT((bi-bi).to_string(), "0");
  32. }
  33. TEST(BigInteger, NegativeMinusNegativeIncreateAbs) {
  34. math::biginteger bi{-1000};
  35. EXPECT_THAT((bi-100).to_string(), "-1100");
  36. }
  37. TEST(BigInteger, SubLargerGivesNegative) {
  38. math::biginteger bi{1000};
  39. EXPECT_THAT((bi-1001).to_string(), "-1");
  40. }
  41. TEST(BigInteger, SubSmallerGivesPositive) {
  42. math::biginteger bi{1000};
  43. EXPECT_THAT((bi-999).to_string(), "1");
  44. }
  45. TEST(BigInteger, SubUnderflowBorrows) {
  46. math::biginteger bi{1000000000ULL};
  47. EXPECT_THAT((bi-1).to_string(), "999999999");
  48. }
  49. TEST(BigInteger, MultiplyZeroReturnsZero) {
  50. auto &ZERO = math::biginteger::ZERO;
  51. math::biginteger bi{999999999ULL};
  52. EXPECT_THAT(bi*ZERO, ZERO);
  53. EXPECT_THAT(ZERO*bi, ZERO);
  54. }
  55. TEST(BigInteger, MultiplyOneReturnsValue) {
  56. auto &ONE = math::biginteger::ONE;
  57. math::biginteger bi{999999999ULL};
  58. EXPECT_THAT((bi*ONE).to_string(), "999999999");
  59. EXPECT_THAT((ONE*bi).to_string(), "999999999");
  60. }
  61. TEST(BigInteger, MultiplyNegativeOneReturnsInverse) {
  62. auto &NEGATIVE_ONE = math::biginteger::NEGATIVE_ONE;
  63. math::biginteger bi{999999999ULL};
  64. EXPECT_THAT((bi*NEGATIVE_ONE).to_string(), "-999999999");
  65. EXPECT_THAT((NEGATIVE_ONE*bi).to_string(), "-999999999");
  66. }
  67. TEST(BigInteger, MultiplyOverflowsIntoNextCell) {
  68. math::biginteger bi{999999999ULL};
  69. EXPECT_THAT((bi*bi).to_string(), "999999998000000001");
  70. }
  71. TEST(BigInteger, MultiplyCarryIntoNextCell) {
  72. math::biginteger bi{999999999ULL};
  73. math::biginteger big{bi*bi};
  74. EXPECT_THAT((big*big).to_string(),
  75. "999999996000000005999999996000000001");
  76. }
  77. TEST(BigInteger, MultiplyNoOverflow) {
  78. math::biginteger bi{1000};
  79. EXPECT_THAT((bi*bi).to_string(), "1000000");
  80. }
  81. TEST(BigInteger, DivideByZeroThrows) {
  82. auto &ZERO = math::biginteger::ZERO;
  83. math::biginteger bi{1000};
  84. EXPECT_THROW(bi/ZERO, std::domain_error);
  85. }
  86. TEST(BigInteger, DivideByOneReturnsValue) {
  87. auto &ONE = math::biginteger::ONE;
  88. math::biginteger bi{1000};
  89. EXPECT_THAT(bi/ONE, bi);
  90. }
  91. TEST(BigInteger, DivideByNegativeOneReturnsInverse) {
  92. auto &NEGATIVE_ONE = math::biginteger::NEGATIVE_ONE;
  93. math::biginteger bi{1000};
  94. EXPECT_THAT((bi/NEGATIVE_ONE).to_string(), "-1000");
  95. }
  96. TEST(BigInteger, DivisionWithMultipleMultSubSteps) {
  97. math::biginteger bi{1112};
  98. EXPECT_THAT((bi/2).to_string(), "556");
  99. }
  100. TEST(BigInteger, DivisionDroppingNumberOfCells) {
  101. math::biginteger bi{1000000000ULL};
  102. EXPECT_THAT((bi/2).to_string(), "500000000");
  103. }
  104. TEST(BigInteger, DivisionByBiggerNumberIsZero) {
  105. math::biginteger bi{1000ULL};
  106. EXPECT_THAT((bi/1001).to_string(), "0");
  107. }
  108. TEST(BigInteger, DivisionWithLargeNumbers) {
  109. math::biginteger big{"999999998000000001"};
  110. EXPECT_THAT(big.to_string(), "999999998000000001");
  111. EXPECT_THAT((big/999999999ULL).to_string(), "999999999");
  112. }
  113. TEST(BigInteger, ModuloZeroThrows) {
  114. math::biginteger bi{1000};
  115. EXPECT_THROW(bi%0, std::domain_error);
  116. }
  117. TEST(BigInteger, ModuloBiggerIsSameValue) {
  118. math::biginteger bi{1000};
  119. EXPECT_THAT(bi%2000, bi);
  120. }
  121. TEST(BigInteger, ModuloSameNumberIsZero) {
  122. math::biginteger bi{1000};
  123. EXPECT_THAT(bi%1000, 0);
  124. }
  125. TEST(BigInteger, ModuloDivisorIsZero) {
  126. math::biginteger bi{1000};
  127. EXPECT_THAT(bi%100, 0);
  128. }
  129. TEST(BigInteger, ModuloDiffSignIsInverseElement) {
  130. math::biginteger bi{1000};
  131. math::biginteger mod{13};
  132. EXPECT_THAT((bi%mod)+((-bi)%mod), mod);
  133. }
  134. TEST(BigInteger, ModuloNegativesIsNegative) {
  135. math::biginteger bi{1000};
  136. math::biginteger mod{13};
  137. EXPECT_THAT((bi%mod), -((-bi)%(-mod)));
  138. }