bigdecimal_test.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. //
  2. // bigdecimal_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, ConstructFromStringIsSameValueAsFromInt) {
  10. // using bi = math::bigdecimal;
  11. // EXPECT_THAT(bi("1000000"), bi(1000000));
  12. // }
  13. //
  14. TEST(BigDecimal, ConstructIntegerAsDecimal) {
  15. EXPECT_THAT(math::bigdecimal("1000.00").to_string(), "1000.00");
  16. }
  17. TEST(BigDecimal, ConstructDecimal) {
  18. EXPECT_THAT(math::bigdecimal("1000.10").to_string(), "1000.10");
  19. EXPECT_THAT(math::bigdecimal("1000.01").to_string(), "1000.01");
  20. }
  21. TEST(BigDecimal, RescaleHigherAddsDigits) {
  22. math::bigdecimal dec(100);
  23. EXPECT_THAT(dec.scale(), 0);
  24. dec.rescale(2);
  25. EXPECT_THAT(dec.to_string(), "100.00");
  26. }
  27. TEST(BigDecimal, RescaleLowerCanBeLossy) {
  28. math::bigdecimal dec("100.10");
  29. EXPECT_THAT(dec.scale(), 2);
  30. dec.rescale(0);
  31. dec.rescale(2);
  32. EXPECT_THAT(dec.to_string(), "100.00");
  33. }
  34. TEST(BigDecimal, NegativeScaleLosesLowerDigits) {
  35. math::bigdecimal dec("123", -2);
  36. EXPECT_THAT(dec.to_string(), "100");
  37. }
  38. TEST(BigDecimal, ConstructWithScaleEqualsWithout) {
  39. math::bigdecimal scl(100, -2);
  40. EXPECT_THAT(scl.to_string(), "100");
  41. }
  42. TEST(BigDecimal, ScaleBelowNegSegDoesntLoseAnything) {
  43. EXPECT_THAT(math::bigdecimal("1000000000", -9).to_string(),
  44. "1000000000");
  45. }
  46. TEST(BigDecimal, AddTwoDecimalsSameScale) {
  47. using bd = math::bigdecimal;
  48. bd a("1000.10");
  49. bd b("1000.01");
  50. EXPECT_THAT(a.scale(), b.scale());
  51. EXPECT_THAT((a+b).to_string(), "2000.11");
  52. }
  53. TEST(BigDecimal, AddTwoDecimalsDifferentScalesUsesHigherScale) {
  54. using bd = math::bigdecimal;
  55. bd a("1000.10");
  56. bd b("1000");
  57. EXPECT_THAT(a.scale(), testing::Gt(b.scale()));
  58. EXPECT_THAT((a+b).to_string(), "2000.10");
  59. }
  60. TEST(BigDecimal, AddNumberWithInversePreservesScale) {
  61. math::bigdecimal a("1.001");
  62. EXPECT_THAT((a+(-a)).to_string(), "0.000");
  63. }
  64. TEST(BigDecimal, SubtractTwoDecimalsDifferentScalesUsesHigherScale) {
  65. using bd = math::bigdecimal;
  66. bd a("900.10");
  67. bd b("1000");
  68. EXPECT_THAT(a.scale(), testing::Gt(b.scale()));
  69. EXPECT_THAT((a-b).to_string(), "-99.90");
  70. EXPECT_THAT((b-a).to_string(), "99.90");
  71. }
  72. TEST(BigDecimal, MultiplicationIncreasesScale) {
  73. math::bigdecimal bd("1.1");
  74. auto out = bd * bd;
  75. EXPECT_THAT(out.scale(), bd.scale() + bd.scale());
  76. EXPECT_THAT(out.to_string(), "1.21");
  77. }
  78. TEST(BigDecimal, MultiplicationNegativeScaleCountersPositiveScale) {
  79. math::bigdecimal a("0.01");
  80. math::bigdecimal b("100", -2);
  81. EXPECT_THAT((a*b).to_string(), "1");
  82. }
  83. TEST(BigDecimal, MultiplicationCreateNewOffsetCell) {
  84. math::bigdecimal C(1, 5);
  85. EXPECT_THAT((C*C).to_string(), "1.0000000000");
  86. }
  87. TEST(BigDecimal, MultiplicationNegativeToPositiveScale) {
  88. math::bigdecimal C(1, 5);
  89. math::bigdecimal D(100, -2);
  90. EXPECT_THAT((D*C).to_string(), "100.000");
  91. }
  92. TEST(BigDecimal, MultiplicationFromDroppedToNonDropScale) {
  93. math::bigdecimal C(1, 5);
  94. math::bigdecimal E(1000000000, -9);
  95. EXPECT_THAT((E*C).to_string(), "1000000000");
  96. }
  97. TEST(BigDecimal, MultiplicationFromDroppedToLowerScale) {
  98. math::bigdecimal D(100, -2);
  99. math::bigdecimal E(1000000000, -9);
  100. EXPECT_THAT((E*D).to_string(), "100000000000");
  101. }
  102. TEST(BigDecimal, MultiplicationFromNonDropToDroppedScale) {
  103. math::bigdecimal F(10000, -4);
  104. math::bigdecimal G(100000, -5);
  105. EXPECT_THAT((G*F).to_string(), "1000000000");
  106. }
  107. TEST(BigDecimal, DivideHigherScaleByLowerScale) {
  108. math::bigdecimal a("1", 2);
  109. math::bigdecimal b("1", 1);
  110. EXPECT_THAT((a/b).to_string(), "1.0");
  111. }
  112. TEST(BigDecimal, DivideLowerScaleByHigherScale) {
  113. math::bigdecimal a("10", 1);
  114. math::bigdecimal b("1", 2);
  115. EXPECT_THAT((a/b).to_string(), "10");
  116. }
  117. TEST(BigDecimal, DivideByLargerNumberGivesDecimalIfScaleAllows) {
  118. math::bigdecimal a("1" , 0);
  119. math::bigdecimal b("1" , 1);
  120. math::bigdecimal c("10", 0);
  121. math::bigdecimal d("10", -1);
  122. EXPECT_THAT((a/c).to_string(), "0");
  123. EXPECT_THAT((a/d).to_string(), "0.1");
  124. EXPECT_THAT((b/c).to_string(), "0.1");
  125. EXPECT_THAT((b/d).to_string(), "0.10");
  126. }