1*71db0c75SAndroid Build Coastguard Worker //===-- A template class for testing strfrom functions ----------*- C++ -*-===// 2*71db0c75SAndroid Build Coastguard Worker // 3*71db0c75SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*71db0c75SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information. 5*71db0c75SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*71db0c75SAndroid Build Coastguard Worker // 7*71db0c75SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 8*71db0c75SAndroid Build Coastguard Worker 9*71db0c75SAndroid Build Coastguard Worker #include "src/__support/CPP/type_traits.h" 10*71db0c75SAndroid Build Coastguard Worker #include "src/__support/FPUtil/FPBits.h" 11*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/Test.h" 12*71db0c75SAndroid Build Coastguard Worker 13*71db0c75SAndroid Build Coastguard Worker #define ASSERT_STREQ_LEN(actual_written, actual_str, expected_str) \ 14*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(actual_written, static_cast<int>(sizeof(expected_str) - 1)); \ 15*71db0c75SAndroid Build Coastguard Worker EXPECT_STREQ(actual_str, expected_str); 16*71db0c75SAndroid Build Coastguard Worker 17*71db0c75SAndroid Build Coastguard Worker template <typename InputT> 18*71db0c75SAndroid Build Coastguard Worker class StrfromTest : public LIBC_NAMESPACE::testing::Test { 19*71db0c75SAndroid Build Coastguard Worker 20*71db0c75SAndroid Build Coastguard Worker static const bool is_single_prec = 21*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::cpp::is_same<InputT, float>::value; 22*71db0c75SAndroid Build Coastguard Worker static const bool is_double_prec = 23*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::cpp::is_same<InputT, double>::value; 24*71db0c75SAndroid Build Coastguard Worker 25*71db0c75SAndroid Build Coastguard Worker using FunctionT = int (*)(char *, size_t, const char *, InputT fp); 26*71db0c75SAndroid Build Coastguard Worker 27*71db0c75SAndroid Build Coastguard Worker public: floatDecimalFormat(FunctionT func)28*71db0c75SAndroid Build Coastguard Worker void floatDecimalFormat(FunctionT func) { 29*71db0c75SAndroid Build Coastguard Worker if (is_single_prec) 30*71db0c75SAndroid Build Coastguard Worker floatDecimalSinglePrec(func); 31*71db0c75SAndroid Build Coastguard Worker else if (is_double_prec) 32*71db0c75SAndroid Build Coastguard Worker floatDecimalDoublePrec(func); 33*71db0c75SAndroid Build Coastguard Worker else 34*71db0c75SAndroid Build Coastguard Worker floatDecimalLongDoublePrec(func); 35*71db0c75SAndroid Build Coastguard Worker } 36*71db0c75SAndroid Build Coastguard Worker floatHexExpFormat(FunctionT func)37*71db0c75SAndroid Build Coastguard Worker void floatHexExpFormat(FunctionT func) { 38*71db0c75SAndroid Build Coastguard Worker if (is_single_prec) 39*71db0c75SAndroid Build Coastguard Worker floatHexExpSinglePrec(func); 40*71db0c75SAndroid Build Coastguard Worker else if (is_double_prec) 41*71db0c75SAndroid Build Coastguard Worker floatHexExpDoublePrec(func); 42*71db0c75SAndroid Build Coastguard Worker else 43*71db0c75SAndroid Build Coastguard Worker floatHexExpLongDoublePrec(func); 44*71db0c75SAndroid Build Coastguard Worker } 45*71db0c75SAndroid Build Coastguard Worker floatDecimalExpFormat(FunctionT func)46*71db0c75SAndroid Build Coastguard Worker void floatDecimalExpFormat(FunctionT func) { 47*71db0c75SAndroid Build Coastguard Worker if (is_single_prec) 48*71db0c75SAndroid Build Coastguard Worker floatDecimalExpSinglePrec(func); 49*71db0c75SAndroid Build Coastguard Worker else if (is_double_prec) 50*71db0c75SAndroid Build Coastguard Worker floatDecimalExpDoublePrec(func); 51*71db0c75SAndroid Build Coastguard Worker else 52*71db0c75SAndroid Build Coastguard Worker floatDecimalExpLongDoublePrec(func); 53*71db0c75SAndroid Build Coastguard Worker } 54*71db0c75SAndroid Build Coastguard Worker floatDecimalAutoFormat(FunctionT func)55*71db0c75SAndroid Build Coastguard Worker void floatDecimalAutoFormat(FunctionT func) { 56*71db0c75SAndroid Build Coastguard Worker if (is_single_prec) 57*71db0c75SAndroid Build Coastguard Worker floatDecimalAutoSinglePrec(func); 58*71db0c75SAndroid Build Coastguard Worker else if (is_double_prec) 59*71db0c75SAndroid Build Coastguard Worker floatDecimalAutoDoublePrec(func); 60*71db0c75SAndroid Build Coastguard Worker else 61*71db0c75SAndroid Build Coastguard Worker floatDecimalAutoLongDoublePrec(func); 62*71db0c75SAndroid Build Coastguard Worker } 63*71db0c75SAndroid Build Coastguard Worker improperFormatString(FunctionT func)64*71db0c75SAndroid Build Coastguard Worker void improperFormatString(FunctionT func) { 65*71db0c75SAndroid Build Coastguard Worker char buff[100]; 66*71db0c75SAndroid Build Coastguard Worker int written; 67*71db0c75SAndroid Build Coastguard Worker const bool is_long_double = !is_single_prec && !is_double_prec; 68*71db0c75SAndroid Build Coastguard Worker 69*71db0c75SAndroid Build Coastguard Worker written = func(buff, 37, "A simple string with no conversions.", 1.0); 70*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "A simple string with no conversions."); 71*71db0c75SAndroid Build Coastguard Worker 72*71db0c75SAndroid Build Coastguard Worker written = 73*71db0c75SAndroid Build Coastguard Worker func(buff, 37, 74*71db0c75SAndroid Build Coastguard Worker "%A simple string with one conversion, should overwrite.", 1.0); 75*71db0c75SAndroid Build Coastguard Worker if (is_long_double) { 76*71db0c75SAndroid Build Coastguard Worker #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80) 77*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0X8P-3"); 78*71db0c75SAndroid Build Coastguard Worker #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64) 79*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0X1P+0"); 80*71db0c75SAndroid Build Coastguard Worker #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128) 81*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0X1P+0"); 82*71db0c75SAndroid Build Coastguard Worker #endif 83*71db0c75SAndroid Build Coastguard Worker } else { 84*71db0c75SAndroid Build Coastguard Worker // not long double 85*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0X1P+0"); 86*71db0c75SAndroid Build Coastguard Worker } 87*71db0c75SAndroid Build Coastguard Worker written = func(buff, 74, 88*71db0c75SAndroid Build Coastguard Worker "A simple string with one conversion in %A " 89*71db0c75SAndroid Build Coastguard Worker "between, writes string as it is", 90*71db0c75SAndroid Build Coastguard Worker 1.0); 91*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, 92*71db0c75SAndroid Build Coastguard Worker "A simple string with one conversion in %A between, " 93*71db0c75SAndroid Build Coastguard Worker "writes string as it is"); 94*71db0c75SAndroid Build Coastguard Worker 95*71db0c75SAndroid Build Coastguard Worker written = func(buff, 36, "A simple string with one conversion", 1.0); 96*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "A simple string with one conversion"); 97*71db0c75SAndroid Build Coastguard Worker 98*71db0c75SAndroid Build Coastguard Worker written = func(buff, 20, "%1f", 1234567890.0); 99*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "%1f"); 100*71db0c75SAndroid Build Coastguard Worker } 101*71db0c75SAndroid Build Coastguard Worker insufficentBufsize(FunctionT func)102*71db0c75SAndroid Build Coastguard Worker void insufficentBufsize(FunctionT func) { 103*71db0c75SAndroid Build Coastguard Worker char buff[20]; 104*71db0c75SAndroid Build Coastguard Worker int written; 105*71db0c75SAndroid Build Coastguard Worker 106*71db0c75SAndroid Build Coastguard Worker written = func(buff, 5, "%f", 1234567890.0); 107*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(written, 17); 108*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ(buff, "1234"); 109*71db0c75SAndroid Build Coastguard Worker 110*71db0c75SAndroid Build Coastguard Worker written = func(buff, 5, "%.5f", 1.05); 111*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(written, 7); 112*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ(buff, "1.05"); 113*71db0c75SAndroid Build Coastguard Worker 114*71db0c75SAndroid Build Coastguard Worker written = func(buff, 0, "%g", 1.0); 115*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(written, 1); 116*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ(buff, "1.05"); // Make sure that buff has not changed 117*71db0c75SAndroid Build Coastguard Worker } 118*71db0c75SAndroid Build Coastguard Worker infNanValues(FunctionT func)119*71db0c75SAndroid Build Coastguard Worker void infNanValues(FunctionT func) { 120*71db0c75SAndroid Build Coastguard Worker if (is_double_prec) 121*71db0c75SAndroid Build Coastguard Worker doublePrecInfNan(func); 122*71db0c75SAndroid Build Coastguard Worker else if (!is_single_prec) 123*71db0c75SAndroid Build Coastguard Worker longDoublePrecInfNan(func); 124*71db0c75SAndroid Build Coastguard Worker } 125*71db0c75SAndroid Build Coastguard Worker floatDecimalSinglePrec(FunctionT func)126*71db0c75SAndroid Build Coastguard Worker void floatDecimalSinglePrec(FunctionT func) { 127*71db0c75SAndroid Build Coastguard Worker char buff[70]; 128*71db0c75SAndroid Build Coastguard Worker int written; 129*71db0c75SAndroid Build Coastguard Worker 130*71db0c75SAndroid Build Coastguard Worker written = func(buff, 16, "%f", 1.0); 131*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "1.000000"); 132*71db0c75SAndroid Build Coastguard Worker 133*71db0c75SAndroid Build Coastguard Worker written = func(buff, 20, "%f", 1234567890.0); 134*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "1234567936.000000"); 135*71db0c75SAndroid Build Coastguard Worker 136*71db0c75SAndroid Build Coastguard Worker written = func(buff, 67, "%.3f", 1.0); 137*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "1.000"); 138*71db0c75SAndroid Build Coastguard Worker } 139*71db0c75SAndroid Build Coastguard Worker floatDecimalDoublePrec(FunctionT func)140*71db0c75SAndroid Build Coastguard Worker void floatDecimalDoublePrec(FunctionT func) { 141*71db0c75SAndroid Build Coastguard Worker char buff[500]; 142*71db0c75SAndroid Build Coastguard Worker int written; 143*71db0c75SAndroid Build Coastguard Worker 144*71db0c75SAndroid Build Coastguard Worker written = func(buff, 99, "%f", 1.0); 145*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "1.000000"); 146*71db0c75SAndroid Build Coastguard Worker 147*71db0c75SAndroid Build Coastguard Worker written = func(buff, 99, "%F", -1.0); 148*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "-1.000000"); 149*71db0c75SAndroid Build Coastguard Worker 150*71db0c75SAndroid Build Coastguard Worker written = func(buff, 99, "%f", -1.234567); 151*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "-1.234567"); 152*71db0c75SAndroid Build Coastguard Worker 153*71db0c75SAndroid Build Coastguard Worker written = func(buff, 99, "%f", 0.0); 154*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0.000000"); 155*71db0c75SAndroid Build Coastguard Worker 156*71db0c75SAndroid Build Coastguard Worker written = func(buff, 99, "%f", 1.5); 157*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "1.500000"); 158*71db0c75SAndroid Build Coastguard Worker 159*71db0c75SAndroid Build Coastguard Worker // Dyadic float is only accurate to ~50 digits, so skip this 300 digit test. 160*71db0c75SAndroid Build Coastguard Worker // TODO: Create way to test just the first ~50 digits of a number. 161*71db0c75SAndroid Build Coastguard Worker #ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION 162*71db0c75SAndroid Build Coastguard Worker written = func(buff, 499, "%f", 1e300); 163*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, 164*71db0c75SAndroid Build Coastguard Worker "100000000000000005250476025520442024870446858110815915491" 165*71db0c75SAndroid Build Coastguard Worker "585411551180245" 166*71db0c75SAndroid Build Coastguard Worker "798890819578637137508044786404370444383288387817694252323" 167*71db0c75SAndroid Build Coastguard Worker "536043057564479" 168*71db0c75SAndroid Build Coastguard Worker "218478670698284838720092657580373783023379478809005936895" 169*71db0c75SAndroid Build Coastguard Worker "323497079994508" 170*71db0c75SAndroid Build Coastguard Worker "111903896764088007465274278014249457925878882005684283811" 171*71db0c75SAndroid Build Coastguard Worker "566947219638686" 172*71db0c75SAndroid Build Coastguard Worker "5459400540160.000000"); 173*71db0c75SAndroid Build Coastguard Worker #endif // DLIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION 174*71db0c75SAndroid Build Coastguard Worker 175*71db0c75SAndroid Build Coastguard Worker written = func(buff, 99, "%f", 0.1); 176*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0.100000"); 177*71db0c75SAndroid Build Coastguard Worker 178*71db0c75SAndroid Build Coastguard Worker written = func(buff, 99, "%f", 1234567890123456789.0); 179*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "1234567890123456768.000000"); 180*71db0c75SAndroid Build Coastguard Worker 181*71db0c75SAndroid Build Coastguard Worker written = func(buff, 99, "%f", 9999999999999.99); 182*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "9999999999999.990234"); 183*71db0c75SAndroid Build Coastguard Worker 184*71db0c75SAndroid Build Coastguard Worker written = func(buff, 99, "%f", 0.1); 185*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0.100000"); 186*71db0c75SAndroid Build Coastguard Worker 187*71db0c75SAndroid Build Coastguard Worker written = func(buff, 99, "%f", 1234567890123456789.0); 188*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "1234567890123456768.000000"); 189*71db0c75SAndroid Build Coastguard Worker 190*71db0c75SAndroid Build Coastguard Worker written = func(buff, 99, "%f", 9999999999999.99); 191*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "9999999999999.990234"); 192*71db0c75SAndroid Build Coastguard Worker 193*71db0c75SAndroid Build Coastguard Worker // Precision Tests 194*71db0c75SAndroid Build Coastguard Worker written = func(buff, 100, "%.2f", 9999999999999.99); 195*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "9999999999999.99"); 196*71db0c75SAndroid Build Coastguard Worker 197*71db0c75SAndroid Build Coastguard Worker written = func(buff, 100, "%.1f", 9999999999999.99); 198*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "10000000000000.0"); 199*71db0c75SAndroid Build Coastguard Worker 200*71db0c75SAndroid Build Coastguard Worker written = func(buff, 100, "%.5f", 1.25); 201*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "1.25000"); 202*71db0c75SAndroid Build Coastguard Worker 203*71db0c75SAndroid Build Coastguard Worker written = func(buff, 100, "%.0f", 1.25); 204*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "1"); 205*71db0c75SAndroid Build Coastguard Worker 206*71db0c75SAndroid Build Coastguard Worker written = func(buff, 100, "%.20f", 1.234e-10); 207*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0.00000000012340000000"); 208*71db0c75SAndroid Build Coastguard Worker } 209*71db0c75SAndroid Build Coastguard Worker floatDecimalLongDoublePrec(FunctionT func)210*71db0c75SAndroid Build Coastguard Worker void floatDecimalLongDoublePrec(FunctionT func) { 211*71db0c75SAndroid Build Coastguard Worker char buff[45]; 212*71db0c75SAndroid Build Coastguard Worker int written; 213*71db0c75SAndroid Build Coastguard Worker 214*71db0c75SAndroid Build Coastguard Worker written = func(buff, 40, "%f", 1.0L); 215*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "1.000000"); 216*71db0c75SAndroid Build Coastguard Worker 217*71db0c75SAndroid Build Coastguard Worker written = func(buff, 10, "%.f", -2.5L); 218*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "-2"); 219*71db0c75SAndroid Build Coastguard Worker } 220*71db0c75SAndroid Build Coastguard Worker floatHexExpSinglePrec(FunctionT func)221*71db0c75SAndroid Build Coastguard Worker void floatHexExpSinglePrec(FunctionT func) { 222*71db0c75SAndroid Build Coastguard Worker char buff[25]; 223*71db0c75SAndroid Build Coastguard Worker int written; 224*71db0c75SAndroid Build Coastguard Worker 225*71db0c75SAndroid Build Coastguard Worker written = func(buff, 0, "%a", 1234567890.0); 226*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(written, 14); 227*71db0c75SAndroid Build Coastguard Worker 228*71db0c75SAndroid Build Coastguard Worker written = func(buff, 20, "%a", 1234567890.0); 229*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(written, 14); 230*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ(buff, "0x1.26580cp+30"); 231*71db0c75SAndroid Build Coastguard Worker 232*71db0c75SAndroid Build Coastguard Worker written = func(buff, 20, "%A", 1234567890.0); 233*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(written, 14); 234*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ(buff, "0X1.26580CP+30"); 235*71db0c75SAndroid Build Coastguard Worker } 236*71db0c75SAndroid Build Coastguard Worker floatHexExpDoublePrec(FunctionT func)237*71db0c75SAndroid Build Coastguard Worker void floatHexExpDoublePrec(FunctionT func) { 238*71db0c75SAndroid Build Coastguard Worker char buff[60]; 239*71db0c75SAndroid Build Coastguard Worker int written; 240*71db0c75SAndroid Build Coastguard Worker 241*71db0c75SAndroid Build Coastguard Worker written = func(buff, 10, "%a", 1.0); 242*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0x1p+0"); 243*71db0c75SAndroid Build Coastguard Worker 244*71db0c75SAndroid Build Coastguard Worker written = func(buff, 10, "%A", -1.0); 245*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "-0X1P+0"); 246*71db0c75SAndroid Build Coastguard Worker 247*71db0c75SAndroid Build Coastguard Worker written = func(buff, 30, "%a", -0x1.abcdef12345p0); 248*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "-0x1.abcdef12345p+0"); 249*71db0c75SAndroid Build Coastguard Worker 250*71db0c75SAndroid Build Coastguard Worker written = func(buff, 50, "%A", 0x1.abcdef12345p0); 251*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0X1.ABCDEF12345P+0"); 252*71db0c75SAndroid Build Coastguard Worker 253*71db0c75SAndroid Build Coastguard Worker written = func(buff, 10, "%a", 0.0); 254*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0x0p+0"); 255*71db0c75SAndroid Build Coastguard Worker 256*71db0c75SAndroid Build Coastguard Worker written = func(buff, 40, "%a", 1.0e100); 257*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0x1.249ad2594c37dp+332"); 258*71db0c75SAndroid Build Coastguard Worker 259*71db0c75SAndroid Build Coastguard Worker written = func(buff, 30, "%a", 0.1); 260*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0x1.999999999999ap-4"); 261*71db0c75SAndroid Build Coastguard Worker } 262*71db0c75SAndroid Build Coastguard Worker floatHexExpLongDoublePrec(FunctionT func)263*71db0c75SAndroid Build Coastguard Worker void floatHexExpLongDoublePrec(FunctionT func) { 264*71db0c75SAndroid Build Coastguard Worker char buff[55]; 265*71db0c75SAndroid Build Coastguard Worker int written; 266*71db0c75SAndroid Build Coastguard Worker 267*71db0c75SAndroid Build Coastguard Worker written = func(buff, 50, "%a", 0.1L); 268*71db0c75SAndroid Build Coastguard Worker #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80) 269*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0xc.ccccccccccccccdp-7"); 270*71db0c75SAndroid Build Coastguard Worker #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64) 271*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0x1.999999999999ap-4"); 272*71db0c75SAndroid Build Coastguard Worker #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128) 273*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0x1.999999999999999999999999999ap-4"); 274*71db0c75SAndroid Build Coastguard Worker #endif 275*71db0c75SAndroid Build Coastguard Worker 276*71db0c75SAndroid Build Coastguard Worker written = func(buff, 20, "%.1a", 0.1L); 277*71db0c75SAndroid Build Coastguard Worker #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80) 278*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0xc.dp-7"); 279*71db0c75SAndroid Build Coastguard Worker #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64) 280*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0x1.ap-4"); 281*71db0c75SAndroid Build Coastguard Worker #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128) 282*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0x1.ap-4"); 283*71db0c75SAndroid Build Coastguard Worker #endif 284*71db0c75SAndroid Build Coastguard Worker 285*71db0c75SAndroid Build Coastguard Worker written = func(buff, 50, "%a", 1.0e1000L); 286*71db0c75SAndroid Build Coastguard Worker #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80) 287*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0xf.38db1f9dd3dac05p+3318"); 288*71db0c75SAndroid Build Coastguard Worker #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64) 289*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "inf"); 290*71db0c75SAndroid Build Coastguard Worker #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128) 291*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0x1.e71b63f3ba7b580af1a52d2a7379p+3321"); 292*71db0c75SAndroid Build Coastguard Worker #endif 293*71db0c75SAndroid Build Coastguard Worker 294*71db0c75SAndroid Build Coastguard Worker written = func(buff, 50, "%a", 1.0e-1000L); 295*71db0c75SAndroid Build Coastguard Worker #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80) 296*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0x8.68a9188a89e1467p-3325"); 297*71db0c75SAndroid Build Coastguard Worker #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64) 298*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0x0p+0"); 299*71db0c75SAndroid Build Coastguard Worker #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128) 300*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0x1.0d152311513c28ce202627c06ec2p-3322"); 301*71db0c75SAndroid Build Coastguard Worker #endif 302*71db0c75SAndroid Build Coastguard Worker 303*71db0c75SAndroid Build Coastguard Worker written = func(buff, 50, "%.1a", 0xf.fffffffffffffffp16380L); 304*71db0c75SAndroid Build Coastguard Worker #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80) 305*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0x1.0p+16384"); 306*71db0c75SAndroid Build Coastguard Worker #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64) 307*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "inf"); 308*71db0c75SAndroid Build Coastguard Worker #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128) 309*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0x2.0p+16383"); 310*71db0c75SAndroid Build Coastguard Worker #endif 311*71db0c75SAndroid Build Coastguard Worker } 312*71db0c75SAndroid Build Coastguard Worker floatDecimalExpSinglePrec(FunctionT func)313*71db0c75SAndroid Build Coastguard Worker void floatDecimalExpSinglePrec(FunctionT func) { 314*71db0c75SAndroid Build Coastguard Worker char buff[25]; 315*71db0c75SAndroid Build Coastguard Worker int written; 316*71db0c75SAndroid Build Coastguard Worker 317*71db0c75SAndroid Build Coastguard Worker written = func(buff, 20, "%.9e", 1234567890.0); 318*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "1.234567936e+09"); 319*71db0c75SAndroid Build Coastguard Worker 320*71db0c75SAndroid Build Coastguard Worker written = func(buff, 20, "%.9E", 1234567890.0); 321*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "1.234567936E+09"); 322*71db0c75SAndroid Build Coastguard Worker } 323*71db0c75SAndroid Build Coastguard Worker floatDecimalExpDoublePrec(FunctionT func)324*71db0c75SAndroid Build Coastguard Worker void floatDecimalExpDoublePrec(FunctionT func) { 325*71db0c75SAndroid Build Coastguard Worker char buff[101]; 326*71db0c75SAndroid Build Coastguard Worker int written; 327*71db0c75SAndroid Build Coastguard Worker 328*71db0c75SAndroid Build Coastguard Worker written = func(buff, 100, "%e", 1.0); 329*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "1.000000e+00"); 330*71db0c75SAndroid Build Coastguard Worker 331*71db0c75SAndroid Build Coastguard Worker written = func(buff, 100, "%E", -1.0); 332*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "-1.000000E+00"); 333*71db0c75SAndroid Build Coastguard Worker 334*71db0c75SAndroid Build Coastguard Worker written = func(buff, 100, "%e", -1.234567); 335*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "-1.234567e+00"); 336*71db0c75SAndroid Build Coastguard Worker 337*71db0c75SAndroid Build Coastguard Worker written = func(buff, 100, "%e", 0.0); 338*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0.000000e+00"); 339*71db0c75SAndroid Build Coastguard Worker 340*71db0c75SAndroid Build Coastguard Worker written = func(buff, 100, "%e", 1.5); 341*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "1.500000e+00"); 342*71db0c75SAndroid Build Coastguard Worker 343*71db0c75SAndroid Build Coastguard Worker written = func(buff, 100, "%e", 1e300); 344*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "1.000000e+300"); 345*71db0c75SAndroid Build Coastguard Worker 346*71db0c75SAndroid Build Coastguard Worker written = func(buff, 100, "%e", 1234567890123456789.0); 347*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "1.234568e+18"); 348*71db0c75SAndroid Build Coastguard Worker 349*71db0c75SAndroid Build Coastguard Worker // Precision Tests 350*71db0c75SAndroid Build Coastguard Worker written = func(buff, 100, "%.1e", 1.0); 351*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "1.0e+00"); 352*71db0c75SAndroid Build Coastguard Worker 353*71db0c75SAndroid Build Coastguard Worker written = func(buff, 100, "%.1e", 1.99); 354*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "2.0e+00"); 355*71db0c75SAndroid Build Coastguard Worker 356*71db0c75SAndroid Build Coastguard Worker written = func(buff, 100, "%.1e", 9.99); 357*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "1.0e+01"); 358*71db0c75SAndroid Build Coastguard Worker } 359*71db0c75SAndroid Build Coastguard Worker floatDecimalExpLongDoublePrec(FunctionT func)360*71db0c75SAndroid Build Coastguard Worker void floatDecimalExpLongDoublePrec(FunctionT func) { 361*71db0c75SAndroid Build Coastguard Worker // Mark as maybe_unused to silence unused variable 362*71db0c75SAndroid Build Coastguard Worker // warning when long double is not 80-bit 363*71db0c75SAndroid Build Coastguard Worker [[maybe_unused]] char buff[100]; 364*71db0c75SAndroid Build Coastguard Worker [[maybe_unused]] int written; 365*71db0c75SAndroid Build Coastguard Worker 366*71db0c75SAndroid Build Coastguard Worker #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80) 367*71db0c75SAndroid Build Coastguard Worker written = func(buff, 90, "%.9e", 1000000000500000000.1L); 368*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "1.000000001e+18"); 369*71db0c75SAndroid Build Coastguard Worker 370*71db0c75SAndroid Build Coastguard Worker written = func(buff, 90, "%.9e", 1000000000500000000.0L); 371*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "1.000000000e+18"); 372*71db0c75SAndroid Build Coastguard Worker 373*71db0c75SAndroid Build Coastguard Worker written = func(buff, 90, "%e", 0xf.fffffffffffffffp+16380L); 374*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "1.189731e+4932"); 375*71db0c75SAndroid Build Coastguard Worker #endif // LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80 376*71db0c75SAndroid Build Coastguard Worker } 377*71db0c75SAndroid Build Coastguard Worker floatDecimalAutoSinglePrec(FunctionT func)378*71db0c75SAndroid Build Coastguard Worker void floatDecimalAutoSinglePrec(FunctionT func) { 379*71db0c75SAndroid Build Coastguard Worker char buff[25]; 380*71db0c75SAndroid Build Coastguard Worker int written; 381*71db0c75SAndroid Build Coastguard Worker 382*71db0c75SAndroid Build Coastguard Worker written = func(buff, 20, "%.9g", 1234567890.0); 383*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "1.23456794e+09"); 384*71db0c75SAndroid Build Coastguard Worker 385*71db0c75SAndroid Build Coastguard Worker written = func(buff, 20, "%.9G", 1234567890.0); 386*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "1.23456794E+09"); 387*71db0c75SAndroid Build Coastguard Worker } 388*71db0c75SAndroid Build Coastguard Worker floatDecimalAutoDoublePrec(FunctionT func)389*71db0c75SAndroid Build Coastguard Worker void floatDecimalAutoDoublePrec(FunctionT func) { 390*71db0c75SAndroid Build Coastguard Worker char buff[120]; 391*71db0c75SAndroid Build Coastguard Worker int written; 392*71db0c75SAndroid Build Coastguard Worker 393*71db0c75SAndroid Build Coastguard Worker written = func(buff, 100, "%g", 1234567890123456789.0); 394*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "1.23457e+18"); 395*71db0c75SAndroid Build Coastguard Worker 396*71db0c75SAndroid Build Coastguard Worker written = func(buff, 100, "%g", 9999990000000.00); 397*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "9.99999e+12"); 398*71db0c75SAndroid Build Coastguard Worker 399*71db0c75SAndroid Build Coastguard Worker written = func(buff, 100, "%g", 9999999000000.00); 400*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "1e+13"); 401*71db0c75SAndroid Build Coastguard Worker 402*71db0c75SAndroid Build Coastguard Worker written = func(buff, 100, "%g", 0xa.aaaaaaaaaaaaaabp-7); 403*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0.0833333"); 404*71db0c75SAndroid Build Coastguard Worker 405*71db0c75SAndroid Build Coastguard Worker written = func(buff, 100, "%g", 0.00001); 406*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "1e-05"); 407*71db0c75SAndroid Build Coastguard Worker 408*71db0c75SAndroid Build Coastguard Worker // Precision Tests 409*71db0c75SAndroid Build Coastguard Worker written = func(buff, 100, "%.0g", 0.0); 410*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0"); 411*71db0c75SAndroid Build Coastguard Worker 412*71db0c75SAndroid Build Coastguard Worker written = func(buff, 100, "%.2g", 0.1); 413*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0.1"); 414*71db0c75SAndroid Build Coastguard Worker 415*71db0c75SAndroid Build Coastguard Worker written = func(buff, 100, "%.2g", 1.09); 416*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "1.1"); 417*71db0c75SAndroid Build Coastguard Worker 418*71db0c75SAndroid Build Coastguard Worker written = func(buff, 100, "%.15g", 22.25); 419*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "22.25"); 420*71db0c75SAndroid Build Coastguard Worker 421*71db0c75SAndroid Build Coastguard Worker written = func(buff, 100, "%.20g", 1.234e-10); 422*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "1.2340000000000000814e-10"); 423*71db0c75SAndroid Build Coastguard Worker } 424*71db0c75SAndroid Build Coastguard Worker floatDecimalAutoLongDoublePrec(FunctionT func)425*71db0c75SAndroid Build Coastguard Worker void floatDecimalAutoLongDoublePrec(FunctionT func) { 426*71db0c75SAndroid Build Coastguard Worker // Mark as maybe_unused to silence unused variable 427*71db0c75SAndroid Build Coastguard Worker // warning when long double is not 80-bit 428*71db0c75SAndroid Build Coastguard Worker [[maybe_unused]] char buff[100]; 429*71db0c75SAndroid Build Coastguard Worker [[maybe_unused]] int written; 430*71db0c75SAndroid Build Coastguard Worker 431*71db0c75SAndroid Build Coastguard Worker #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80) 432*71db0c75SAndroid Build Coastguard Worker written = func(buff, 99, "%g", 0xf.fffffffffffffffp+16380L); 433*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "1.18973e+4932"); 434*71db0c75SAndroid Build Coastguard Worker 435*71db0c75SAndroid Build Coastguard Worker written = func(buff, 99, "%g", 0xa.aaaaaaaaaaaaaabp-7L); 436*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "0.0833333"); 437*71db0c75SAndroid Build Coastguard Worker 438*71db0c75SAndroid Build Coastguard Worker written = func(buff, 99, "%g", 9.99999999999e-100L); 439*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "1e-99"); 440*71db0c75SAndroid Build Coastguard Worker #endif // LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80 441*71db0c75SAndroid Build Coastguard Worker } 442*71db0c75SAndroid Build Coastguard Worker doublePrecInfNan(FunctionT func)443*71db0c75SAndroid Build Coastguard Worker void doublePrecInfNan(FunctionT func) { 444*71db0c75SAndroid Build Coastguard Worker char buff[15]; 445*71db0c75SAndroid Build Coastguard Worker int written; 446*71db0c75SAndroid Build Coastguard Worker 447*71db0c75SAndroid Build Coastguard Worker double inf = LIBC_NAMESPACE::fputil::FPBits<double>::inf().get_val(); 448*71db0c75SAndroid Build Coastguard Worker double nan = LIBC_NAMESPACE::fputil::FPBits<double>::quiet_nan().get_val(); 449*71db0c75SAndroid Build Coastguard Worker 450*71db0c75SAndroid Build Coastguard Worker written = func(buff, 10, "%f", inf); 451*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "inf"); 452*71db0c75SAndroid Build Coastguard Worker 453*71db0c75SAndroid Build Coastguard Worker written = func(buff, 10, "%A", -inf); 454*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "-INF"); 455*71db0c75SAndroid Build Coastguard Worker 456*71db0c75SAndroid Build Coastguard Worker written = func(buff, 10, "%f", nan); 457*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "nan"); 458*71db0c75SAndroid Build Coastguard Worker 459*71db0c75SAndroid Build Coastguard Worker written = func(buff, 10, "%A", -nan); 460*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "-NAN"); 461*71db0c75SAndroid Build Coastguard Worker } 462*71db0c75SAndroid Build Coastguard Worker longDoublePrecInfNan(FunctionT func)463*71db0c75SAndroid Build Coastguard Worker void longDoublePrecInfNan(FunctionT func) { 464*71db0c75SAndroid Build Coastguard Worker char buff[15]; 465*71db0c75SAndroid Build Coastguard Worker int written; 466*71db0c75SAndroid Build Coastguard Worker 467*71db0c75SAndroid Build Coastguard Worker long double ld_inf = 468*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::fputil::FPBits<long double>::inf().get_val(); 469*71db0c75SAndroid Build Coastguard Worker long double ld_nan = 470*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::fputil::FPBits<long double>::quiet_nan().get_val(); 471*71db0c75SAndroid Build Coastguard Worker 472*71db0c75SAndroid Build Coastguard Worker written = func(buff, 10, "%f", ld_inf); 473*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "inf"); 474*71db0c75SAndroid Build Coastguard Worker 475*71db0c75SAndroid Build Coastguard Worker written = func(buff, 10, "%A", -ld_inf); 476*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "-INF"); 477*71db0c75SAndroid Build Coastguard Worker 478*71db0c75SAndroid Build Coastguard Worker written = func(buff, 10, "%f", ld_nan); 479*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "nan"); 480*71db0c75SAndroid Build Coastguard Worker 481*71db0c75SAndroid Build Coastguard Worker written = func(buff, 10, "%A", -ld_nan); 482*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ_LEN(written, buff, "-NAN"); 483*71db0c75SAndroid Build Coastguard Worker } 484*71db0c75SAndroid Build Coastguard Worker }; 485*71db0c75SAndroid Build Coastguard Worker 486*71db0c75SAndroid Build Coastguard Worker #define STRFROM_TEST(InputType, name, func) \ 487*71db0c75SAndroid Build Coastguard Worker using LlvmLibc##name##Test = StrfromTest<InputType>; \ 488*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibc##name##Test, FloatDecimalFormat) { \ 489*71db0c75SAndroid Build Coastguard Worker floatDecimalFormat(func); \ 490*71db0c75SAndroid Build Coastguard Worker } \ 491*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibc##name##Test, FloatHexExpFormat) { floatHexExpFormat(func); } \ 492*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibc##name##Test, FloatDecimalAutoFormat) { \ 493*71db0c75SAndroid Build Coastguard Worker floatDecimalAutoFormat(func); \ 494*71db0c75SAndroid Build Coastguard Worker } \ 495*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibc##name##Test, FloatDecimalExpFormat) { \ 496*71db0c75SAndroid Build Coastguard Worker floatDecimalExpFormat(func); \ 497*71db0c75SAndroid Build Coastguard Worker } \ 498*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibc##name##Test, ImproperFormatString) { \ 499*71db0c75SAndroid Build Coastguard Worker improperFormatString(func); \ 500*71db0c75SAndroid Build Coastguard Worker } \ 501*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibc##name##Test, InsufficientBufferSize) { \ 502*71db0c75SAndroid Build Coastguard Worker insufficentBufsize(func); \ 503*71db0c75SAndroid Build Coastguard Worker } \ 504*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibc##name##Test, InfAndNanValues) { infNanValues(func); } 505