bignumber_integral_test.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. //
  2. // bigdecimal_integral_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. #include "bigdecimal.h"
  10. template <typename T>
  11. class BigIntLikeTest : public testing::Test {
  12. public:
  13. T typeget_;
  14. };
  15. #define BigNumber decltype(this->typeget_)
  16. typedef testing::Types<math::biginteger, math::bigdecimal> IntLikeBigNumbers;
  17. TYPED_TEST_CASE(BigIntLikeTest, IntLikeBigNumbers);
  18. TYPED_TEST(BigIntLikeTest, DefaultConstructorCreatesZero) {
  19. EXPECT_THAT(BigNumber(), 0);
  20. EXPECT_THAT(BigNumber().to_string(), "0");
  21. }
  22. TYPED_TEST(BigIntLikeTest, StringAndNumberConstructorsEqual) {
  23. EXPECT_THAT(BigNumber( "1000000"), BigNumber( 1000000));
  24. EXPECT_THAT(BigNumber("-1000000"), BigNumber(-1000000));
  25. }
  26. TYPED_TEST(BigIntLikeTest, AddPastBounds) {
  27. BigNumber bi{999999999ULL};
  28. EXPECT_THAT((bi+1).to_string(), "1000000000");
  29. }
  30. TYPED_TEST(BigIntLikeTest, AddReciprocalIsZero) {
  31. BigNumber bi{1000};
  32. EXPECT_THAT((bi+(-bi)).to_string(), "0");
  33. }
  34. TYPED_TEST(BigIntLikeTest, AddNegativeLargerGivesNegative) {
  35. BigNumber bi{1000};
  36. EXPECT_THAT((bi+(-1001)).to_string(), "-1");
  37. }
  38. TYPED_TEST(BigIntLikeTest, AddNegativeSmallerGivesPositive) {
  39. BigNumber bi{1000};
  40. EXPECT_THAT((bi+(-999)).to_string(), "1");
  41. }
  42. TYPED_TEST(BigIntLikeTest, AddNumberZeroGivesOriginal) {
  43. BigNumber bi{1000};
  44. EXPECT_THAT(bi+0, bi);
  45. }
  46. TYPED_TEST(BigIntLikeTest, AddZeroNumberGivesOriginal) {
  47. BigNumber bi{1000};
  48. EXPECT_THAT(0+bi, bi);
  49. }
  50. TYPED_TEST(BigIntLikeTest, SubSelfIsZero) {
  51. BigNumber bi{1000};
  52. EXPECT_THAT((bi-bi).to_string(), "0");
  53. }
  54. TYPED_TEST(BigIntLikeTest, SubtractZeroGivesOriginal) {
  55. BigNumber bi{1000};
  56. EXPECT_THAT(bi-0, bi);
  57. }
  58. TYPED_TEST(BigIntLikeTest, ZeroMinusNumberEqualsReciprocal) {
  59. BigNumber bi{1000};
  60. EXPECT_THAT((0-bi).to_string(), (-bi).to_string());
  61. }
  62. TYPED_TEST(BigIntLikeTest, NegativeMinusNegativeIncreateAbs) {
  63. BigNumber bi{-1000};
  64. EXPECT_THAT((bi-100).to_string(), "-1100");
  65. }
  66. TYPED_TEST(BigIntLikeTest, SubLargerGivesNegative) {
  67. BigNumber bi{1000};
  68. EXPECT_THAT((bi-1001).to_string(), "-1");
  69. }
  70. TYPED_TEST(BigIntLikeTest, SubSmallerGivesPositive) {
  71. BigNumber bi{1000};
  72. EXPECT_THAT((bi-999).to_string(), "1");
  73. }
  74. TYPED_TEST(BigIntLikeTest, SubUnderflowBorrows) {
  75. BigNumber bi{1000000000ULL};
  76. EXPECT_THAT((bi-1).to_string(), "999999999");
  77. }
  78. TYPED_TEST(BigIntLikeTest, MultiplyZeroReturnsZero) {
  79. auto &ZERO = BigNumber::ZERO;
  80. BigNumber bi{999999999ULL};
  81. EXPECT_THAT(bi*ZERO, ZERO);
  82. EXPECT_THAT(ZERO*bi, ZERO);
  83. }
  84. TYPED_TEST(BigIntLikeTest, MultiplyOneReturnsValue) {
  85. auto &ONE = BigNumber::ONE;
  86. BigNumber bi{999999999ULL};
  87. EXPECT_THAT((bi*ONE).to_string(), "999999999");
  88. EXPECT_THAT((ONE*bi).to_string(), "999999999");
  89. }
  90. TYPED_TEST(BigIntLikeTest, MultiplyNegativeOneReturnsInverse) {
  91. auto &NEGATIVE_ONE = BigNumber::NEGATIVE_ONE;
  92. BigNumber bi{999999999ULL};
  93. EXPECT_THAT((bi*NEGATIVE_ONE).to_string(), "-999999999");
  94. EXPECT_THAT((NEGATIVE_ONE*bi).to_string(), "-999999999");
  95. }
  96. TYPED_TEST(BigIntLikeTest, MultiplyOverflowsIntoNextCell) {
  97. BigNumber bi{999999999ULL};
  98. EXPECT_THAT((bi*bi).to_string(), "999999998000000001");
  99. }
  100. TYPED_TEST(BigIntLikeTest, MultiplyCarryIntoNextCell) {
  101. BigNumber bi{999999999ULL};
  102. BigNumber big{bi*bi};
  103. EXPECT_THAT((big*big).to_string(),
  104. "999999996000000005999999996000000001");
  105. }
  106. TYPED_TEST(BigIntLikeTest, MultiplyNoOverflow) {
  107. BigNumber bi{1000};
  108. EXPECT_THAT((bi*bi).to_string(), "1000000");
  109. }
  110. TYPED_TEST(BigIntLikeTest, DivideByZeroThrows) {
  111. auto &ZERO = BigNumber::ZERO;
  112. BigNumber bi{1000};
  113. EXPECT_THROW(bi/ZERO, std::domain_error);
  114. }
  115. TYPED_TEST(BigIntLikeTest, DivideByOneReturnsValue) {
  116. auto &ONE = BigNumber::ONE;
  117. BigNumber bi{1000};
  118. EXPECT_THAT(bi/ONE, bi);
  119. }
  120. TYPED_TEST(BigIntLikeTest, DivideBySelfReturnsOne) {
  121. auto &ONE = BigNumber::ONE;
  122. BigNumber bi{1000};
  123. EXPECT_THAT(bi/bi, ONE);
  124. }
  125. TYPED_TEST(BigIntLikeTest, DivideByNegativeOneReturnsInverse) {
  126. auto &NEGATIVE_ONE = BigNumber::NEGATIVE_ONE;
  127. BigNumber bi{1000};
  128. EXPECT_THAT((bi/NEGATIVE_ONE).to_string(), "-1000");
  129. }
  130. TYPED_TEST(BigIntLikeTest, DivisionWithMultipleMultSubSteps) {
  131. BigNumber bi{1112};
  132. EXPECT_THAT((bi/2).to_string(), "556");
  133. }
  134. TYPED_TEST(BigIntLikeTest, DivisionDroppingNumberOfCells) {
  135. BigNumber bi{1000000000ULL};
  136. EXPECT_THAT((bi/2).to_string(), "500000000");
  137. }
  138. TYPED_TEST(BigIntLikeTest, DivisionByBiggerNumberIsZero) {
  139. BigNumber bi{1000ULL};
  140. EXPECT_THAT((bi/1001).to_string(), "0");
  141. }
  142. TYPED_TEST(BigIntLikeTest, DivisionWithLargeNumbers) {
  143. BigNumber big{"999999998000000001"};
  144. EXPECT_THAT(big.to_string(), "999999998000000001");
  145. EXPECT_THAT((big/999999999ULL).to_string(),
  146. "999999999");
  147. }
  148. TYPED_TEST(BigIntLikeTest, ZeroDividedByAnyReturnsZero) {
  149. auto & ZERO = BigNumber::ZERO;
  150. EXPECT_THAT(ZERO/25, ZERO);
  151. }