bigdecimal_integral_test.cpp 4.6 KB

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