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 
9ff6fe39eSMichael Jones #include "src/stdio/sprintf.h"
10ff6fe39eSMichael Jones 
11f9f8693bSMichael Jones #include "src/__support/FPUtil/FPBits.h"
12f9f8693bSMichael Jones #include "src/__support/FPUtil/PlatformDefs.h"
13ff6fe39eSMichael Jones #include "utils/UnitTest/Test.h"
14*3b3b816fSMichael Jones #include "utils/testutils/RoundingModeUtils.h"
15*3b3b816fSMichael Jones 
16*3b3b816fSMichael Jones class LlvmLibcSPrintfTest : public __llvm_libc::testing::Test {
17*3b3b816fSMichael Jones protected:
18*3b3b816fSMichael Jones   char buff[64];
19*3b3b816fSMichael Jones   int written;
20*3b3b816fSMichael Jones };
21ff6fe39eSMichael Jones 
22f9f8693bSMichael Jones // Subtract 1 from sizeof(expected_str) to account for the null byte.
23f9f8693bSMichael Jones #define ASSERT_STREQ_LEN(actual_written, actual_str, expected_str)             \
24f9f8693bSMichael Jones   EXPECT_EQ(actual_written, static_cast<int>(sizeof(expected_str) - 1));       \
25f9f8693bSMichael Jones   EXPECT_STREQ(actual_str, expected_str);
26f9f8693bSMichael Jones 
TEST(LlvmLibcSPrintfTest,SimpleNoConv)27ff6fe39eSMichael Jones TEST(LlvmLibcSPrintfTest, SimpleNoConv) {
28ff6fe39eSMichael Jones   char buff[64];
29ff6fe39eSMichael Jones   int written;
30ff6fe39eSMichael Jones 
31ff6fe39eSMichael Jones   written = __llvm_libc::sprintf(buff, "A simple string with no conversions.");
32ff6fe39eSMichael Jones   EXPECT_EQ(written, 36);
33ff6fe39eSMichael Jones   ASSERT_STREQ(buff, "A simple string with no conversions.");
34ff6fe39eSMichael Jones }
35ff6fe39eSMichael Jones 
TEST(LlvmLibcSPrintfTest,PercentConv)36ff6fe39eSMichael Jones TEST(LlvmLibcSPrintfTest, PercentConv) {
37ff6fe39eSMichael Jones   char buff[64];
38ff6fe39eSMichael Jones   int written;
39ff6fe39eSMichael Jones 
40ff6fe39eSMichael Jones   written = __llvm_libc::sprintf(buff, "%%");
41ff6fe39eSMichael Jones   EXPECT_EQ(written, 1);
42ff6fe39eSMichael Jones   ASSERT_STREQ(buff, "%");
43ff6fe39eSMichael Jones 
44ff6fe39eSMichael Jones   written = __llvm_libc::sprintf(buff, "abc %% def");
45ff6fe39eSMichael Jones   EXPECT_EQ(written, 9);
46ff6fe39eSMichael Jones   ASSERT_STREQ(buff, "abc % def");
47ff6fe39eSMichael Jones 
48ff6fe39eSMichael Jones   written = __llvm_libc::sprintf(buff, "%%%%%%");
49ff6fe39eSMichael Jones   EXPECT_EQ(written, 3);
50ff6fe39eSMichael Jones   ASSERT_STREQ(buff, "%%%");
51ff6fe39eSMichael Jones }
52ff6fe39eSMichael Jones 
TEST(LlvmLibcSPrintfTest,CharConv)53ff6fe39eSMichael Jones TEST(LlvmLibcSPrintfTest, CharConv) {
54ff6fe39eSMichael Jones   char buff[64];
55ff6fe39eSMichael Jones   int written;
56ff6fe39eSMichael Jones 
57ff6fe39eSMichael Jones   written = __llvm_libc::sprintf(buff, "%c", 'a');
58ff6fe39eSMichael Jones   EXPECT_EQ(written, 1);
59ff6fe39eSMichael Jones   ASSERT_STREQ(buff, "a");
60ff6fe39eSMichael Jones 
61ff6fe39eSMichael Jones   written = __llvm_libc::sprintf(buff, "%3c %-3c", '1', '2');
62ff6fe39eSMichael Jones   EXPECT_EQ(written, 7);
63ff6fe39eSMichael Jones   ASSERT_STREQ(buff, "  1 2  ");
64ff6fe39eSMichael Jones 
65ff6fe39eSMichael Jones   written = __llvm_libc::sprintf(buff, "%*c", 2, '3');
66ff6fe39eSMichael Jones   EXPECT_EQ(written, 2);
67ff6fe39eSMichael Jones   ASSERT_STREQ(buff, " 3");
68ff6fe39eSMichael Jones }
69ff6fe39eSMichael Jones 
TEST(LlvmLibcSPrintfTest,StringConv)70ff6fe39eSMichael Jones TEST(LlvmLibcSPrintfTest, StringConv) {
71ff6fe39eSMichael Jones   char buff[64];
72ff6fe39eSMichael Jones   int written;
73ff6fe39eSMichael Jones 
74ff6fe39eSMichael Jones   written = __llvm_libc::sprintf(buff, "%s", "abcDEF123");
75ff6fe39eSMichael Jones   EXPECT_EQ(written, 9);
76ff6fe39eSMichael Jones   ASSERT_STREQ(buff, "abcDEF123");
77ff6fe39eSMichael Jones 
78ff6fe39eSMichael Jones   written = __llvm_libc::sprintf(buff, "%10s %-10s", "centered", "title");
79ff6fe39eSMichael Jones   EXPECT_EQ(written, 21);
80ff6fe39eSMichael Jones   ASSERT_STREQ(buff, "  centered title     ");
81ff6fe39eSMichael Jones 
82ff6fe39eSMichael Jones   written = __llvm_libc::sprintf(buff, "%-5.4s%-4.4s", "words can describe",
83ff6fe39eSMichael Jones                                  "soups most delicious");
84ff6fe39eSMichael Jones   EXPECT_EQ(written, 9);
85ff6fe39eSMichael Jones   ASSERT_STREQ(buff, "word soup");
86ff6fe39eSMichael Jones 
87ff6fe39eSMichael Jones   written = __llvm_libc::sprintf(buff, "%*s %.*s %*.*s", 10, "beginning", 2,
88ff6fe39eSMichael Jones                                  "isn't", 12, 10, "important. Ever.");
89ff6fe39eSMichael Jones   EXPECT_EQ(written, 26);
90ff6fe39eSMichael Jones   ASSERT_STREQ(buff, " beginning is   important.");
91ff6fe39eSMichael Jones }
92ff6fe39eSMichael Jones 
TEST(LlvmLibcSPrintfTest,IntConv)931be3669dSMichael Jones TEST(LlvmLibcSPrintfTest, IntConv) {
941be3669dSMichael Jones   char buff[64];
951be3669dSMichael Jones   int written;
961be3669dSMichael Jones 
971be3669dSMichael Jones   // Basic Tests.
981be3669dSMichael Jones 
991be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%d", 123);
1001be3669dSMichael Jones   EXPECT_EQ(written, 3);
1011be3669dSMichael Jones   ASSERT_STREQ(buff, "123");
1021be3669dSMichael Jones 
1031be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%i", -456);
1041be3669dSMichael Jones   EXPECT_EQ(written, 4);
1051be3669dSMichael Jones   ASSERT_STREQ(buff, "-456");
1061be3669dSMichael Jones 
1071be3669dSMichael Jones   // Length Modifier Tests.
1081be3669dSMichael Jones 
10988b80139SMichael Jones   written = __llvm_libc::sprintf(buff, "%hhu", 257); // 0x101
1101be3669dSMichael Jones   EXPECT_EQ(written, 1);
1111be3669dSMichael Jones   ASSERT_STREQ(buff, "1");
1121be3669dSMichael Jones 
1131be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%llu", 18446744073709551615ull);
1141be3669dSMichael Jones   EXPECT_EQ(written, 20);
1151be3669dSMichael Jones   ASSERT_STREQ(buff, "18446744073709551615"); // ull max
1161be3669dSMichael Jones 
1171be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%tu", ~ptrdiff_t(0));
1181be3669dSMichael Jones   if (sizeof(ptrdiff_t) == 8) {
1191be3669dSMichael Jones     EXPECT_EQ(written, 20);
1201be3669dSMichael Jones     ASSERT_STREQ(buff, "18446744073709551615");
1211be3669dSMichael Jones   } else if (sizeof(ptrdiff_t) == 4) {
1221be3669dSMichael Jones     EXPECT_EQ(written, 10);
1231be3669dSMichael Jones     ASSERT_STREQ(buff, "4294967296");
1241be3669dSMichael Jones   }
1251be3669dSMichael Jones 
1261be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%lld", -9223372036854775807ll - 1ll);
1271be3669dSMichael Jones   EXPECT_EQ(written, 20);
1281be3669dSMichael Jones   ASSERT_STREQ(buff, "-9223372036854775808"); // ll min
1291be3669dSMichael Jones 
1301be3669dSMichael Jones   // Min Width Tests.
1311be3669dSMichael Jones 
1321be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%4d", 789);
1331be3669dSMichael Jones   EXPECT_EQ(written, 4);
1341be3669dSMichael Jones   ASSERT_STREQ(buff, " 789");
1351be3669dSMichael Jones 
1361be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%2d", 987);
1371be3669dSMichael Jones   EXPECT_EQ(written, 3);
1381be3669dSMichael Jones   ASSERT_STREQ(buff, "987");
1391be3669dSMichael Jones 
1401be3669dSMichael Jones   // Precision Tests.
1411be3669dSMichael Jones 
1421be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%d", 0);
1431be3669dSMichael Jones   EXPECT_EQ(written, 1);
1441be3669dSMichael Jones   ASSERT_STREQ(buff, "0");
1451be3669dSMichael Jones 
1461be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%.0d", 0);
1471be3669dSMichael Jones   EXPECT_EQ(written, 0);
1481be3669dSMichael Jones   ASSERT_STREQ(buff, "");
1491be3669dSMichael Jones 
1501be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%.5d", 654);
1511be3669dSMichael Jones   EXPECT_EQ(written, 5);
1521be3669dSMichael Jones   ASSERT_STREQ(buff, "00654");
1531be3669dSMichael Jones 
1541be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%.5d", -321);
1551be3669dSMichael Jones   EXPECT_EQ(written, 6);
1561be3669dSMichael Jones   ASSERT_STREQ(buff, "-00321");
1571be3669dSMichael Jones 
1581be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%.2d", 135);
1591be3669dSMichael Jones   EXPECT_EQ(written, 3);
1601be3669dSMichael Jones   ASSERT_STREQ(buff, "135");
1611be3669dSMichael Jones 
1621be3669dSMichael Jones   // Flag Tests.
1631be3669dSMichael Jones 
1641be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%.5d", -321);
1651be3669dSMichael Jones   EXPECT_EQ(written, 6);
1661be3669dSMichael Jones   ASSERT_STREQ(buff, "-00321");
1671be3669dSMichael Jones 
1681be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%-5d", 246);
1691be3669dSMichael Jones   EXPECT_EQ(written, 5);
1701be3669dSMichael Jones   ASSERT_STREQ(buff, "246  ");
1711be3669dSMichael Jones 
1721be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%-5d", -147);
1731be3669dSMichael Jones   EXPECT_EQ(written, 5);
1741be3669dSMichael Jones   ASSERT_STREQ(buff, "-147 ");
1751be3669dSMichael Jones 
1761be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%+d", 258);
1771be3669dSMichael Jones   EXPECT_EQ(written, 4);
1781be3669dSMichael Jones   ASSERT_STREQ(buff, "+258");
1791be3669dSMichael Jones 
1801be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "% d", 369);
1811be3669dSMichael Jones   EXPECT_EQ(written, 4);
1821be3669dSMichael Jones   ASSERT_STREQ(buff, " 369");
1831be3669dSMichael Jones 
1841be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%05d", 470);
1851be3669dSMichael Jones   EXPECT_EQ(written, 5);
1861be3669dSMichael Jones   ASSERT_STREQ(buff, "00470");
1871be3669dSMichael Jones 
1881be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%05d", -581);
1891be3669dSMichael Jones   EXPECT_EQ(written, 5);
1901be3669dSMichael Jones   ASSERT_STREQ(buff, "-0581");
1911be3669dSMichael Jones 
1921be3669dSMichael Jones   // Combined Tests.
1931be3669dSMichael Jones 
1941be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%+ u", 692);
1951be3669dSMichael Jones   EXPECT_EQ(written, 3);
1961be3669dSMichael Jones   ASSERT_STREQ(buff, "692");
1971be3669dSMichael Jones 
1981be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%+ -05d", 703);
1991be3669dSMichael Jones   EXPECT_EQ(written, 5);
2001be3669dSMichael Jones   ASSERT_STREQ(buff, "+703 ");
2011be3669dSMichael Jones 
2021be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%7.5d", 814);
2031be3669dSMichael Jones   EXPECT_EQ(written, 7);
2041be3669dSMichael Jones   ASSERT_STREQ(buff, "  00814");
2051be3669dSMichael Jones 
2061be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%7.5d", -925);
2071be3669dSMichael Jones   EXPECT_EQ(written, 7);
2081be3669dSMichael Jones   ASSERT_STREQ(buff, " -00925");
2091be3669dSMichael Jones 
2101be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%7.5d", 159);
2111be3669dSMichael Jones   EXPECT_EQ(written, 7);
2121be3669dSMichael Jones   ASSERT_STREQ(buff, "  00159");
2131be3669dSMichael Jones 
2141be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "% -7.5d", 260);
2151be3669dSMichael Jones   EXPECT_EQ(written, 7);
2161be3669dSMichael Jones   ASSERT_STREQ(buff, " 00260 ");
2171be3669dSMichael Jones 
2181be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%5.4d", 10000);
2191be3669dSMichael Jones   EXPECT_EQ(written, 5);
2201be3669dSMichael Jones   ASSERT_STREQ(buff, "10000");
2211be3669dSMichael Jones 
2221be3669dSMichael Jones   // Multiple Conversion Tests.
2231be3669dSMichael Jones 
2241be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%10d %-10d", 456, -789);
2251be3669dSMichael Jones   EXPECT_EQ(written, 21);
2261be3669dSMichael Jones   ASSERT_STREQ(buff, "       456 -789      ");
2271be3669dSMichael Jones 
2281be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%-5.4d%+.4u", 75, 25);
2291be3669dSMichael Jones   EXPECT_EQ(written, 9);
2301be3669dSMichael Jones   ASSERT_STREQ(buff, "0075 0025");
2311be3669dSMichael Jones 
2321be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "% 05hhi %+-0.5llu %-+ 06.3zd",
2331be3669dSMichael Jones                                  256 + 127, 68719476736ll, size_t(2));
2341be3669dSMichael Jones   EXPECT_EQ(written, 24);
2351be3669dSMichael Jones   ASSERT_STREQ(buff, " 0127 68719476736 +002  ");
2361be3669dSMichael Jones }
2371be3669dSMichael Jones 
TEST(LlvmLibcSPrintfTest,HexConv)238652ecb25SMichael Jones TEST(LlvmLibcSPrintfTest, HexConv) {
239652ecb25SMichael Jones   char buff[64];
240652ecb25SMichael Jones   int written;
241652ecb25SMichael Jones 
242652ecb25SMichael Jones   // Basic Tests.
243652ecb25SMichael Jones 
244652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%x", 0x123a);
245652ecb25SMichael Jones   EXPECT_EQ(written, 4);
246652ecb25SMichael Jones   ASSERT_STREQ(buff, "123a");
247652ecb25SMichael Jones 
248652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%X", 0x456b);
249652ecb25SMichael Jones   EXPECT_EQ(written, 4);
250652ecb25SMichael Jones   ASSERT_STREQ(buff, "456B");
251652ecb25SMichael Jones 
252652ecb25SMichael Jones   // Length Modifier Tests.
253652ecb25SMichael Jones 
254652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%hhx", 0x10001);
255652ecb25SMichael Jones   EXPECT_EQ(written, 1);
256652ecb25SMichael Jones   ASSERT_STREQ(buff, "1");
257652ecb25SMichael Jones 
258652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%llx", 0xffffffffffffffffull);
259652ecb25SMichael Jones   EXPECT_EQ(written, 16);
260652ecb25SMichael Jones   ASSERT_STREQ(buff, "ffffffffffffffff"); // ull max
261652ecb25SMichael Jones 
262652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%tX", ~ptrdiff_t(0));
263652ecb25SMichael Jones   if (sizeof(ptrdiff_t) == 8) {
264652ecb25SMichael Jones     EXPECT_EQ(written, 16);
265652ecb25SMichael Jones     ASSERT_STREQ(buff, "FFFFFFFFFFFFFFFF");
266652ecb25SMichael Jones   } else if (sizeof(ptrdiff_t) == 4) {
267652ecb25SMichael Jones     EXPECT_EQ(written, 8);
268652ecb25SMichael Jones     ASSERT_STREQ(buff, "FFFFFFFF");
269652ecb25SMichael Jones   }
270652ecb25SMichael Jones 
271652ecb25SMichael Jones   // Min Width Tests.
272652ecb25SMichael Jones 
273652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%4x", 0x789);
274652ecb25SMichael Jones   EXPECT_EQ(written, 4);
275652ecb25SMichael Jones   ASSERT_STREQ(buff, " 789");
276652ecb25SMichael Jones 
277652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%2X", 0x987);
278652ecb25SMichael Jones   EXPECT_EQ(written, 3);
279652ecb25SMichael Jones   ASSERT_STREQ(buff, "987");
280652ecb25SMichael Jones 
281652ecb25SMichael Jones   // Precision Tests.
282652ecb25SMichael Jones 
283652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%x", 0);
284652ecb25SMichael Jones   EXPECT_EQ(written, 1);
285652ecb25SMichael Jones   ASSERT_STREQ(buff, "0");
286652ecb25SMichael Jones 
287652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%.0x", 0);
288652ecb25SMichael Jones   EXPECT_EQ(written, 0);
289652ecb25SMichael Jones   ASSERT_STREQ(buff, "");
290652ecb25SMichael Jones 
291652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%.5x", 0x1F3);
292652ecb25SMichael Jones   EXPECT_EQ(written, 5);
293652ecb25SMichael Jones   ASSERT_STREQ(buff, "001f3");
294652ecb25SMichael Jones 
295652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%.2x", 0x135);
296652ecb25SMichael Jones   EXPECT_EQ(written, 3);
297652ecb25SMichael Jones   ASSERT_STREQ(buff, "135");
298652ecb25SMichael Jones 
299652ecb25SMichael Jones   // Flag Tests.
300652ecb25SMichael Jones 
301652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%-5x", 0x246);
302652ecb25SMichael Jones   EXPECT_EQ(written, 5);
303652ecb25SMichael Jones   ASSERT_STREQ(buff, "246  ");
304652ecb25SMichael Jones 
305652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%#x", 0xd3f);
306652ecb25SMichael Jones   EXPECT_EQ(written, 5);
307652ecb25SMichael Jones   ASSERT_STREQ(buff, "0xd3f");
308652ecb25SMichael Jones 
309652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%#X", 0xE40);
310652ecb25SMichael Jones   EXPECT_EQ(written, 5);
311652ecb25SMichael Jones   ASSERT_STREQ(buff, "0XE40");
312652ecb25SMichael Jones 
313652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%05x", 0x470);
314652ecb25SMichael Jones   EXPECT_EQ(written, 5);
315652ecb25SMichael Jones   ASSERT_STREQ(buff, "00470");
316652ecb25SMichael Jones 
317652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%0#6x", 0x8c3);
318652ecb25SMichael Jones   EXPECT_EQ(written, 6);
319652ecb25SMichael Jones   ASSERT_STREQ(buff, "0x08c3");
320652ecb25SMichael Jones 
321652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%-#6x", 0x5f0);
322652ecb25SMichael Jones   EXPECT_EQ(written, 6);
323652ecb25SMichael Jones   ASSERT_STREQ(buff, "0x5f0 ");
324652ecb25SMichael Jones 
325652ecb25SMichael Jones   // Combined Tests.
326652ecb25SMichael Jones 
327652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%#-07x", 0x703);
328652ecb25SMichael Jones   EXPECT_EQ(written, 7);
329652ecb25SMichael Jones   ASSERT_STREQ(buff, "0x703  ");
330652ecb25SMichael Jones 
331652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%7.5x", 0x814);
332652ecb25SMichael Jones   EXPECT_EQ(written, 7);
333652ecb25SMichael Jones   ASSERT_STREQ(buff, "  00814");
334652ecb25SMichael Jones 
335652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%#9.5X", 0x9d4);
336652ecb25SMichael Jones   EXPECT_EQ(written, 9);
337652ecb25SMichael Jones   ASSERT_STREQ(buff, "  0X009D4");
338652ecb25SMichael Jones 
339652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%-7.5x", 0x260);
340652ecb25SMichael Jones   EXPECT_EQ(written, 7);
341652ecb25SMichael Jones   ASSERT_STREQ(buff, "00260  ");
342652ecb25SMichael Jones 
343652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%5.4x", 0x10000);
344652ecb25SMichael Jones   EXPECT_EQ(written, 5);
345652ecb25SMichael Jones   ASSERT_STREQ(buff, "10000");
346652ecb25SMichael Jones 
347652ecb25SMichael Jones   // Multiple Conversion Tests.
348652ecb25SMichael Jones 
349652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%10X %-#10x", 0x45b, 0x789);
350652ecb25SMichael Jones   EXPECT_EQ(written, 21);
351652ecb25SMichael Jones   ASSERT_STREQ(buff, "       45B 0x789     ");
352652ecb25SMichael Jones 
353652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%-5.4x%#.4x", 0x75, 0x25);
354652ecb25SMichael Jones   EXPECT_EQ(written, 11);
355652ecb25SMichael Jones   ASSERT_STREQ(buff, "0075 0x0025");
356652ecb25SMichael Jones 
357652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%04hhX %#.5llx %-6.3zX", 256 + 0x7f,
358652ecb25SMichael Jones                                  0x1000000000ll, size_t(2));
359652ecb25SMichael Jones   EXPECT_EQ(written, 24);
360652ecb25SMichael Jones   ASSERT_STREQ(buff, "007F 0x1000000000 002   ");
361652ecb25SMichael Jones }
362652ecb25SMichael Jones 
TEST(LlvmLibcSPrintfTest,PointerConv)363121c6454SMichael Jones TEST(LlvmLibcSPrintfTest, PointerConv) {
364121c6454SMichael Jones   char buff[64];
365121c6454SMichael Jones   int written;
366121c6454SMichael Jones 
367121c6454SMichael Jones   written = __llvm_libc::sprintf(buff, "%p", nullptr);
368121c6454SMichael Jones   EXPECT_EQ(written, 9);
369121c6454SMichael Jones   ASSERT_STREQ(buff, "(nullptr)");
370121c6454SMichael Jones 
371121c6454SMichael Jones   written = __llvm_libc::sprintf(buff, "%p", 0x1a2b3c4d);
372121c6454SMichael Jones   EXPECT_EQ(written, 10);
373121c6454SMichael Jones   ASSERT_STREQ(buff, "0x1a2b3c4d");
374121c6454SMichael Jones 
375121c6454SMichael Jones   written = __llvm_libc::sprintf(buff, "%p", buff);
376121c6454SMichael Jones   EXPECT_GT(written, 0);
377121c6454SMichael Jones }
378121c6454SMichael Jones 
TEST(LlvmLibcSPrintfTest,OctConv)3796ec465abSMichael Jones TEST(LlvmLibcSPrintfTest, OctConv) {
3806ec465abSMichael Jones   char buff[64];
3816ec465abSMichael Jones   int written;
3826ec465abSMichael Jones 
3836ec465abSMichael Jones   // Basic Tests.
3846ec465abSMichael Jones 
3856ec465abSMichael Jones   written = __llvm_libc::sprintf(buff, "%o", 01234);
3866ec465abSMichael Jones   EXPECT_EQ(written, 4);
3876ec465abSMichael Jones   ASSERT_STREQ(buff, "1234");
3886ec465abSMichael Jones 
3896ec465abSMichael Jones   written = __llvm_libc::sprintf(buff, "%o", 04567);
3906ec465abSMichael Jones   EXPECT_EQ(written, 4);
3916ec465abSMichael Jones   ASSERT_STREQ(buff, "4567");
3926ec465abSMichael Jones 
3936ec465abSMichael Jones   // Length Modifier Tests.
3946ec465abSMichael Jones 
3956ec465abSMichael Jones   written = __llvm_libc::sprintf(buff, "%hho", 0401);
3966ec465abSMichael Jones   EXPECT_EQ(written, 1);
3976ec465abSMichael Jones   ASSERT_STREQ(buff, "1");
3986ec465abSMichael Jones 
3996ec465abSMichael Jones   written = __llvm_libc::sprintf(buff, "%llo", 01777777777777777777777ull);
4006ec465abSMichael Jones   EXPECT_EQ(written, 22);
4016ec465abSMichael Jones   ASSERT_STREQ(buff, "1777777777777777777777"); // ull max
4026ec465abSMichael Jones 
4036ec465abSMichael Jones   written = __llvm_libc::sprintf(buff, "%to", ~ptrdiff_t(0));
4046ec465abSMichael Jones   if (sizeof(ptrdiff_t) == 8) {
4056ec465abSMichael Jones     EXPECT_EQ(written, 22);
4066ec465abSMichael Jones     ASSERT_STREQ(buff, "1777777777777777777777");
4076ec465abSMichael Jones   } else if (sizeof(ptrdiff_t) == 4) {
4086ec465abSMichael Jones     EXPECT_EQ(written, 11);
4096ec465abSMichael Jones     ASSERT_STREQ(buff, "37777777777");
4106ec465abSMichael Jones   }
4116ec465abSMichael Jones 
4126ec465abSMichael Jones   // Min Width Tests.
4136ec465abSMichael Jones 
4146ec465abSMichael Jones   written = __llvm_libc::sprintf(buff, "%4o", 0701);
4156ec465abSMichael Jones   EXPECT_EQ(written, 4);
4166ec465abSMichael Jones   ASSERT_STREQ(buff, " 701");
4176ec465abSMichael Jones 
4186ec465abSMichael Jones   written = __llvm_libc::sprintf(buff, "%2o", 0107);
4196ec465abSMichael Jones   EXPECT_EQ(written, 3);
4206ec465abSMichael Jones   ASSERT_STREQ(buff, "107");
4216ec465abSMichael Jones 
4226ec465abSMichael Jones   // Precision Tests.
4236ec465abSMichael Jones 
4246ec465abSMichael Jones   written = __llvm_libc::sprintf(buff, "%o", 0);
4256ec465abSMichael Jones   EXPECT_EQ(written, 1);
4266ec465abSMichael Jones   ASSERT_STREQ(buff, "0");
4276ec465abSMichael Jones 
4286ec465abSMichael Jones   written = __llvm_libc::sprintf(buff, "%.0o", 0);
4296ec465abSMichael Jones   EXPECT_EQ(written, 0);
4306ec465abSMichael Jones   ASSERT_STREQ(buff, "");
4316ec465abSMichael Jones 
4326ec465abSMichael Jones   written = __llvm_libc::sprintf(buff, "%.5o", 0153);
4336ec465abSMichael Jones   EXPECT_EQ(written, 5);
4346ec465abSMichael Jones   ASSERT_STREQ(buff, "00153");
4356ec465abSMichael Jones 
4366ec465abSMichael Jones   written = __llvm_libc::sprintf(buff, "%.2o", 0135);
4376ec465abSMichael Jones   EXPECT_EQ(written, 3);
4386ec465abSMichael Jones   ASSERT_STREQ(buff, "135");
4396ec465abSMichael Jones 
4406ec465abSMichael Jones   // Flag Tests.
4416ec465abSMichael Jones 
4426ec465abSMichael Jones   written = __llvm_libc::sprintf(buff, "%-5o", 0246);
4436ec465abSMichael Jones   EXPECT_EQ(written, 5);
4446ec465abSMichael Jones   ASSERT_STREQ(buff, "246  ");
4456ec465abSMichael Jones 
4466ec465abSMichael Jones   written = __llvm_libc::sprintf(buff, "%#o", 0234);
4476ec465abSMichael Jones   EXPECT_EQ(written, 4);
4486ec465abSMichael Jones   ASSERT_STREQ(buff, "0234");
4496ec465abSMichael Jones 
4506ec465abSMichael Jones   written = __llvm_libc::sprintf(buff, "%05o", 0470);
4516ec465abSMichael Jones   EXPECT_EQ(written, 5);
4526ec465abSMichael Jones   ASSERT_STREQ(buff, "00470");
4536ec465abSMichael Jones 
4546ec465abSMichael Jones   written = __llvm_libc::sprintf(buff, "%0#6o", 0753);
4556ec465abSMichael Jones   EXPECT_EQ(written, 6);
4566ec465abSMichael Jones   ASSERT_STREQ(buff, "000753");
4576ec465abSMichael Jones 
4586ec465abSMichael Jones   written = __llvm_libc::sprintf(buff, "%-#6o", 0642);
4596ec465abSMichael Jones   EXPECT_EQ(written, 6);
4606ec465abSMichael Jones   ASSERT_STREQ(buff, "0642  ");
4616ec465abSMichael Jones 
4626ec465abSMichael Jones   // Combined Tests.
4636ec465abSMichael Jones 
4646ec465abSMichael Jones   written = __llvm_libc::sprintf(buff, "%#-07o", 0703);
4656ec465abSMichael Jones   EXPECT_EQ(written, 7);
4666ec465abSMichael Jones   ASSERT_STREQ(buff, "0703   ");
4676ec465abSMichael Jones 
4686ec465abSMichael Jones   written = __llvm_libc::sprintf(buff, "%7.5o", 0314);
4696ec465abSMichael Jones   EXPECT_EQ(written, 7);
4706ec465abSMichael Jones   ASSERT_STREQ(buff, "  00314");
4716ec465abSMichael Jones 
4726ec465abSMichael Jones   written = __llvm_libc::sprintf(buff, "%#9.5o", 0234);
4736ec465abSMichael Jones   EXPECT_EQ(written, 9);
4746ec465abSMichael Jones   ASSERT_STREQ(buff, "    00234");
4756ec465abSMichael Jones 
4766ec465abSMichael Jones   written = __llvm_libc::sprintf(buff, "%-7.5o", 0260);
4776ec465abSMichael Jones   EXPECT_EQ(written, 7);
4786ec465abSMichael Jones   ASSERT_STREQ(buff, "00260  ");
4796ec465abSMichael Jones 
4806ec465abSMichael Jones   written = __llvm_libc::sprintf(buff, "%5.4o", 010000);
4816ec465abSMichael Jones   EXPECT_EQ(written, 5);
4826ec465abSMichael Jones   ASSERT_STREQ(buff, "10000");
4836ec465abSMichael Jones 
4846ec465abSMichael Jones   // Multiple Conversion Tests.
4856ec465abSMichael Jones 
4866ec465abSMichael Jones   written = __llvm_libc::sprintf(buff, "%10o %-#10o", 0456, 0123);
4876ec465abSMichael Jones   EXPECT_EQ(written, 21);
4886ec465abSMichael Jones   ASSERT_STREQ(buff, "       456 0123      ");
4896ec465abSMichael Jones 
4906ec465abSMichael Jones   written = __llvm_libc::sprintf(buff, "%-5.4o%#.4o", 075, 025);
4916ec465abSMichael Jones   EXPECT_EQ(written, 9);
4926ec465abSMichael Jones   ASSERT_STREQ(buff, "0075 0025");
4936ec465abSMichael Jones 
4946ec465abSMichael Jones   written = __llvm_libc::sprintf(buff, "%04hho %#.5llo %-6.3zo", 256 + 077,
4956ec465abSMichael Jones                                  01000000000000ll, size_t(2));
4966ec465abSMichael Jones   EXPECT_EQ(written, 26);
4976ec465abSMichael Jones   ASSERT_STREQ(buff, "0077 01000000000000 002   ");
4986ec465abSMichael Jones }
4996ec465abSMichael Jones 
500f9f8693bSMichael Jones #ifndef LLVM_LIBC_PRINTF_DISABLE_FLOAT
501*3b3b816fSMichael Jones 
TEST_F(LlvmLibcSPrintfTest,FloatHexExpConv)502*3b3b816fSMichael Jones TEST_F(LlvmLibcSPrintfTest, FloatHexExpConv) {
503*3b3b816fSMichael Jones   __llvm_libc::testutils::ForceRoundingMode r(
504*3b3b816fSMichael Jones       __llvm_libc::testutils::RoundingMode::Nearest);
505f9f8693bSMichael Jones   double inf = __llvm_libc::fputil::FPBits<double>::inf().get_val();
506f9f8693bSMichael Jones   double nan = __llvm_libc::fputil::FPBits<double>::build_nan(1);
507f9f8693bSMichael Jones 
508f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%a", 1.0);
509f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1p+0");
510f9f8693bSMichael Jones 
511f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%A", -1.0);
512f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "-0X1P+0");
513f9f8693bSMichael Jones 
514f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%a", -0x1.abcdef12345p0);
515f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "-0x1.abcdef12345p+0");
516f9f8693bSMichael Jones 
517f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%A", 0x1.abcdef12345p0);
518f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0X1.ABCDEF12345P+0");
519f9f8693bSMichael Jones 
520f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%a", 0.0);
521f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0p+0");
522f9f8693bSMichael Jones 
523f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%a", 1.0e100);
524f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.249ad2594c37dp+332");
525f9f8693bSMichael Jones 
526f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%a", 0.1);
527f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.999999999999ap-4");
528f9f8693bSMichael Jones 
529f9f8693bSMichael Jones   // Subnormal Tests.
530f9f8693bSMichael Jones 
531f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%a", 0x1.0p-1027);
532f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0.08p-1022");
533f9f8693bSMichael Jones 
534f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%a", 0x1.0p-1025);
535f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0.2p-1022");
536f9f8693bSMichael Jones 
537f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%a", 0x1.0p-1023);
538f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0.8p-1022");
539f9f8693bSMichael Jones 
540f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%a", 0x1.0p-1022);
541f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1p-1022");
542f9f8693bSMichael Jones 
543f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%a", 0x1.0p-1074);
544f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0.0000000000001p-1022");
545f9f8693bSMichael Jones 
546f9f8693bSMichael Jones   // Inf/Nan Tests.
547f9f8693bSMichael Jones 
548f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%a", inf);
549f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "inf");
550f9f8693bSMichael Jones 
551f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%A", -inf);
552f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "-INF");
553f9f8693bSMichael Jones 
554f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%a", nan);
555f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "nan");
556f9f8693bSMichael Jones 
557f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%A", -nan);
558f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "-NAN");
559f9f8693bSMichael Jones 
560f9f8693bSMichael Jones   // Length Modifier Tests.
561f9f8693bSMichael Jones 
562f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%La", 0.1L);
563f9f8693bSMichael Jones #if defined(SPECIAL_X86_LONG_DOUBLE)
564f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0xc.ccccccccccccccdp-7");
565f9f8693bSMichael Jones #elif defined(LONG_DOUBLE_IS_DOUBLE)
566f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.999999999999ap-4");
567f9f8693bSMichael Jones #else // 128 bit long double
568f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.999999999999999999999999999ap-4");
569f9f8693bSMichael Jones #endif
570f9f8693bSMichael Jones 
571f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%La", 1.0e1000L);
572f9f8693bSMichael Jones #if defined(SPECIAL_X86_LONG_DOUBLE)
573f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0xf.38db1f9dd3dac05p+3318");
574f9f8693bSMichael Jones #elif defined(LONG_DOUBLE_IS_DOUBLE)
575f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "inf");
576f9f8693bSMichael Jones #else // 128 bit long double
577f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.e71b63f3ba7b580af1a52d2a7379p+3321");
578f9f8693bSMichael Jones #endif
579f9f8693bSMichael Jones 
580f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%La", 1.0e-1000L);
581f9f8693bSMichael Jones #if defined(SPECIAL_X86_LONG_DOUBLE)
582f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x8.68a9188a89e1467p-3325");
583f9f8693bSMichael Jones #elif defined(LONG_DOUBLE_IS_DOUBLE)
584f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0p+0");
585f9f8693bSMichael Jones #else // 128 bit long double
586f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.0d152311513c28ce202627c06ec2p-3322");
587f9f8693bSMichael Jones #endif
588f9f8693bSMichael Jones 
589f9f8693bSMichael Jones   // Min Width Tests.
590f9f8693bSMichael Jones 
591f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%15a", 1.0);
592f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "         0x1p+0");
593f9f8693bSMichael Jones 
594f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%15a", -1.0);
595f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "        -0x1p+0");
596f9f8693bSMichael Jones 
597f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%15a", 1.0e10);
598f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, " 0x1.2a05f2p+33");
599f9f8693bSMichael Jones 
600f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%15a", -1.0e10);
601f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "-0x1.2a05f2p+33");
602f9f8693bSMichael Jones 
603f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%10a", 1.0e10);
604f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.2a05f2p+33");
605f9f8693bSMichael Jones 
606f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%5a", inf);
607f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "  inf");
608f9f8693bSMichael Jones 
609f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%5a", -nan);
610f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, " -nan");
611f9f8693bSMichael Jones 
612f9f8693bSMichael Jones   // Precision Tests.
613f9f8693bSMichael Jones 
614f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%.1a", 1.0);
615f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.0p+0");
616f9f8693bSMichael Jones 
617f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%.1a", 0.0);
618f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0.0p+0");
619f9f8693bSMichael Jones 
620f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%.1a", 0.1);
621f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.ap-4");
622f9f8693bSMichael Jones 
623f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%.1a", 0x1.0fp0);
624f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.1p+0");
625f9f8693bSMichael Jones 
626f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%.1a", 0x1.07p0);
627f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.0p+0");
628f9f8693bSMichael Jones 
629f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%.1a", 0x1.08p0);
630f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.0p+0");
631f9f8693bSMichael Jones 
632f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%.1a", 0x1.18p0);
633f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.2p+0");
634f9f8693bSMichael Jones 
635f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%.1a", 0x1.ffp0);
636f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x2.0p+0");
637f9f8693bSMichael Jones 
638f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%.5a", 1.25);
639f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.40000p+0");
640f9f8693bSMichael Jones 
641f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%.0a", 1.25);
642f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1p+0");
643f9f8693bSMichael Jones 
644f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%.0a", 1.75);
645f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x2p+0");
646f9f8693bSMichael Jones 
647f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%.1a", 0x1.0p-1023);
648f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0.8p-1022");
649f9f8693bSMichael Jones 
650f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%.1a", 0x1.8p-1023);
651f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0.cp-1022");
652f9f8693bSMichael Jones 
653f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%.1a", 0x1.0p-1024);
654f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0.4p-1022");
655f9f8693bSMichael Jones 
656f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%.0a", 0x1.0p-1023);
657f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0p-1022");
658f9f8693bSMichael Jones 
659f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%.0a", 0x1.8p-1023);
660f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1p-1022");
661f9f8693bSMichael Jones 
662f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%.0a", 0x1.0p-1024);
663f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0p-1022");
664f9f8693bSMichael Jones 
665f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%.2a", 0x1.0p-1027);
666f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0.08p-1022");
667f9f8693bSMichael Jones 
668f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%.1a", 0x1.0p-1027);
669f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0.0p-1022");
670f9f8693bSMichael Jones 
671f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%.5a", 0.0);
672f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x0.00000p+0");
673f9f8693bSMichael Jones 
674f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%.5a", 0x1.008p0);
675f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.00800p+0");
676f9f8693bSMichael Jones 
677f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%.5a", 0x1.008p10);
678f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.00800p+10");
679f9f8693bSMichael Jones 
680f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%.5a", nan);
681f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "nan");
682f9f8693bSMichael Jones 
683f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%.1La", 0.1L);
684f9f8693bSMichael Jones #if defined(SPECIAL_X86_LONG_DOUBLE)
685f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0xc.dp-7");
686f9f8693bSMichael Jones #elif defined(LONG_DOUBLE_IS_DOUBLE)
687f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.ap-4");
688f9f8693bSMichael Jones #else // 128 bit long double
689f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.ap-4");
690f9f8693bSMichael Jones #endif
691f9f8693bSMichael Jones 
692f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%.1La", 0xf.fffffffffffffffp16380L);
693f9f8693bSMichael Jones #if defined(SPECIAL_X86_LONG_DOUBLE)
694f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.0p+16384");
695f9f8693bSMichael Jones #elif defined(LONG_DOUBLE_IS_DOUBLE)
696f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "inf");
697f9f8693bSMichael Jones #else // 128 bit long double
698f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x2.0p+16383");
699f9f8693bSMichael Jones #endif
700f9f8693bSMichael Jones 
701*3b3b816fSMichael Jones   // Rounding Mode Tests.
702*3b3b816fSMichael Jones 
703*3b3b816fSMichael Jones   {
704*3b3b816fSMichael Jones     __llvm_libc::testutils::ForceRoundingMode r(
705*3b3b816fSMichael Jones         __llvm_libc::testutils::RoundingMode::Nearest);
706*3b3b816fSMichael Jones 
707*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", 0x1.08p0);
708*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.0p+0");
709*3b3b816fSMichael Jones 
710*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", 0x1.18p0);
711*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.2p+0");
712*3b3b816fSMichael Jones 
713*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", 0x1.04p0);
714*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.0p+0");
715*3b3b816fSMichael Jones 
716*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", 0x1.14p0);
717*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.1p+0");
718*3b3b816fSMichael Jones 
719*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", -0x1.08p0);
720*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.0p+0");
721*3b3b816fSMichael Jones 
722*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", -0x1.18p0);
723*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.2p+0");
724*3b3b816fSMichael Jones 
725*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", -0x1.04p0);
726*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.0p+0");
727*3b3b816fSMichael Jones 
728*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", -0x1.14p0);
729*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0");
730*3b3b816fSMichael Jones   }
731*3b3b816fSMichael Jones 
732*3b3b816fSMichael Jones   {
733*3b3b816fSMichael Jones     __llvm_libc::testutils::ForceRoundingMode r(
734*3b3b816fSMichael Jones         __llvm_libc::testutils::RoundingMode::Upward);
735*3b3b816fSMichael Jones 
736*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", 0x1.08p0);
737*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.1p+0");
738*3b3b816fSMichael Jones 
739*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", 0x1.18p0);
740*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.2p+0");
741*3b3b816fSMichael Jones 
742*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", 0x1.04p0);
743*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.1p+0");
744*3b3b816fSMichael Jones 
745*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", 0x1.14p0);
746*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.2p+0");
747*3b3b816fSMichael Jones 
748*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", -0x1.08p0);
749*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.0p+0");
750*3b3b816fSMichael Jones 
751*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", -0x1.18p0);
752*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0");
753*3b3b816fSMichael Jones 
754*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", -0x1.04p0);
755*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.0p+0");
756*3b3b816fSMichael Jones 
757*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", -0x1.14p0);
758*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0");
759*3b3b816fSMichael Jones   }
760*3b3b816fSMichael Jones 
761*3b3b816fSMichael Jones   {
762*3b3b816fSMichael Jones     __llvm_libc::testutils::ForceRoundingMode r(
763*3b3b816fSMichael Jones         __llvm_libc::testutils::RoundingMode::Downward);
764*3b3b816fSMichael Jones 
765*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", 0x1.08p0);
766*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.0p+0");
767*3b3b816fSMichael Jones 
768*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", 0x1.18p0);
769*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.1p+0");
770*3b3b816fSMichael Jones 
771*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", 0x1.04p0);
772*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.0p+0");
773*3b3b816fSMichael Jones 
774*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", 0x1.14p0);
775*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.1p+0");
776*3b3b816fSMichael Jones 
777*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", -0x1.08p0);
778*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0");
779*3b3b816fSMichael Jones 
780*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", -0x1.18p0);
781*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.2p+0");
782*3b3b816fSMichael Jones 
783*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", -0x1.04p0);
784*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0");
785*3b3b816fSMichael Jones 
786*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", -0x1.14p0);
787*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.2p+0");
788*3b3b816fSMichael Jones   }
789*3b3b816fSMichael Jones 
790*3b3b816fSMichael Jones   {
791*3b3b816fSMichael Jones     __llvm_libc::testutils::ForceRoundingMode r(
792*3b3b816fSMichael Jones         __llvm_libc::testutils::RoundingMode::TowardZero);
793*3b3b816fSMichael Jones 
794*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", 0x1.08p0);
795*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.0p+0");
796*3b3b816fSMichael Jones 
797*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", 0x1.18p0);
798*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.1p+0");
799*3b3b816fSMichael Jones 
800*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", 0x1.04p0);
801*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.0p+0");
802*3b3b816fSMichael Jones 
803*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", 0x1.14p0);
804*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "0x1.1p+0");
805*3b3b816fSMichael Jones 
806*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", -0x1.08p0);
807*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.0p+0");
808*3b3b816fSMichael Jones 
809*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", -0x1.18p0);
810*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0");
811*3b3b816fSMichael Jones 
812*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", -0x1.04p0);
813*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.0p+0");
814*3b3b816fSMichael Jones 
815*3b3b816fSMichael Jones     written = __llvm_libc::sprintf(buff, "%.1a", -0x1.14p0);
816*3b3b816fSMichael Jones     ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0");
817*3b3b816fSMichael Jones   }
818*3b3b816fSMichael Jones 
819f9f8693bSMichael Jones   // Flag Tests.
820f9f8693bSMichael Jones 
821f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%+a", nan);
822f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "+nan");
823f9f8693bSMichael Jones 
824f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "% A", inf);
825f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, " INF");
826f9f8693bSMichael Jones 
827f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%-5a", inf);
828f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "inf  ");
829f9f8693bSMichael Jones 
830f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%+-5A", nan);
831f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "+NAN ");
832f9f8693bSMichael Jones 
833f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%+a", 1.0);
834f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "+0x1p+0");
835f9f8693bSMichael Jones 
836f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "% a", 0.0);
837f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, " 0x0p+0");
838f9f8693bSMichael Jones 
839f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%-10a", 1.5);
840f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.8p+0  ");
841f9f8693bSMichael Jones 
842f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%#a", 1.0);
843f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x1.p+0");
844f9f8693bSMichael Jones 
845f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%#.0a", 1.5);
846f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x2.p+0");
847f9f8693bSMichael Jones 
848f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%010a", 1.5);
849f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "0x001.8p+0");
850f9f8693bSMichael Jones 
851f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%+- #0a", 0.0);
852f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "+0x0.p+0");
853f9f8693bSMichael Jones 
854f9f8693bSMichael Jones   // Combined Tests.
855f9f8693bSMichael Jones 
856f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%12.3a %-12.3A", 0.1, 256.0);
857f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "  0x1.99ap-4 0X1.000P+8  ");
858f9f8693bSMichael Jones 
859f9f8693bSMichael Jones   written = __llvm_libc::sprintf(buff, "%+-#12.3a % 012.3a", 0.1256, 1256.0);
860f9f8693bSMichael Jones   ASSERT_STREQ_LEN(written, buff, "+0x1.014p-3   0x1.3a0p+10");
861f9f8693bSMichael Jones }
862f9f8693bSMichael Jones #endif // LLVM_LIBC_PRINTF_DISABLE_FLOAT
863f9f8693bSMichael Jones 
86488b80139SMichael Jones #ifndef LLVM_LIBC_PRINTF_DISABLE_WRITE_INT
TEST(LlvmLibcSPrintfTest,WriteIntConv)86588b80139SMichael Jones TEST(LlvmLibcSPrintfTest, WriteIntConv) {
86688b80139SMichael Jones   char buff[64];
86788b80139SMichael Jones   int written;
86888b80139SMichael Jones   int test_val = -1;
86988b80139SMichael Jones 
87088b80139SMichael Jones   test_val = -1;
87188b80139SMichael Jones   written = __llvm_libc::sprintf(buff, "12345%n67890", &test_val);
87288b80139SMichael Jones   EXPECT_EQ(written, 10);
87388b80139SMichael Jones   EXPECT_EQ(test_val, 5);
87488b80139SMichael Jones   ASSERT_STREQ(buff, "1234567890");
87588b80139SMichael Jones 
87688b80139SMichael Jones   test_val = -1;
87788b80139SMichael Jones   written = __llvm_libc::sprintf(buff, "%n", &test_val);
87888b80139SMichael Jones   EXPECT_EQ(written, 0);
87988b80139SMichael Jones   EXPECT_EQ(test_val, 0);
88088b80139SMichael Jones   ASSERT_STREQ(buff, "");
88188b80139SMichael Jones 
88288b80139SMichael Jones   test_val = 0x100;
88388b80139SMichael Jones   written = __llvm_libc::sprintf(buff, "ABC%hhnDEF", &test_val);
88488b80139SMichael Jones   EXPECT_EQ(written, 6);
88588b80139SMichael Jones   EXPECT_EQ(test_val, 0x103);
88688b80139SMichael Jones   ASSERT_STREQ(buff, "ABCDEF");
88788b80139SMichael Jones 
88888b80139SMichael Jones   test_val = -1;
88988b80139SMichael Jones   written = __llvm_libc::sprintf(buff, "%s%n", "87654321", &test_val);
89088b80139SMichael Jones   EXPECT_EQ(written, 8);
89188b80139SMichael Jones   EXPECT_EQ(test_val, 8);
89288b80139SMichael Jones   ASSERT_STREQ(buff, "87654321");
89388b80139SMichael Jones 
89488b80139SMichael Jones   written = __llvm_libc::sprintf(buff, "abc123%n", nullptr);
89588b80139SMichael Jones   EXPECT_LT(written, 0);
89688b80139SMichael Jones }
89788b80139SMichael Jones #endif // LLVM_LIBC_PRINTF_DISABLE_WRITE_INT
89888b80139SMichael Jones 
899ff6fe39eSMichael Jones #ifndef LLVM_LIBC_PRINTF_DISABLE_INDEX_MODE
TEST(LlvmLibcSPrintfTest,IndexModeParsing)900ff6fe39eSMichael Jones TEST(LlvmLibcSPrintfTest, IndexModeParsing) {
901ff6fe39eSMichael Jones   char buff[64];
902ff6fe39eSMichael Jones   int written;
903ff6fe39eSMichael Jones 
904ff6fe39eSMichael Jones   written = __llvm_libc::sprintf(buff, "%1$s", "abcDEF123");
905ff6fe39eSMichael Jones   EXPECT_EQ(written, 9);
906ff6fe39eSMichael Jones   ASSERT_STREQ(buff, "abcDEF123");
907ff6fe39eSMichael Jones 
908ff6fe39eSMichael Jones   written = __llvm_libc::sprintf(buff, "%1$s %%", "abcDEF123");
909ff6fe39eSMichael Jones   EXPECT_EQ(written, 11);
910ff6fe39eSMichael Jones   ASSERT_STREQ(buff, "abcDEF123 %");
911ff6fe39eSMichael Jones 
912ff6fe39eSMichael Jones   written =
913ff6fe39eSMichael Jones       __llvm_libc::sprintf(buff, "%3$s %1$s %2$s", "is", "hard", "ordering");
914ff6fe39eSMichael Jones   EXPECT_EQ(written, 16);
915ff6fe39eSMichael Jones   ASSERT_STREQ(buff, "ordering is hard");
916ff6fe39eSMichael Jones 
917ff6fe39eSMichael Jones   written = __llvm_libc::sprintf(
918ff6fe39eSMichael Jones       buff, "%10$s %9$s %8$c %7$s %6$s, %6$s %5$s %4$-*1$s %3$.*11$s %2$s. %%",
919ff6fe39eSMichael Jones       6, "pain", "alphabetical", "such", "is", "this", "do", 'u', "would",
920ff6fe39eSMichael Jones       "why", 1);
921ff6fe39eSMichael Jones   EXPECT_EQ(written, 45);
922ff6fe39eSMichael Jones   ASSERT_STREQ(buff, "why would u do this, this is such   a pain. %");
923ff6fe39eSMichael Jones }
924ff6fe39eSMichael Jones #endif // LLVM_LIBC_PRINTF_DISABLE_INDEX_MODE
925