bignumber_integral_test.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  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, ConstructFromStringIsSameValueAsFromInt) {
  23. EXPECT_THAT(BigNumber("1000000"),
  24. 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, SubSelfIsZero) {
  43. BigNumber bi{1000};
  44. EXPECT_THAT((bi-bi).to_string(), "0");
  45. }
  46. TYPED_TEST(BigIntLikeTest, NegativeMinusNegativeIncreateAbs) {
  47. BigNumber bi{-1000};
  48. EXPECT_THAT((bi-100).to_string(), "-1100");
  49. }
  50. TYPED_TEST(BigIntLikeTest, SubLargerGivesNegative) {
  51. BigNumber bi{1000};
  52. EXPECT_THAT((bi-1001).to_string(), "-1");
  53. }
  54. TYPED_TEST(BigIntLikeTest, SubSmallerGivesPositive) {
  55. BigNumber bi{1000};
  56. EXPECT_THAT((bi-999).to_string(), "1");
  57. }
  58. TYPED_TEST(BigIntLikeTest, SubUnderflowBorrows) {
  59. BigNumber bi{1000000000ULL};
  60. EXPECT_THAT((bi-1).to_string(), "999999999");
  61. }
  62. TYPED_TEST(BigIntLikeTest, MultiplyZeroReturnsZero) {
  63. auto &ZERO = BigNumber::ZERO;
  64. BigNumber bi{999999999ULL};
  65. EXPECT_THAT(bi*ZERO, ZERO);
  66. EXPECT_THAT(ZERO*bi, ZERO);
  67. }
  68. TYPED_TEST(BigIntLikeTest, MultiplyOneReturnsValue) {
  69. auto &ONE = BigNumber::ONE;
  70. BigNumber bi{999999999ULL};
  71. EXPECT_THAT((bi*ONE).to_string(), "999999999");
  72. EXPECT_THAT((ONE*bi).to_string(), "999999999");
  73. }
  74. TYPED_TEST(BigIntLikeTest, MultiplyNegativeOneReturnsInverse) {
  75. auto &NEGATIVE_ONE = BigNumber::NEGATIVE_ONE;
  76. BigNumber bi{999999999ULL};
  77. EXPECT_THAT((bi*NEGATIVE_ONE).to_string(), "-999999999");
  78. EXPECT_THAT((NEGATIVE_ONE*bi).to_string(), "-999999999");
  79. }
  80. TYPED_TEST(BigIntLikeTest, MultiplyOverflowsIntoNextCell) {
  81. BigNumber bi{999999999ULL};
  82. EXPECT_THAT((bi*bi).to_string(), "999999998000000001");
  83. }
  84. TYPED_TEST(BigIntLikeTest, MultiplyCarryIntoNextCell) {
  85. BigNumber bi{999999999ULL};
  86. BigNumber big{bi*bi};
  87. EXPECT_THAT((big*big).to_string(),
  88. "999999996000000005999999996000000001");
  89. }
  90. TYPED_TEST(BigIntLikeTest, MultiplyNoOverflow) {
  91. BigNumber bi{1000};
  92. EXPECT_THAT((bi*bi).to_string(), "1000000");
  93. }
  94. TYPED_TEST(BigIntLikeTest, DivideByZeroThrows) {
  95. auto &ZERO = BigNumber::ZERO;
  96. BigNumber bi{1000};
  97. EXPECT_THROW(bi/ZERO, std::domain_error);
  98. }
  99. TYPED_TEST(BigIntLikeTest, DivideByOneReturnsValue) {
  100. auto &ONE = BigNumber::ONE;
  101. BigNumber bi{1000};
  102. EXPECT_THAT(bi/ONE, bi);
  103. }
  104. TYPED_TEST(BigIntLikeTest, DivideByNegativeOneReturnsInverse) {
  105. auto &NEGATIVE_ONE = BigNumber::NEGATIVE_ONE;
  106. BigNumber bi{1000};
  107. EXPECT_THAT((bi/NEGATIVE_ONE).to_string(), "-1000");
  108. }
  109. TYPED_TEST(BigIntLikeTest, DivisionWithMultipleMultSubSteps) {
  110. BigNumber bi{1112};
  111. EXPECT_THAT((bi/2).to_string(), "556");
  112. }
  113. TYPED_TEST(BigIntLikeTest, DivisionDroppingNumberOfCells) {
  114. BigNumber bi{1000000000ULL};
  115. EXPECT_THAT((bi/2).to_string(), "500000000");
  116. }
  117. TYPED_TEST(BigIntLikeTest, DivisionByBiggerNumberIsZero) {
  118. BigNumber bi{1000ULL};
  119. EXPECT_THAT((bi/1001).to_string(), "0");
  120. }
  121. TYPED_TEST(BigIntLikeTest, DivisionWithLargeNumbers) {
  122. BigNumber big{"999999998000000001"};
  123. EXPECT_THAT(big.to_string(), "999999998000000001");
  124. EXPECT_THAT((big/999999999ULL).to_string(),
  125. "999999999");
  126. }