16f80339bSMichael Jones //===-- Unittests for high_precision_decimal ------------------------------===//
26f80339bSMichael Jones //
36f80339bSMichael Jones // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
46f80339bSMichael Jones // See https://llvm.org/LICENSE.txt for license information.
56f80339bSMichael Jones // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
66f80339bSMichael Jones //
76f80339bSMichael Jones //===----------------------------------------------------------------------===//
86f80339bSMichael Jones 
9*300f8da8SSiva Chandra Reddy #include "src/__support/CPP/UInt128.h"
106f80339bSMichael Jones #include "src/__support/high_precision_decimal.h"
116f80339bSMichael Jones 
126f80339bSMichael Jones #include "utils/UnitTest/Test.h"
136f80339bSMichael Jones 
TEST(LlvmLibcHighPrecisionDecimalTest,BasicInit)146f80339bSMichael Jones TEST(LlvmLibcHighPrecisionDecimalTest, BasicInit) {
15d7cc760fSGuillaume Chatelet   __llvm_libc::internal::HighPrecisionDecimal hpd =
16d7cc760fSGuillaume Chatelet       __llvm_libc::internal::HighPrecisionDecimal("1.2345");
171c92911eSMichael Jones   uint8_t *digits = hpd.get_digits();
186f80339bSMichael Jones 
196f80339bSMichael Jones   EXPECT_EQ(digits[0], uint8_t(1));
206f80339bSMichael Jones   EXPECT_EQ(digits[1], uint8_t(2));
216f80339bSMichael Jones   EXPECT_EQ(digits[2], uint8_t(3));
226f80339bSMichael Jones   EXPECT_EQ(digits[3], uint8_t(4));
236f80339bSMichael Jones   EXPECT_EQ(digits[4], uint8_t(5));
241c92911eSMichael Jones   EXPECT_EQ(hpd.get_num_digits(), 5u);
251c92911eSMichael Jones   EXPECT_EQ(hpd.get_decimal_point(), 1);
266f80339bSMichael Jones }
276f80339bSMichael Jones 
TEST(LlvmLibcHighPrecisionDecimalTest,BasicShift)286f80339bSMichael Jones TEST(LlvmLibcHighPrecisionDecimalTest, BasicShift) {
29d7cc760fSGuillaume Chatelet   __llvm_libc::internal::HighPrecisionDecimal hpd =
30d7cc760fSGuillaume Chatelet       __llvm_libc::internal::HighPrecisionDecimal("1");
311c92911eSMichael Jones   uint8_t *digits = hpd.get_digits();
326f80339bSMichael Jones 
336f80339bSMichael Jones   hpd.shift(1); // shift left 1, equal to multiplying by 2.
346f80339bSMichael Jones 
356f80339bSMichael Jones   EXPECT_EQ(digits[0], uint8_t(2));
361c92911eSMichael Jones   EXPECT_EQ(hpd.get_num_digits(), 1u);
371c92911eSMichael Jones   EXPECT_EQ(hpd.get_decimal_point(), 1);
386f80339bSMichael Jones }
396f80339bSMichael Jones 
TEST(LlvmLibcHighPrecisionDecimalTest,ShouldRoundup)4064724218STue Ly TEST(LlvmLibcHighPrecisionDecimalTest, ShouldRoundup) {
4164724218STue Ly   __llvm_libc::internal::HighPrecisionDecimal hpd =
4264724218STue Ly       __llvm_libc::internal::HighPrecisionDecimal(".5");
4364724218STue Ly   uint8_t *digits = hpd.get_digits();
4464724218STue Ly 
4564724218STue Ly   EXPECT_EQ(digits[0], uint8_t(5));
4664724218STue Ly   EXPECT_EQ(hpd.get_num_digits(), 1u);
4764724218STue Ly   EXPECT_EQ(hpd.get_decimal_point(), 0);
4864724218STue Ly   EXPECT_EQ(hpd.round_to_integer_type<int>(), 0);
4964724218STue Ly }
5064724218STue Ly 
TEST(LlvmLibcHighPrecisionDecimalTest,SmallShift)516f80339bSMichael Jones TEST(LlvmLibcHighPrecisionDecimalTest, SmallShift) {
52d7cc760fSGuillaume Chatelet   __llvm_libc::internal::HighPrecisionDecimal hpd =
53d7cc760fSGuillaume Chatelet       __llvm_libc::internal::HighPrecisionDecimal("1.2345");
541c92911eSMichael Jones   uint8_t *digits = hpd.get_digits();
556f80339bSMichael Jones 
566f80339bSMichael Jones   hpd.shift(-1); // shift right one, equal to dividing by 2
576f80339bSMichael Jones   // result should be 0.61725
586f80339bSMichael Jones 
596f80339bSMichael Jones   EXPECT_EQ(digits[0], uint8_t(6));
606f80339bSMichael Jones   EXPECT_EQ(digits[1], uint8_t(1));
616f80339bSMichael Jones   EXPECT_EQ(digits[2], uint8_t(7));
626f80339bSMichael Jones   EXPECT_EQ(digits[3], uint8_t(2));
636f80339bSMichael Jones   EXPECT_EQ(digits[4], uint8_t(5));
641c92911eSMichael Jones   EXPECT_EQ(hpd.get_num_digits(), 5u);
651c92911eSMichael Jones   EXPECT_EQ(hpd.get_decimal_point(), 0);
666f80339bSMichael Jones 
676f80339bSMichael Jones   hpd.shift(1); // shift left one, equal to multiplying by 2
686f80339bSMichael Jones   // result should be 1.2345 again
696f80339bSMichael Jones 
706f80339bSMichael Jones   EXPECT_EQ(digits[0], uint8_t(1));
716f80339bSMichael Jones   EXPECT_EQ(digits[1], uint8_t(2));
726f80339bSMichael Jones   EXPECT_EQ(digits[2], uint8_t(3));
736f80339bSMichael Jones   EXPECT_EQ(digits[3], uint8_t(4));
746f80339bSMichael Jones   EXPECT_EQ(digits[4], uint8_t(5));
751c92911eSMichael Jones   EXPECT_EQ(hpd.get_num_digits(), 5u);
761c92911eSMichael Jones   EXPECT_EQ(hpd.get_decimal_point(), 1);
776f80339bSMichael Jones 
786f80339bSMichael Jones   hpd.shift(1); // shift left one again
796f80339bSMichael Jones   // result should be 2.469
806f80339bSMichael Jones 
816f80339bSMichael Jones   EXPECT_EQ(digits[0], uint8_t(2));
826f80339bSMichael Jones   EXPECT_EQ(digits[1], uint8_t(4));
836f80339bSMichael Jones   EXPECT_EQ(digits[2], uint8_t(6));
846f80339bSMichael Jones   EXPECT_EQ(digits[3], uint8_t(9));
851c92911eSMichael Jones   EXPECT_EQ(hpd.get_num_digits(), 4u);
861c92911eSMichael Jones   EXPECT_EQ(hpd.get_decimal_point(), 1);
876f80339bSMichael Jones 
886f80339bSMichael Jones   hpd.shift(-1); // shift right one again
896f80339bSMichael Jones   // result should be 1.2345 again
906f80339bSMichael Jones 
916f80339bSMichael Jones   EXPECT_EQ(digits[0], uint8_t(1));
926f80339bSMichael Jones   EXPECT_EQ(digits[1], uint8_t(2));
936f80339bSMichael Jones   EXPECT_EQ(digits[2], uint8_t(3));
946f80339bSMichael Jones   EXPECT_EQ(digits[3], uint8_t(4));
956f80339bSMichael Jones   EXPECT_EQ(digits[4], uint8_t(5));
961c92911eSMichael Jones   EXPECT_EQ(hpd.get_num_digits(), 5u);
971c92911eSMichael Jones   EXPECT_EQ(hpd.get_decimal_point(), 1);
986f80339bSMichael Jones }
996f80339bSMichael Jones 
TEST(LlvmLibcHighPrecisionDecimalTest,MediumShift)1006f80339bSMichael Jones TEST(LlvmLibcHighPrecisionDecimalTest, MediumShift) {
101d7cc760fSGuillaume Chatelet   __llvm_libc::internal::HighPrecisionDecimal hpd =
102d7cc760fSGuillaume Chatelet       __llvm_libc::internal::HighPrecisionDecimal(".299792458");
1031c92911eSMichael Jones   uint8_t *digits = hpd.get_digits();
1046f80339bSMichael Jones 
1056f80339bSMichael Jones   hpd.shift(-3); // shift right three, equal to dividing by 8
1066f80339bSMichael Jones   // result should be 0.03747405725
1076f80339bSMichael Jones 
1086f80339bSMichael Jones   EXPECT_EQ(digits[0], uint8_t(3));
1096f80339bSMichael Jones   EXPECT_EQ(digits[1], uint8_t(7));
1106f80339bSMichael Jones   EXPECT_EQ(digits[2], uint8_t(4));
1116f80339bSMichael Jones   EXPECT_EQ(digits[3], uint8_t(7));
1126f80339bSMichael Jones   EXPECT_EQ(digits[4], uint8_t(4));
1136f80339bSMichael Jones   EXPECT_EQ(digits[5], uint8_t(0));
1146f80339bSMichael Jones   EXPECT_EQ(digits[6], uint8_t(5));
1156f80339bSMichael Jones   EXPECT_EQ(digits[7], uint8_t(7));
1166f80339bSMichael Jones   EXPECT_EQ(digits[8], uint8_t(2));
1176f80339bSMichael Jones   EXPECT_EQ(digits[9], uint8_t(5));
1181c92911eSMichael Jones   EXPECT_EQ(hpd.get_num_digits(), 10u);
1191c92911eSMichael Jones   EXPECT_EQ(hpd.get_decimal_point(), -1);
1206f80339bSMichael Jones 
1216f80339bSMichael Jones   hpd.shift(3); // shift left three, equal to multiplying by 8
1226f80339bSMichael Jones   // result should be 0.299792458 again
1236f80339bSMichael Jones 
1246f80339bSMichael Jones   EXPECT_EQ(digits[0], uint8_t(2));
1256f80339bSMichael Jones   EXPECT_EQ(digits[1], uint8_t(9));
1266f80339bSMichael Jones   EXPECT_EQ(digits[2], uint8_t(9));
1276f80339bSMichael Jones   EXPECT_EQ(digits[3], uint8_t(7));
1286f80339bSMichael Jones   EXPECT_EQ(digits[4], uint8_t(9));
1296f80339bSMichael Jones   EXPECT_EQ(digits[5], uint8_t(2));
1306f80339bSMichael Jones   EXPECT_EQ(digits[6], uint8_t(4));
1316f80339bSMichael Jones   EXPECT_EQ(digits[7], uint8_t(5));
1326f80339bSMichael Jones   EXPECT_EQ(digits[8], uint8_t(8));
1331c92911eSMichael Jones   EXPECT_EQ(hpd.get_num_digits(), 9u);
1341c92911eSMichael Jones   EXPECT_EQ(hpd.get_decimal_point(), 0);
1356f80339bSMichael Jones }
1366f80339bSMichael Jones 
TEST(LlvmLibcHighPrecisionDecimalTest,BigShift)1376f80339bSMichael Jones TEST(LlvmLibcHighPrecisionDecimalTest, BigShift) {
138d7cc760fSGuillaume Chatelet   __llvm_libc::internal::HighPrecisionDecimal hpd =
139d7cc760fSGuillaume Chatelet       __llvm_libc::internal::HighPrecisionDecimal(".299792458");
1401c92911eSMichael Jones   uint8_t *digits = hpd.get_digits();
1416f80339bSMichael Jones 
1426f80339bSMichael Jones   hpd.shift(-29); // shift right 29, equal to dividing by 536,870,912
1436f80339bSMichael Jones   // result should be 0.0000000005584069676697254180908203125
1446f80339bSMichael Jones 
1456f80339bSMichael Jones   EXPECT_EQ(digits[0], uint8_t(5));
1466f80339bSMichael Jones   EXPECT_EQ(digits[1], uint8_t(5));
1476f80339bSMichael Jones   EXPECT_EQ(digits[2], uint8_t(8));
1486f80339bSMichael Jones   EXPECT_EQ(digits[3], uint8_t(4));
1496f80339bSMichael Jones   EXPECT_EQ(digits[4], uint8_t(0));
1506f80339bSMichael Jones   EXPECT_EQ(digits[5], uint8_t(6));
1516f80339bSMichael Jones   EXPECT_EQ(digits[6], uint8_t(9));
1526f80339bSMichael Jones   EXPECT_EQ(digits[7], uint8_t(6));
1536f80339bSMichael Jones   EXPECT_EQ(digits[8], uint8_t(7));
1546f80339bSMichael Jones   EXPECT_EQ(digits[9], uint8_t(6));
1556f80339bSMichael Jones   EXPECT_EQ(digits[10], uint8_t(6));
1566f80339bSMichael Jones   EXPECT_EQ(digits[11], uint8_t(9));
1576f80339bSMichael Jones   EXPECT_EQ(digits[12], uint8_t(7));
1586f80339bSMichael Jones   EXPECT_EQ(digits[13], uint8_t(2));
1596f80339bSMichael Jones   EXPECT_EQ(digits[14], uint8_t(5));
1606f80339bSMichael Jones   EXPECT_EQ(digits[15], uint8_t(4));
1616f80339bSMichael Jones   EXPECT_EQ(digits[16], uint8_t(1));
1626f80339bSMichael Jones   EXPECT_EQ(digits[17], uint8_t(8));
1636f80339bSMichael Jones   EXPECT_EQ(digits[18], uint8_t(0));
1646f80339bSMichael Jones   EXPECT_EQ(digits[19], uint8_t(9));
1656f80339bSMichael Jones   EXPECT_EQ(digits[20], uint8_t(0));
1666f80339bSMichael Jones   EXPECT_EQ(digits[21], uint8_t(8));
1676f80339bSMichael Jones   EXPECT_EQ(digits[22], uint8_t(2));
1686f80339bSMichael Jones   EXPECT_EQ(digits[23], uint8_t(0));
1696f80339bSMichael Jones   EXPECT_EQ(digits[24], uint8_t(3));
1706f80339bSMichael Jones   EXPECT_EQ(digits[25], uint8_t(1));
1716f80339bSMichael Jones   EXPECT_EQ(digits[26], uint8_t(2));
1726f80339bSMichael Jones   EXPECT_EQ(digits[27], uint8_t(5));
1731c92911eSMichael Jones   EXPECT_EQ(hpd.get_num_digits(), 28u);
1741c92911eSMichael Jones   EXPECT_EQ(hpd.get_decimal_point(), -9);
1756f80339bSMichael Jones 
1766f80339bSMichael Jones   hpd.shift(29); // shift left 29, equal to multiplying by 536,870,912
1776f80339bSMichael Jones   // result should be 0.299792458 again
1786f80339bSMichael Jones 
1796f80339bSMichael Jones   EXPECT_EQ(digits[0], uint8_t(2));
1806f80339bSMichael Jones   EXPECT_EQ(digits[1], uint8_t(9));
1816f80339bSMichael Jones   EXPECT_EQ(digits[2], uint8_t(9));
1826f80339bSMichael Jones   EXPECT_EQ(digits[3], uint8_t(7));
1836f80339bSMichael Jones   EXPECT_EQ(digits[4], uint8_t(9));
1846f80339bSMichael Jones   EXPECT_EQ(digits[5], uint8_t(2));
1856f80339bSMichael Jones   EXPECT_EQ(digits[6], uint8_t(4));
1866f80339bSMichael Jones   EXPECT_EQ(digits[7], uint8_t(5));
1876f80339bSMichael Jones   EXPECT_EQ(digits[8], uint8_t(8));
1881c92911eSMichael Jones   EXPECT_EQ(hpd.get_num_digits(), 9u);
1891c92911eSMichael Jones   EXPECT_EQ(hpd.get_decimal_point(), 0);
1906f80339bSMichael Jones }
1916f80339bSMichael Jones 
TEST(LlvmLibcHighPrecisionDecimalTest,BigShiftInSteps)1926f80339bSMichael Jones TEST(LlvmLibcHighPrecisionDecimalTest, BigShiftInSteps) {
193d7cc760fSGuillaume Chatelet   __llvm_libc::internal::HighPrecisionDecimal hpd =
194d7cc760fSGuillaume Chatelet       __llvm_libc::internal::HighPrecisionDecimal("1");
1951c92911eSMichael Jones   uint8_t *digits = hpd.get_digits();
1966f80339bSMichael Jones 
1976f80339bSMichael Jones   hpd.shift(60); // shift left 60, equal to multiplying by
1986f80339bSMichael Jones                  // 1152921504606846976.
1996f80339bSMichael Jones 
2006f80339bSMichael Jones   EXPECT_EQ(digits[0], uint8_t(1));
2016f80339bSMichael Jones   EXPECT_EQ(digits[1], uint8_t(1));
2026f80339bSMichael Jones   EXPECT_EQ(digits[2], uint8_t(5));
2036f80339bSMichael Jones   EXPECT_EQ(digits[3], uint8_t(2));
2046f80339bSMichael Jones   EXPECT_EQ(digits[4], uint8_t(9));
2056f80339bSMichael Jones   EXPECT_EQ(digits[5], uint8_t(2));
2066f80339bSMichael Jones   EXPECT_EQ(digits[6], uint8_t(1));
2076f80339bSMichael Jones   EXPECT_EQ(digits[7], uint8_t(5));
2086f80339bSMichael Jones   EXPECT_EQ(digits[8], uint8_t(0));
2096f80339bSMichael Jones   EXPECT_EQ(digits[9], uint8_t(4));
2106f80339bSMichael Jones   EXPECT_EQ(digits[10], uint8_t(6));
2116f80339bSMichael Jones   EXPECT_EQ(digits[11], uint8_t(0));
2126f80339bSMichael Jones   EXPECT_EQ(digits[12], uint8_t(6));
2136f80339bSMichael Jones   EXPECT_EQ(digits[13], uint8_t(8));
2146f80339bSMichael Jones   EXPECT_EQ(digits[14], uint8_t(4));
2156f80339bSMichael Jones   EXPECT_EQ(digits[15], uint8_t(6));
2166f80339bSMichael Jones   EXPECT_EQ(digits[16], uint8_t(9));
2176f80339bSMichael Jones   EXPECT_EQ(digits[17], uint8_t(7));
2186f80339bSMichael Jones   EXPECT_EQ(digits[18], uint8_t(6));
2191c92911eSMichael Jones   EXPECT_EQ(hpd.get_num_digits(), 19u);
2201c92911eSMichael Jones   EXPECT_EQ(hpd.get_decimal_point(), 19);
2216f80339bSMichael Jones 
2226f80339bSMichael Jones   hpd.shift(40); // shift left 40, equal to multiplying by
2236f80339bSMichael Jones                  // 1099511627776. Result should be 2^100
2246f80339bSMichael Jones 
2256f80339bSMichael Jones   EXPECT_EQ(digits[0], uint8_t(1));
2266f80339bSMichael Jones   EXPECT_EQ(digits[1], uint8_t(2));
2276f80339bSMichael Jones   EXPECT_EQ(digits[2], uint8_t(6));
2286f80339bSMichael Jones   EXPECT_EQ(digits[3], uint8_t(7));
2296f80339bSMichael Jones   EXPECT_EQ(digits[4], uint8_t(6));
2306f80339bSMichael Jones   EXPECT_EQ(digits[5], uint8_t(5));
2316f80339bSMichael Jones   EXPECT_EQ(digits[6], uint8_t(0));
2326f80339bSMichael Jones   EXPECT_EQ(digits[7], uint8_t(6));
2336f80339bSMichael Jones   EXPECT_EQ(digits[8], uint8_t(0));
2346f80339bSMichael Jones   EXPECT_EQ(digits[9], uint8_t(0));
2356f80339bSMichael Jones   EXPECT_EQ(digits[10], uint8_t(2));
2366f80339bSMichael Jones   EXPECT_EQ(digits[11], uint8_t(2));
2376f80339bSMichael Jones   EXPECT_EQ(digits[12], uint8_t(8));
2386f80339bSMichael Jones   EXPECT_EQ(digits[13], uint8_t(2));
2396f80339bSMichael Jones   EXPECT_EQ(digits[14], uint8_t(2));
2406f80339bSMichael Jones   EXPECT_EQ(digits[15], uint8_t(9));
2416f80339bSMichael Jones   EXPECT_EQ(digits[16], uint8_t(4));
2426f80339bSMichael Jones   EXPECT_EQ(digits[17], uint8_t(0));
2436f80339bSMichael Jones   EXPECT_EQ(digits[18], uint8_t(1));
2446f80339bSMichael Jones   EXPECT_EQ(digits[19], uint8_t(4));
2456f80339bSMichael Jones   EXPECT_EQ(digits[20], uint8_t(9));
2466f80339bSMichael Jones   EXPECT_EQ(digits[21], uint8_t(6));
2476f80339bSMichael Jones   EXPECT_EQ(digits[22], uint8_t(7));
2486f80339bSMichael Jones   EXPECT_EQ(digits[23], uint8_t(0));
2496f80339bSMichael Jones   EXPECT_EQ(digits[24], uint8_t(3));
2506f80339bSMichael Jones   EXPECT_EQ(digits[25], uint8_t(2));
2516f80339bSMichael Jones   EXPECT_EQ(digits[26], uint8_t(0));
2526f80339bSMichael Jones   EXPECT_EQ(digits[27], uint8_t(5));
2536f80339bSMichael Jones   EXPECT_EQ(digits[28], uint8_t(3));
2546f80339bSMichael Jones   EXPECT_EQ(digits[29], uint8_t(7));
2556f80339bSMichael Jones   EXPECT_EQ(digits[30], uint8_t(6));
2566f80339bSMichael Jones 
2571c92911eSMichael Jones   EXPECT_EQ(hpd.get_num_digits(), 31u);
2581c92911eSMichael Jones   EXPECT_EQ(hpd.get_decimal_point(), 31);
2596f80339bSMichael Jones 
2606f80339bSMichael Jones   hpd.shift(-60); // shift right 60, equal to dividing by
2616f80339bSMichael Jones                   // 1152921504606846976. Result should be 2^40
2626f80339bSMichael Jones 
2636f80339bSMichael Jones   EXPECT_EQ(digits[0], uint8_t(1));
2646f80339bSMichael Jones   EXPECT_EQ(digits[1], uint8_t(0));
2656f80339bSMichael Jones   EXPECT_EQ(digits[2], uint8_t(9));
2666f80339bSMichael Jones   EXPECT_EQ(digits[3], uint8_t(9));
2676f80339bSMichael Jones   EXPECT_EQ(digits[4], uint8_t(5));
2686f80339bSMichael Jones   EXPECT_EQ(digits[5], uint8_t(1));
2696f80339bSMichael Jones   EXPECT_EQ(digits[6], uint8_t(1));
2706f80339bSMichael Jones   EXPECT_EQ(digits[7], uint8_t(6));
2716f80339bSMichael Jones   EXPECT_EQ(digits[8], uint8_t(2));
2726f80339bSMichael Jones   EXPECT_EQ(digits[9], uint8_t(7));
2736f80339bSMichael Jones   EXPECT_EQ(digits[10], uint8_t(7));
2746f80339bSMichael Jones   EXPECT_EQ(digits[11], uint8_t(7));
2756f80339bSMichael Jones   EXPECT_EQ(digits[12], uint8_t(6));
2766f80339bSMichael Jones 
2771c92911eSMichael Jones   EXPECT_EQ(hpd.get_num_digits(), 13u);
2781c92911eSMichael Jones   EXPECT_EQ(hpd.get_decimal_point(), 13);
2796f80339bSMichael Jones 
2806f80339bSMichael Jones   hpd.shift(-40); // shift right 40, equal to dividing by
2816f80339bSMichael Jones                   // 1099511627776. Result should be 1
2826f80339bSMichael Jones 
2836f80339bSMichael Jones   EXPECT_EQ(digits[0], uint8_t(1));
2846f80339bSMichael Jones 
2851c92911eSMichael Jones   EXPECT_EQ(hpd.get_num_digits(), 1u);
2861c92911eSMichael Jones   EXPECT_EQ(hpd.get_decimal_point(), 1);
2876f80339bSMichael Jones }
2886f80339bSMichael Jones 
TEST(LlvmLibcHighPrecisionDecimalTest,VeryBigShift)2896f80339bSMichael Jones TEST(LlvmLibcHighPrecisionDecimalTest, VeryBigShift) {
290d7cc760fSGuillaume Chatelet   __llvm_libc::internal::HighPrecisionDecimal hpd =
291d7cc760fSGuillaume Chatelet       __llvm_libc::internal::HighPrecisionDecimal("1");
2921c92911eSMichael Jones   uint8_t *digits = hpd.get_digits();
2936f80339bSMichael Jones 
2946f80339bSMichael Jones   hpd.shift(100); // shift left 100, equal to multiplying by
2956f80339bSMichael Jones                   // 1267650600228229401496703205376.
2966f80339bSMichael Jones   // result should be 2^100
2976f80339bSMichael Jones 
2986f80339bSMichael Jones   EXPECT_EQ(digits[0], uint8_t(1));
2996f80339bSMichael Jones   EXPECT_EQ(digits[1], uint8_t(2));
3006f80339bSMichael Jones   EXPECT_EQ(digits[2], uint8_t(6));
3016f80339bSMichael Jones   EXPECT_EQ(digits[3], uint8_t(7));
3026f80339bSMichael Jones   EXPECT_EQ(digits[4], uint8_t(6));
3036f80339bSMichael Jones   EXPECT_EQ(digits[5], uint8_t(5));
3046f80339bSMichael Jones   EXPECT_EQ(digits[6], uint8_t(0));
3056f80339bSMichael Jones   EXPECT_EQ(digits[7], uint8_t(6));
3066f80339bSMichael Jones   EXPECT_EQ(digits[8], uint8_t(0));
3076f80339bSMichael Jones   EXPECT_EQ(digits[9], uint8_t(0));
3086f80339bSMichael Jones   EXPECT_EQ(digits[10], uint8_t(2));
3096f80339bSMichael Jones   EXPECT_EQ(digits[11], uint8_t(2));
3106f80339bSMichael Jones   EXPECT_EQ(digits[12], uint8_t(8));
3116f80339bSMichael Jones   EXPECT_EQ(digits[13], uint8_t(2));
3126f80339bSMichael Jones   EXPECT_EQ(digits[14], uint8_t(2));
3136f80339bSMichael Jones   EXPECT_EQ(digits[15], uint8_t(9));
3146f80339bSMichael Jones   EXPECT_EQ(digits[16], uint8_t(4));
3156f80339bSMichael Jones   EXPECT_EQ(digits[17], uint8_t(0));
3166f80339bSMichael Jones   EXPECT_EQ(digits[18], uint8_t(1));
3176f80339bSMichael Jones   EXPECT_EQ(digits[19], uint8_t(4));
3186f80339bSMichael Jones   EXPECT_EQ(digits[20], uint8_t(9));
3196f80339bSMichael Jones   EXPECT_EQ(digits[21], uint8_t(6));
3206f80339bSMichael Jones   EXPECT_EQ(digits[22], uint8_t(7));
3216f80339bSMichael Jones   EXPECT_EQ(digits[23], uint8_t(0));
3226f80339bSMichael Jones   EXPECT_EQ(digits[24], uint8_t(3));
3236f80339bSMichael Jones   EXPECT_EQ(digits[25], uint8_t(2));
3246f80339bSMichael Jones   EXPECT_EQ(digits[26], uint8_t(0));
3256f80339bSMichael Jones   EXPECT_EQ(digits[27], uint8_t(5));
3266f80339bSMichael Jones   EXPECT_EQ(digits[28], uint8_t(3));
3276f80339bSMichael Jones   EXPECT_EQ(digits[29], uint8_t(7));
3286f80339bSMichael Jones   EXPECT_EQ(digits[30], uint8_t(6));
3296f80339bSMichael Jones 
3301c92911eSMichael Jones   EXPECT_EQ(hpd.get_num_digits(), 31u);
3311c92911eSMichael Jones   EXPECT_EQ(hpd.get_decimal_point(), 31);
3326f80339bSMichael Jones 
3336f80339bSMichael Jones   hpd.shift(-100); // shift right 100, equal to dividing by
3346f80339bSMichael Jones                    // 1267650600228229401496703205376.
3356f80339bSMichael Jones   // result should be 1
3366f80339bSMichael Jones 
3376f80339bSMichael Jones   EXPECT_EQ(digits[0], uint8_t(1));
3381c92911eSMichael Jones   EXPECT_EQ(hpd.get_num_digits(), 1u);
3391c92911eSMichael Jones   EXPECT_EQ(hpd.get_decimal_point(), 1);
3406f80339bSMichael Jones }
3416f80339bSMichael Jones 
TEST(LlvmLibcHighPrecisionDecimalTest,RoundingTest)3426f80339bSMichael Jones TEST(LlvmLibcHighPrecisionDecimalTest, RoundingTest) {
343d7cc760fSGuillaume Chatelet   __llvm_libc::internal::HighPrecisionDecimal hpd =
344d7cc760fSGuillaume Chatelet       __llvm_libc::internal::HighPrecisionDecimal("1.2345");
3456f80339bSMichael Jones 
3461c92911eSMichael Jones   EXPECT_EQ(hpd.round_to_integer_type<uint32_t>(), uint32_t(1));
3471c92911eSMichael Jones   EXPECT_EQ(hpd.round_to_integer_type<uint64_t>(), uint64_t(1));
348*300f8da8SSiva Chandra Reddy   EXPECT_EQ(hpd.round_to_integer_type<UInt128>(), UInt128(1));
3496f80339bSMichael Jones 
3506f80339bSMichael Jones   hpd.shift(1); // shift left 1 to get 2.469 (rounds to 2)
3516f80339bSMichael Jones 
3521c92911eSMichael Jones   EXPECT_EQ(hpd.round_to_integer_type<uint32_t>(), uint32_t(2));
3531c92911eSMichael Jones   EXPECT_EQ(hpd.round_to_integer_type<uint64_t>(), uint64_t(2));
354*300f8da8SSiva Chandra Reddy   EXPECT_EQ(hpd.round_to_integer_type<UInt128>(), UInt128(2));
3556f80339bSMichael Jones 
3566f80339bSMichael Jones   hpd.shift(1); // shift left 1 to get 4.938 (rounds to 5)
3576f80339bSMichael Jones 
3581c92911eSMichael Jones   EXPECT_EQ(hpd.round_to_integer_type<uint32_t>(), uint32_t(5));
3591c92911eSMichael Jones   EXPECT_EQ(hpd.round_to_integer_type<uint64_t>(), uint64_t(5));
360*300f8da8SSiva Chandra Reddy   EXPECT_EQ(hpd.round_to_integer_type<UInt128>(), UInt128(5));
3616f80339bSMichael Jones 
3626f80339bSMichael Jones   // 2.5 is right between two integers, so we round to even (2)
363d7cc760fSGuillaume Chatelet   hpd = __llvm_libc::internal::HighPrecisionDecimal("2.5");
3646f80339bSMichael Jones 
3651c92911eSMichael Jones   EXPECT_EQ(hpd.round_to_integer_type<uint32_t>(), uint32_t(2));
3661c92911eSMichael Jones   EXPECT_EQ(hpd.round_to_integer_type<uint64_t>(), uint64_t(2));
367*300f8da8SSiva Chandra Reddy   EXPECT_EQ(hpd.round_to_integer_type<UInt128>(), UInt128(2));
3686f80339bSMichael Jones 
3696f80339bSMichael Jones   // unless it's marked as having truncated, which means it's actually slightly
3706f80339bSMichael Jones   // higher, forcing a round up (3)
3711c92911eSMichael Jones   hpd.set_truncated(true);
3726f80339bSMichael Jones 
3731c92911eSMichael Jones   EXPECT_EQ(hpd.round_to_integer_type<uint32_t>(), uint32_t(3));
3741c92911eSMichael Jones   EXPECT_EQ(hpd.round_to_integer_type<uint64_t>(), uint64_t(3));
375*300f8da8SSiva Chandra Reddy   EXPECT_EQ(hpd.round_to_integer_type<UInt128>(), UInt128(3));
3766f80339bSMichael Jones 
3776f80339bSMichael Jones   // Check that the larger int types are being handled properly (overflow is not
3786f80339bSMichael Jones   // handled, so int types that are too small are ignored for this test.)
3796f80339bSMichael Jones 
3806f80339bSMichael Jones   // 1099511627776 = 2^40
381d7cc760fSGuillaume Chatelet   hpd = __llvm_libc::internal::HighPrecisionDecimal("1099511627776");
3826f80339bSMichael Jones 
3831c92911eSMichael Jones   EXPECT_EQ(hpd.round_to_integer_type<uint64_t>(), uint64_t(1099511627776));
384*300f8da8SSiva Chandra Reddy   EXPECT_EQ(hpd.round_to_integer_type<UInt128>(), UInt128(1099511627776));
3856f80339bSMichael Jones 
3866f80339bSMichael Jones   // 1267650600228229401496703205376 = 2^100
387d7cc760fSGuillaume Chatelet   hpd = __llvm_libc::internal::HighPrecisionDecimal(
3886f80339bSMichael Jones       "1267650600228229401496703205376");
3896f80339bSMichael Jones 
390*300f8da8SSiva Chandra Reddy   UInt128 result = UInt128(1) << 100;
3916f80339bSMichael Jones 
392*300f8da8SSiva Chandra Reddy   EXPECT_EQ(hpd.round_to_integer_type<UInt128>(), result);
3936f80339bSMichael Jones }
394