| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- //
- // bigdecimal_test.cpp
- // bigdecimal
- //
- // Created by Sam Jaffe on 5/18/18.
- //
- #include <gmock/gmock.h>
- #include "bigdecimal.h"
- // TEST(BigDecimal, ConstructFromStringIsSameValueAsFromInt) {
- // using bi = math::bigdecimal;
- // EXPECT_THAT(bi("1000000"), bi(1000000));
- // }
- //
- TEST(BigDecimal, ConstructIntegerAsDecimal) {
- EXPECT_THAT(math::bigdecimal("1000.00").to_string(), "1000.00");
- }
- TEST(BigDecimal, ConstructDecimal) {
- EXPECT_THAT(math::bigdecimal("1000.10").to_string(), "1000.10");
- EXPECT_THAT(math::bigdecimal("1000.01").to_string(), "1000.01");
- }
- TEST(BigDecimal, RescaleHigherAddsDigits) {
- math::bigdecimal dec(100);
- EXPECT_THAT(dec.scale(), 0);
- dec.rescale(2);
- EXPECT_THAT(dec.to_string(), "100.00");
- }
- TEST(BigDecimal, RescaleLowerCanBeLossy) {
- math::bigdecimal dec("100.10");
- EXPECT_THAT(dec.scale(), 2);
- dec.rescale(0);
- dec.rescale(2);
- EXPECT_THAT(dec.to_string(), "100.00");
- }
- TEST(BigDecimal, NegativeScaleLosesLowerDigits) {
- math::bigdecimal dec("123", -2);
- EXPECT_THAT(dec.to_string(), "100");
- }
- TEST(BigDecimal, ConstructWithScaleEqualsWithout) {
- math::bigdecimal scl(100, -2);
- EXPECT_THAT(scl.to_string(), "100");
- }
- TEST(BigDecimal, ScaleBelowNegSegDoesntLoseAnything) {
- EXPECT_THAT(math::bigdecimal("1000000000", -9).to_string(),
- "1000000000");
- }
- TEST(BigDecimal, AddTwoDecimalsSameScale) {
- using bd = math::bigdecimal;
- bd a("1000.10");
- bd b("1000.01");
- EXPECT_THAT(a.scale(), b.scale());
- EXPECT_THAT((a+b).to_string(), "2000.11");
- }
- TEST(BigDecimal, AddTwoDecimalsDifferentScalesUsesHigherScale) {
- using bd = math::bigdecimal;
- bd a("1000.10");
- bd b("1000");
- EXPECT_THAT(a.scale(), testing::Gt(b.scale()));
- EXPECT_THAT((a+b).to_string(), "2000.10");
- }
- TEST(BigDecimal, AddNumberWithInversePreservesScale) {
- math::bigdecimal a("1.001");
- EXPECT_THAT((a+(-a)).to_string(), "0.000");
- }
- TEST(BigDecimal, SubtractTwoDecimalsDifferentScalesUsesHigherScale) {
- using bd = math::bigdecimal;
- bd a("900.10");
- bd b("1000");
- EXPECT_THAT(a.scale(), testing::Gt(b.scale()));
- EXPECT_THAT((a-b).to_string(), "-99.90");
- EXPECT_THAT((b-a).to_string(), "99.90");
- }
- TEST(BigDecimal, MultiplicationIncreasesScale) {
- math::bigdecimal bd("1.1");
- auto out = bd * bd;
- EXPECT_THAT(out.scale(), bd.scale() + bd.scale());
- EXPECT_THAT(out.to_string(), "1.21");
- }
- TEST(BigDecimal, MultiplicationNegativeScaleCountersPositiveScale) {
- math::bigdecimal a("0.01");
- math::bigdecimal b("100", -2);
- EXPECT_THAT((a*b).to_string(), "1");
- }
- TEST(BigDecimal, MultiplicationCreateNewOffsetCell) {
- math::bigdecimal C(1, 5);
- EXPECT_THAT((C*C).to_string(), "1.0000000000");
- }
- TEST(BigDecimal, MultiplicationNegativeToPositiveScale) {
- math::bigdecimal C(1, 5);
- math::bigdecimal D(100, -2);
- EXPECT_THAT((D*C).to_string(), "100.000");
- }
- TEST(BigDecimal, MultiplicationFromDroppedToNonDropScale) {
- math::bigdecimal C(1, 5);
- math::bigdecimal E(1000000000, -9);
- EXPECT_THAT((E*C).to_string(), "1000000000");
- }
- TEST(BigDecimal, MultiplicationFromDroppedToLowerScale) {
- math::bigdecimal D(100, -2);
- math::bigdecimal E(1000000000, -9);
- EXPECT_THAT((E*D).to_string(), "100000000000");
- }
- TEST(BigDecimal, MultiplicationFromNonDropToDroppedScale) {
- math::bigdecimal F(10000, -4);
- math::bigdecimal G(100000, -5);
- EXPECT_THAT((G*F).to_string(), "1000000000");
- }
- TEST(BigDecimal, DivideHigherScaleByLowerScale) {
- math::bigdecimal a("1", 2);
- math::bigdecimal b("1", 1);
- EXPECT_THAT((a/b).to_string(), "1.0");
- }
- TEST(BigDecimal, DivideLowerScaleByHigherScale) {
- math::bigdecimal a("10", 1);
- math::bigdecimal b("1", 2);
- EXPECT_THAT((a/b).to_string(), "10");
- }
- TEST(BigDecimal, DivideByLargerNumberGivesDecimalIfScaleAllows) {
- math::bigdecimal a("1" , 0);
- math::bigdecimal b("1" , 1);
- math::bigdecimal c("10", 0);
- math::bigdecimal d("10", -1);
- EXPECT_THAT((a/c).to_string(), "0");
- EXPECT_THAT((a/d).to_string(), "0.1");
- EXPECT_THAT((b/c).to_string(), "0.1");
- EXPECT_THAT((b/d).to_string(), "0.10");
- }
|