bignumber_integral_test.cpp 4.8 KB

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