xref: /llvm-project/libc/test/src/stdio/sprintf_test.cpp (revision 9c868195daf153920272269d2af1c4b62670c4b9)
1ff6fe39eSMichael Jones //===-- Unittests for sprintf ---------------------------------------------===//
2ff6fe39eSMichael Jones //
3ff6fe39eSMichael Jones // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4ff6fe39eSMichael Jones // See https://llvm.org/LICENSE.txt for license information.
5ff6fe39eSMichael Jones // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ff6fe39eSMichael Jones //
7ff6fe39eSMichael Jones //===----------------------------------------------------------------------===//
8ff6fe39eSMichael Jones 
95ff3ff33SPetr Hosek #include "src/__support/macros/config.h"
10ff6fe39eSMichael Jones #include "src/stdio/sprintf.h"
11ff6fe39eSMichael Jones 
12f9f8693bSMichael Jones #include "src/__support/FPUtil/FPBits.h"
13f009f72dSMichael Jones #include "src/errno/libc_errno.h"
14447d59e0SSiva Chandra Reddy #include "test/UnitTest/RoundingModeUtils.h"
15af1315c2SSiva Chandra Reddy #include "test/UnitTest/Test.h"
16ca1da36aSSchrodinger ZHU Yifan #include <inttypes.h>
173b3b816fSMichael Jones 
18b02e73a3SMichael Jones // TODO: Add a comment here explaining the printf format string.
19b02e73a3SMichael Jones 
20173d5023SMichael Jones // #include <stdio.h>
215ff3ff33SPetr Hosek // namespace LIBC_NAMESPACE_DECL {
22173d5023SMichael Jones // using ::sprintf;
23173d5023SMichael Jones // }
24173d5023SMichael Jones 
25b6bc9d72SGuillaume Chatelet using LIBC_NAMESPACE::fputil::testing::ForceRoundingMode;
26b6bc9d72SGuillaume Chatelet using LIBC_NAMESPACE::fputil::testing::RoundingMode;
27055be3c3STue Ly 
28f9f8693bSMichael Jones // Subtract 1 from sizeof(expected_str) to account for the null byte.
29f9f8693bSMichael Jones #define ASSERT_STREQ_LEN(actual_written, actual_str, expected_str)             \
30f9f8693bSMichael Jones   EXPECT_EQ(actual_written, static_cast<int>(sizeof(expected_str) - 1));       \
31f9f8693bSMichael Jones   EXPECT_STREQ(actual_str, expected_str);
32f9f8693bSMichael Jones 
33ca1da36aSSchrodinger ZHU Yifan #define macro_test(FMT, X, expected)                                           \
34ca1da36aSSchrodinger ZHU Yifan   do {                                                                         \
35ca1da36aSSchrodinger ZHU Yifan     for (char &c : buff) {                                                     \
36ca1da36aSSchrodinger ZHU Yifan       c = 0;                                                                   \
37ca1da36aSSchrodinger ZHU Yifan     }                                                                          \
388492ad59SMichael Jones     written = LIBC_NAMESPACE::sprintf(buff, "%" FMT, X);                       \
398492ad59SMichael Jones     ASSERT_STREQ_LEN(written, buff, expected);                                 \
40ca1da36aSSchrodinger ZHU Yifan   } while (0)
41ca1da36aSSchrodinger ZHU Yifan 
42ca1da36aSSchrodinger ZHU Yifan TEST(LlvmLibcSPrintfTest, Macros) {
43ca1da36aSSchrodinger ZHU Yifan   char buff[128];
448492ad59SMichael Jones   int written;
45ca1da36aSSchrodinger ZHU Yifan   macro_test(PRIu8, 1, "1");
46ca1da36aSSchrodinger ZHU Yifan   macro_test(PRIX16, 0xAA, "AA");
47ca1da36aSSchrodinger ZHU Yifan   macro_test(PRId32, -123, "-123");
48ca1da36aSSchrodinger ZHU Yifan   macro_test(PRIX32, 0xFFFFFF85, "FFFFFF85");
49ca1da36aSSchrodinger ZHU Yifan   macro_test(PRIo8, 0xFF, "377");
508492ad59SMichael Jones   macro_test(PRIo64, 0123456712345671234567ll, "123456712345671234567");
51ca1da36aSSchrodinger ZHU Yifan }
52ca1da36aSSchrodinger ZHU Yifan 
53ff6fe39eSMichael Jones TEST(LlvmLibcSPrintfTest, SimpleNoConv) {
54ff6fe39eSMichael Jones   char buff[64];
55ff6fe39eSMichael Jones   int written;
56ff6fe39eSMichael Jones 
57b6bc9d72SGuillaume Chatelet   written =
58b6bc9d72SGuillaume Chatelet       LIBC_NAMESPACE::sprintf(buff, "A simple string with no conversions.");
59*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "A simple string with no conversions.");
60ff6fe39eSMichael Jones }
61ff6fe39eSMichael Jones 
62ff6fe39eSMichael Jones TEST(LlvmLibcSPrintfTest, PercentConv) {
63ff6fe39eSMichael Jones   char buff[64];
64ff6fe39eSMichael Jones   int written;
65ff6fe39eSMichael Jones 
66b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%%");
67*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "%");
68ff6fe39eSMichael Jones 
69b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "abc %% def");
70*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "abc % def");
71ff6fe39eSMichael Jones 
72b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%%%%%%");
73*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "%%%");
74ff6fe39eSMichael Jones }
75ff6fe39eSMichael Jones 
76ff6fe39eSMichael Jones TEST(LlvmLibcSPrintfTest, CharConv) {
77ff6fe39eSMichael Jones   char buff[64];
78ff6fe39eSMichael Jones   int written;
79ff6fe39eSMichael Jones 
80b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%c", 'a');
81*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "a");
82ff6fe39eSMichael Jones 
83b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%3c %-3c", '1', '2');
84*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "  1 2  ");
85ff6fe39eSMichael Jones 
86b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%*c", 2, '3');
87*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, " 3");
88ff6fe39eSMichael Jones }
89ff6fe39eSMichael Jones 
90ff6fe39eSMichael Jones TEST(LlvmLibcSPrintfTest, StringConv) {
91ff6fe39eSMichael Jones   char buff[64];
92ff6fe39eSMichael Jones   int written;
93ff6fe39eSMichael Jones 
94b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%s", "abcDEF123");
95*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "abcDEF123");
96ff6fe39eSMichael Jones 
97b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%10s %-10s", "centered", "title");
98*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "  centered title     ");
99ff6fe39eSMichael Jones 
100b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-5.4s%-4.4s", "words can describe",
101ff6fe39eSMichael Jones                                     "soups most delicious");
102*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "word soup");
103ff6fe39eSMichael Jones 
104b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%*s %.*s %*.*s", 10, "beginning", 2,
105ff6fe39eSMichael Jones                                     "isn't", 12, 10, "important. Ever.");
106*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, " beginning is   important.");
107f6ba3529SMichael Jones 
108f6ba3529SMichael Jones #ifndef LIBC_COPT_PRINTF_NO_NULLPTR_CHECKS
109b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%s", nullptr);
110*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "(null)");
111f6ba3529SMichael Jones #endif // LIBC_COPT_PRINTF_NO_NULLPTR_CHECKS
112ff6fe39eSMichael Jones }
113ff6fe39eSMichael Jones 
1141be3669dSMichael Jones TEST(LlvmLibcSPrintfTest, IntConv) {
1151be3669dSMichael Jones   char buff[64];
1161be3669dSMichael Jones   int written;
1171be3669dSMichael Jones 
1181be3669dSMichael Jones   // Basic Tests.
1191be3669dSMichael Jones 
120b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%d", 123);
121*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "123");
1221be3669dSMichael Jones 
123b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%i", -456);
124*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-456");
1251be3669dSMichael Jones 
1261be3669dSMichael Jones   // Length Modifier Tests.
1271be3669dSMichael Jones 
128b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%hhu", 257); // 0x101
129*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1");
1301be3669dSMichael Jones 
131b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%llu", 18446744073709551615ull);
132*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "18446744073709551615"); // ull max
1331be3669dSMichael Jones 
134b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%u", ~0);
13591eb99b8SMichael Jones   if (sizeof(int) == 4) {
136*9c868195SMichael Jones     ASSERT_STREQ_LEN(written, buff, "4294967295");
13791eb99b8SMichael Jones   }
13891eb99b8SMichael Jones 
139b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%tu", ~ptrdiff_t(0));
1401be3669dSMichael Jones   if (sizeof(ptrdiff_t) == 8) {
141*9c868195SMichael Jones     ASSERT_STREQ_LEN(written, buff, "18446744073709551615");
1421be3669dSMichael Jones   } else if (sizeof(ptrdiff_t) == 4) {
143*9c868195SMichael Jones     ASSERT_STREQ_LEN(written, buff, "4294967295");
1441be3669dSMichael Jones   }
1451be3669dSMichael Jones 
146b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%lld", -9223372036854775807ll - 1ll);
147*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-9223372036854775808"); // ll min
1481be3669dSMichael Jones 
149fdef5c4fSOm Prakaash   written = LIBC_NAMESPACE::sprintf(buff, "%w3d", 5807);
150*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "7");
151fdef5c4fSOm Prakaash 
152fdef5c4fSOm Prakaash   written = LIBC_NAMESPACE::sprintf(buff, "%w3d", 1);
153*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1");
154fdef5c4fSOm Prakaash 
155fdef5c4fSOm Prakaash   written = LIBC_NAMESPACE::sprintf(buff, "%w64d", 9223372036854775807ll);
156*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "9223372036854775807");
157fdef5c4fSOm Prakaash 
158fdef5c4fSOm Prakaash   written = LIBC_NAMESPACE::sprintf(buff, "%w-1d", 5807);
159*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "%w-1d");
160fdef5c4fSOm Prakaash 
161fdef5c4fSOm Prakaash   written = LIBC_NAMESPACE::sprintf(buff, "%w0d", 5807);
162*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "%w0d");
163fdef5c4fSOm Prakaash 
164fdef5c4fSOm Prakaash   written = LIBC_NAMESPACE::sprintf(buff, "%w999d", 9223372036854775807ll);
165*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "9223372036854775807");
166fdef5c4fSOm Prakaash 
167fdef5c4fSOm Prakaash   written = LIBC_NAMESPACE::sprintf(buff, "%winvalid%w1d", 5807, 5807);
168*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "%winvalid1");
169fdef5c4fSOm Prakaash 
170fdef5c4fSOm Prakaash   written = LIBC_NAMESPACE::sprintf(buff, "%w-1d%w1d", 5807, 5807);
171*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "%w-1d1");
172fdef5c4fSOm Prakaash 
173fdef5c4fSOm Prakaash   char format[64];
174fdef5c4fSOm Prakaash   char uintmax[128];
175838b118dSMichael Jones   LIBC_NAMESPACE::sprintf(format, "%%w%du", sizeof(uintmax_t) * CHAR_BIT);
176838b118dSMichael Jones   const int uintmax_len =
177838b118dSMichael Jones       LIBC_NAMESPACE::sprintf(uintmax, "%ju", sizeof(uintmax_t) * CHAR_BIT);
178838b118dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, format, sizeof(uintmax_t) * CHAR_BIT);
179fdef5c4fSOm Prakaash   EXPECT_EQ(written, uintmax_len);
180fdef5c4fSOm Prakaash   ASSERT_STREQ(buff, uintmax);
181fdef5c4fSOm Prakaash 
182fdef5c4fSOm Prakaash   written = LIBC_NAMESPACE::sprintf(buff, "%w64u", 18446744073709551615ull);
183*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "18446744073709551615"); // ull max
184fdef5c4fSOm Prakaash 
185fdef5c4fSOm Prakaash   written =
186fdef5c4fSOm Prakaash       LIBC_NAMESPACE::sprintf(buff, "%w64d", -9223372036854775807ll - 1ll);
187*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-9223372036854775808"); // ll min
188fdef5c4fSOm Prakaash 
189fdef5c4fSOm Prakaash   written = LIBC_NAMESPACE::sprintf(buff, "%wf3d", 5807);
190*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "7");
191fdef5c4fSOm Prakaash 
192fdef5c4fSOm Prakaash   written = LIBC_NAMESPACE::sprintf(buff, "%wf3d", 1);
193*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1");
194fdef5c4fSOm Prakaash 
195fdef5c4fSOm Prakaash   written = LIBC_NAMESPACE::sprintf(buff, "%wf64u", 18446744073709551615ull);
196*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "18446744073709551615"); // ull max
197fdef5c4fSOm Prakaash 
198fdef5c4fSOm Prakaash   written =
199fdef5c4fSOm Prakaash       LIBC_NAMESPACE::sprintf(buff, "%wf64d", -9223372036854775807ll - 1ll);
200*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-9223372036854775808"); // ll min
201fdef5c4fSOm Prakaash 
202fdef5c4fSOm Prakaash   written = LIBC_NAMESPACE::sprintf(buff, "%wf0d", 5807);
203*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "%wf0d");
204fdef5c4fSOm Prakaash 
205fdef5c4fSOm Prakaash   written = LIBC_NAMESPACE::sprintf(buff, "%wf-1d", 5807);
206*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "%wf-1d");
207fdef5c4fSOm Prakaash 
208fdef5c4fSOm Prakaash   written = LIBC_NAMESPACE::sprintf(buff, "%wfinvalid%wf1d", 5807, 5807);
209*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "%wfinvalid1");
210fdef5c4fSOm Prakaash 
211fdef5c4fSOm Prakaash   written = LIBC_NAMESPACE::sprintf(buff, "%wf-1d%wf1d", 5807, 5807);
212*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "%wf-1d1");
213fdef5c4fSOm Prakaash 
214fdef5c4fSOm Prakaash   written = LIBC_NAMESPACE::sprintf(buff, "%wf999d", 9223372036854775807ll);
215*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "9223372036854775807");
216fdef5c4fSOm Prakaash 
2171be3669dSMichael Jones   // Min Width Tests.
2181be3669dSMichael Jones 
219b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%4d", 789);
220*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, " 789");
2211be3669dSMichael Jones 
222b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%2d", 987);
223*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "987");
2241be3669dSMichael Jones 
2251be3669dSMichael Jones   // Precision Tests.
2261be3669dSMichael Jones 
227b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%d", 0);
228*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0");
2291be3669dSMichael Jones 
230b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.0d", 0);
231*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "");
2321be3669dSMichael Jones 
233b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.5d", 654);
234*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "00654");
2351be3669dSMichael Jones 
236b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.5d", -321);
237*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-00321");
2381be3669dSMichael Jones 
239b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.2d", 135);
240*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "135");
2411be3669dSMichael Jones 
2421be3669dSMichael Jones   // Flag Tests.
2431be3669dSMichael Jones 
244b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.5d", -321);
245*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-00321");
2461be3669dSMichael Jones 
247b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-5d", 246);
248*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "246  ");
2491be3669dSMichael Jones 
250b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-5d", -147);
251*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-147 ");
2521be3669dSMichael Jones 
253b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%+d", 258);
254*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "+258");
2551be3669dSMichael Jones 
256b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "% d", 369);
257*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, " 369");
2581be3669dSMichael Jones 
259b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%05d", 470);
260*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "00470");
2611be3669dSMichael Jones 
262b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%05d", -581);
263*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-0581");
2641be3669dSMichael Jones 
2651be3669dSMichael Jones   // Combined Tests.
2661be3669dSMichael Jones 
267b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%+ u", 692);
268*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "692");
2691be3669dSMichael Jones 
270b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%+ -05d", 703);
271*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "+703 ");
2721be3669dSMichael Jones 
273b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%7.5d", 814);
274*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "  00814");
2751be3669dSMichael Jones 
276b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%7.5d", -925);
277*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, " -00925");
2781be3669dSMichael Jones 
279b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%7.5d", 159);
280*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "  00159");
2811be3669dSMichael Jones 
282b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "% -7.5d", 260);
283*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, " 00260 ");
2841be3669dSMichael Jones 
285b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%5.4d", 10000);
286*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "10000");
2871be3669dSMichael Jones 
2881be3669dSMichael Jones   // Multiple Conversion Tests.
2891be3669dSMichael Jones 
290b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%10d %-10d", 456, -789);
291*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "       456 -789      ");
2921be3669dSMichael Jones 
293b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-5.4d%+.4u", 75, 25);
294*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0075 0025");
2951be3669dSMichael Jones 
296b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "% 05hhi %+-0.5llu %-+ 06.3zd",
2971be3669dSMichael Jones                                     256 + 127, 68719476736ll, size_t(2));
298*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, " 0127 68719476736 +002  ");
2991be3669dSMichael Jones }
3001be3669dSMichael Jones 
301652ecb25SMichael Jones TEST(LlvmLibcSPrintfTest, HexConv) {
302652ecb25SMichael Jones   char buff[64];
303652ecb25SMichael Jones   int written;
304652ecb25SMichael Jones 
305652ecb25SMichael Jones   // Basic Tests.
306652ecb25SMichael Jones 
307b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%x", 0x123a);
308*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "123a");
309652ecb25SMichael Jones 
310b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%X", 0x456b);
311*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "456B");
312652ecb25SMichael Jones 
313652ecb25SMichael Jones   // Length Modifier Tests.
314652ecb25SMichael Jones 
315b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%hhx", 0x10001);
316*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1");
317652ecb25SMichael Jones 
318b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%llx", 0xffffffffffffffffull);
319*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "ffffffffffffffff"); // ull max
320652ecb25SMichael Jones 
321b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%tX", ~ptrdiff_t(0));
322652ecb25SMichael Jones   if (sizeof(ptrdiff_t) == 8) {
323*9c868195SMichael Jones     ASSERT_STREQ_LEN(written, buff, "FFFFFFFFFFFFFFFF");
324652ecb25SMichael Jones   } else if (sizeof(ptrdiff_t) == 4) {
325*9c868195SMichael Jones     ASSERT_STREQ_LEN(written, buff, "FFFFFFFF");
326652ecb25SMichael Jones   }
327652ecb25SMichael Jones 
328652ecb25SMichael Jones   // Min Width Tests.
329652ecb25SMichael Jones 
330b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%4x", 0x789);
331*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, " 789");
332652ecb25SMichael Jones 
333b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%2X", 0x987);
334*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "987");
335652ecb25SMichael Jones 
336652ecb25SMichael Jones   // Precision Tests.
337652ecb25SMichael Jones 
338b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%x", 0);
339*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0");
340652ecb25SMichael Jones 
341b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.0x", 0);
342*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "");
343652ecb25SMichael Jones 
344b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.5x", 0x1F3);
345*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "001f3");
346652ecb25SMichael Jones 
347b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.2x", 0x135);
348*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "135");
349652ecb25SMichael Jones 
350652ecb25SMichael Jones   // Flag Tests.
351652ecb25SMichael Jones 
352b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-5x", 0x246);
353*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "246  ");
354652ecb25SMichael Jones 
355b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%#x", 0xd3f);
356*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0xd3f");
357652ecb25SMichael Jones 
3586e863c40Smichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%#x", 0);
359*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0");
3606e863c40Smichaelrj-google 
361b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%#X", 0xE40);
362*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0XE40");
363652ecb25SMichael Jones 
364b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%05x", 0x470);
365*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "00470");
366652ecb25SMichael Jones 
367b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%0#6x", 0x8c3);
368*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x08c3");
369652ecb25SMichael Jones 
370b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-#6x", 0x5f0);
371*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x5f0 ");
372652ecb25SMichael Jones 
373652ecb25SMichael Jones   // Combined Tests.
374652ecb25SMichael Jones 
375b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%#-07x", 0x703);
376*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x703  ");
377652ecb25SMichael Jones 
378b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%7.5x", 0x814);
379*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "  00814");
380652ecb25SMichael Jones 
381b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%#9.5X", 0x9d4);
382*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "  0X009D4");
383652ecb25SMichael Jones 
3846e863c40Smichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%#.x", 0);
385*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "");
3866e863c40Smichaelrj-google 
387b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-7.5x", 0x260);
388*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "00260  ");
389652ecb25SMichael Jones 
390b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%5.4x", 0x10000);
391*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "10000");
392652ecb25SMichael Jones 
393652ecb25SMichael Jones   // Multiple Conversion Tests.
394652ecb25SMichael Jones 
395b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%10X %-#10x", 0x45b, 0x789);
396*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "       45B 0x789     ");
397652ecb25SMichael Jones 
398b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-5.4x%#.4x", 0x75, 0x25);
399*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0075 0x0025");
400652ecb25SMichael Jones 
401b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%04hhX %#.5llx %-6.3zX", 256 + 0x7f,
402652ecb25SMichael Jones                                     0x1000000000ll, size_t(2));
403*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "007F 0x1000000000 002   ");
404652ecb25SMichael Jones }
405652ecb25SMichael Jones 
406e28ca2ddSArtem Tyurin TEST(LlvmLibcSPrintfTest, BinConv) {
407e28ca2ddSArtem Tyurin   char buff[64];
408e28ca2ddSArtem Tyurin   int written;
409e28ca2ddSArtem Tyurin 
410e28ca2ddSArtem Tyurin   // Basic Tests.
411e28ca2ddSArtem Tyurin 
412e28ca2ddSArtem Tyurin   written = LIBC_NAMESPACE::sprintf(buff, "%b", 42);
413*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "101010");
414e28ca2ddSArtem Tyurin 
415e28ca2ddSArtem Tyurin   written = LIBC_NAMESPACE::sprintf(buff, "%B", 12081991);
416*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "101110000101101101000111");
417e28ca2ddSArtem Tyurin 
418e28ca2ddSArtem Tyurin   // Min Width Tests.
419e28ca2ddSArtem Tyurin 
420e28ca2ddSArtem Tyurin   written = LIBC_NAMESPACE::sprintf(buff, "%10b", 0b101010);
421*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "    101010");
422e28ca2ddSArtem Tyurin 
423e28ca2ddSArtem Tyurin   written = LIBC_NAMESPACE::sprintf(buff, "%2B", 0b101010);
424*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "101010");
425e28ca2ddSArtem Tyurin 
426e28ca2ddSArtem Tyurin   // Precision Tests.
427e28ca2ddSArtem Tyurin 
428e28ca2ddSArtem Tyurin   written = LIBC_NAMESPACE::sprintf(buff, "%b", 0);
429*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0");
430e28ca2ddSArtem Tyurin 
431e28ca2ddSArtem Tyurin   written = LIBC_NAMESPACE::sprintf(buff, "%.0b", 0);
432*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "");
433e28ca2ddSArtem Tyurin 
434e28ca2ddSArtem Tyurin   written = LIBC_NAMESPACE::sprintf(buff, "%.5b", 0b111);
435*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "00111");
436e28ca2ddSArtem Tyurin 
437e28ca2ddSArtem Tyurin   written = LIBC_NAMESPACE::sprintf(buff, "%.2b", 0b111);
438*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "111");
439e28ca2ddSArtem Tyurin 
440e28ca2ddSArtem Tyurin   written = LIBC_NAMESPACE::sprintf(buff, "%3b", 0b111);
441*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "111");
442e28ca2ddSArtem Tyurin 
443e28ca2ddSArtem Tyurin   // Flag Tests.
444e28ca2ddSArtem Tyurin 
445e28ca2ddSArtem Tyurin   written = LIBC_NAMESPACE::sprintf(buff, "%-5b", 0b111);
446*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "111  ");
447e28ca2ddSArtem Tyurin 
448e28ca2ddSArtem Tyurin   written = LIBC_NAMESPACE::sprintf(buff, "%#b", 0b111);
449*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0b111");
450e28ca2ddSArtem Tyurin 
451e28ca2ddSArtem Tyurin   written = LIBC_NAMESPACE::sprintf(buff, "%#b", 0);
452*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0");
453e28ca2ddSArtem Tyurin 
454e28ca2ddSArtem Tyurin   written = LIBC_NAMESPACE::sprintf(buff, "%#B", 0b111);
455*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0B111");
456e28ca2ddSArtem Tyurin 
457e28ca2ddSArtem Tyurin   written = LIBC_NAMESPACE::sprintf(buff, "%05b", 0b111);
458*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "00111");
459e28ca2ddSArtem Tyurin 
460e28ca2ddSArtem Tyurin   written = LIBC_NAMESPACE::sprintf(buff, "%0#6b", 0b111);
461*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0b0111");
462e28ca2ddSArtem Tyurin 
463e28ca2ddSArtem Tyurin   written = LIBC_NAMESPACE::sprintf(buff, "%-#6b", 0b111);
464*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0b111 ");
465e28ca2ddSArtem Tyurin 
466e28ca2ddSArtem Tyurin   // Combined Tests.
467e28ca2ddSArtem Tyurin 
468e28ca2ddSArtem Tyurin   written = LIBC_NAMESPACE::sprintf(buff, "%#-07b", 0b111);
469*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0b111  ");
470e28ca2ddSArtem Tyurin 
471e28ca2ddSArtem Tyurin   written = LIBC_NAMESPACE::sprintf(buff, "%7.5b", 0b111);
472*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "  00111");
473e28ca2ddSArtem Tyurin 
474e28ca2ddSArtem Tyurin   written = LIBC_NAMESPACE::sprintf(buff, "%#9.5B", 0b111);
475*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "  0B00111");
476e28ca2ddSArtem Tyurin 
477e28ca2ddSArtem Tyurin   written = LIBC_NAMESPACE::sprintf(buff, "%#.b", 0);
478*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "");
479e28ca2ddSArtem Tyurin 
480e28ca2ddSArtem Tyurin   written = LIBC_NAMESPACE::sprintf(buff, "%-7.5b", 0b111);
481*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "00111  ");
482e28ca2ddSArtem Tyurin 
483e28ca2ddSArtem Tyurin   written = LIBC_NAMESPACE::sprintf(buff, "%5.4b", 0b1111);
484*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, " 1111");
485e28ca2ddSArtem Tyurin 
486e28ca2ddSArtem Tyurin   // Multiple Conversion Tests.
487e28ca2ddSArtem Tyurin 
488e28ca2ddSArtem Tyurin   written = LIBC_NAMESPACE::sprintf(buff, "%10B %-#10b", 0b101, 0b110);
489*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "       101 0b110     ");
490e28ca2ddSArtem Tyurin 
491e28ca2ddSArtem Tyurin   written = LIBC_NAMESPACE::sprintf(buff, "%-5.4b%#.4b", 0b101, 0b110);
492*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0101 0b0110");
493e28ca2ddSArtem Tyurin }
494e28ca2ddSArtem Tyurin 
495121c6454SMichael Jones TEST(LlvmLibcSPrintfTest, PointerConv) {
496121c6454SMichael Jones   char buff[64];
497121c6454SMichael Jones   int written;
498121c6454SMichael Jones 
499b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%p", nullptr);
500*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "(nullptr)");
501121c6454SMichael Jones 
502b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%p", 0x1a2b3c4d);
503*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1a2b3c4d");
504121c6454SMichael Jones 
505dd51ae81SMichael Jones   if constexpr (sizeof(void *) > 4) {
506b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%p", 0x1a2b3c4d5e6f7081);
507*9c868195SMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1a2b3c4d5e6f7081");
508dd51ae81SMichael Jones   }
509dd51ae81SMichael Jones 
51088f0dc48SOverMighty   written = LIBC_NAMESPACE::sprintf(buff, "%p", &written);
511121c6454SMichael Jones   EXPECT_GT(written, 0);
512dd51ae81SMichael Jones 
513dd51ae81SMichael Jones   // Width tests:
514dd51ae81SMichael Jones 
515b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%20p", nullptr);
516*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "           (nullptr)");
517dd51ae81SMichael Jones 
518b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%20p", 0x1a2b3c4d);
519*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "          0x1a2b3c4d");
520dd51ae81SMichael Jones 
521dd51ae81SMichael Jones   // Flag tests:
522dd51ae81SMichael Jones 
523b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-20p", nullptr);
524*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "(nullptr)           ");
525dd51ae81SMichael Jones 
526b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-20p", 0x1a2b3c4d);
527*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1a2b3c4d          ");
528dd51ae81SMichael Jones 
529dd51ae81SMichael Jones   // Using the 0 flag is technically undefined, but here we're following the
530dd51ae81SMichael Jones   // convention of matching the behavior of %#x.
531b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%020p", 0x1a2b3c4d);
532*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x00000000001a2b3c4d");
533dd51ae81SMichael Jones 
534dd51ae81SMichael Jones   // Precision tests:
535dd51ae81SMichael Jones   // These are all undefined behavior. The precision option is undefined for %p.
536dd51ae81SMichael Jones 
537dd51ae81SMichael Jones   // Precision specifies the number of characters for a string conversion.
538b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.5p", nullptr);
539*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "(null");
540dd51ae81SMichael Jones 
541dd51ae81SMichael Jones   // Precision specifies the number of digits to be written for %x conversions,
542dd51ae81SMichael Jones   // and the "0x" doesn't count as part of the digits.
543b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.20p", 0x1a2b3c4d);
544*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0000000000001a2b3c4d");
545121c6454SMichael Jones }
546121c6454SMichael Jones 
5476ec465abSMichael Jones TEST(LlvmLibcSPrintfTest, OctConv) {
5486ec465abSMichael Jones   char buff[64];
5496ec465abSMichael Jones   int written;
5506ec465abSMichael Jones 
5516ec465abSMichael Jones   // Basic Tests.
5526ec465abSMichael Jones 
553b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%o", 01234);
554*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1234");
5556ec465abSMichael Jones 
556b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%o", 04567);
557*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "4567");
5586ec465abSMichael Jones 
5596ec465abSMichael Jones   // Length Modifier Tests.
5606ec465abSMichael Jones 
561b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%hho", 0401);
562*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1");
5636ec465abSMichael Jones 
564b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%llo", 01777777777777777777777ull);
565*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1777777777777777777777"); // ull max
5666ec465abSMichael Jones 
567b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%to", ~ptrdiff_t(0));
5686ec465abSMichael Jones   if (sizeof(ptrdiff_t) == 8) {
569*9c868195SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1777777777777777777777");
5706ec465abSMichael Jones   } else if (sizeof(ptrdiff_t) == 4) {
571*9c868195SMichael Jones     ASSERT_STREQ_LEN(written, buff, "37777777777");
5726ec465abSMichael Jones   }
5736ec465abSMichael Jones 
5746ec465abSMichael Jones   // Min Width Tests.
5756ec465abSMichael Jones 
576b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%4o", 0701);
577*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, " 701");
5786ec465abSMichael Jones 
579b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%2o", 0107);
580*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "107");
5816ec465abSMichael Jones 
5826ec465abSMichael Jones   // Precision Tests.
5836ec465abSMichael Jones 
584b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%o", 0);
585*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0");
5866ec465abSMichael Jones 
587b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.0o", 0);
588*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "");
5896ec465abSMichael Jones 
590b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.5o", 0153);
591*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "00153");
5926ec465abSMichael Jones 
593b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.2o", 0135);
594*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "135");
5956ec465abSMichael Jones 
5966ec465abSMichael Jones   // Flag Tests.
5976ec465abSMichael Jones 
598b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-5o", 0246);
599*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "246  ");
6006ec465abSMichael Jones 
601b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%#o", 0234);
602*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0234");
6036ec465abSMichael Jones 
6046e863c40Smichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%#o", 0);
605*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0");
6066e863c40Smichaelrj-google 
607b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%05o", 0470);
608*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "00470");
6096ec465abSMichael Jones 
610b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%0#6o", 0753);
611*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "000753");
6126ec465abSMichael Jones 
613b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-#6o", 0642);
614*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0642  ");
6156ec465abSMichael Jones 
6166ec465abSMichael Jones   // Combined Tests.
6176ec465abSMichael Jones 
618b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%#-07o", 0703);
619*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0703   ");
6206ec465abSMichael Jones 
6216e863c40Smichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%#.o", 0);
622*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0");
6236e863c40Smichaelrj-google 
624b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%7.5o", 0314);
625*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "  00314");
6266ec465abSMichael Jones 
627b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%#9.5o", 0234);
628*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "    00234");
6296ec465abSMichael Jones 
630b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-7.5o", 0260);
631*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "00260  ");
6326ec465abSMichael Jones 
633b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%5.4o", 010000);
634*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "10000");
6356ec465abSMichael Jones 
6366ec465abSMichael Jones   // Multiple Conversion Tests.
6376ec465abSMichael Jones 
638b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%10o %-#10o", 0456, 0123);
639*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "       456 0123      ");
6406ec465abSMichael Jones 
641b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-5.4o%#.4o", 075, 025);
642*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0075 0025");
6436ec465abSMichael Jones 
644b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%04hho %#.5llo %-6.3zo", 256 + 077,
6456ec465abSMichael Jones                                     01000000000000ll, size_t(2));
646*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0077 01000000000000 002   ");
6476ec465abSMichael Jones }
6486ec465abSMichael Jones 
649c3228714SGuillaume Chatelet #ifndef LIBC_COPT_PRINTF_DISABLE_FLOAT
6503b3b816fSMichael Jones 
651cab8c876Slntue TEST(LlvmLibcSPrintfTest, FloatHexExpConv) {
652cab8c876Slntue   char buff[128];
653cab8c876Slntue   int written;
654cab8c876Slntue 
655055be3c3STue Ly   ForceRoundingMode r(RoundingMode::Nearest);
6566b02d2f8SGuillaume Chatelet   double inf = LIBC_NAMESPACE::fputil::FPBits<double>::inf().get_val();
657ace383dfSGuillaume Chatelet   double nan = LIBC_NAMESPACE::fputil::FPBits<double>::quiet_nan().get_val();
658b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%a", 1.0);
659f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1p+0");
660f9f8693bSMichael Jones 
661b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%A", -1.0);
662f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "-0X1P+0");
663f9f8693bSMichael Jones 
664b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%a", -0x1.abcdef12345p0);
665f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "-0x1.abcdef12345p+0");
666f9f8693bSMichael Jones 
667b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%A", 0x1.abcdef12345p0);
668f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0X1.ABCDEF12345P+0");
669f9f8693bSMichael Jones 
670b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%a", 0.0);
671f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0p+0");
672f9f8693bSMichael Jones 
673b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%a", 1.0e100);
674f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.249ad2594c37dp+332");
675f9f8693bSMichael Jones 
676b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%a", 0.1);
677f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.999999999999ap-4");
678f9f8693bSMichael Jones 
679f9f8693bSMichael Jones   // Subnormal Tests.
680f9f8693bSMichael Jones 
681b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%a", 0x1.0p-1027);
682f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0.08p-1022");
683f9f8693bSMichael Jones 
684b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%a", 0x1.0p-1025);
685f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0.2p-1022");
686f9f8693bSMichael Jones 
687b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%a", 0x1.0p-1023);
688f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0.8p-1022");
689f9f8693bSMichael Jones 
690b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%a", 0x1.0p-1022);
691f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1p-1022");
692f9f8693bSMichael Jones 
693b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%a", 0x1.0p-1074);
694f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0.0000000000001p-1022");
695f9f8693bSMichael Jones 
696f9f8693bSMichael Jones   // Inf/Nan Tests.
697f9f8693bSMichael Jones 
698b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%a", inf);
699f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "inf");
700f9f8693bSMichael Jones 
701b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%A", -inf);
702f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "-INF");
703f9f8693bSMichael Jones 
704b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%a", nan);
705f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "nan");
706f9f8693bSMichael Jones 
707b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%A", -nan);
708f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "-NAN");
709f9f8693bSMichael Jones 
710f9f8693bSMichael Jones   // Length Modifier Tests.
711f9f8693bSMichael Jones 
712b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%La", 0.1L);
713f7d4236aSGuillaume Chatelet #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80)
714f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0xc.ccccccccccccccdp-7");
715f7d4236aSGuillaume Chatelet #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64)
716f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.999999999999ap-4");
717f7d4236aSGuillaume Chatelet #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128)
718f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.999999999999999999999999999ap-4");
719f9f8693bSMichael Jones #endif
720f9f8693bSMichael Jones 
721b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%La", 1.0e1000L);
722f7d4236aSGuillaume Chatelet #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80)
723f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0xf.38db1f9dd3dac05p+3318");
724f7d4236aSGuillaume Chatelet #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64)
725f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "inf");
726f7d4236aSGuillaume Chatelet #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128)
727f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.e71b63f3ba7b580af1a52d2a7379p+3321");
728f9f8693bSMichael Jones #endif
729f9f8693bSMichael Jones 
730b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%La", 1.0e-1000L);
731f7d4236aSGuillaume Chatelet #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80)
732f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x8.68a9188a89e1467p-3325");
733f7d4236aSGuillaume Chatelet #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64)
734f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0p+0");
735f7d4236aSGuillaume Chatelet #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128)
736f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.0d152311513c28ce202627c06ec2p-3322");
737f9f8693bSMichael Jones #endif
738f9f8693bSMichael Jones 
739f9f8693bSMichael Jones   // Min Width Tests.
740f9f8693bSMichael Jones 
741b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%15a", 1.0);
742f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "         0x1p+0");
743f9f8693bSMichael Jones 
744b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%15a", -1.0);
745f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "        -0x1p+0");
746f9f8693bSMichael Jones 
747b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%15a", 1.0e10);
748f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, " 0x1.2a05f2p+33");
749f9f8693bSMichael Jones 
750b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%15a", -1.0e10);
751f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "-0x1.2a05f2p+33");
752f9f8693bSMichael Jones 
753b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%10a", 1.0e10);
754f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.2a05f2p+33");
755f9f8693bSMichael Jones 
756b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%5a", inf);
757f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "  inf");
758f9f8693bSMichael Jones 
759b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%5a", -nan);
760f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, " -nan");
761f9f8693bSMichael Jones 
762f9f8693bSMichael Jones   // Precision Tests.
763f9f8693bSMichael Jones 
764b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 1.0);
765f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.0p+0");
766f9f8693bSMichael Jones 
767b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0.0);
768f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0.0p+0");
769f9f8693bSMichael Jones 
770b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0.1);
771f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.ap-4");
772f9f8693bSMichael Jones 
773b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.0fp0);
774f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.1p+0");
775f9f8693bSMichael Jones 
776b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.07p0);
777f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.0p+0");
778f9f8693bSMichael Jones 
779b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.08p0);
780f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.0p+0");
781f9f8693bSMichael Jones 
782b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.18p0);
783f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.2p+0");
784f9f8693bSMichael Jones 
785b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.ffp0);
786f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x2.0p+0");
787f9f8693bSMichael Jones 
788b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.5a", 1.25);
789f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.40000p+0");
790f9f8693bSMichael Jones 
791b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.0a", 1.25);
792f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1p+0");
793f9f8693bSMichael Jones 
794b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.0a", 1.75);
795f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x2p+0");
796f9f8693bSMichael Jones 
797b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.0p-1023);
798f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0.8p-1022");
799f9f8693bSMichael Jones 
800b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.8p-1023);
801f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0.cp-1022");
802f9f8693bSMichael Jones 
803b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.0p-1024);
804f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0.4p-1022");
805f9f8693bSMichael Jones 
806b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.0a", 0x1.0p-1023);
807f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0p-1022");
808f9f8693bSMichael Jones 
809b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.0a", 0x1.8p-1023);
810f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1p-1022");
811f9f8693bSMichael Jones 
812b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.0a", 0x1.0p-1024);
813f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0p-1022");
814f9f8693bSMichael Jones 
815b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.2a", 0x1.0p-1027);
816f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0.08p-1022");
817f9f8693bSMichael Jones 
818b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.0p-1027);
819f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0.0p-1022");
820f9f8693bSMichael Jones 
821b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.5a", 0.0);
822f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0.00000p+0");
823f9f8693bSMichael Jones 
824b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.5a", 0x1.008p0);
825f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.00800p+0");
826f9f8693bSMichael Jones 
827b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.5a", 0x1.008p10);
828f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.00800p+10");
829f9f8693bSMichael Jones 
830b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.5a", nan);
831f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "nan");
832f9f8693bSMichael Jones 
8338a47ad4bSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%La", 0.0L);
8348a47ad4bSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "0x0p+0");
8358a47ad4bSmichaelrj-google 
836b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1La", 0.1L);
837f7d4236aSGuillaume Chatelet #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80)
838f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0xc.dp-7");
839f7d4236aSGuillaume Chatelet #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64)
840f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.ap-4");
841f7d4236aSGuillaume Chatelet #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128)
842f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.ap-4");
843f9f8693bSMichael Jones #endif
844f9f8693bSMichael Jones 
845b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1La", 0xf.fffffffffffffffp16380L);
846f7d4236aSGuillaume Chatelet #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80)
847f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.0p+16384");
848f7d4236aSGuillaume Chatelet #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64)
849f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "inf");
850f7d4236aSGuillaume Chatelet #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128)
851f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x2.0p+16383");
852f9f8693bSMichael Jones #endif
853f9f8693bSMichael Jones 
8543b3b816fSMichael Jones   // Rounding Mode Tests.
8553b3b816fSMichael Jones 
856055be3c3STue Ly   if (ForceRoundingMode r(RoundingMode::Nearest); r.success) {
857b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.08p0);
8583b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.0p+0");
8593b3b816fSMichael Jones 
860b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.18p0);
8613b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.2p+0");
8623b3b816fSMichael Jones 
863b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.04p0);
8643b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.0p+0");
8653b3b816fSMichael Jones 
866b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.14p0);
8673b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.1p+0");
8683b3b816fSMichael Jones 
869b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.08p0);
8703b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.0p+0");
8713b3b816fSMichael Jones 
872b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.18p0);
8733b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.2p+0");
8743b3b816fSMichael Jones 
875b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.04p0);
8763b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.0p+0");
8773b3b816fSMichael Jones 
878b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.14p0);
8793b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0");
8803b3b816fSMichael Jones   }
8813b3b816fSMichael Jones 
882055be3c3STue Ly   if (ForceRoundingMode r(RoundingMode::Upward); r.success) {
883b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.08p0);
8843b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.1p+0");
8853b3b816fSMichael Jones 
886b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.18p0);
8873b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.2p+0");
8883b3b816fSMichael Jones 
889b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.04p0);
8903b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.1p+0");
8913b3b816fSMichael Jones 
892b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.14p0);
8933b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.2p+0");
8943b3b816fSMichael Jones 
895b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.08p0);
8963b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.0p+0");
8973b3b816fSMichael Jones 
898b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.18p0);
8993b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0");
9003b3b816fSMichael Jones 
901b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.04p0);
9023b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.0p+0");
9033b3b816fSMichael Jones 
904b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.14p0);
9053b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0");
9063b3b816fSMichael Jones   }
9073b3b816fSMichael Jones 
908055be3c3STue Ly   if (ForceRoundingMode r(RoundingMode::Downward); r.success) {
909b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.08p0);
9103b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.0p+0");
9113b3b816fSMichael Jones 
912b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.18p0);
9133b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.1p+0");
9143b3b816fSMichael Jones 
915b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.04p0);
9163b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.0p+0");
9173b3b816fSMichael Jones 
918b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.14p0);
9193b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.1p+0");
9203b3b816fSMichael Jones 
921b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.08p0);
9223b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0");
9233b3b816fSMichael Jones 
924b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.18p0);
9253b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.2p+0");
9263b3b816fSMichael Jones 
927b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.04p0);
9283b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0");
9293b3b816fSMichael Jones 
930b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.14p0);
9313b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.2p+0");
9323b3b816fSMichael Jones   }
9333b3b816fSMichael Jones 
934055be3c3STue Ly   if (ForceRoundingMode r(RoundingMode::TowardZero); r.success) {
935b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.08p0);
9363b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.0p+0");
9373b3b816fSMichael Jones 
938b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.18p0);
9393b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.1p+0");
9403b3b816fSMichael Jones 
941b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.04p0);
9423b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.0p+0");
9433b3b816fSMichael Jones 
944b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", 0x1.14p0);
9453b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.1p+0");
9463b3b816fSMichael Jones 
947b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.08p0);
9483b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.0p+0");
9493b3b816fSMichael Jones 
950b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.18p0);
9513b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0");
9523b3b816fSMichael Jones 
953b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.04p0);
9543b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.0p+0");
9553b3b816fSMichael Jones 
956b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1a", -0x1.14p0);
9573b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0");
9583b3b816fSMichael Jones   }
9593b3b816fSMichael Jones 
960f9f8693bSMichael Jones   // Flag Tests.
961f9f8693bSMichael Jones 
962b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%+a", nan);
963f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "+nan");
964f9f8693bSMichael Jones 
965b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "% A", inf);
966f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, " INF");
967f9f8693bSMichael Jones 
968b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-5a", inf);
969f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "inf  ");
970f9f8693bSMichael Jones 
971b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%+-5A", nan);
972f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "+NAN ");
973f9f8693bSMichael Jones 
974b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%+a", 1.0);
975f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "+0x1p+0");
976f9f8693bSMichael Jones 
977b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "% a", 0.0);
978f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, " 0x0p+0");
979f9f8693bSMichael Jones 
980b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-10a", 1.5);
981f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.8p+0  ");
982f9f8693bSMichael Jones 
983b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%#a", 1.0);
984f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.p+0");
985f9f8693bSMichael Jones 
986b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%#.0a", 1.5);
987f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x2.p+0");
988f9f8693bSMichael Jones 
989b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%010a", 1.5);
990f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x001.8p+0");
991f9f8693bSMichael Jones 
992b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%+- #0a", 0.0);
993f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "+0x0.p+0");
994f9f8693bSMichael Jones 
995f9f8693bSMichael Jones   // Combined Tests.
996f9f8693bSMichael Jones 
997b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%12.3a %-12.3A", 0.1, 256.0);
998f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "  0x1.99ap-4 0X1.000P+8  ");
999f9f8693bSMichael Jones 
1000b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%+-#12.3a % 012.3a", 0.1256, 1256.0);
1001f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "+0x1.014p-3   0x1.3a0p+10");
100289cdaa8dSMichael Jones 
100389cdaa8dSMichael Jones   // These tests check that the padding is properly calculated based on the
100489cdaa8dSMichael Jones   // min_width field. Specifically, they check that the extra zeroes added by
100589cdaa8dSMichael Jones   // the high precision are accounted for correctly.
1006b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%50.50a", 0x1.0p0);
100789cdaa8dSMichael Jones   ASSERT_STREQ_LEN(written, buff,
100889cdaa8dSMichael Jones                    "0x1.00000000000000000000000000000000000000000000000000p+0");
100989cdaa8dSMichael Jones 
101089cdaa8dSMichael Jones   // The difference with this test is that the formatted number is exactly 57
101189cdaa8dSMichael Jones   // characters, so padding to 58 adds a space.
1012b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%58.50a", 0x1.0p0);
101389cdaa8dSMichael Jones   ASSERT_STREQ_LEN(
101489cdaa8dSMichael Jones       written, buff,
101589cdaa8dSMichael Jones       " 0x1.00000000000000000000000000000000000000000000000000p+0");
1016f9f8693bSMichael Jones }
101707c0a41bSMichael Jones 
1018cab8c876Slntue TEST(LlvmLibcSPrintfTest, FloatDecimalConv) {
1019*9c868195SMichael Jones   char buff[1500];
1020cab8c876Slntue   int written;
1021cab8c876Slntue 
1022055be3c3STue Ly   ForceRoundingMode r(RoundingMode::Nearest);
10236b02d2f8SGuillaume Chatelet   double inf = LIBC_NAMESPACE::fputil::FPBits<double>::inf().get_val();
1024ace383dfSGuillaume Chatelet   double nan = LIBC_NAMESPACE::fputil::FPBits<double>::quiet_nan().get_val();
10256b02d2f8SGuillaume Chatelet   long double ld_inf =
10266b02d2f8SGuillaume Chatelet       LIBC_NAMESPACE::fputil::FPBits<long double>::inf().get_val();
1027eb56bc2bSGuillaume Chatelet   long double ld_nan =
1028ace383dfSGuillaume Chatelet       LIBC_NAMESPACE::fputil::FPBits<long double>::quiet_nan().get_val();
102907c0a41bSMichael Jones 
1030b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%f", 1.0);
103107c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.000000");
103207c0a41bSMichael Jones 
1033b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%F", -1.0);
103407c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "-1.000000");
103507c0a41bSMichael Jones 
1036b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%f", -1.234567);
103707c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "-1.234567");
103807c0a41bSMichael Jones 
1039b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%f", 0.0);
104007c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0.000000");
104107c0a41bSMichael Jones 
1042b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%f", 1.5);
104307c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.500000");
104407c0a41bSMichael Jones 
1045*9c868195SMichael Jones #ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION
1046b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%f", 1e300);
104707c0a41bSMichael Jones   ASSERT_STREQ_LEN(
104807c0a41bSMichael Jones       written, buff,
104907c0a41bSMichael Jones       "100000000000000005250476025520442024870446858110815915491585411551180245"
105007c0a41bSMichael Jones       "798890819578637137508044786404370444383288387817694252323536043057564479"
105107c0a41bSMichael Jones       "218478670698284838720092657580373783023379478809005936895323497079994508"
105207c0a41bSMichael Jones       "111903896764088007465274278014249457925878882005684283811566947219638686"
105307c0a41bSMichael Jones       "5459400540160.000000");
1054*9c868195SMichael Jones #endif // LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION
105507c0a41bSMichael Jones 
1056b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%f", 0.1);
105707c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0.100000");
105807c0a41bSMichael Jones 
1059b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%f", 1234567890123456789.0);
106007c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "1234567890123456768.000000");
106107c0a41bSMichael Jones 
1062b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%f", 9999999999999.99);
106307c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "9999999999999.990234");
106407c0a41bSMichael Jones 
106507c0a41bSMichael Jones   // Simple Subnormal Tests.
106607c0a41bSMichael Jones 
1067b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%f", 0x1.0p-1027);
106807c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0.000000");
106907c0a41bSMichael Jones 
1070b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%f", 0x1.0p-1074);
107107c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0.000000");
107207c0a41bSMichael Jones 
107307c0a41bSMichael Jones   // Inf/Nan Tests.
107407c0a41bSMichael Jones 
1075b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%f", inf);
107607c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "inf");
107707c0a41bSMichael Jones 
1078b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%F", -inf);
107907c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "-INF");
108007c0a41bSMichael Jones 
1081b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%f", nan);
108207c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "nan");
108307c0a41bSMichael Jones 
1084b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%F", -nan);
108507c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "-NAN");
108607c0a41bSMichael Jones 
1087b4e55299Smichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%Lf", ld_inf);
1088b4e55299Smichaelrj-google   ASSERT_STREQ_LEN(written, buff, "inf");
1089b4e55299Smichaelrj-google 
1090b4e55299Smichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%LF", -ld_inf);
1091b4e55299Smichaelrj-google   ASSERT_STREQ_LEN(written, buff, "-INF");
1092b4e55299Smichaelrj-google 
1093b4e55299Smichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%Lf", ld_nan);
1094b4e55299Smichaelrj-google   ASSERT_STREQ_LEN(written, buff, "nan");
1095b4e55299Smichaelrj-google 
10962282af26Smichaelrj-google // Some float128 systems (specifically the ones used for aarch64 buildbots)
10972282af26Smichaelrj-google // don't respect signs for long double NaNs.
1098f7d4236aSGuillaume Chatelet #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80) ||                          \
1099f7d4236aSGuillaume Chatelet     defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64)
1100b4e55299Smichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%LF", -ld_nan);
1101b4e55299Smichaelrj-google   ASSERT_STREQ_LEN(written, buff, "-NAN");
11022282af26Smichaelrj-google #endif
1103b4e55299Smichaelrj-google 
110407c0a41bSMichael Jones   // Min Width Tests.
110507c0a41bSMichael Jones 
1106b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%15f", 1.0);
110707c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "       1.000000");
110807c0a41bSMichael Jones 
1109b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%15f", -1.0);
111007c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "      -1.000000");
111107c0a41bSMichael Jones 
1112b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%15f", 1.0e5);
111307c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "  100000.000000");
111407c0a41bSMichael Jones 
1115b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%15f", -1.0e5);
111607c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, " -100000.000000");
111707c0a41bSMichael Jones 
1118b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%10f", 1.0e5);
111907c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "100000.000000");
112007c0a41bSMichael Jones 
112107c0a41bSMichael Jones   // Precision Tests.
112207c0a41bSMichael Jones 
1123b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.0);
112407c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.0");
112507c0a41bSMichael Jones 
1126b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 0.0);
112707c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0.0");
112807c0a41bSMichael Jones 
1129b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.0f", 0.0);
113007c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0");
113107c0a41bSMichael Jones 
1132b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 0.1);
113307c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0.1");
113407c0a41bSMichael Jones 
1135b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.09);
113607c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.1");
113707c0a41bSMichael Jones 
1138b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.04);
113907c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.0");
114007c0a41bSMichael Jones 
1141b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.19);
114207c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.2");
114307c0a41bSMichael Jones 
1144b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.99);
114507c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "2.0");
114607c0a41bSMichael Jones 
1147b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 9.99);
114807c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "10.0");
114907c0a41bSMichael Jones 
1150b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.2f", 9999999999999.99);
115107c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "9999999999999.99");
115207c0a41bSMichael Jones 
1153b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 9999999999999.99);
115407c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "10000000000000.0");
115507c0a41bSMichael Jones 
1156b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.5f", 1.25);
115707c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.25000");
115807c0a41bSMichael Jones 
1159b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.0f", 1.25);
116007c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "1");
116107c0a41bSMichael Jones 
1162b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.0f", 1.75);
116307c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "2");
116407c0a41bSMichael Jones 
1165b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.20f", 1.234e-10);
116607c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0.00000000012340000000");
116707c0a41bSMichael Jones 
1168b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.2f", -9.99);
116907c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "-9.99");
117007c0a41bSMichael Jones 
1171b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -9.99);
117207c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "-10.0");
117307c0a41bSMichael Jones 
1174b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.5f", 0.0);
117507c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0.00000");
117607c0a41bSMichael Jones 
1177b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.5f", 1.008);
117807c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.00800");
117907c0a41bSMichael Jones 
1180b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.5f", 1.008e3);
118107c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "1008.00000");
118207c0a41bSMichael Jones 
1183b39f1e5cSMichael Jones   // Found with the help of Fred Tydeman's tbin2dec test.
1184b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 0x1.1000000000006p+3);
1185b39f1e5cSMichael Jones   ASSERT_STREQ_LEN(written, buff, "8.5");
1186b39f1e5cSMichael Jones 
1187b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.0f", 0x1.1000000000006p+3);
1188b39f1e5cSMichael Jones   ASSERT_STREQ_LEN(written, buff, "9");
1189b39f1e5cSMichael Jones 
1190b02e73a3SMichael Jones   // Most of these tests are checking rounding behavior when the precision is
1191b02e73a3SMichael Jones   // set. As an example, %.9f has a precision of 9, meaning it should be rounded
1192b02e73a3SMichael Jones   // to 9 digits after the decimal point. In this case, that means that it
1193b02e73a3SMichael Jones   // should be rounded up. Many of these tests have precisions divisible by 9
1194b02e73a3SMichael Jones   // since when printing the floating point numbers are broken up into "blocks"
1195b02e73a3SMichael Jones   // of 9 digits. They often also have a 5 after the end of what's printed,
1196b02e73a3SMichael Jones   // since in round to nearest mode, that requires checking additional digits.
1197b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.9f", 1.9999999999999514);
1198b02e73a3SMichael Jones   ASSERT_STREQ_LEN(written, buff, "2.000000000");
1199b02e73a3SMichael Jones 
1200*9c868195SMichael Jones #ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION
1201b02e73a3SMichael Jones   // The number continues after the literal because floating point numbers can't
1202b02e73a3SMichael Jones   // represent every value. The printed value is the closest value a double can
1203b02e73a3SMichael Jones   // represent, rounded to the requested precision.
1204b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.238f", 1.131959884853339E-72);
1205b02e73a3SMichael Jones   ASSERT_STREQ_LEN(
1206b02e73a3SMichael Jones       written, buff,
1207b02e73a3SMichael Jones       "0."
1208b02e73a3SMichael Jones       "000000000000000000000000000000000000000000000000000000000000000000000001"
1209b02e73a3SMichael Jones       "131959884853339045938639911360973972585316399767392273697826861241937664"
1210b02e73a3SMichael Jones       "824105639342441431495119762431744054912109728706985341609159156917030486"
1211b02e73a3SMichael Jones       "5110665559768676757812");
1212*9c868195SMichael Jones #endif
1213b02e73a3SMichael Jones 
1214b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.36f", 9.9e-77);
1215b02e73a3SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0.000000000000000000000000000000000000");
1216b02e73a3SMichael Jones 
1217*9c868195SMichael Jones #ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION
1218*9c868195SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%.1071f", 2.0226568751604562E-314);
1219b02e73a3SMichael Jones   ASSERT_STREQ_LEN(
1220*9c868195SMichael Jones       written, buff,
1221b02e73a3SMichael Jones       "0."
1222b02e73a3SMichael Jones       "000000000000000000000000000000000000000000000000000000000000000000000000"
1223b02e73a3SMichael Jones       "000000000000000000000000000000000000000000000000000000000000000000000000"
1224b02e73a3SMichael Jones       "000000000000000000000000000000000000000000000000000000000000000000000000"
1225b02e73a3SMichael Jones       "000000000000000000000000000000000000000000000000000000000000000000000000"
1226b02e73a3SMichael Jones       "000000000000000000000000020226568751604561683387695750739190248658016786"
1227b02e73a3SMichael Jones       "876938365740768295004457513021760887468117675879956193821375945376632621"
1228b02e73a3SMichael Jones       "367998639317487303530427946024002091961988296562516210434394107910027236"
1229b02e73a3SMichael Jones       "308233439098296717697919471698168200340836487924061502604112643734560622"
1230b02e73a3SMichael Jones       "258525943451473162532620033398739382796482175564084902819878893430369431"
1231b02e73a3SMichael Jones       "907237673154867595954110791891883281880339550955455702452422857027182100"
1232b02e73a3SMichael Jones       "606009588295886640782228837851739241290179512817803196347460636150182981"
1233b02e73a3SMichael Jones       "085084829941917048152725177119574542042352896161225179181967347829576272"
1234b02e73a3SMichael Jones       "242480201291872969114441104973910102402751449901108484914924879541248714"
1235b02e73a3SMichael Jones       "939096548775588293353689592872854495101242645279589976452453829724479805"
1236b02e73a3SMichael Jones       "750016448075109469332839157162950982637994457036256790161132812");
1237*9c868195SMichael Jones #endif
1238b02e73a3SMichael Jones 
1239b02e73a3SMichael Jones   // If no precision is specified it defaults to 6 for %f.
1240b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%f", 2325885.4901960781);
1241b02e73a3SMichael Jones   ASSERT_STREQ_LEN(written, buff, "2325885.490196");
1242b02e73a3SMichael Jones 
124307c0a41bSMichael Jones   // Subnormal Precision Tests
124407c0a41bSMichael Jones 
1245b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.310f", 0x1.0p-1022);
124607c0a41bSMichael Jones   ASSERT_STREQ_LEN(
124707c0a41bSMichael Jones       written, buff,
124807c0a41bSMichael Jones       "0."
124907c0a41bSMichael Jones       "000000000000000000000000000000000000000000000000000000000000000000000000"
125007c0a41bSMichael Jones       "000000000000000000000000000000000000000000000000000000000000000000000000"
125107c0a41bSMichael Jones       "000000000000000000000000000000000000000000000000000000000000000000000000"
125207c0a41bSMichael Jones       "000000000000000000000000000000000000000000000000000000000000000000000000"
125307c0a41bSMichael Jones       "0000000000000000000223");
125407c0a41bSMichael Jones 
1255b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.310f", 0x1.0p-1023);
125607c0a41bSMichael Jones   ASSERT_STREQ_LEN(
125707c0a41bSMichael Jones       written, buff,
125807c0a41bSMichael Jones       "0."
125907c0a41bSMichael Jones       "000000000000000000000000000000000000000000000000000000000000000000000000"
126007c0a41bSMichael Jones       "000000000000000000000000000000000000000000000000000000000000000000000000"
126107c0a41bSMichael Jones       "000000000000000000000000000000000000000000000000000000000000000000000000"
126207c0a41bSMichael Jones       "000000000000000000000000000000000000000000000000000000000000000000000000"
126307c0a41bSMichael Jones       "0000000000000000000111");
126407c0a41bSMichael Jones 
1265b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.315f", 9.99999e-310);
126607c0a41bSMichael Jones   ASSERT_STREQ_LEN(
126707c0a41bSMichael Jones       written, buff,
126807c0a41bSMichael Jones       "0."
126907c0a41bSMichael Jones       "000000000000000000000000000000000000000000000000000000000000000000000000"
127007c0a41bSMichael Jones       "000000000000000000000000000000000000000000000000000000000000000000000000"
127107c0a41bSMichael Jones       "000000000000000000000000000000000000000000000000000000000000000000000000"
127207c0a41bSMichael Jones       "000000000000000000000000000000000000000000000000000000000000000000000000"
127307c0a41bSMichael Jones       "000000000000000000000999999");
127407c0a41bSMichael Jones 
1275b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.314f", 9.99999e-310);
127607c0a41bSMichael Jones   ASSERT_STREQ_LEN(
127707c0a41bSMichael Jones       written, buff,
127807c0a41bSMichael Jones       "0."
127907c0a41bSMichael Jones       "000000000000000000000000000000000000000000000000000000000000000000000000"
128007c0a41bSMichael Jones       "000000000000000000000000000000000000000000000000000000000000000000000000"
128107c0a41bSMichael Jones       "000000000000000000000000000000000000000000000000000000000000000000000000"
128207c0a41bSMichael Jones       "000000000000000000000000000000000000000000000000000000000000000000000000"
128307c0a41bSMichael Jones       "00000000000000000000100000");
128407c0a41bSMichael Jones 
1285b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.330f", 0x1.0p-1074);
128607c0a41bSMichael Jones   ASSERT_STREQ_LEN(
128707c0a41bSMichael Jones       written, buff,
128807c0a41bSMichael Jones       "0."
128907c0a41bSMichael Jones       "000000000000000000000000000000000000000000000000000000000000000000000000"
129007c0a41bSMichael Jones       "000000000000000000000000000000000000000000000000000000000000000000000000"
129107c0a41bSMichael Jones       "000000000000000000000000000000000000000000000000000000000000000000000000"
129207c0a41bSMichael Jones       "000000000000000000000000000000000000000000000000000000000000000000000000"
129307c0a41bSMichael Jones       "000000000000000000000000000000000004940656");
129407c0a41bSMichael Jones 
129507c0a41bSMichael Jones   // Rounding Mode Tests.
129607c0a41bSMichael Jones 
1297055be3c3STue Ly   if (ForceRoundingMode r(RoundingMode::Nearest); r.success) {
1298b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.75);
129907c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.8");
130007c0a41bSMichael Jones 
1301b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.25);
130207c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.2");
130307c0a41bSMichael Jones 
1304b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.125);
130507c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.1");
130607c0a41bSMichael Jones 
1307b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.625);
130807c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.6");
130907c0a41bSMichael Jones 
1310b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.375);
131107c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.4");
131207c0a41bSMichael Jones 
1313b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.875);
131407c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.9");
131507c0a41bSMichael Jones 
1316b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.75);
131707c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.8");
131807c0a41bSMichael Jones 
1319b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.25);
132007c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.2");
132107c0a41bSMichael Jones 
1322b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.125);
132307c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.1");
132407c0a41bSMichael Jones 
1325b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.625);
132607c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.6");
132707c0a41bSMichael Jones 
1328b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.375);
132907c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.4");
133007c0a41bSMichael Jones 
1331b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.875);
133207c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.9");
133307c0a41bSMichael Jones   }
133407c0a41bSMichael Jones 
1335055be3c3STue Ly   if (ForceRoundingMode r(RoundingMode::Upward); r.success) {
1336b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.75);
133707c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.8");
133807c0a41bSMichael Jones 
1339b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.25);
134007c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.3");
134107c0a41bSMichael Jones 
1342b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.125);
134307c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.2");
134407c0a41bSMichael Jones 
1345b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.625);
134607c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.7");
134707c0a41bSMichael Jones 
1348b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.375);
134907c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.4");
135007c0a41bSMichael Jones 
1351b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.875);
135207c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.9");
135307c0a41bSMichael Jones 
1354b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.75);
135507c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.7");
135607c0a41bSMichael Jones 
1357b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.25);
135807c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.2");
135907c0a41bSMichael Jones 
1360b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.125);
136107c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.1");
136207c0a41bSMichael Jones 
1363b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.625);
136407c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.6");
136507c0a41bSMichael Jones 
1366b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.375);
136707c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.3");
136807c0a41bSMichael Jones 
1369b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.875);
137007c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.8");
137107c0a41bSMichael Jones   }
137207c0a41bSMichael Jones 
1373055be3c3STue Ly   if (ForceRoundingMode r(RoundingMode::Downward); r.success) {
1374b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.75);
137507c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.7");
137607c0a41bSMichael Jones 
1377b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.25);
137807c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.2");
137907c0a41bSMichael Jones 
1380b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.125);
138107c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.1");
138207c0a41bSMichael Jones 
1383b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.625);
138407c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.6");
138507c0a41bSMichael Jones 
1386b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.375);
138707c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.3");
138807c0a41bSMichael Jones 
1389b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.875);
139007c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.8");
139107c0a41bSMichael Jones 
1392b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.75);
139307c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.8");
139407c0a41bSMichael Jones 
1395b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.25);
139607c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.3");
139707c0a41bSMichael Jones 
1398b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.125);
139907c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.2");
140007c0a41bSMichael Jones 
1401b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.625);
140207c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.7");
140307c0a41bSMichael Jones 
1404b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.375);
140507c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.4");
140607c0a41bSMichael Jones 
1407b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.875);
140807c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.9");
140907c0a41bSMichael Jones   }
141007c0a41bSMichael Jones 
1411055be3c3STue Ly   if (ForceRoundingMode r(RoundingMode::TowardZero); r.success) {
1412b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.75);
141307c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.7");
141407c0a41bSMichael Jones 
1415b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.25);
141607c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.2");
141707c0a41bSMichael Jones 
1418b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.125);
141907c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.1");
142007c0a41bSMichael Jones 
1421b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.625);
142207c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.6");
142307c0a41bSMichael Jones 
1424b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.375);
142507c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.3");
142607c0a41bSMichael Jones 
1427b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", 1.875);
142807c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.8");
142907c0a41bSMichael Jones 
1430b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.75);
143107c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.7");
143207c0a41bSMichael Jones 
1433b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.25);
143407c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.2");
143507c0a41bSMichael Jones 
1436b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.125);
143707c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.1");
143807c0a41bSMichael Jones 
1439b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.625);
144007c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.6");
144107c0a41bSMichael Jones 
1442b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.375);
144307c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.3");
144407c0a41bSMichael Jones 
1445b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1f", -1.875);
144607c0a41bSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.8");
144707c0a41bSMichael Jones   }
144807c0a41bSMichael Jones 
144907c0a41bSMichael Jones   // Flag Tests.
1450b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%+f", 1.0);
145107c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "+1.000000");
145207c0a41bSMichael Jones 
1453b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%+f", -1.0);
145407c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "-1.000000");
145507c0a41bSMichael Jones 
1456b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "% f", 1.0);
145707c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, " 1.000000");
145807c0a41bSMichael Jones 
1459b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "% f", -1.0);
146007c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "-1.000000");
146107c0a41bSMichael Jones 
1462b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-10f", 1.5);
146307c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.500000  ");
146407c0a41bSMichael Jones 
1465b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%#.f", 1.0);
146607c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.");
146707c0a41bSMichael Jones 
1468b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%#.0f", 1.5);
146907c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "2.");
147007c0a41bSMichael Jones 
1471b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%010f", 1.5);
147207c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "001.500000");
147307c0a41bSMichael Jones 
1474b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%010f", -1.5);
147507c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "-01.500000");
147607c0a41bSMichael Jones 
1477b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%+- #0f", 0.0);
147807c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "+0.000000");
147907c0a41bSMichael Jones 
148007c0a41bSMichael Jones   // Combined Tests.
148107c0a41bSMichael Jones 
1482b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%10.2f", 9.99);
148307c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "      9.99");
148407c0a41bSMichael Jones 
1485b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%5.1f", 9.99);
148607c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, " 10.0");
148707c0a41bSMichael Jones 
1488b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-10.2f", 9.99);
148907c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "9.99      ");
149007c0a41bSMichael Jones 
1491b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-5.1f", 9.99);
149207c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "10.0 ");
149307c0a41bSMichael Jones 
1494b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-5.1f", 1.0e-50);
149507c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0.0  ");
149607c0a41bSMichael Jones 
1497b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%30f", 1234567890123456789.0);
149807c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "    1234567890123456768.000000");
149907c0a41bSMichael Jones 
1500b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-30f", 1234567890123456789.0);
150107c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "1234567890123456768.000000    ");
150207c0a41bSMichael Jones 
1503b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%20.2f", 9999999999999.99);
150407c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "    9999999999999.99");
150507c0a41bSMichael Jones 
1506b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%20.1f", 9999999999999.99);
150707c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "    10000000000000.0");
150807c0a41bSMichael Jones 
1509b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%12.3f %-12.3f", 0.1, 256.0);
151007c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "       0.100 256.000     ");
151107c0a41bSMichael Jones 
1512b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%+-#12.3f % 012.3f", 0.1256, 1256.0);
151307c0a41bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "+0.126        0001256.000");
151407c0a41bSMichael Jones }
151551126518SMichael Jones 
1516a621198aSmichaelrj-google // The long double tests are separated so that their performance can be directly
1517a621198aSmichaelrj-google // measured.
1518cab8c876Slntue TEST(LlvmLibcSPrintfTest, FloatDecimalLongDoubleConv) {
1519cab8c876Slntue   char buff[1000];
1520cab8c876Slntue   int written;
1521cab8c876Slntue 
1522055be3c3STue Ly   ForceRoundingMode r(RoundingMode::Nearest);
152351126518SMichael Jones 
152451126518SMichael Jones   // Length Modifier Tests.
152551126518SMichael Jones 
1526f7d4236aSGuillaume Chatelet   // TODO(michaelrj): Add tests for LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64 and 128
1527f7d4236aSGuillaume Chatelet   // bit long double systems.
1528a621198aSmichaelrj-google   // TODO(michaelrj): Fix the tests to only depend on the digits the long double
1529a621198aSmichaelrj-google   // is accurate for.
1530a621198aSmichaelrj-google 
1531a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%Lf", 1.0L);
1532a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "1.000000");
1533a621198aSmichaelrj-google 
1534a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%.Lf", -2.5L);
1535a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "-2");
1536a621198aSmichaelrj-google 
1537f7d4236aSGuillaume Chatelet #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80)
1538cd06b9d9SMichael Jones 
1539*9c868195SMichael Jones #ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION
1540b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%Lf", 1e100L);
154151126518SMichael Jones   ASSERT_STREQ_LEN(written, buff,
154251126518SMichael Jones                    "99999999999999999996693535322073426194986990198284960792713"
154351126518SMichael Jones                    "91541752018669482644324418977840117055488.000000");
1544*9c868195SMichael Jones #endif
154551126518SMichael Jones 
1546a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%Lf", 0xd.96ed1192687859ap-24L);
1547a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "0.000001");
154851126518SMichael Jones 
1549a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%Lf", 10000000000000000.25L);
1550a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "10000000000000000.250000");
1551a621198aSmichaelrj-google 
1552*9c868195SMichael Jones #ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION
1553a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%.510Lf", 0x8p-503L);
1554a621198aSmichaelrj-google   ASSERT_STREQ_LEN(
1555a621198aSmichaelrj-google       written, buff,
1556a621198aSmichaelrj-google       "0."
1557a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1558a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1559a621198aSmichaelrj-google       "000000305493636349960468205197939321361769978940274057232666389361390928"
1560a621198aSmichaelrj-google       "129162652472045770185723510801522825687515269359046715531785342780428396"
1561a621198aSmichaelrj-google       "973513311420091788963072442053377285222203558881953188370081650866793017"
1562a621198aSmichaelrj-google       "948791366338993705251636497892270212003524508209121908744820211960149463"
1563a621198aSmichaelrj-google       "721109340307985507678283651836204093399373959982767701148986816406250000"
1564a621198aSmichaelrj-google       "000000");
1565*9c868195SMichael Jones #endif
1566a621198aSmichaelrj-google 
1567a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%.500Lf", -4327677766926336.0L);
1568a621198aSmichaelrj-google   ASSERT_STREQ_LEN(
1569a621198aSmichaelrj-google       written, buff,
1570a621198aSmichaelrj-google       "-4327677766926336."
1571a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1572a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1573a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1574a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1575a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1576a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1577a621198aSmichaelrj-google       "00000000000000000000000000000000000000000000000000000000000000000000");
1578a621198aSmichaelrj-google 
157988f0dc48SOverMighty   char big_buff[10000]; // Used for extremely wide numbers.
158088f0dc48SOverMighty 
1581*9c868195SMichael Jones #ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION
1582b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(big_buff, "%Lf", 1e1000L);
158351126518SMichael Jones   ASSERT_STREQ_LEN(
158451126518SMichael Jones       written, big_buff,
158551126518SMichael Jones       "999999999999999999973107317669562353428234857594552594925899449376328728"
158651126518SMichael Jones       "202461036775511405481186963193066642191664822065529414252060696836533522"
158751126518SMichael Jones       "387143501724276282079456797058697369889056407118642873669166717313763499"
158851126518SMichael Jones       "277025985141177344925615052465165938514140943010597323750202561187880136"
158951126518SMichael Jones       "174810574553749194614479541820148407958204853833697063267336294787191005"
159051126518SMichael Jones       "628217462261955103745349844675732989944229689277833828743730290177882029"
159151126518SMichael Jones       "042613704915899149603539993716885598351951895974316347947147507970269673"
159251126518SMichael Jones       "097709017164643598452451201499004104341931127294141495501309305995449742"
159351126518SMichael Jones       "273419524803597130450457553871345958049837885085168840317195672271085085"
159451126518SMichael Jones       "950520957945970913451088104971436093671776829538796532762184174216651692"
159551126518SMichael Jones       "640931965387852083906784898823494867055070322768919156031682291829761007"
159651126518SMichael Jones       "101483799978382119231551218582499361996919560548090784230386907125151658"
159751126518SMichael Jones       "086767207295524036170321059257942621398084478974000973622199163292708506"
159851126518SMichael Jones       "2431457550909271560663602154947063707982236377366647567795879936."
159951126518SMichael Jones       "000000");
160051126518SMichael Jones 
1601b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(big_buff, "%Lf", 1e4900L);
160251126518SMichael Jones   ASSERT_STREQ_LEN(
160351126518SMichael Jones       written, big_buff,
160451126518SMichael Jones       "100000000000000000002708312230690349833224052504078834346502930111959028"
160551126518SMichael Jones       "517260692666637048230414374897655201843766090626319971729765251179632020"
160651126518SMichael Jones       "313912652522792711197087872698264530532442630109549129842736280196919130"
160751126518SMichael Jones       "242615101228133188193853826983121366159061148351354364472807590931218045"
160851126518SMichael Jones       "387490935930967150336231085015126034696883068553581691802388371635128003"
160951126518SMichael Jones       "615577299166097675723780877126495909902479233742826339471026068806070433"
161051126518SMichael Jones       "075629449530819183550315434973800271862658869400009022028602967197463980"
161151126518SMichael Jones       "126881829804282202449930132940824361207087494829502385835258094836304011"
161251126518SMichael Jones       "876250359661206802659650567866176246063987902366800491980400341950657151"
161351126518SMichael Jones       "370854446585517805253310195469184699955519312761482572080479702840420595"
161451126518SMichael Jones       "377369017651259376039167277822106875560385309101650382998482652792335482"
161551126518SMichael Jones       "865443482342801545877390859444282105890147577937366066315975231014810320"
161651126518SMichael Jones       "888482059656248277607763361589359794524314002443575149260630989130103550"
161751126518SMichael Jones       "443177966380769341050735632338583912575890190136462629316287947355057647"
161851126518SMichael Jones       "111088565611192544631519843618778618820046304429723908484879583579178075"
161951126518SMichael Jones       "456701368334212923379389029311286386996015804122917416008806233549005183"
162051126518SMichael Jones       "152461084266176543129004016414959261473645240454289630182591200574019087"
162151126518SMichael Jones       "358223489767381636349719510715487188747217311279465814538495924567014916"
162251126518SMichael Jones       "238565628036285599497236493491668884212847699052761266207598941300449276"
162351126518SMichael Jones       "447201387520841811835583254242213093566548778954711633721122784159793843"
162451126518SMichael Jones       "766802019309395771984693609426401362800013936338891483689127845928572536"
162551126518SMichael Jones       "790651156184721483511507878883282891696900630100211914227950790472211403"
162651126518SMichael Jones       "392549466062537498185758854079775888444518306635752468713312357556380082"
162751126518SMichael Jones       "275500658967283696421824354930077523691855699312544373220921962817907078"
162851126518SMichael Jones       "445538421941800259027487429330768616490865438859612697367766323925013940"
162951126518SMichael Jones       "918384858952407145253573823848733994146335416209309233074165707437420756"
163051126518SMichael Jones       "438833918763109580759409985573826485055208965115587885226774453455112406"
163151126518SMichael Jones       "581351429640282227888764449360534584421929291565334894907337572527922691"
163251126518SMichael Jones       "473242328379737396430908523008687037407295838014450772162091496534584696"
163351126518SMichael Jones       "605157436893236842602956298545594095307060870397506421786236892553632163"
163451126518SMichael Jones       "491468601982681381011940409602294892199042638682530687578982576819839451"
163551126518SMichael Jones       "907594697546439533559153604700750696252355362322662219852740143212566818"
163651126518SMichael Jones       "745528402265116534684566273868361460640280523251242059850044328669692159"
163751126518SMichael Jones       "629900374576027104298177006629276014371540945261309319363704125592775129"
163851126518SMichael Jones       "543526908667388673739382491147471395192495459318806593271282662311169392"
163951126518SMichael Jones       "196897003517840025298267505925987901751541005546610016067658227181318892"
164051126518SMichael Jones       "914686508281007582655667597441346214499847364272258631922040641860333431"
164151126518SMichael Jones       "409838623713258383681350233064164940590695888300919626215847587544298023"
164251126518SMichael Jones       "636416943680102708406086295669759876682046839368574433996997648445207805"
164351126518SMichael Jones       "615784339667691231286807666753972942872019850432610318031627872612657513"
164451126518SMichael Jones       "588188267160616660825719678199868371370527508463011236193719286066916786"
164551126518SMichael Jones       "169956541349011494927225747024994619057884118692213564790598702879596058"
164651126518SMichael Jones       "672338334720925179141906809470606964896245458600635183723159228561689808"
164751126518SMichael Jones       "246141482736625197373238197777325580142168245885279594913851700941789475"
164851126518SMichael Jones       "252421784152262567254611571822468808675893407728003047921107885664474662"
164951126518SMichael Jones       "930921581384003950729114103689170603748380178682003976896397305836815761"
165051126518SMichael Jones       "717676338115866650889936516794601457549097578905329423919798362140648664"
165151126518SMichael Jones       "569177147076571576101649257502509463877402424847669830852345415301684820"
165251126518SMichael Jones       "395813946416649808062227494112874521812750160935760825922220707178083076"
165351126518SMichael Jones       "380203450993589198835885505461509442443773367592842795410339065860781804"
165451126518SMichael Jones       "024975272228687688301824830333940416256885455008512598774611538878683158"
165551126518SMichael Jones       "183931461086893832255176926531299425504132104728730288984598001187854507"
165651126518SMichael Jones       "900417184206801359847651992484444933900133130832052346600926424167009902"
165751126518SMichael Jones       "829803553087005800387704758687923428053612864451456596148162238935900033"
165851126518SMichael Jones       "917094683141205188616000211702577553792389670853917118547527592495253773"
165951126518SMichael Jones       "028135298405566315903922235989614934474805789300370437580494193066066314"
166051126518SMichael Jones       "056627605207631392651010580925826419831250810981343093764403877594495896"
166151126518SMichael Jones       "516881097415880926429607388979497471571321217205535961262051641426436441"
166251126518SMichael Jones       "668989765107456413733909427384182109285933511623871034309722437967253289"
166351126518SMichael Jones       "084018145083721513211807496392673952789642893241520398827805325610653506"
166451126518SMichael Jones       "029060153153064455898648607959013571280930834475689835845791849456112104"
166551126518SMichael Jones       "462337569019001580859906425911782967213265389744605395555069797947978230"
166651126518SMichael Jones       "708108432086217134763779632408473684293543722127232658767439906910370146"
166751126518SMichael Jones       "716836295909075482355827087389127370874842532825987593970846704144140471"
166851126518SMichael Jones       "956027276735614286138656432085771988513977140957180090146798065497158947"
166951126518SMichael Jones       "229765733489703157617307078835099906185890777007500964162371428641176460"
167051126518SMichael Jones       "739074789794941408428328217107759915202650066155868439585510978709442590"
167151126518SMichael Jones       "231934194956788626761834746430104077432547436359522462253411168467463134"
167251126518SMichael Jones       "24896.000000");
167351126518SMichael Jones 
1674a621198aSmichaelrj-google   written =
1675a621198aSmichaelrj-google       LIBC_NAMESPACE::sprintf(big_buff, "%Lf", 0xf.fffffffffffffffp+16380L);
1676a621198aSmichaelrj-google   ASSERT_STREQ_LEN(
1677a621198aSmichaelrj-google       written, big_buff,
1678a621198aSmichaelrj-google       "118973149535723176502126385303097020516906332229462420044032373389173700"
1679a621198aSmichaelrj-google       "552297072261641029033652888285354569780749557731442744315367028843419812"
1680a621198aSmichaelrj-google       "557385374367867359320070697326320191591828296152436552951064679108661431"
1681a621198aSmichaelrj-google       "179063216977883889613478656060039914875343321145491116008867984515486651"
1682a621198aSmichaelrj-google       "285234014977303760000912547939396622315138362241783854274391783813871780"
1683a621198aSmichaelrj-google       "588948754057516822634765923557697480511372564902088485522249479139937758"
1684a621198aSmichaelrj-google       "502601177354918009979622602685950855888360815984690023564513234659447638"
1685a621198aSmichaelrj-google       "493985927645628457966177293040780660922910271504608538808795932778162298"
1686a621198aSmichaelrj-google       "682754783076808004015069494230341172895777710033571401055977524212405734"
1687a621198aSmichaelrj-google       "700738625166011082837911962300846927720096515350020847447079244384854591"
1688a621198aSmichaelrj-google       "288672300061908512647211195136146752763351956292759795725027800298079590"
1689a621198aSmichaelrj-google       "419313960302147099703527646744553092202267965628099149823208332964124103"
1690a621198aSmichaelrj-google       "850923918473478612192169721054348428704835340811304257300221642134891734"
1691a621198aSmichaelrj-google       "717423480071488075100206439051723424765600472176809648610799494341570347"
1692a621198aSmichaelrj-google       "632064355862420744350442438056613601760883747816538902780957697597728686"
1693a621198aSmichaelrj-google       "007148702828795556714140463261583262360276289631617397848425448686060994"
1694a621198aSmichaelrj-google       "827086796804807870251185893083854658422304090880599629459458620190376604"
1695a621198aSmichaelrj-google       "844679092600222541053077590106576067134720012584640695703025713896098375"
1696a621198aSmichaelrj-google       "799892695455305236856075868317922311363951946885088077187210470520395758"
1697a621198aSmichaelrj-google       "748001314313144425494391994017575316933939236688185618912993172910425292"
1698a621198aSmichaelrj-google       "123683515992232205099800167710278403536014082929639811512287776813570604"
1699a621198aSmichaelrj-google       "578934353545169653956125404884644716978689321167108722908808277835051822"
1700a621198aSmichaelrj-google       "885764606221873970285165508372099234948333443522898475123275372663606621"
1701a621198aSmichaelrj-google       "390228126470623407535207172405866507951821730346378263135339370677490195"
1702a621198aSmichaelrj-google       "019784169044182473806316282858685774143258116536404021840272491339332094"
1703a621198aSmichaelrj-google       "921949842244273042701987304453662035026238695780468200360144729199712309"
1704a621198aSmichaelrj-google       "553005720614186697485284685618651483271597448120312194675168637934309618"
1705a621198aSmichaelrj-google       "961510733006555242148519520176285859509105183947250286387163249416761380"
1706a621198aSmichaelrj-google       "499631979144187025430270675849519200883791516940158174004671147787720145"
1707a621198aSmichaelrj-google       "964446117520405945350476472180797576111172084627363927960033967047003761"
1708a621198aSmichaelrj-google       "337450955318415007379641260504792325166135484129188421134082301547330475"
1709a621198aSmichaelrj-google       "406707281876350361733290800595189632520707167390454777712968226520622565"
1710a621198aSmichaelrj-google       "143991937680440029238090311243791261477625596469422198137514696707944687"
1711a621198aSmichaelrj-google       "035800439250765945161837981185939204954403611491531078225107269148697980"
1712a621198aSmichaelrj-google       "924094677214272701240437718740921675661363493890045123235166814608932240"
1713a621198aSmichaelrj-google       "069799317601780533819184998193300841098599393876029260139091141452600372"
1714a621198aSmichaelrj-google       "028487213241195542428210183120421610446740462163533690058366460659115629"
1715a621198aSmichaelrj-google       "876474552506814500393294140413149540067760295100596225302282300363147382"
1716a621198aSmichaelrj-google       "468105964844244132486457313743759509641616804802412935187620466813563687"
1717a621198aSmichaelrj-google       "753281467553879887177183651289394719533506188500326760735438867336800207"
1718a621198aSmichaelrj-google       "438784965701457609034985757124304510203873049485425670247933932280911052"
1719a621198aSmichaelrj-google       "604153852899484920399109194612991249163328991799809438033787952209313146"
1720a621198aSmichaelrj-google       "694614970593966415237594928589096048991612194498998638483702248667224914"
1721a621198aSmichaelrj-google       "892467841020618336462741696957630763248023558797524525373703543388296086"
1722a621198aSmichaelrj-google       "275342774001633343405508353704850737454481975472222897528108302089868263"
1723a621198aSmichaelrj-google       "302028525992308416805453968791141829762998896457648276528750456285492426"
1724a621198aSmichaelrj-google       "516521775079951625966922911497778896235667095662713848201819134832168799"
1725a621198aSmichaelrj-google       "586365263762097828507009933729439678463987902491451422274252700636394232"
1726a621198aSmichaelrj-google       "799848397673998715441855420156224415492665301451550468548925862027608576"
1727a621198aSmichaelrj-google       "183712976335876121538256512963353814166394951655600026415918655485005705"
1728a621198aSmichaelrj-google       "261143195291991880795452239464962763563017858089669222640623538289853586"
1729a621198aSmichaelrj-google       "759599064700838568712381032959192649484625076899225841930548076362021508"
1730a621198aSmichaelrj-google       "902214922052806984201835084058693849381549890944546197789302911357651677"
1731a621198aSmichaelrj-google       "540623227829831403347327660395223160342282471752818181884430488092132193"
1732a621198aSmichaelrj-google       "355086987339586127607367086665237555567580317149010847732009642431878007"
1733a621198aSmichaelrj-google       "000879734603290627894355374356444885190719161645514115576193939969076741"
1734a621198aSmichaelrj-google       "515640282654366402676009508752394550734155613586793306603174472092444651"
1735a621198aSmichaelrj-google       "353236664764973540085196704077110364053815007348689179836404957060618953"
1736a621198aSmichaelrj-google       "500508984091382686953509006678332447257871219660441528492484004185093281"
1737a621198aSmichaelrj-google       "190896363417573989716659600075948780061916409485433875852065711654107226"
1738a621198aSmichaelrj-google       "099628815012314437794400874930194474433078438899570184271000480830501217"
1739a621198aSmichaelrj-google       "712356062289507626904285680004771889315808935851559386317665294808903126"
1740a621198aSmichaelrj-google       "774702966254511086154895839508779675546413794489596052797520987481383976"
1741a621198aSmichaelrj-google       "257859210575628440175934932416214833956535018919681138909184379573470326"
1742a621198aSmichaelrj-google       "940634289008780584694035245347939808067427323629788710086717580253156130"
1743a621198aSmichaelrj-google       "235606487870925986528841635097252953709111431720488774740553905400942537"
1744a621198aSmichaelrj-google       "542411931794417513706468964386151771884986701034153254238591108962471088"
1745a621198aSmichaelrj-google       "538580868883777725864856414593426212108664758848926003176234596076950884"
1746a621198aSmichaelrj-google       "9149662444156604419552086811989770240.000000");
1747*9c868195SMichael Jones #endif
1748a621198aSmichaelrj-google 
1749a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(big_buff, "%.10Lf", 1e-10L);
1750a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, big_buff, "0.0000000001");
1751a621198aSmichaelrj-google 
1752*9c868195SMichael Jones #ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION
1753a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(big_buff, "%.7500Lf", 1e-4900L);
1754a621198aSmichaelrj-google   ASSERT_STREQ_LEN(
1755a621198aSmichaelrj-google       written, big_buff,
1756a621198aSmichaelrj-google       "0."
1757a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1758a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1759a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1760a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1761a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1762a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1763a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1764a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1765a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1766a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1767a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1768a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1769a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1770a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1771a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1772a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1773a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1774a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1775a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1776a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1777a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1778a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1779a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1780a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1781a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1782a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1783a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1784a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1785a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1786a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1787a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1788a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1789a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1790a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1791a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1792a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1793a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1794a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1795a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1796a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1797a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1798a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1799a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1800a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1801a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1802a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1803a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1804a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1805a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1806a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1807a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1808a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1809a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1810a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1811a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1812a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1813a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1814a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1815a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1816a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1817a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1818a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1819a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1820a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1821a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1822a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1823a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1824a621198aSmichaelrj-google       "000000000000000000000000000000000000000000000000000000000000000000000000"
1825a621198aSmichaelrj-google       "000099999999999999999996962764452956071352139203248614920751610856665084"
1826a621198aSmichaelrj-google       "549214352477698417183862158583009348897567779527408501588132175167211539"
1827a621198aSmichaelrj-google       "462139941448204886585901454195352527238724272760638086779284030512649793"
1828a621198aSmichaelrj-google       "039219351187928723378036480041948464946018272171365770411701020666925613"
1829a621198aSmichaelrj-google       "422460317465324758217878522666789603627480490870456508256359180089236338"
1830a621198aSmichaelrj-google       "765625231186929290294207420828927406735690318849109129700396907705735097"
1831a621198aSmichaelrj-google       "663944722727287361650042373203763784830198232253311807069225650324196304"
1832a621198aSmichaelrj-google       "532045014970637489181357566354288111205943347410488298480279857453705249"
1833a621198aSmichaelrj-google       "232862728556860184412369114663536200895729846877559808001004454634804626"
1834a621198aSmichaelrj-google       "541455540260282018142615835686583304903486353937549394736905011798466731"
1835a621198aSmichaelrj-google       "536563240053860118551127061960208467764243724656897127545613968909523389"
1836a621198aSmichaelrj-google       "577188368809623987105800147797280462974804046545425080530020901531407223"
1837a621198aSmichaelrj-google       "191237123282274818236437397994019915368657474589800678444589412286037789"
1838a621198aSmichaelrj-google       "891525464936023205313685584525510094270344601331453730179416773626565262"
1839a621198aSmichaelrj-google       "480345858564672442896904520146956686863172737711483866766404977719744767"
1840a621198aSmichaelrj-google       "834324844875237277613991088218774564658513875732403456058414595576806383"
1841a621198aSmichaelrj-google       "115554713240005982141397577420073082470139244845624915873825746771661332"
1842a621198aSmichaelrj-google       "098677966580506186966978746832443976821987300902957597498388211921362869"
1843a621198aSmichaelrj-google       "017846215557612829071692275292036211064515305528052919611691470945774714"
1844a621198aSmichaelrj-google       "135516559501572279732350629089770249554808690411603894492333360300589658"
1845a621198aSmichaelrj-google       "470898965370892774715815089075170720164713889237058574941489766701880158"
1846a621198aSmichaelrj-google       "060081295483989540170337129032188818293132770882381428397119039835946745"
1847a621198aSmichaelrj-google       "549356649433406617266370644136291924838857814675939156677910783740103207"
1848a621198aSmichaelrj-google       "523299367093130816446415259371931925208362367989095199399211644084543790"
1849a621198aSmichaelrj-google       "110432339056231037520216864358899218874658268610955002763260912337688947"
1850a621198aSmichaelrj-google       "822453100821038299301092582962825965939081817836419126254832772002214908"
1851a621198aSmichaelrj-google       "085575905761843610944187009818156363893015929300295112598059949496854566"
1852a621198aSmichaelrj-google       "638748010633726861510500653821408135845840123073754133549077708843800674"
1853a621198aSmichaelrj-google       "328440913743105608636458354618912183716456158809545183074062249922212944"
1854a621198aSmichaelrj-google       "249667793845728355381309084891765979111348980470647082269921872595470473"
1855a621198aSmichaelrj-google       "719354467594516320911964549508538492057120740224559944452120552719041944"
1856a621198aSmichaelrj-google       "961475548547884309626382512432626380881023756568143060204097921571153170"
1857a621198aSmichaelrj-google       "723817845809196253498326358439807445210362177680590181657555380795450462"
1858a621198aSmichaelrj-google       "223805222580359379367452693270553602179122419370586308101820559214330382"
1859a621198aSmichaelrj-google       "570449525088342437216896462077260223998756027453411520977536701491759878"
1860a621198aSmichaelrj-google       "422771447006016890777855573925295187921971811871399320142563330377888532"
1861a621198aSmichaelrj-google       "179817332113");
1862*9c868195SMichael Jones #endif
1863f7d4236aSGuillaume Chatelet #endif // LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80
1864a621198aSmichaelrj-google }
1865a621198aSmichaelrj-google 
1866cab8c876Slntue TEST(LlvmLibcSPrintfTest, FloatExponentConv) {
1867cab8c876Slntue   char buff[1000];
1868cab8c876Slntue   int written;
1869cab8c876Slntue 
1870a621198aSmichaelrj-google   ForceRoundingMode r(RoundingMode::Nearest);
1871a621198aSmichaelrj-google   double inf = LIBC_NAMESPACE::fputil::FPBits<double>::inf().get_val();
1872ace383dfSGuillaume Chatelet   double nan = LIBC_NAMESPACE::fputil::FPBits<double>::quiet_nan().get_val();
1873a621198aSmichaelrj-google 
1874a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%e", 1.0);
1875a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "1.000000e+00");
1876a621198aSmichaelrj-google 
1877a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%E", -1.0);
1878a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "-1.000000E+00");
1879a621198aSmichaelrj-google 
1880a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%e", -1.234567);
1881a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "-1.234567e+00");
1882a621198aSmichaelrj-google 
1883a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%e", 0.0);
1884a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "0.000000e+00");
1885a621198aSmichaelrj-google 
1886a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%e", 1.5);
1887a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "1.500000e+00");
1888a621198aSmichaelrj-google 
1889a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%e", 1e300);
1890a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "1.000000e+300");
1891a621198aSmichaelrj-google 
1892a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%e", 0.1);
1893a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "1.000000e-01");
1894a621198aSmichaelrj-google 
1895a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%e", 0.001);
1896a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "1.000000e-03");
1897a621198aSmichaelrj-google 
1898a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%e", 0.00001);
1899a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "1.000000e-05");
1900a621198aSmichaelrj-google 
1901a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%e", 0.0000001);
1902a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "1.000000e-07");
1903a621198aSmichaelrj-google 
1904a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%e", 0.000000001);
1905a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "1.000000e-09");
1906a621198aSmichaelrj-google 
1907a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%e", 1.0e-20);
1908a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "1.000000e-20");
1909a621198aSmichaelrj-google 
1910a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%e", 1234567890123456789.0);
1911a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "1.234568e+18");
1912a621198aSmichaelrj-google 
1913a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%e", 9999999000000.00);
1914a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "9.999999e+12");
1915a621198aSmichaelrj-google 
1916a621198aSmichaelrj-google   // Simple Subnormal Tests.
1917a621198aSmichaelrj-google 
1918a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%e", 0x1.0p-1027);
1919a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "6.953356e-310");
1920a621198aSmichaelrj-google 
1921a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%e", 0x1.0p-1074);
1922a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "4.940656e-324");
1923a621198aSmichaelrj-google 
1924a621198aSmichaelrj-google   // Inf/Nan Tests.
1925a621198aSmichaelrj-google 
1926a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%e", inf);
192751126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "inf");
192851126518SMichael Jones 
1929a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%E", -inf);
1930a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "-INF");
1931a621198aSmichaelrj-google 
1932a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%e", nan);
1933a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "nan");
1934a621198aSmichaelrj-google 
1935a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%E", -nan);
1936a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "-NAN");
193751126518SMichael Jones 
193851126518SMichael Jones   // Min Width Tests.
193951126518SMichael Jones 
1940b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%15e", 1.0);
194151126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "   1.000000e+00");
194251126518SMichael Jones 
1943b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%15e", -1.0);
194451126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "  -1.000000e+00");
194551126518SMichael Jones 
1946b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%15e", 1.0e5);
194751126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "   1.000000e+05");
194851126518SMichael Jones 
1949b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%15e", -1.0e5);
195051126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "  -1.000000e+05");
195151126518SMichael Jones 
1952b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%10e", 1.0e-5);
195351126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.000000e-05");
195451126518SMichael Jones 
195551126518SMichael Jones   // Precision Tests.
195651126518SMichael Jones 
1957b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.0);
195851126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.0e+00");
195951126518SMichael Jones 
1960b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 0.0);
196151126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0.0e+00");
196251126518SMichael Jones 
1963b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 0.0);
196451126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0e+00");
196551126518SMichael Jones 
1966b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 0.1);
196751126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.0e-01");
196851126518SMichael Jones 
1969b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.09);
197051126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.1e+00");
197151126518SMichael Jones 
1972b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.04);
197351126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.0e+00");
197451126518SMichael Jones 
1975b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.19);
197651126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.2e+00");
197751126518SMichael Jones 
1978b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.99);
197951126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "2.0e+00");
198051126518SMichael Jones 
1981b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 9.99);
198251126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.0e+01");
198351126518SMichael Jones 
1984b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.2e", 99.9);
198551126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "9.99e+01");
198651126518SMichael Jones 
1987b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 99.9);
198851126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.0e+02");
198951126518SMichael Jones 
1990b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.5e", 1.25);
199151126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.25000e+00");
199251126518SMichael Jones 
1993b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 1.25);
199451126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1e+00");
199551126518SMichael Jones 
1996b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 1.75);
199751126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "2e+00");
199851126518SMichael Jones 
1999b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.20e", 1.234e-10);
200051126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.23400000000000008140e-10");
200151126518SMichael Jones 
2002b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.2e", -9.99);
200351126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-9.99e+00");
200451126518SMichael Jones 
2005b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -9.99);
200651126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-1.0e+01");
200751126518SMichael Jones 
2008b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.5e", 0.0);
200951126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0.00000e+00");
201051126518SMichael Jones 
2011b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.5e", 1.008);
201251126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.00800e+00");
201351126518SMichael Jones 
2014b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.5e", 1.008e3);
201551126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.00800e+03");
201651126518SMichael Jones 
2017cd06b9d9SMichael Jones   // These tests also focus on rounding. Almost all of them have a 5 right after
2018cd06b9d9SMichael Jones   // the printed string (e.g. 9.5 with precision 0 prints 0 digits after the
2019cd06b9d9SMichael Jones   // decimal point). This is again because rounding a number with a 5 after the
2020cd06b9d9SMichael Jones   // printed section means that more digits have to be checked to determine if
2021cd06b9d9SMichael Jones   // this should be rounded up (if there are non-zero digits after the 5) or to
2022cd06b9d9SMichael Jones   // even (if the 5 is the last non-zero digit). Additionally, the algorithm for
2023cd06b9d9SMichael Jones   // checking if a number is all 0s after the decimal point may not work since
2024cd06b9d9SMichael Jones   // the decimal point moves in this representation.
2025b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 2.5812229360061737E+200);
2026cd06b9d9SMichael Jones   ASSERT_STREQ_LEN(written, buff, "3e+200");
2027cd06b9d9SMichael Jones 
2028b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 9.059E+200);
2029cd06b9d9SMichael Jones   ASSERT_STREQ_LEN(written, buff, "9.1e+200");
2030cd06b9d9SMichael Jones 
2031b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 9.059E+200);
2032cd06b9d9SMichael Jones   ASSERT_STREQ_LEN(written, buff, "9e+200");
2033cd06b9d9SMichael Jones 
2034*9c868195SMichael Jones #ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION
2035b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.166e", 1.131959884853339E-72);
2036cd06b9d9SMichael Jones   ASSERT_STREQ_LEN(written, buff,
2037cd06b9d9SMichael Jones                    "1."
2038cd06b9d9SMichael Jones                    "13195988485333904593863991136097397258531639976739227369782"
2039cd06b9d9SMichael Jones                    "68612419376648241056393424414314951197624317440549121097287"
2040cd06b9d9SMichael Jones                    "069853416091591569170304865110665559768676757812e-72");
2041*9c868195SMichael Jones #endif
2042cd06b9d9SMichael Jones 
2043b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 9.5);
2044cd06b9d9SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1e+01");
2045cd06b9d9SMichael Jones 
2046b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.10e", 1.9999999999890936);
2047cd06b9d9SMichael Jones   ASSERT_STREQ_LEN(written, buff, "2.0000000000e+00");
2048cd06b9d9SMichael Jones 
2049b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 745362143563.03894);
2050cd06b9d9SMichael Jones   ASSERT_STREQ_LEN(written, buff, "7.5e+11");
2051cd06b9d9SMichael Jones 
2052b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 45181042688.0);
2053cd06b9d9SMichael Jones   ASSERT_STREQ_LEN(written, buff, "5e+10");
2054cd06b9d9SMichael Jones 
2055b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.35e", 1.3752441369139243);
2056cd06b9d9SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.37524413691392433101157166674965993e+00");
2057cd06b9d9SMichael Jones 
205851126518SMichael Jones   // Subnormal Precision Tests
205951126518SMichael Jones 
2060*9c868195SMichael Jones #ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION
2061b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.310e", 0x1.0p-1022);
206251126518SMichael Jones   ASSERT_STREQ_LEN(
206351126518SMichael Jones       written, buff,
206451126518SMichael Jones       "2."
206551126518SMichael Jones       "225073858507201383090232717332404064219215980462331830553327416887204434"
206651126518SMichael Jones       "813918195854283159012511020564067339731035811005152434161553460108856012"
206751126518SMichael Jones       "385377718821130777993532002330479610147442583636071921565046942503734208"
206851126518SMichael Jones       "375250806650616658158948720491179968591639648500635908770118304874799780"
206951126518SMichael Jones       "8877537499494515804516e-308");
2070*9c868195SMichael Jones #endif
207151126518SMichael Jones 
2072b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.30e", 0x1.0p-1022);
207351126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "2.225073858507201383090232717332e-308");
207451126518SMichael Jones 
2075*9c868195SMichael Jones #ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION
2076b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.310e", 0x1.0p-1023);
207751126518SMichael Jones   ASSERT_STREQ_LEN(
207851126518SMichael Jones       written, buff,
207951126518SMichael Jones       "1."
208051126518SMichael Jones       "112536929253600691545116358666202032109607990231165915276663708443602217"
208151126518SMichael Jones       "406959097927141579506255510282033669865517905502576217080776730054428006"
208251126518SMichael Jones       "192688859410565388996766001165239805073721291818035960782523471251867104"
208351126518SMichael Jones       "187625403325308329079474360245589984295819824250317954385059152437399890"
208451126518SMichael Jones       "4438768749747257902258e-308");
2085*9c868195SMichael Jones #endif
208651126518SMichael Jones 
2087b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.6e", 9.99999e-310);
208851126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "9.999990e-310");
208951126518SMichael Jones 
2090b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.5e", 9.99999e-310);
209151126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "9.99999e-310");
209251126518SMichael Jones 
2093b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.4e", 9.99999e-310);
209451126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.0000e-309");
209551126518SMichael Jones 
2096b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.3e", 9.99999e-310);
209751126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.000e-309");
209851126518SMichael Jones 
2099b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.2e", 9.99999e-310);
210051126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.00e-309");
210151126518SMichael Jones 
2102b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 9.99999e-310);
210351126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.0e-309");
210451126518SMichael Jones 
2105b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.0e", 9.99999e-310);
210651126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1e-309");
210751126518SMichael Jones 
2108b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.10e", 0x1.0p-1074);
210951126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "4.9406564584e-324");
211051126518SMichael Jones 
211151126518SMichael Jones   // Rounding Mode Tests.
211251126518SMichael Jones 
2113055be3c3STue Ly   if (ForceRoundingMode r(RoundingMode::Nearest); r.success) {
2114b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.75);
211551126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.8e+00");
211651126518SMichael Jones 
2117b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.25);
211851126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.2e+00");
211951126518SMichael Jones 
2120b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.125);
212151126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.1e+00");
212251126518SMichael Jones 
2123b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.625);
212451126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.6e+00");
212551126518SMichael Jones 
2126b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.375);
212751126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.4e+00");
212851126518SMichael Jones 
2129b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.875);
213051126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.9e+00");
213151126518SMichael Jones 
2132b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.75);
213351126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.8e+00");
213451126518SMichael Jones 
2135b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.25);
213651126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.2e+00");
213751126518SMichael Jones 
2138b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.125);
213951126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.1e+00");
214051126518SMichael Jones 
2141b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.625);
214251126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.6e+00");
214351126518SMichael Jones 
2144b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.375);
214551126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.4e+00");
214651126518SMichael Jones 
2147b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.875);
214851126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.9e+00");
214951126518SMichael Jones   }
215051126518SMichael Jones 
2151055be3c3STue Ly   if (ForceRoundingMode r(RoundingMode::Upward); r.success) {
2152b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.75);
215351126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.8e+00");
215451126518SMichael Jones 
2155b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.25);
215651126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.3e+00");
215751126518SMichael Jones 
2158b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.125);
215951126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.2e+00");
216051126518SMichael Jones 
2161b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.625);
216251126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.7e+00");
216351126518SMichael Jones 
2164b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.375);
216551126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.4e+00");
216651126518SMichael Jones 
2167b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.875);
216851126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.9e+00");
216951126518SMichael Jones 
2170b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.75);
217151126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.7e+00");
217251126518SMichael Jones 
2173b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.25);
217451126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.2e+00");
217551126518SMichael Jones 
2176b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.125);
217751126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.1e+00");
217851126518SMichael Jones 
2179b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.625);
218051126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.6e+00");
218151126518SMichael Jones 
2182b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.375);
218351126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.3e+00");
218451126518SMichael Jones 
2185b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.875);
218651126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.8e+00");
218751126518SMichael Jones   }
218851126518SMichael Jones 
2189055be3c3STue Ly   if (ForceRoundingMode r(RoundingMode::Downward); r.success) {
2190b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.75);
219151126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.7e+00");
219251126518SMichael Jones 
2193b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.25);
219451126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.2e+00");
219551126518SMichael Jones 
2196b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.125);
219751126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.1e+00");
219851126518SMichael Jones 
2199b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.625);
220051126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.6e+00");
220151126518SMichael Jones 
2202b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.375);
220351126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.3e+00");
220451126518SMichael Jones 
2205b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.875);
220651126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.8e+00");
220751126518SMichael Jones 
2208b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.75);
220951126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.8e+00");
221051126518SMichael Jones 
2211b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.25);
221251126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.3e+00");
221351126518SMichael Jones 
2214b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.125);
221551126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.2e+00");
221651126518SMichael Jones 
2217b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.625);
221851126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.7e+00");
221951126518SMichael Jones 
2220b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.375);
222151126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.4e+00");
222251126518SMichael Jones 
2223b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.875);
222451126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.9e+00");
222551126518SMichael Jones   }
222651126518SMichael Jones 
2227055be3c3STue Ly   if (ForceRoundingMode r(RoundingMode::TowardZero); r.success) {
2228b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.75);
222951126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.7e+00");
223051126518SMichael Jones 
2231b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.25);
223251126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.2e+00");
223351126518SMichael Jones 
2234b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.125);
223551126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.1e+00");
223651126518SMichael Jones 
2237b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.625);
223851126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.6e+00");
223951126518SMichael Jones 
2240b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.375);
224151126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.3e+00");
224251126518SMichael Jones 
2243b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", 1.875);
224451126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.8e+00");
224551126518SMichael Jones 
2246b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.75);
224751126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.7e+00");
224851126518SMichael Jones 
2249b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.25);
225051126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.2e+00");
225151126518SMichael Jones 
2252b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.125);
225351126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.1e+00");
225451126518SMichael Jones 
2255b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.625);
225651126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.6e+00");
225751126518SMichael Jones 
2258b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.375);
225951126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.3e+00");
226051126518SMichael Jones 
2261b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.1e", -1.875);
226251126518SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.8e+00");
226351126518SMichael Jones   }
226451126518SMichael Jones 
226551126518SMichael Jones   // Flag Tests.
2266b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%+e", 1.0);
226751126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "+1.000000e+00");
226851126518SMichael Jones 
2269b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%+e", -1.0);
227051126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-1.000000e+00");
227151126518SMichael Jones 
2272b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "% e", 1.0);
227351126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, " 1.000000e+00");
227451126518SMichael Jones 
2275b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "% e", -1.0);
227651126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-1.000000e+00");
227751126518SMichael Jones 
2278b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-15e", 1.5);
227951126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.500000e+00   ");
228051126518SMichael Jones 
2281b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%#.e", 1.0);
228251126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.e+00");
228351126518SMichael Jones 
2284b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%#.0e", 1.5);
228551126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "2.e+00");
228651126518SMichael Jones 
2287b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%015e", 1.5);
228851126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0001.500000e+00");
228951126518SMichael Jones 
2290b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%015e", -1.5);
229151126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-001.500000e+00");
229251126518SMichael Jones 
2293b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%+- #0e", 0.0);
229451126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "+0.000000e+00");
229551126518SMichael Jones 
229651126518SMichael Jones   // Combined Tests.
229751126518SMichael Jones 
2298b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%10.2e", 9.99);
229951126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "  9.99e+00");
230051126518SMichael Jones 
2301b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%10.1e", 9.99);
230251126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "   1.0e+01");
230351126518SMichael Jones 
2304b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%10.0e", 9.99);
2305173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "     1e+01");
2306173d5023SMichael Jones 
2307b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%10.0e", 0.0999);
2308173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "     1e-01");
2309173d5023SMichael Jones 
2310b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-10.2e", 9.99);
231151126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "9.99e+00  ");
231251126518SMichael Jones 
2313b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-10.1e", 9.99);
231451126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.0e+01   ");
231551126518SMichael Jones 
2316b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-10.1e", 1.0e-50);
231751126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.0e-50   ");
231851126518SMichael Jones 
2319b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%30e", 1234567890123456789.0);
232051126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "                  1.234568e+18");
232151126518SMichael Jones 
2322b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-30e", 1234567890123456789.0);
232351126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.234568e+18                  ");
232451126518SMichael Jones 
2325b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%25.14e", 9999999999999.99);
232651126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "     9.99999999999999e+12");
232751126518SMichael Jones 
2328b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%25.13e", 9999999999999.99);
232951126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "      1.0000000000000e+13");
233051126518SMichael Jones 
2331b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%25.12e", 9999999999999.99);
2332173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "       1.000000000000e+13");
2333173d5023SMichael Jones 
2334b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%12.3e %-12.3e", 0.1, 256.0);
233551126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "   1.000e-01 2.560e+02   ");
233651126518SMichael Jones 
2337b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%+-#12.3e % 012.3e", 0.1256, 1256.0);
233851126518SMichael Jones   ASSERT_STREQ_LEN(written, buff, "+1.256e-01    001.256e+03");
233951126518SMichael Jones }
234051126518SMichael Jones 
2341cab8c876Slntue TEST(LlvmLibcSPrintfTest, FloatExponentLongDoubleConv) {
2342cab8c876Slntue   char buff[1000];
2343cab8c876Slntue   int written;
2344cab8c876Slntue 
2345055be3c3STue Ly   ForceRoundingMode r(RoundingMode::Nearest);
2346173d5023SMichael Jones   // Length Modifier Tests.
2347173d5023SMichael Jones 
2348a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%.9Le", 1000000000500000000.1L);
2349a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "1.000000001e+18");
2350bfcfc2a6Smichaelrj-google 
2351a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%.9Le", 1000000000500000000.0L);
2352a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "1.000000000e+18");
23535bd34e0aSmichaelrj-google 
2354*9c868195SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%Le", 1e100L);
2355*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.000000e+100");
2356*9c868195SMichael Jones 
2357*9c868195SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%Le", 1.0L);
2358*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.000000e+00");
2359*9c868195SMichael Jones 
2360*9c868195SMichael Jones #if !defined(LIBC_TYPES_LONG_DOUBLE_IS_DOUBLE)
2361a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%Le", 0xf.fffffffffffffffp+16380L);
2362a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "1.189731e+4932");
2363*9c868195SMichael Jones 
2364*9c868195SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%Le", 1e1000L);
2365*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.000000e+1000");
2366*9c868195SMichael Jones 
2367*9c868195SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%Le", 1e4900L);
2368*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.000000e+4900");
2369*9c868195SMichael Jones 
2370*9c868195SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%Le", 1.2345678e4900L);
2371*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.234568e+4900");
2372a621198aSmichaelrj-google #endif
2373a621198aSmichaelrj-google }
2374173d5023SMichael Jones 
2375cab8c876Slntue TEST(LlvmLibcSPrintfTest, FloatAutoConv) {
2376cab8c876Slntue   char buff[1000];
2377cab8c876Slntue   int written;
2378cab8c876Slntue 
2379a621198aSmichaelrj-google   ForceRoundingMode r(RoundingMode::Nearest);
2380a621198aSmichaelrj-google   double inf = LIBC_NAMESPACE::fputil::FPBits<double>::inf().get_val();
2381ace383dfSGuillaume Chatelet   double nan = LIBC_NAMESPACE::fputil::FPBits<double>::quiet_nan().get_val();
2382a621198aSmichaelrj-google 
2383a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%g", 1.0);
2384a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "1");
2385a621198aSmichaelrj-google 
2386a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%G", -1.0);
2387a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "-1");
2388a621198aSmichaelrj-google 
2389a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%g", -1.234567);
2390a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "-1.23457");
2391a621198aSmichaelrj-google 
2392a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%g", 0.0);
2393a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "0");
2394a621198aSmichaelrj-google 
2395a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%g", -0.0);
2396a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "-0");
2397a621198aSmichaelrj-google 
2398a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%g", 1.5);
2399a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "1.5");
2400a621198aSmichaelrj-google 
2401a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%g", 1e300);
2402a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "1e+300");
2403a621198aSmichaelrj-google 
2404a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%g", 0.1);
2405a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "0.1");
2406a621198aSmichaelrj-google 
2407a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%g", 0.001);
2408a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "0.001");
2409a621198aSmichaelrj-google 
2410a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%g", 0.00001);
2411a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "1e-05");
2412a621198aSmichaelrj-google 
2413a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%g", 0.0000001);
2414a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "1e-07");
2415a621198aSmichaelrj-google 
2416a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%g", 0.000000001);
2417a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "1e-09");
2418a621198aSmichaelrj-google 
2419a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%g", 1.0e-20);
2420a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "1e-20");
2421a621198aSmichaelrj-google 
2422a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%g", 1234567890123456789.0);
2423a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "1.23457e+18");
2424a621198aSmichaelrj-google 
2425a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%g", 9999990000000.00);
2426a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "9.99999e+12");
2427a621198aSmichaelrj-google 
2428a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%g", 9999999000000.00);
2429a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "1e+13");
2430a621198aSmichaelrj-google 
2431a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%g", 0xa.aaaaaaaaaaaaaabp-7);
2432a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "0.0833333");
2433a621198aSmichaelrj-google 
2434a621198aSmichaelrj-google   // Simple Subnormal Tests.
2435a621198aSmichaelrj-google 
2436a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%g", 0x1.0p-1027);
2437a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "6.95336e-310");
2438a621198aSmichaelrj-google 
2439a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%g", 0x1.0p-1074);
2440a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "4.94066e-324");
2441a621198aSmichaelrj-google 
2442a621198aSmichaelrj-google   // Inf/Nan Tests.
2443a621198aSmichaelrj-google 
2444a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%g", inf);
2445173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "inf");
2446173d5023SMichael Jones 
2447a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%G", -inf);
2448a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "-INF");
2449a621198aSmichaelrj-google 
2450a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%g", nan);
2451a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "nan");
2452a621198aSmichaelrj-google 
2453a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%G", -nan);
2454a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "-NAN");
2455173d5023SMichael Jones 
2456173d5023SMichael Jones   // Min Width Tests.
2457173d5023SMichael Jones 
2458b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%15g", 1.0);
2459173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "              1");
2460173d5023SMichael Jones 
2461b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%15g", -1.0);
2462173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "             -1");
2463173d5023SMichael Jones 
2464b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%15g", 1.0e5);
2465173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "         100000");
2466173d5023SMichael Jones 
2467b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%15g", -1.0e5);
2468173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "        -100000");
2469173d5023SMichael Jones 
2470b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%10g", 1.0e-5);
2471173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "     1e-05");
2472173d5023SMichael Jones 
2473173d5023SMichael Jones   // Precision Tests.
2474173d5023SMichael Jones 
2475b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.23456789);
2476173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.2");
2477173d5023SMichael Jones 
2478173d5023SMichael Jones   // Trimming trailing zeroes causes the precision to be ignored here.
2479b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1g", 0.0);
2480173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0");
2481173d5023SMichael Jones 
2482b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.0g", 0.0);
2483173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0");
2484173d5023SMichael Jones 
2485b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 0.1);
2486173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0.1");
2487173d5023SMichael Jones 
2488b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.09);
2489173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.1");
2490173d5023SMichael Jones 
2491b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.04);
2492173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1");
2493173d5023SMichael Jones 
2494b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.19);
2495173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.2");
2496173d5023SMichael Jones 
2497b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.99);
2498173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "2");
2499173d5023SMichael Jones 
2500b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 9.99);
2501173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "10");
2502173d5023SMichael Jones 
2503b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.3g", 99.9);
2504173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "99.9");
2505173d5023SMichael Jones 
2506b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 99.9);
2507173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1e+02");
2508173d5023SMichael Jones 
2509b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1g", 99.9);
2510173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1e+02");
2511173d5023SMichael Jones 
2512b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.5g", 1.25);
2513173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.25");
2514173d5023SMichael Jones 
2515b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.0g", 1.25);
2516173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1");
2517173d5023SMichael Jones 
2518b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.0g", 1.75);
2519173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "2");
2520173d5023SMichael Jones 
2521b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.20g", 1.234e-10);
2522173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.2340000000000000814e-10");
2523173d5023SMichael Jones 
2524b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.3g", -9.99);
2525173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-9.99");
2526173d5023SMichael Jones 
2527b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -9.99);
2528173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-10");
2529173d5023SMichael Jones 
2530b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1g", -9.99);
2531173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-1e+01");
2532173d5023SMichael Jones 
2533b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.5g", 1.008);
2534173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.008");
2535173d5023SMichael Jones 
2536b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.5g", 1.008e3);
2537173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1008");
2538173d5023SMichael Jones 
2539b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.4g", 9999.0);
2540173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "9999");
2541173d5023SMichael Jones 
2542b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.3g", 9999.0);
2543173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1e+04");
2544173d5023SMichael Jones 
2545b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.3g", 1256.0);
2546173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.26e+03");
2547173d5023SMichael Jones 
254863f8922fSMichael Jones   // Found through large scale testing.
2549b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.15g", 22.25);
255063f8922fSMichael Jones   ASSERT_STREQ_LEN(written, buff, "22.25");
255163f8922fSMichael Jones 
2552cd06b9d9SMichael Jones   // These tests also focus on rounding, but only in how it relates to the base
2553cd06b9d9SMichael Jones   // 10 exponent. The %g conversion selects between being a %f or %e conversion
2554cd06b9d9SMichael Jones   // based on what the exponent would be if it was %e. If we call the precision
2555cd06b9d9SMichael Jones   // P (equal to 6 if the precision is not set, 0 if the provided precision is
2556cd06b9d9SMichael Jones   // 0, and provided precision - 1 otherwise) and the exponent X, then the style
2557cd06b9d9SMichael Jones   // is %f with an effective precision of P - X + 1 if P > X >= -4, else the
2558cd06b9d9SMichael Jones   // style is %e with effective precision P - 1. Additionally, it attempts to
2559cd06b9d9SMichael Jones   // trim zeros that would be displayed after the decimal point.
2560b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1g", 9.059E+200);
2561cd06b9d9SMichael Jones   ASSERT_STREQ_LEN(written, buff, "9e+200");
2562173d5023SMichael Jones 
2563b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 9.059E+200);
2564cd06b9d9SMichael Jones   ASSERT_STREQ_LEN(written, buff, "9.1e+200");
2565cd06b9d9SMichael Jones 
2566cd06b9d9SMichael Jones   // For this test, P = 0 and X = 1, so P > X >= -4 is false, giving a %e style.
2567b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.0g", 9.5);
2568cd06b9d9SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1e+01");
2569cd06b9d9SMichael Jones 
2570cd06b9d9SMichael Jones   // Subnormal Precision Tests
2571*9c868195SMichael Jones #ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION
2572b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.310g", 0x1.0p-1022);
2573173d5023SMichael Jones   ASSERT_STREQ_LEN(
2574173d5023SMichael Jones       written, buff,
2575173d5023SMichael Jones       "2."
2576173d5023SMichael Jones       "225073858507201383090232717332404064219215980462331830553327416887204434"
2577173d5023SMichael Jones       "813918195854283159012511020564067339731035811005152434161553460108856012"
2578173d5023SMichael Jones       "385377718821130777993532002330479610147442583636071921565046942503734208"
2579173d5023SMichael Jones       "375250806650616658158948720491179968591639648500635908770118304874799780"
2580173d5023SMichael Jones       "887753749949451580452e-308");
2581*9c868195SMichael Jones #endif
2582173d5023SMichael Jones 
2583b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.30g", 0x1.0p-1022);
2584173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "2.22507385850720138309023271733e-308");
2585173d5023SMichael Jones 
2586*9c868195SMichael Jones #ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION
2587b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.310g", 0x1.0p-1023);
2588173d5023SMichael Jones   ASSERT_STREQ_LEN(
2589173d5023SMichael Jones       written, buff,
2590173d5023SMichael Jones       "1."
2591173d5023SMichael Jones       "112536929253600691545116358666202032109607990231165915276663708443602217"
2592173d5023SMichael Jones       "406959097927141579506255510282033669865517905502576217080776730054428006"
2593173d5023SMichael Jones       "192688859410565388996766001165239805073721291818035960782523471251867104"
2594173d5023SMichael Jones       "187625403325308329079474360245589984295819824250317954385059152437399890"
2595173d5023SMichael Jones       "443876874974725790226e-308");
2596*9c868195SMichael Jones #endif
2597173d5023SMichael Jones 
2598b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.7g", 9.99999e-310);
2599173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "9.99999e-310");
2600173d5023SMichael Jones 
2601b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.6g", 9.99999e-310);
2602173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "9.99999e-310");
2603173d5023SMichael Jones 
2604b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.5g", 9.99999e-310);
2605173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1e-309");
2606173d5023SMichael Jones 
2607b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.4g", 9.99999e-310);
2608173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1e-309");
2609173d5023SMichael Jones 
2610b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.3g", 9.99999e-310);
2611173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1e-309");
2612173d5023SMichael Jones 
2613b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 9.99999e-310);
2614173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1e-309");
2615173d5023SMichael Jones 
2616b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.1g", 9.99999e-310);
2617173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1e-309");
2618173d5023SMichael Jones 
2619b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.0g", 9.99999e-310);
2620173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1e-309");
2621173d5023SMichael Jones 
2622b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%.10g", 0x1.0p-1074);
2623173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "4.940656458e-324");
2624173d5023SMichael Jones 
2625173d5023SMichael Jones   // Rounding Mode Tests.
2626173d5023SMichael Jones 
2627055be3c3STue Ly   if (ForceRoundingMode r(RoundingMode::Nearest); r.success) {
2628b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.75);
2629173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.8");
2630173d5023SMichael Jones 
2631b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.25);
2632173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.2");
2633173d5023SMichael Jones 
2634b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.125);
2635173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.1");
2636173d5023SMichael Jones 
2637b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.625);
2638173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.6");
2639173d5023SMichael Jones 
2640b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.375);
2641173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.4");
2642173d5023SMichael Jones 
2643b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.875);
2644173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.9");
2645173d5023SMichael Jones 
2646b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.75);
2647173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.8");
2648173d5023SMichael Jones 
2649b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.25);
2650173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.2");
2651173d5023SMichael Jones 
2652b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.125);
2653173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.1");
2654173d5023SMichael Jones 
2655b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.625);
2656173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.6");
2657173d5023SMichael Jones 
2658b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.375);
2659173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.4");
2660173d5023SMichael Jones 
2661b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.875);
2662173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.9");
2663173d5023SMichael Jones   }
2664173d5023SMichael Jones 
2665055be3c3STue Ly   if (ForceRoundingMode r(RoundingMode::Upward); r.success) {
2666b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.75);
2667173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.8");
2668173d5023SMichael Jones 
2669b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.25);
2670173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.3");
2671173d5023SMichael Jones 
2672b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.125);
2673173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.2");
2674173d5023SMichael Jones 
2675b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.625);
2676173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.7");
2677173d5023SMichael Jones 
2678b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.375);
2679173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.4");
2680173d5023SMichael Jones 
2681b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.875);
2682173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.9");
2683173d5023SMichael Jones 
2684b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.75);
2685173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.7");
2686173d5023SMichael Jones 
2687b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.25);
2688173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.2");
2689173d5023SMichael Jones 
2690b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.125);
2691173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.1");
2692173d5023SMichael Jones 
2693b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.625);
2694173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.6");
2695173d5023SMichael Jones 
2696b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.375);
2697173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.3");
2698173d5023SMichael Jones 
2699b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.875);
2700173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.8");
2701173d5023SMichael Jones   }
2702173d5023SMichael Jones 
2703055be3c3STue Ly   if (ForceRoundingMode r(RoundingMode::Downward); r.success) {
2704b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.75);
2705173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.7");
2706173d5023SMichael Jones 
2707b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.25);
2708173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.2");
2709173d5023SMichael Jones 
2710b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.125);
2711173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.1");
2712173d5023SMichael Jones 
2713b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.625);
2714173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.6");
2715173d5023SMichael Jones 
2716b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.375);
2717173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.3");
2718173d5023SMichael Jones 
2719b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.875);
2720173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.8");
2721173d5023SMichael Jones 
2722b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.75);
2723173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.8");
2724173d5023SMichael Jones 
2725b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.25);
2726173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.3");
2727173d5023SMichael Jones 
2728b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.125);
2729173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.2");
2730173d5023SMichael Jones 
2731b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.625);
2732173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.7");
2733173d5023SMichael Jones 
2734b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.375);
2735173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.4");
2736173d5023SMichael Jones 
2737b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.875);
2738173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.9");
2739173d5023SMichael Jones   }
2740173d5023SMichael Jones 
2741055be3c3STue Ly   if (ForceRoundingMode r(RoundingMode::TowardZero); r.success) {
2742b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.75);
2743173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.7");
2744173d5023SMichael Jones 
2745b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.25);
2746173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.2");
2747173d5023SMichael Jones 
2748b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.125);
2749173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.1");
2750173d5023SMichael Jones 
2751b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.625);
2752173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.6");
2753173d5023SMichael Jones 
2754b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.375);
2755173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.3");
2756173d5023SMichael Jones 
2757b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", 1.875);
2758173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "1.8");
2759173d5023SMichael Jones 
2760b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.75);
2761173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.7");
2762173d5023SMichael Jones 
2763b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.25);
2764173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.2");
2765173d5023SMichael Jones 
2766b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.125);
2767173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.1");
2768173d5023SMichael Jones 
2769b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.625);
2770173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.6");
2771173d5023SMichael Jones 
2772b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.375);
2773173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.3");
2774173d5023SMichael Jones 
2775b6bc9d72SGuillaume Chatelet     written = LIBC_NAMESPACE::sprintf(buff, "%.2g", -1.875);
2776173d5023SMichael Jones     ASSERT_STREQ_LEN(written, buff, "-1.8");
2777173d5023SMichael Jones   }
2778173d5023SMichael Jones 
2779173d5023SMichael Jones   // Flag Tests.
2780b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%+g", 1.0);
2781173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "+1");
2782173d5023SMichael Jones 
2783b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%+g", -1.0);
2784173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-1");
2785173d5023SMichael Jones 
2786b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "% g", 1.0);
2787173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, " 1");
2788173d5023SMichael Jones 
2789b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "% g", -1.0);
2790173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-1");
2791173d5023SMichael Jones 
2792b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-15g", 1.5);
2793173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.5            ");
2794173d5023SMichael Jones 
2795b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%#.g", 1.0);
2796173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.");
2797173d5023SMichael Jones 
2798b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%#g", 1.0);
2799173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.00000");
2800173d5023SMichael Jones 
2801b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%#.0g", 1.5);
2802173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "2.");
2803173d5023SMichael Jones 
2804b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%015g", 1.5);
2805173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0000000000001.5");
2806173d5023SMichael Jones 
2807b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%015g", -1.5);
2808173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-000000000001.5");
2809173d5023SMichael Jones 
2810b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%+- #0g", 0.0);
2811173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "+0.00000");
2812173d5023SMichael Jones 
2813173d5023SMichael Jones   // Combined Tests.
2814173d5023SMichael Jones 
2815b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%10.3g", 9.99);
2816173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "      9.99");
2817173d5023SMichael Jones 
2818b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%10.2g", 9.99);
2819173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "        10");
2820173d5023SMichael Jones 
2821b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%10.1g", 9.99);
2822173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "     1e+01");
2823173d5023SMichael Jones 
2824b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-10.3g", 9.99);
2825173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "9.99      ");
2826173d5023SMichael Jones 
2827b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-10.2g", 9.99);
2828173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "10        ");
2829173d5023SMichael Jones 
2830b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-10.1g", 9.99);
2831173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1e+01     ");
2832173d5023SMichael Jones 
2833b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-10.1g", 1.0e-50);
2834173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1e-50     ");
2835173d5023SMichael Jones 
2836b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%30g", 1234567890123456789.0);
2837173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "                   1.23457e+18");
2838173d5023SMichael Jones 
2839b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%-30g", 1234567890123456789.0);
2840173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.23457e+18                   ");
2841173d5023SMichael Jones 
2842b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%25.15g", 9999999999999.99);
2843173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "         9999999999999.99");
2844173d5023SMichael Jones 
2845b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%25.14g", 9999999999999.99);
2846173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "           10000000000000");
2847173d5023SMichael Jones 
2848b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%25.13g", 9999999999999.99);
2849173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "                    1e+13");
2850173d5023SMichael Jones 
2851b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%#12.3g %-12.3g", 0.1, 256.0);
2852173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "       0.100 256         ");
2853173d5023SMichael Jones 
2854b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%+-#12.3g % 012.3g", 0.1256, 1256.0);
2855173d5023SMichael Jones   ASSERT_STREQ_LEN(written, buff, "+0.126        0001.26e+03");
2856173d5023SMichael Jones }
2857173d5023SMichael Jones 
2858cab8c876Slntue TEST(LlvmLibcSPrintfTest, FloatAutoLongDoubleConv) {
2859cab8c876Slntue   char buff[1000];
2860cab8c876Slntue   int written;
2861cab8c876Slntue 
2862a621198aSmichaelrj-google   ForceRoundingMode r(RoundingMode::Nearest);
2863a621198aSmichaelrj-google 
2864a621198aSmichaelrj-google   // Length Modifier Tests.
2865a621198aSmichaelrj-google 
2866*9c868195SMichael Jones // TODO: Tests for other long double types
2867f7d4236aSGuillaume Chatelet #if defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80)
2868a621198aSmichaelrj-google 
2869a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%Lg", 0xf.fffffffffffffffp+16380L);
2870a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "1.18973e+4932");
2871a621198aSmichaelrj-google 
2872a621198aSmichaelrj-google   written = LIBC_NAMESPACE::sprintf(buff, "%Lg", 0xa.aaaaaaaaaaaaaabp-7L);
2873a621198aSmichaelrj-google   ASSERT_STREQ_LEN(written, buff, "0.0833333");
2874a621198aSmichaelrj-google 
2875*9c868195SMichael Jones #ifndef LIBC_COPT_FLOAT_TO_STR_REDUCED_PRECISION
2876*9c868195SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%.60Lg", 0xa.aaaaaaaaaaaaaabp-7L);
2877*9c868195SMichael Jones   ASSERT_STREQ_LEN(
2878*9c868195SMichael Jones       written, buff,
2879*9c868195SMichael Jones       "0.0833333333333333333355920878593448009041821933351457118988037");
2880*9c868195SMichael Jones #endif
2881a621198aSmichaelrj-google 
2882f7d4236aSGuillaume Chatelet #endif // LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80
2883a621198aSmichaelrj-google 
2884*9c868195SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%Lg", 9.99999999999e-100L);
2885*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1e-99");
2886a621198aSmichaelrj-google 
2887*9c868195SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%Lg", 1e100L);
2888*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1e+100");
2889*9c868195SMichael Jones 
2890*9c868195SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%Lg", 1.0L);
2891*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1");
2892*9c868195SMichael Jones 
2893*9c868195SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%Lg", 0.1L);
2894*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0.1");
2895a621198aSmichaelrj-google 
2896a621198aSmichaelrj-google   char big_buff[10000];
2897*9c868195SMichael Jones   written = LIBC_NAMESPACE::sprintf(big_buff, "%Lg", 1e1000L);
2898*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, big_buff, "1e+1000");
2899a621198aSmichaelrj-google 
2900*9c868195SMichael Jones   written = LIBC_NAMESPACE::sprintf(big_buff, "%Lg", 1e4900L);
2901*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, big_buff, "1e+4900");
2902a621198aSmichaelrj-google }
2903a621198aSmichaelrj-google 
2904c3228714SGuillaume Chatelet #endif // LIBC_COPT_PRINTF_DISABLE_FLOAT
2905f9f8693bSMichael Jones 
29068e3b6054SMichael Jones #if defined(LIBC_COMPILER_HAS_FIXED_POINT) &&                                  \
29078e3b6054SMichael Jones     !defined(LIBC_COPT_PRINTF_DISABLE_FIXED_POINT)
2908cab8c876Slntue TEST(LlvmLibcSPrintfTest, FixedConv) {
2909cab8c876Slntue   char buff[1000];
2910cab8c876Slntue   int written;
29118e3b6054SMichael Jones 
29128e3b6054SMichael Jones   // These numeric tests are potentially a little weak, but the fuzz test is
29138e3b6054SMichael Jones   // more thorough than my handwritten tests tend to be.
29148e3b6054SMichael Jones 
29158e3b6054SMichael Jones   // TODO: Replace hex literals with their appropriate fixed point literals.
29168e3b6054SMichael Jones 
29178e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%k", 0x0); // 0.0
29188e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0.000000");
29198e3b6054SMichael Jones 
29208e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%k", 0x80000000); // -0.0
29218e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-0.000000");
29228e3b6054SMichael Jones 
29238e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%r", 0xffff); // -fract max
29248e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-0.999969");
29258e3b6054SMichael Jones 
29268e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%R", 0xffff); // unsigned fract max
29278e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0.999985");
29288e3b6054SMichael Jones 
29298e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%k", 0xffffffff); // -accum max
29308e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-65535.999969");
29318e3b6054SMichael Jones 
29328e3b6054SMichael Jones   written =
29338e3b6054SMichael Jones       LIBC_NAMESPACE::sprintf(buff, "%K", 0xffffffff); // unsigned accum max
29348e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "65535.999985");
29358e3b6054SMichael Jones 
29368e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%r", 0x7fff); // fract max
29378e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0.999969");
29388e3b6054SMichael Jones 
29398e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%k", 0x7fffffff); // accum max
29408e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "65535.999969");
29418e3b6054SMichael Jones 
29428e3b6054SMichael Jones   // Length Modifier Tests.
29438e3b6054SMichael Jones 
29448e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%hk", 0x0); // 0.0
29458e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0.000000");
29468e3b6054SMichael Jones 
29478e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%hk", 0xffff); // -short accum max
29488e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-255.992188");
29498e3b6054SMichael Jones 
29508e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%hr", 0x0); // 0.0
29518e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0.000000");
29528e3b6054SMichael Jones 
29538e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%hr", 0xff); // -short fract max
29548e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-0.992188");
29558e3b6054SMichael Jones 
29568e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%hK", 0x0); // 0.0
29578e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0.000000");
29588e3b6054SMichael Jones 
29598e3b6054SMichael Jones   written =
29608e3b6054SMichael Jones       LIBC_NAMESPACE::sprintf(buff, "%hK", 0xffff); // unsigned short accum max
29618e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "255.996094");
29628e3b6054SMichael Jones 
29638e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%hR", 0x0); // 0.0
29648e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0.000000");
29658e3b6054SMichael Jones 
29668e3b6054SMichael Jones   written =
29678e3b6054SMichael Jones       LIBC_NAMESPACE::sprintf(buff, "%hR", 0xff); // unsigned short fract max
29688e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0.996094");
29698e3b6054SMichael Jones 
29709e0347d7SMikhail R. Gadelha   written = LIBC_NAMESPACE::sprintf(buff, "%lk", 0x0ll); // 0.0
29718e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0.000000");
29728e3b6054SMichael Jones 
29738e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%lk",
29748e3b6054SMichael Jones                                     0xffffffffffffffff); //-long accum max
29758e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-4294967296.000000");
29768e3b6054SMichael Jones 
29778e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%lr", 0x0); // 0.0
29788e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0.000000");
29798e3b6054SMichael Jones 
29808e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%lr",
29818e3b6054SMichael Jones                                     0xffffffff); //-long fract max
29828e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-1.000000");
29838e3b6054SMichael Jones 
29849e0347d7SMikhail R. Gadelha   written = LIBC_NAMESPACE::sprintf(buff, "%lK", 0x0ll); // 0.0
29858e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0.000000");
29868e3b6054SMichael Jones 
29878e3b6054SMichael Jones   written =
29888e3b6054SMichael Jones       LIBC_NAMESPACE::sprintf(buff, "%lK",
29898e3b6054SMichael Jones                               0xffffffffffffffff); // unsigned long accum max
29908e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "4294967296.000000");
29918e3b6054SMichael Jones 
29928e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%lR", 0x0); // 0.0
29938e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0.000000");
29948e3b6054SMichael Jones 
29958e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%lR",
29968e3b6054SMichael Jones                                     0xffffffff); // unsigned long fract max
29978e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.000000");
29988e3b6054SMichael Jones 
29998e3b6054SMichael Jones   // Min Width Tests.
30008e3b6054SMichael Jones 
30018e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%10k", 0x0000a000); // 1.25
30028e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "  1.250000");
30038e3b6054SMichael Jones 
30048e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%10k", 0x8000a000); //-1.25
30058e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, " -1.250000");
30068e3b6054SMichael Jones 
30078e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%8k", 0x0000a000); // 1.25
30088e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.250000");
30098e3b6054SMichael Jones 
30108e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%9k", 0x8000a000); //-1.25
30118e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-1.250000");
30128e3b6054SMichael Jones 
30138e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%4k", 0x0000a000); // 1.25
30148e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.250000");
30158e3b6054SMichael Jones 
30168e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%4k", 0x8000a000); //-1.25
30178e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-1.250000");
30188e3b6054SMichael Jones 
30198e3b6054SMichael Jones   // Precision Tests.
30208e3b6054SMichael Jones 
30218e3b6054SMichael Jones   written =
30228e3b6054SMichael Jones       LIBC_NAMESPACE::sprintf(buff, "%.16K", 0xFFFFFFFF); // unsigned accum max
30238e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "65535.9999847412109375");
30248e3b6054SMichael Jones 
30258e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(
30268e3b6054SMichael Jones       buff, "%.32lK", 0xFFFFFFFFFFFFFFFF); // unsigned long accum max
30278e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff,
30288e3b6054SMichael Jones                    "4294967295.99999999976716935634613037109375");
30298e3b6054SMichael Jones 
30308e3b6054SMichael Jones   written =
30318e3b6054SMichael Jones       LIBC_NAMESPACE::sprintf(buff, "%.0K", 0xFFFFFFFF); // unsigned accum max
30328e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "65536");
30338e3b6054SMichael Jones 
30348e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%.0R", 0xFFFF); // unsigned fract max
30358e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1");
30368e3b6054SMichael Jones 
30378e3b6054SMichael Jones   // Flag Tests.
30388e3b6054SMichael Jones 
30398e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%+k", 0x0000a000); // 1.25
30408e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "+1.250000");
30418e3b6054SMichael Jones 
30428e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%+k", 0x8000a000); //-1.25
30438e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-1.250000");
30448e3b6054SMichael Jones 
30458e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "% k", 0x0000a000); // 1.25
30468e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, " 1.250000");
30478e3b6054SMichael Jones 
30488e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "% k", 0x8000a000); //-1.25
30498e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-1.250000");
30508e3b6054SMichael Jones 
30518e3b6054SMichael Jones   // unsigned variants ignore sign flags.
30528e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%+K", 0x00014000); // 1.25
30538e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.250000");
30548e3b6054SMichael Jones 
30558e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "% K", 0x00014000); // 1.25
30568e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.250000");
30578e3b6054SMichael Jones 
30588e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%-10k", 0x0000c000); // 1.5
30598e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.500000  ");
30608e3b6054SMichael Jones 
30618e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%#.k", 0x00008000); // 1.0
30628e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1.");
30638e3b6054SMichael Jones 
30648e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%#.0k", 0x0000c000); // 1.5
30658e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "2.");
30668e3b6054SMichael Jones 
30678e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%010k", 0x0000c000); // 1.5
30688e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "001.500000");
30698e3b6054SMichael Jones 
30708e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%010k", 0x8000c000); //-1.5
30718e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "-01.500000");
30728e3b6054SMichael Jones 
30738e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%+- #0k", 0); // 0.0
30748e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "+0.000000");
30758e3b6054SMichael Jones 
30768e3b6054SMichael Jones   // Combined Tests.
30778e3b6054SMichael Jones 
30788e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%10.2k", 0x0004feb8); // 9.99
30798e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "      9.99");
30808e3b6054SMichael Jones 
30818e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%5.1k", 0x0004feb8); // 9.99
30828e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, " 10.0");
30838e3b6054SMichael Jones 
30848e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%-10.2k", 0x0004feb8); // 9.99
30858e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "9.99      ");
30868e3b6054SMichael Jones 
30878e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%-5.1k", 0x0004feb8); // 9.99
30888e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "10.0 ");
30898e3b6054SMichael Jones 
30908e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%-5.1k", 0x00000001); // accum min
30918e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "0.0  ");
30928e3b6054SMichael Jones 
30938e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%30k", 0x7fffffff); // accum max
30948e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "                  65535.999969");
30958e3b6054SMichael Jones 
30968e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%-30k", 0x7fffffff); // accum max
30978e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "65535.999969                  ");
30988e3b6054SMichael Jones 
30998e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%20.2lK",
31008e3b6054SMichael Jones                                     0x3b9ac9ffFD70A3D7); // 999999999.99
31018e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "        999999999.99");
31028e3b6054SMichael Jones 
31038e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%20.1lK",
31048e3b6054SMichael Jones                                     0x3b9ac9ffFD70A3D7); // 999999999.99
31058e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "        1000000000.0");
31068e3b6054SMichael Jones 
31078e3b6054SMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%12.3R %-12.3k", 0x1999,
31088e3b6054SMichael Jones                                     0x00800000); // 0.1, 256.0
31098e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "       0.100 256.000     ");
31108e3b6054SMichael Jones 
31118e3b6054SMichael Jones   written =
31129e0347d7SMikhail R. Gadelha       LIBC_NAMESPACE::sprintf(buff, "%+-#12.3lk % 012.3k", 0x000000001013a92all,
31138e3b6054SMichael Jones                               0x02740000); // 0.126, 1256.0
31148e3b6054SMichael Jones   ASSERT_STREQ_LEN(written, buff, "+0.126        0001256.000");
31158e3b6054SMichael Jones }
31168e3b6054SMichael Jones #endif // defined(LIBC_COMPILER_HAS_FIXED_POINT) &&
31178e3b6054SMichael Jones        // !defined(LIBC_COPT_PRINTF_DISABLE_FIXED_POINT)
31188e3b6054SMichael Jones 
3119f009f72dSMichael Jones #ifndef LIBC_COPT_PRINTF_DISABLE_STRERROR
3120cab8c876Slntue TEST(LlvmLibcSPrintfTest, StrerrorConv) {
3121cab8c876Slntue   char buff[1000];
3122cab8c876Slntue   int written;
3123cab8c876Slntue 
3124f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = 0;
3125f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%m");
3126f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "Success");
3127f009f72dSMichael Jones 
3128f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = ERANGE;
3129f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%m");
3130f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "Numerical result out of range");
3131f009f72dSMichael Jones 
3132f009f72dSMichael Jones   // Check that it correctly consumes no arguments.
3133f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = 0;
3134f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%m %d", 1);
3135f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "Success 1");
3136f009f72dSMichael Jones 
3137f009f72dSMichael Jones   // Width Tests
3138f009f72dSMichael Jones 
3139f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = 0;
3140f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%10m");
3141f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "   Success");
3142f009f72dSMichael Jones 
3143f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = ERANGE;
3144f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%10m");
3145f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "Numerical result out of range");
3146f009f72dSMichael Jones 
3147f009f72dSMichael Jones   // Precision Tests
3148f009f72dSMichael Jones 
3149f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = 0;
3150f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%.10m");
3151f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "Success");
3152f009f72dSMichael Jones 
3153f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = ERANGE;
3154f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%.10m");
3155f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "Numerical ");
3156f009f72dSMichael Jones 
3157f009f72dSMichael Jones   // Flag Tests (Only '-' since the others only affect ints)
3158f009f72dSMichael Jones 
3159f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = 0;
3160f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%-10m");
3161f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "Success   ");
3162f009f72dSMichael Jones 
3163f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = ERANGE;
3164f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%-10m");
3165f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "Numerical result out of range");
3166f009f72dSMichael Jones 
3167f009f72dSMichael Jones   // Alt Mode Tests
3168f009f72dSMichael Jones   // Since alt mode here is effectively a completely separate conversion, it
3169f009f72dSMichael Jones   // gets separate tests.
3170f009f72dSMichael Jones 
3171f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = 0;
3172f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%#m");
3173f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0");
3174f009f72dSMichael Jones 
3175f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = ERANGE;
3176f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%#m");
3177f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "ERANGE");
3178f009f72dSMichael Jones 
3179f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = -9999;
3180f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%#m");
3181f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "-9999");
3182f009f72dSMichael Jones 
3183f009f72dSMichael Jones   // Alt Mode Width
3184f009f72dSMichael Jones 
3185f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = 0;
3186f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%#10m");
3187f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "         0");
3188f009f72dSMichael Jones 
3189f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = ERANGE;
3190f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%#10m");
3191f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "    ERANGE");
3192f009f72dSMichael Jones 
3193f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = -9999;
3194f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%#10m");
3195f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "     -9999");
3196f009f72dSMichael Jones 
3197f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = ERANGE;
3198f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%#3m");
3199f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "ERANGE");
3200f009f72dSMichael Jones 
3201f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = -9999;
3202f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%#3m");
3203f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "-9999");
3204f009f72dSMichael Jones 
3205f009f72dSMichael Jones   // Alt Mode Precision
3206f009f72dSMichael Jones 
3207f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = ERANGE;
3208f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%#.10m");
3209f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "ERANGE");
3210f009f72dSMichael Jones 
3211f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = -9999;
3212f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%#.10m");
3213f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "-0000009999");
3214f009f72dSMichael Jones 
3215f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = ERANGE;
3216f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%#.3m");
3217f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "ERA");
3218f009f72dSMichael Jones 
3219f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = -9999;
3220f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%#.3m");
3221f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "-9999");
3222f009f72dSMichael Jones 
3223f009f72dSMichael Jones   // We don't test precision (or int flags) on errno = 0 because it behaves
3224f009f72dSMichael Jones   // weirdly, see the docs for more information.
3225f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = 0;
3226f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%#.1m");
3227f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0");
3228f009f72dSMichael Jones 
3229f009f72dSMichael Jones   // Alt Mode Flags
3230f009f72dSMichael Jones 
3231f009f72dSMichael Jones   // '-' flag
3232f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = 0;
3233f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%#-10m");
3234f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0         ");
3235f009f72dSMichael Jones 
3236f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = ERANGE;
3237f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%#-10m");
3238f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "ERANGE    ");
3239f009f72dSMichael Jones 
3240f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = -9999;
3241f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%#-10m");
3242f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "-9999     ");
3243f009f72dSMichael Jones 
3244f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = ERANGE;
3245f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%#-3m");
3246f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "ERANGE");
3247f009f72dSMichael Jones 
3248f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = -9999;
3249f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%#-3m");
3250f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "-9999");
3251f009f72dSMichael Jones 
3252f009f72dSMichael Jones   // '+' flag
3253f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = ERANGE;
3254f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%#+m");
3255f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "ERANGE");
3256f009f72dSMichael Jones 
3257f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = -9999;
3258f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%#+m");
3259f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "-9999");
3260f009f72dSMichael Jones 
3261f009f72dSMichael Jones   // Technically 9999 could be a valid error, since the standard just says errno
3262f009f72dSMichael Jones   // macros are "distinct positive values". In practice I don't expect this to
3263f009f72dSMichael Jones   // come up, but I've avoided it for the other %m tests for ease of
3264f009f72dSMichael Jones   // refactoring if necessary. Here it needs to be positive to test that the
3265f009f72dSMichael Jones   // flags that only affect positive signed integers are properly passed along.
3266f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = 9999;
3267f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%#+m");
3268f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "+9999");
3269f009f72dSMichael Jones 
3270f009f72dSMichael Jones   // ' ' flag
3271f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = ERANGE;
3272f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%# m");
3273f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "ERANGE");
3274f009f72dSMichael Jones 
3275f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = -9999;
3276f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%# m");
3277f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "-9999");
3278f009f72dSMichael Jones 
3279f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = 9999;
3280f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%# m");
3281f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, " 9999");
3282f009f72dSMichael Jones 
3283f009f72dSMichael Jones   // '0' flag
3284f009f72dSMichael Jones 
3285f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = ERANGE;
3286f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%#010m");
3287f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "    ERANGE");
3288f009f72dSMichael Jones 
3289f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = -9999;
3290f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%#010m");
3291f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "-000009999");
3292f009f72dSMichael Jones 
3293f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = ERANGE;
3294f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%#03m");
3295f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "ERANGE");
3296f009f72dSMichael Jones 
3297f009f72dSMichael Jones   LIBC_NAMESPACE::libc_errno = -9999;
3298f009f72dSMichael Jones   written = LIBC_NAMESPACE::sprintf(buff, "%#03m");
3299f009f72dSMichael Jones   ASSERT_STREQ_LEN(written, buff, "-9999");
3300f009f72dSMichael Jones }
3301f009f72dSMichael Jones #endif // LIBC_COPT_PRINTF_DISABLE_STRERROR
3302f009f72dSMichael Jones 
3303c3228714SGuillaume Chatelet #ifndef LIBC_COPT_PRINTF_DISABLE_WRITE_INT
330488b80139SMichael Jones TEST(LlvmLibcSPrintfTest, WriteIntConv) {
330588b80139SMichael Jones   char buff[64];
330688b80139SMichael Jones   int written;
330788b80139SMichael Jones   int test_val = -1;
330888b80139SMichael Jones 
330988b80139SMichael Jones   test_val = -1;
3310b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "12345%n67890", &test_val);
331188b80139SMichael Jones   EXPECT_EQ(test_val, 5);
3312*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "1234567890");
331388b80139SMichael Jones 
331488b80139SMichael Jones   test_val = -1;
3315b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%n", &test_val);
331688b80139SMichael Jones   EXPECT_EQ(test_val, 0);
3317*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "");
331888b80139SMichael Jones 
331988b80139SMichael Jones   test_val = 0x100;
3320b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "ABC%hhnDEF", &test_val);
332188b80139SMichael Jones   EXPECT_EQ(test_val, 0x103);
3322*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "ABCDEF");
332388b80139SMichael Jones 
332488b80139SMichael Jones   test_val = -1;
3325b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%s%n", "87654321", &test_val);
332688b80139SMichael Jones   EXPECT_EQ(test_val, 8);
3327*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "87654321");
332888b80139SMichael Jones 
3329f6ba3529SMichael Jones #ifndef LIBC_COPT_PRINTF_NO_NULLPTR_CHECKS
3330b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "abc123%n", nullptr);
333188b80139SMichael Jones   EXPECT_LT(written, 0);
3332f6ba3529SMichael Jones #endif // LIBC_COPT_PRINTF_NO_NULLPTR_CHECKS
333388b80139SMichael Jones }
3334c3228714SGuillaume Chatelet #endif // LIBC_COPT_PRINTF_DISABLE_WRITE_INT
333588b80139SMichael Jones 
3336c3228714SGuillaume Chatelet #ifndef LIBC_COPT_PRINTF_DISABLE_INDEX_MODE
3337ff6fe39eSMichael Jones TEST(LlvmLibcSPrintfTest, IndexModeParsing) {
3338ff6fe39eSMichael Jones   char buff[64];
3339ff6fe39eSMichael Jones   int written;
3340ff6fe39eSMichael Jones 
3341b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%1$s", "abcDEF123");
3342*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "abcDEF123");
3343ff6fe39eSMichael Jones 
3344b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(buff, "%1$s %%", "abcDEF123");
3345*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "abcDEF123 %");
3346ff6fe39eSMichael Jones 
3347ff6fe39eSMichael Jones   written =
3348b6bc9d72SGuillaume Chatelet       LIBC_NAMESPACE::sprintf(buff, "%3$s %1$s %2$s", "is", "hard", "ordering");
3349*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff, "ordering is hard");
3350ff6fe39eSMichael Jones 
3351b6bc9d72SGuillaume Chatelet   written = LIBC_NAMESPACE::sprintf(
3352ff6fe39eSMichael Jones       buff, "%10$s %9$s %8$c %7$s %6$s, %6$s %5$s %4$-*1$s %3$.*11$s %2$s. %%",
3353ff6fe39eSMichael Jones       6, "pain", "alphabetical", "such", "is", "this", "do", 'u', "would",
3354ff6fe39eSMichael Jones       "why", 1);
3355*9c868195SMichael Jones   ASSERT_STREQ_LEN(written, buff,
3356*9c868195SMichael Jones                    "why would u do this, this is such   a pain. %");
3357ff6fe39eSMichael Jones }
3358c3228714SGuillaume Chatelet #endif // LIBC_COPT_PRINTF_DISABLE_INDEX_MODE
3359