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 
11ff6fe39eSMichael Jones #include "utils/UnitTest/Test.h"
12ff6fe39eSMichael Jones 
13ff6fe39eSMichael Jones TEST(LlvmLibcSPrintfTest, SimpleNoConv) {
14ff6fe39eSMichael Jones   char buff[64];
15ff6fe39eSMichael Jones   int written;
16ff6fe39eSMichael Jones 
17ff6fe39eSMichael Jones   written = __llvm_libc::sprintf(buff, "A simple string with no conversions.");
18ff6fe39eSMichael Jones   EXPECT_EQ(written, 36);
19ff6fe39eSMichael Jones   ASSERT_STREQ(buff, "A simple string with no conversions.");
20ff6fe39eSMichael Jones }
21ff6fe39eSMichael Jones 
22ff6fe39eSMichael Jones TEST(LlvmLibcSPrintfTest, PercentConv) {
23ff6fe39eSMichael Jones   char buff[64];
24ff6fe39eSMichael Jones   int written;
25ff6fe39eSMichael Jones 
26ff6fe39eSMichael Jones   written = __llvm_libc::sprintf(buff, "%%");
27ff6fe39eSMichael Jones   EXPECT_EQ(written, 1);
28ff6fe39eSMichael Jones   ASSERT_STREQ(buff, "%");
29ff6fe39eSMichael Jones 
30ff6fe39eSMichael Jones   written = __llvm_libc::sprintf(buff, "abc %% def");
31ff6fe39eSMichael Jones   EXPECT_EQ(written, 9);
32ff6fe39eSMichael Jones   ASSERT_STREQ(buff, "abc % def");
33ff6fe39eSMichael Jones 
34ff6fe39eSMichael Jones   written = __llvm_libc::sprintf(buff, "%%%%%%");
35ff6fe39eSMichael Jones   EXPECT_EQ(written, 3);
36ff6fe39eSMichael Jones   ASSERT_STREQ(buff, "%%%");
37ff6fe39eSMichael Jones }
38ff6fe39eSMichael Jones 
39ff6fe39eSMichael Jones TEST(LlvmLibcSPrintfTest, CharConv) {
40ff6fe39eSMichael Jones   char buff[64];
41ff6fe39eSMichael Jones   int written;
42ff6fe39eSMichael Jones 
43ff6fe39eSMichael Jones   written = __llvm_libc::sprintf(buff, "%c", 'a');
44ff6fe39eSMichael Jones   EXPECT_EQ(written, 1);
45ff6fe39eSMichael Jones   ASSERT_STREQ(buff, "a");
46ff6fe39eSMichael Jones 
47ff6fe39eSMichael Jones   written = __llvm_libc::sprintf(buff, "%3c %-3c", '1', '2');
48ff6fe39eSMichael Jones   EXPECT_EQ(written, 7);
49ff6fe39eSMichael Jones   ASSERT_STREQ(buff, "  1 2  ");
50ff6fe39eSMichael Jones 
51ff6fe39eSMichael Jones   written = __llvm_libc::sprintf(buff, "%*c", 2, '3');
52ff6fe39eSMichael Jones   EXPECT_EQ(written, 2);
53ff6fe39eSMichael Jones   ASSERT_STREQ(buff, " 3");
54ff6fe39eSMichael Jones }
55ff6fe39eSMichael Jones 
56ff6fe39eSMichael Jones TEST(LlvmLibcSPrintfTest, StringConv) {
57ff6fe39eSMichael Jones   char buff[64];
58ff6fe39eSMichael Jones   int written;
59ff6fe39eSMichael Jones 
60ff6fe39eSMichael Jones   written = __llvm_libc::sprintf(buff, "%s", "abcDEF123");
61ff6fe39eSMichael Jones   EXPECT_EQ(written, 9);
62ff6fe39eSMichael Jones   ASSERT_STREQ(buff, "abcDEF123");
63ff6fe39eSMichael Jones 
64ff6fe39eSMichael Jones   written = __llvm_libc::sprintf(buff, "%10s %-10s", "centered", "title");
65ff6fe39eSMichael Jones   EXPECT_EQ(written, 21);
66ff6fe39eSMichael Jones   ASSERT_STREQ(buff, "  centered title     ");
67ff6fe39eSMichael Jones 
68ff6fe39eSMichael Jones   written = __llvm_libc::sprintf(buff, "%-5.4s%-4.4s", "words can describe",
69ff6fe39eSMichael Jones                                  "soups most delicious");
70ff6fe39eSMichael Jones   EXPECT_EQ(written, 9);
71ff6fe39eSMichael Jones   ASSERT_STREQ(buff, "word soup");
72ff6fe39eSMichael Jones 
73ff6fe39eSMichael Jones   written = __llvm_libc::sprintf(buff, "%*s %.*s %*.*s", 10, "beginning", 2,
74ff6fe39eSMichael Jones                                  "isn't", 12, 10, "important. Ever.");
75ff6fe39eSMichael Jones   EXPECT_EQ(written, 26);
76ff6fe39eSMichael Jones   ASSERT_STREQ(buff, " beginning is   important.");
77ff6fe39eSMichael Jones }
78ff6fe39eSMichael Jones 
791be3669dSMichael Jones TEST(LlvmLibcSPrintfTest, IntConv) {
801be3669dSMichael Jones   char buff[64];
811be3669dSMichael Jones   int written;
821be3669dSMichael Jones 
831be3669dSMichael Jones   // Basic Tests.
841be3669dSMichael Jones 
851be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%d", 123);
861be3669dSMichael Jones   EXPECT_EQ(written, 3);
871be3669dSMichael Jones   ASSERT_STREQ(buff, "123");
881be3669dSMichael Jones 
891be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%i", -456);
901be3669dSMichael Jones   EXPECT_EQ(written, 4);
911be3669dSMichael Jones   ASSERT_STREQ(buff, "-456");
921be3669dSMichael Jones 
931be3669dSMichael Jones   // Length Modifier Tests.
941be3669dSMichael Jones 
951be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%hhu", 257); // 0x10001
961be3669dSMichael Jones   EXPECT_EQ(written, 1);
971be3669dSMichael Jones   ASSERT_STREQ(buff, "1");
981be3669dSMichael Jones 
991be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%llu", 18446744073709551615ull);
1001be3669dSMichael Jones   EXPECT_EQ(written, 20);
1011be3669dSMichael Jones   ASSERT_STREQ(buff, "18446744073709551615"); // ull max
1021be3669dSMichael Jones 
1031be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%tu", ~ptrdiff_t(0));
1041be3669dSMichael Jones   if (sizeof(ptrdiff_t) == 8) {
1051be3669dSMichael Jones     EXPECT_EQ(written, 20);
1061be3669dSMichael Jones     ASSERT_STREQ(buff, "18446744073709551615");
1071be3669dSMichael Jones   } else if (sizeof(ptrdiff_t) == 4) {
1081be3669dSMichael Jones     EXPECT_EQ(written, 10);
1091be3669dSMichael Jones     ASSERT_STREQ(buff, "4294967296");
1101be3669dSMichael Jones   }
1111be3669dSMichael Jones 
1121be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%lld", -9223372036854775807ll - 1ll);
1131be3669dSMichael Jones   EXPECT_EQ(written, 20);
1141be3669dSMichael Jones   ASSERT_STREQ(buff, "-9223372036854775808"); // ll min
1151be3669dSMichael Jones 
1161be3669dSMichael Jones   // Min Width Tests.
1171be3669dSMichael Jones 
1181be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%4d", 789);
1191be3669dSMichael Jones   EXPECT_EQ(written, 4);
1201be3669dSMichael Jones   ASSERT_STREQ(buff, " 789");
1211be3669dSMichael Jones 
1221be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%2d", 987);
1231be3669dSMichael Jones   EXPECT_EQ(written, 3);
1241be3669dSMichael Jones   ASSERT_STREQ(buff, "987");
1251be3669dSMichael Jones 
1261be3669dSMichael Jones   // Precision Tests.
1271be3669dSMichael Jones 
1281be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%d", 0);
1291be3669dSMichael Jones   EXPECT_EQ(written, 1);
1301be3669dSMichael Jones   ASSERT_STREQ(buff, "0");
1311be3669dSMichael Jones 
1321be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%.0d", 0);
1331be3669dSMichael Jones   EXPECT_EQ(written, 0);
1341be3669dSMichael Jones   ASSERT_STREQ(buff, "");
1351be3669dSMichael Jones 
1361be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%.5d", 654);
1371be3669dSMichael Jones   EXPECT_EQ(written, 5);
1381be3669dSMichael Jones   ASSERT_STREQ(buff, "00654");
1391be3669dSMichael Jones 
1401be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%.5d", -321);
1411be3669dSMichael Jones   EXPECT_EQ(written, 6);
1421be3669dSMichael Jones   ASSERT_STREQ(buff, "-00321");
1431be3669dSMichael Jones 
1441be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%.2d", 135);
1451be3669dSMichael Jones   EXPECT_EQ(written, 3);
1461be3669dSMichael Jones   ASSERT_STREQ(buff, "135");
1471be3669dSMichael Jones 
1481be3669dSMichael Jones   // Flag Tests.
1491be3669dSMichael Jones 
1501be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%.5d", -321);
1511be3669dSMichael Jones   EXPECT_EQ(written, 6);
1521be3669dSMichael Jones   ASSERT_STREQ(buff, "-00321");
1531be3669dSMichael Jones 
1541be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%-5d", 246);
1551be3669dSMichael Jones   EXPECT_EQ(written, 5);
1561be3669dSMichael Jones   ASSERT_STREQ(buff, "246  ");
1571be3669dSMichael Jones 
1581be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%-5d", -147);
1591be3669dSMichael Jones   EXPECT_EQ(written, 5);
1601be3669dSMichael Jones   ASSERT_STREQ(buff, "-147 ");
1611be3669dSMichael Jones 
1621be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%+d", 258);
1631be3669dSMichael Jones   EXPECT_EQ(written, 4);
1641be3669dSMichael Jones   ASSERT_STREQ(buff, "+258");
1651be3669dSMichael Jones 
1661be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "% d", 369);
1671be3669dSMichael Jones   EXPECT_EQ(written, 4);
1681be3669dSMichael Jones   ASSERT_STREQ(buff, " 369");
1691be3669dSMichael Jones 
1701be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%05d", 470);
1711be3669dSMichael Jones   EXPECT_EQ(written, 5);
1721be3669dSMichael Jones   ASSERT_STREQ(buff, "00470");
1731be3669dSMichael Jones 
1741be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%05d", -581);
1751be3669dSMichael Jones   EXPECT_EQ(written, 5);
1761be3669dSMichael Jones   ASSERT_STREQ(buff, "-0581");
1771be3669dSMichael Jones 
1781be3669dSMichael Jones   // Combined Tests.
1791be3669dSMichael Jones 
1801be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%+ u", 692);
1811be3669dSMichael Jones   EXPECT_EQ(written, 3);
1821be3669dSMichael Jones   ASSERT_STREQ(buff, "692");
1831be3669dSMichael Jones 
1841be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%+ -05d", 703);
1851be3669dSMichael Jones   EXPECT_EQ(written, 5);
1861be3669dSMichael Jones   ASSERT_STREQ(buff, "+703 ");
1871be3669dSMichael Jones 
1881be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%7.5d", 814);
1891be3669dSMichael Jones   EXPECT_EQ(written, 7);
1901be3669dSMichael Jones   ASSERT_STREQ(buff, "  00814");
1911be3669dSMichael Jones 
1921be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%7.5d", -925);
1931be3669dSMichael Jones   EXPECT_EQ(written, 7);
1941be3669dSMichael Jones   ASSERT_STREQ(buff, " -00925");
1951be3669dSMichael Jones 
1961be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%7.5d", 159);
1971be3669dSMichael Jones   EXPECT_EQ(written, 7);
1981be3669dSMichael Jones   ASSERT_STREQ(buff, "  00159");
1991be3669dSMichael Jones 
2001be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "% -7.5d", 260);
2011be3669dSMichael Jones   EXPECT_EQ(written, 7);
2021be3669dSMichael Jones   ASSERT_STREQ(buff, " 00260 ");
2031be3669dSMichael Jones 
2041be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%5.4d", 10000);
2051be3669dSMichael Jones   EXPECT_EQ(written, 5);
2061be3669dSMichael Jones   ASSERT_STREQ(buff, "10000");
2071be3669dSMichael Jones 
2081be3669dSMichael Jones   // Multiple Conversion Tests.
2091be3669dSMichael Jones 
2101be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%10d %-10d", 456, -789);
2111be3669dSMichael Jones   EXPECT_EQ(written, 21);
2121be3669dSMichael Jones   ASSERT_STREQ(buff, "       456 -789      ");
2131be3669dSMichael Jones 
2141be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "%-5.4d%+.4u", 75, 25);
2151be3669dSMichael Jones   EXPECT_EQ(written, 9);
2161be3669dSMichael Jones   ASSERT_STREQ(buff, "0075 0025");
2171be3669dSMichael Jones 
2181be3669dSMichael Jones   written = __llvm_libc::sprintf(buff, "% 05hhi %+-0.5llu %-+ 06.3zd",
2191be3669dSMichael Jones                                  256 + 127, 68719476736ll, size_t(2));
2201be3669dSMichael Jones   EXPECT_EQ(written, 24);
2211be3669dSMichael Jones   ASSERT_STREQ(buff, " 0127 68719476736 +002  ");
2221be3669dSMichael Jones }
2231be3669dSMichael Jones 
224*652ecb25SMichael Jones TEST(LlvmLibcSPrintfTest, HexConv) {
225*652ecb25SMichael Jones   char buff[64];
226*652ecb25SMichael Jones   int written;
227*652ecb25SMichael Jones 
228*652ecb25SMichael Jones   // Basic Tests.
229*652ecb25SMichael Jones 
230*652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%x", 0x123a);
231*652ecb25SMichael Jones   EXPECT_EQ(written, 4);
232*652ecb25SMichael Jones   ASSERT_STREQ(buff, "123a");
233*652ecb25SMichael Jones 
234*652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%X", 0x456b);
235*652ecb25SMichael Jones   EXPECT_EQ(written, 4);
236*652ecb25SMichael Jones   ASSERT_STREQ(buff, "456B");
237*652ecb25SMichael Jones 
238*652ecb25SMichael Jones   // Length Modifier Tests.
239*652ecb25SMichael Jones 
240*652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%hhx", 0x10001);
241*652ecb25SMichael Jones   EXPECT_EQ(written, 1);
242*652ecb25SMichael Jones   ASSERT_STREQ(buff, "1");
243*652ecb25SMichael Jones 
244*652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%llx", 0xffffffffffffffffull);
245*652ecb25SMichael Jones   EXPECT_EQ(written, 16);
246*652ecb25SMichael Jones   ASSERT_STREQ(buff, "ffffffffffffffff"); // ull max
247*652ecb25SMichael Jones 
248*652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%tX", ~ptrdiff_t(0));
249*652ecb25SMichael Jones   if (sizeof(ptrdiff_t) == 8) {
250*652ecb25SMichael Jones     EXPECT_EQ(written, 16);
251*652ecb25SMichael Jones     ASSERT_STREQ(buff, "FFFFFFFFFFFFFFFF");
252*652ecb25SMichael Jones   } else if (sizeof(ptrdiff_t) == 4) {
253*652ecb25SMichael Jones     EXPECT_EQ(written, 8);
254*652ecb25SMichael Jones     ASSERT_STREQ(buff, "FFFFFFFF");
255*652ecb25SMichael Jones   }
256*652ecb25SMichael Jones 
257*652ecb25SMichael Jones   // Min Width Tests.
258*652ecb25SMichael Jones 
259*652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%4x", 0x789);
260*652ecb25SMichael Jones   EXPECT_EQ(written, 4);
261*652ecb25SMichael Jones   ASSERT_STREQ(buff, " 789");
262*652ecb25SMichael Jones 
263*652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%2X", 0x987);
264*652ecb25SMichael Jones   EXPECT_EQ(written, 3);
265*652ecb25SMichael Jones   ASSERT_STREQ(buff, "987");
266*652ecb25SMichael Jones 
267*652ecb25SMichael Jones   // Precision Tests.
268*652ecb25SMichael Jones 
269*652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%x", 0);
270*652ecb25SMichael Jones   EXPECT_EQ(written, 1);
271*652ecb25SMichael Jones   ASSERT_STREQ(buff, "0");
272*652ecb25SMichael Jones 
273*652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%.0x", 0);
274*652ecb25SMichael Jones   EXPECT_EQ(written, 0);
275*652ecb25SMichael Jones   ASSERT_STREQ(buff, "");
276*652ecb25SMichael Jones 
277*652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%.5x", 0x1F3);
278*652ecb25SMichael Jones   EXPECT_EQ(written, 5);
279*652ecb25SMichael Jones   ASSERT_STREQ(buff, "001f3");
280*652ecb25SMichael Jones 
281*652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%.2x", 0x135);
282*652ecb25SMichael Jones   EXPECT_EQ(written, 3);
283*652ecb25SMichael Jones   ASSERT_STREQ(buff, "135");
284*652ecb25SMichael Jones 
285*652ecb25SMichael Jones   // Flag Tests.
286*652ecb25SMichael Jones 
287*652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%-5x", 0x246);
288*652ecb25SMichael Jones   EXPECT_EQ(written, 5);
289*652ecb25SMichael Jones   ASSERT_STREQ(buff, "246  ");
290*652ecb25SMichael Jones 
291*652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%#x", 0xd3f);
292*652ecb25SMichael Jones   EXPECT_EQ(written, 5);
293*652ecb25SMichael Jones   ASSERT_STREQ(buff, "0xd3f");
294*652ecb25SMichael Jones 
295*652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%#X", 0xE40);
296*652ecb25SMichael Jones   EXPECT_EQ(written, 5);
297*652ecb25SMichael Jones   ASSERT_STREQ(buff, "0XE40");
298*652ecb25SMichael Jones 
299*652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%05x", 0x470);
300*652ecb25SMichael Jones   EXPECT_EQ(written, 5);
301*652ecb25SMichael Jones   ASSERT_STREQ(buff, "00470");
302*652ecb25SMichael Jones 
303*652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%0#6x", 0x8c3);
304*652ecb25SMichael Jones   EXPECT_EQ(written, 6);
305*652ecb25SMichael Jones   ASSERT_STREQ(buff, "0x08c3");
306*652ecb25SMichael Jones 
307*652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%-#6x", 0x5f0);
308*652ecb25SMichael Jones   EXPECT_EQ(written, 6);
309*652ecb25SMichael Jones   ASSERT_STREQ(buff, "0x5f0 ");
310*652ecb25SMichael Jones 
311*652ecb25SMichael Jones   // Combined Tests.
312*652ecb25SMichael Jones 
313*652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%#-07x", 0x703);
314*652ecb25SMichael Jones   EXPECT_EQ(written, 7);
315*652ecb25SMichael Jones   ASSERT_STREQ(buff, "0x703  ");
316*652ecb25SMichael Jones 
317*652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%7.5x", 0x814);
318*652ecb25SMichael Jones   EXPECT_EQ(written, 7);
319*652ecb25SMichael Jones   ASSERT_STREQ(buff, "  00814");
320*652ecb25SMichael Jones 
321*652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%#9.5X", 0x9d4);
322*652ecb25SMichael Jones   EXPECT_EQ(written, 9);
323*652ecb25SMichael Jones   ASSERT_STREQ(buff, "  0X009D4");
324*652ecb25SMichael Jones 
325*652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%-7.5x", 0x260);
326*652ecb25SMichael Jones   EXPECT_EQ(written, 7);
327*652ecb25SMichael Jones   ASSERT_STREQ(buff, "00260  ");
328*652ecb25SMichael Jones 
329*652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%5.4x", 0x10000);
330*652ecb25SMichael Jones   EXPECT_EQ(written, 5);
331*652ecb25SMichael Jones   ASSERT_STREQ(buff, "10000");
332*652ecb25SMichael Jones 
333*652ecb25SMichael Jones   // Multiple Conversion Tests.
334*652ecb25SMichael Jones 
335*652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%10X %-#10x", 0x45b, 0x789);
336*652ecb25SMichael Jones   EXPECT_EQ(written, 21);
337*652ecb25SMichael Jones   ASSERT_STREQ(buff, "       45B 0x789     ");
338*652ecb25SMichael Jones 
339*652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%-5.4x%#.4x", 0x75, 0x25);
340*652ecb25SMichael Jones   EXPECT_EQ(written, 11);
341*652ecb25SMichael Jones   ASSERT_STREQ(buff, "0075 0x0025");
342*652ecb25SMichael Jones 
343*652ecb25SMichael Jones   written = __llvm_libc::sprintf(buff, "%04hhX %#.5llx %-6.3zX", 256 + 0x7f,
344*652ecb25SMichael Jones                                  0x1000000000ll, size_t(2));
345*652ecb25SMichael Jones   EXPECT_EQ(written, 24);
346*652ecb25SMichael Jones   ASSERT_STREQ(buff, "007F 0x1000000000 002   ");
347*652ecb25SMichael Jones }
348*652ecb25SMichael Jones 
349ff6fe39eSMichael Jones #ifndef LLVM_LIBC_PRINTF_DISABLE_INDEX_MODE
350ff6fe39eSMichael Jones TEST(LlvmLibcSPrintfTest, IndexModeParsing) {
351ff6fe39eSMichael Jones   char buff[64];
352ff6fe39eSMichael Jones   int written;
353ff6fe39eSMichael Jones 
354ff6fe39eSMichael Jones   written = __llvm_libc::sprintf(buff, "%1$s", "abcDEF123");
355ff6fe39eSMichael Jones   EXPECT_EQ(written, 9);
356ff6fe39eSMichael Jones   ASSERT_STREQ(buff, "abcDEF123");
357ff6fe39eSMichael Jones 
358ff6fe39eSMichael Jones   written = __llvm_libc::sprintf(buff, "%1$s %%", "abcDEF123");
359ff6fe39eSMichael Jones   EXPECT_EQ(written, 11);
360ff6fe39eSMichael Jones   ASSERT_STREQ(buff, "abcDEF123 %");
361ff6fe39eSMichael Jones 
362ff6fe39eSMichael Jones   written =
363ff6fe39eSMichael Jones       __llvm_libc::sprintf(buff, "%3$s %1$s %2$s", "is", "hard", "ordering");
364ff6fe39eSMichael Jones   EXPECT_EQ(written, 16);
365ff6fe39eSMichael Jones   ASSERT_STREQ(buff, "ordering is hard");
366ff6fe39eSMichael Jones 
367ff6fe39eSMichael Jones   written = __llvm_libc::sprintf(
368ff6fe39eSMichael Jones       buff, "%10$s %9$s %8$c %7$s %6$s, %6$s %5$s %4$-*1$s %3$.*11$s %2$s. %%",
369ff6fe39eSMichael Jones       6, "pain", "alphabetical", "such", "is", "this", "do", 'u', "would",
370ff6fe39eSMichael Jones       "why", 1);
371ff6fe39eSMichael Jones   EXPECT_EQ(written, 45);
372ff6fe39eSMichael Jones   ASSERT_STREQ(buff, "why would u do this, this is such   a pain. %");
373ff6fe39eSMichael Jones }
374ff6fe39eSMichael Jones #endif // LLVM_LIBC_PRINTF_DISABLE_INDEX_MODE
375