bignumber_integral_test.cpp 4.7 KB

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