1 //===-- Unittests for sprintf ---------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "src/stdio/sprintf.h" 10 11 #include "src/__support/FPUtil/FPBits.h" 12 #include "src/__support/FPUtil/PlatformDefs.h" 13 #include "utils/UnitTest/Test.h" 14 #include "utils/testutils/RoundingModeUtils.h" 15 16 class LlvmLibcSPrintfTest : public __llvm_libc::testing::Test { 17 protected: 18 char buff[64]; 19 int written; 20 }; 21 22 // Subtract 1 from sizeof(expected_str) to account for the null byte. 23 #define ASSERT_STREQ_LEN(actual_written, actual_str, expected_str) \ 24 EXPECT_EQ(actual_written, static_cast<int>(sizeof(expected_str) - 1)); \ 25 EXPECT_STREQ(actual_str, expected_str); 26 27 TEST(LlvmLibcSPrintfTest, SimpleNoConv) { 28 char buff[64]; 29 int written; 30 31 written = __llvm_libc::sprintf(buff, "A simple string with no conversions."); 32 EXPECT_EQ(written, 36); 33 ASSERT_STREQ(buff, "A simple string with no conversions."); 34 } 35 36 TEST(LlvmLibcSPrintfTest, PercentConv) { 37 char buff[64]; 38 int written; 39 40 written = __llvm_libc::sprintf(buff, "%%"); 41 EXPECT_EQ(written, 1); 42 ASSERT_STREQ(buff, "%"); 43 44 written = __llvm_libc::sprintf(buff, "abc %% def"); 45 EXPECT_EQ(written, 9); 46 ASSERT_STREQ(buff, "abc % def"); 47 48 written = __llvm_libc::sprintf(buff, "%%%%%%"); 49 EXPECT_EQ(written, 3); 50 ASSERT_STREQ(buff, "%%%"); 51 } 52 53 TEST(LlvmLibcSPrintfTest, CharConv) { 54 char buff[64]; 55 int written; 56 57 written = __llvm_libc::sprintf(buff, "%c", 'a'); 58 EXPECT_EQ(written, 1); 59 ASSERT_STREQ(buff, "a"); 60 61 written = __llvm_libc::sprintf(buff, "%3c %-3c", '1', '2'); 62 EXPECT_EQ(written, 7); 63 ASSERT_STREQ(buff, " 1 2 "); 64 65 written = __llvm_libc::sprintf(buff, "%*c", 2, '3'); 66 EXPECT_EQ(written, 2); 67 ASSERT_STREQ(buff, " 3"); 68 } 69 70 TEST(LlvmLibcSPrintfTest, StringConv) { 71 char buff[64]; 72 int written; 73 74 written = __llvm_libc::sprintf(buff, "%s", "abcDEF123"); 75 EXPECT_EQ(written, 9); 76 ASSERT_STREQ(buff, "abcDEF123"); 77 78 written = __llvm_libc::sprintf(buff, "%10s %-10s", "centered", "title"); 79 EXPECT_EQ(written, 21); 80 ASSERT_STREQ(buff, " centered title "); 81 82 written = __llvm_libc::sprintf(buff, "%-5.4s%-4.4s", "words can describe", 83 "soups most delicious"); 84 EXPECT_EQ(written, 9); 85 ASSERT_STREQ(buff, "word soup"); 86 87 written = __llvm_libc::sprintf(buff, "%*s %.*s %*.*s", 10, "beginning", 2, 88 "isn't", 12, 10, "important. Ever."); 89 EXPECT_EQ(written, 26); 90 ASSERT_STREQ(buff, " beginning is important."); 91 } 92 93 TEST(LlvmLibcSPrintfTest, IntConv) { 94 char buff[64]; 95 int written; 96 97 // Basic Tests. 98 99 written = __llvm_libc::sprintf(buff, "%d", 123); 100 EXPECT_EQ(written, 3); 101 ASSERT_STREQ(buff, "123"); 102 103 written = __llvm_libc::sprintf(buff, "%i", -456); 104 EXPECT_EQ(written, 4); 105 ASSERT_STREQ(buff, "-456"); 106 107 // Length Modifier Tests. 108 109 written = __llvm_libc::sprintf(buff, "%hhu", 257); // 0x101 110 EXPECT_EQ(written, 1); 111 ASSERT_STREQ(buff, "1"); 112 113 written = __llvm_libc::sprintf(buff, "%llu", 18446744073709551615ull); 114 EXPECT_EQ(written, 20); 115 ASSERT_STREQ(buff, "18446744073709551615"); // ull max 116 117 written = __llvm_libc::sprintf(buff, "%tu", ~ptrdiff_t(0)); 118 if (sizeof(ptrdiff_t) == 8) { 119 EXPECT_EQ(written, 20); 120 ASSERT_STREQ(buff, "18446744073709551615"); 121 } else if (sizeof(ptrdiff_t) == 4) { 122 EXPECT_EQ(written, 10); 123 ASSERT_STREQ(buff, "4294967296"); 124 } 125 126 written = __llvm_libc::sprintf(buff, "%lld", -9223372036854775807ll - 1ll); 127 EXPECT_EQ(written, 20); 128 ASSERT_STREQ(buff, "-9223372036854775808"); // ll min 129 130 // Min Width Tests. 131 132 written = __llvm_libc::sprintf(buff, "%4d", 789); 133 EXPECT_EQ(written, 4); 134 ASSERT_STREQ(buff, " 789"); 135 136 written = __llvm_libc::sprintf(buff, "%2d", 987); 137 EXPECT_EQ(written, 3); 138 ASSERT_STREQ(buff, "987"); 139 140 // Precision Tests. 141 142 written = __llvm_libc::sprintf(buff, "%d", 0); 143 EXPECT_EQ(written, 1); 144 ASSERT_STREQ(buff, "0"); 145 146 written = __llvm_libc::sprintf(buff, "%.0d", 0); 147 EXPECT_EQ(written, 0); 148 ASSERT_STREQ(buff, ""); 149 150 written = __llvm_libc::sprintf(buff, "%.5d", 654); 151 EXPECT_EQ(written, 5); 152 ASSERT_STREQ(buff, "00654"); 153 154 written = __llvm_libc::sprintf(buff, "%.5d", -321); 155 EXPECT_EQ(written, 6); 156 ASSERT_STREQ(buff, "-00321"); 157 158 written = __llvm_libc::sprintf(buff, "%.2d", 135); 159 EXPECT_EQ(written, 3); 160 ASSERT_STREQ(buff, "135"); 161 162 // Flag Tests. 163 164 written = __llvm_libc::sprintf(buff, "%.5d", -321); 165 EXPECT_EQ(written, 6); 166 ASSERT_STREQ(buff, "-00321"); 167 168 written = __llvm_libc::sprintf(buff, "%-5d", 246); 169 EXPECT_EQ(written, 5); 170 ASSERT_STREQ(buff, "246 "); 171 172 written = __llvm_libc::sprintf(buff, "%-5d", -147); 173 EXPECT_EQ(written, 5); 174 ASSERT_STREQ(buff, "-147 "); 175 176 written = __llvm_libc::sprintf(buff, "%+d", 258); 177 EXPECT_EQ(written, 4); 178 ASSERT_STREQ(buff, "+258"); 179 180 written = __llvm_libc::sprintf(buff, "% d", 369); 181 EXPECT_EQ(written, 4); 182 ASSERT_STREQ(buff, " 369"); 183 184 written = __llvm_libc::sprintf(buff, "%05d", 470); 185 EXPECT_EQ(written, 5); 186 ASSERT_STREQ(buff, "00470"); 187 188 written = __llvm_libc::sprintf(buff, "%05d", -581); 189 EXPECT_EQ(written, 5); 190 ASSERT_STREQ(buff, "-0581"); 191 192 // Combined Tests. 193 194 written = __llvm_libc::sprintf(buff, "%+ u", 692); 195 EXPECT_EQ(written, 3); 196 ASSERT_STREQ(buff, "692"); 197 198 written = __llvm_libc::sprintf(buff, "%+ -05d", 703); 199 EXPECT_EQ(written, 5); 200 ASSERT_STREQ(buff, "+703 "); 201 202 written = __llvm_libc::sprintf(buff, "%7.5d", 814); 203 EXPECT_EQ(written, 7); 204 ASSERT_STREQ(buff, " 00814"); 205 206 written = __llvm_libc::sprintf(buff, "%7.5d", -925); 207 EXPECT_EQ(written, 7); 208 ASSERT_STREQ(buff, " -00925"); 209 210 written = __llvm_libc::sprintf(buff, "%7.5d", 159); 211 EXPECT_EQ(written, 7); 212 ASSERT_STREQ(buff, " 00159"); 213 214 written = __llvm_libc::sprintf(buff, "% -7.5d", 260); 215 EXPECT_EQ(written, 7); 216 ASSERT_STREQ(buff, " 00260 "); 217 218 written = __llvm_libc::sprintf(buff, "%5.4d", 10000); 219 EXPECT_EQ(written, 5); 220 ASSERT_STREQ(buff, "10000"); 221 222 // Multiple Conversion Tests. 223 224 written = __llvm_libc::sprintf(buff, "%10d %-10d", 456, -789); 225 EXPECT_EQ(written, 21); 226 ASSERT_STREQ(buff, " 456 -789 "); 227 228 written = __llvm_libc::sprintf(buff, "%-5.4d%+.4u", 75, 25); 229 EXPECT_EQ(written, 9); 230 ASSERT_STREQ(buff, "0075 0025"); 231 232 written = __llvm_libc::sprintf(buff, "% 05hhi %+-0.5llu %-+ 06.3zd", 233 256 + 127, 68719476736ll, size_t(2)); 234 EXPECT_EQ(written, 24); 235 ASSERT_STREQ(buff, " 0127 68719476736 +002 "); 236 } 237 238 TEST(LlvmLibcSPrintfTest, HexConv) { 239 char buff[64]; 240 int written; 241 242 // Basic Tests. 243 244 written = __llvm_libc::sprintf(buff, "%x", 0x123a); 245 EXPECT_EQ(written, 4); 246 ASSERT_STREQ(buff, "123a"); 247 248 written = __llvm_libc::sprintf(buff, "%X", 0x456b); 249 EXPECT_EQ(written, 4); 250 ASSERT_STREQ(buff, "456B"); 251 252 // Length Modifier Tests. 253 254 written = __llvm_libc::sprintf(buff, "%hhx", 0x10001); 255 EXPECT_EQ(written, 1); 256 ASSERT_STREQ(buff, "1"); 257 258 written = __llvm_libc::sprintf(buff, "%llx", 0xffffffffffffffffull); 259 EXPECT_EQ(written, 16); 260 ASSERT_STREQ(buff, "ffffffffffffffff"); // ull max 261 262 written = __llvm_libc::sprintf(buff, "%tX", ~ptrdiff_t(0)); 263 if (sizeof(ptrdiff_t) == 8) { 264 EXPECT_EQ(written, 16); 265 ASSERT_STREQ(buff, "FFFFFFFFFFFFFFFF"); 266 } else if (sizeof(ptrdiff_t) == 4) { 267 EXPECT_EQ(written, 8); 268 ASSERT_STREQ(buff, "FFFFFFFF"); 269 } 270 271 // Min Width Tests. 272 273 written = __llvm_libc::sprintf(buff, "%4x", 0x789); 274 EXPECT_EQ(written, 4); 275 ASSERT_STREQ(buff, " 789"); 276 277 written = __llvm_libc::sprintf(buff, "%2X", 0x987); 278 EXPECT_EQ(written, 3); 279 ASSERT_STREQ(buff, "987"); 280 281 // Precision Tests. 282 283 written = __llvm_libc::sprintf(buff, "%x", 0); 284 EXPECT_EQ(written, 1); 285 ASSERT_STREQ(buff, "0"); 286 287 written = __llvm_libc::sprintf(buff, "%.0x", 0); 288 EXPECT_EQ(written, 0); 289 ASSERT_STREQ(buff, ""); 290 291 written = __llvm_libc::sprintf(buff, "%.5x", 0x1F3); 292 EXPECT_EQ(written, 5); 293 ASSERT_STREQ(buff, "001f3"); 294 295 written = __llvm_libc::sprintf(buff, "%.2x", 0x135); 296 EXPECT_EQ(written, 3); 297 ASSERT_STREQ(buff, "135"); 298 299 // Flag Tests. 300 301 written = __llvm_libc::sprintf(buff, "%-5x", 0x246); 302 EXPECT_EQ(written, 5); 303 ASSERT_STREQ(buff, "246 "); 304 305 written = __llvm_libc::sprintf(buff, "%#x", 0xd3f); 306 EXPECT_EQ(written, 5); 307 ASSERT_STREQ(buff, "0xd3f"); 308 309 written = __llvm_libc::sprintf(buff, "%#X", 0xE40); 310 EXPECT_EQ(written, 5); 311 ASSERT_STREQ(buff, "0XE40"); 312 313 written = __llvm_libc::sprintf(buff, "%05x", 0x470); 314 EXPECT_EQ(written, 5); 315 ASSERT_STREQ(buff, "00470"); 316 317 written = __llvm_libc::sprintf(buff, "%0#6x", 0x8c3); 318 EXPECT_EQ(written, 6); 319 ASSERT_STREQ(buff, "0x08c3"); 320 321 written = __llvm_libc::sprintf(buff, "%-#6x", 0x5f0); 322 EXPECT_EQ(written, 6); 323 ASSERT_STREQ(buff, "0x5f0 "); 324 325 // Combined Tests. 326 327 written = __llvm_libc::sprintf(buff, "%#-07x", 0x703); 328 EXPECT_EQ(written, 7); 329 ASSERT_STREQ(buff, "0x703 "); 330 331 written = __llvm_libc::sprintf(buff, "%7.5x", 0x814); 332 EXPECT_EQ(written, 7); 333 ASSERT_STREQ(buff, " 00814"); 334 335 written = __llvm_libc::sprintf(buff, "%#9.5X", 0x9d4); 336 EXPECT_EQ(written, 9); 337 ASSERT_STREQ(buff, " 0X009D4"); 338 339 written = __llvm_libc::sprintf(buff, "%-7.5x", 0x260); 340 EXPECT_EQ(written, 7); 341 ASSERT_STREQ(buff, "00260 "); 342 343 written = __llvm_libc::sprintf(buff, "%5.4x", 0x10000); 344 EXPECT_EQ(written, 5); 345 ASSERT_STREQ(buff, "10000"); 346 347 // Multiple Conversion Tests. 348 349 written = __llvm_libc::sprintf(buff, "%10X %-#10x", 0x45b, 0x789); 350 EXPECT_EQ(written, 21); 351 ASSERT_STREQ(buff, " 45B 0x789 "); 352 353 written = __llvm_libc::sprintf(buff, "%-5.4x%#.4x", 0x75, 0x25); 354 EXPECT_EQ(written, 11); 355 ASSERT_STREQ(buff, "0075 0x0025"); 356 357 written = __llvm_libc::sprintf(buff, "%04hhX %#.5llx %-6.3zX", 256 + 0x7f, 358 0x1000000000ll, size_t(2)); 359 EXPECT_EQ(written, 24); 360 ASSERT_STREQ(buff, "007F 0x1000000000 002 "); 361 } 362 363 TEST(LlvmLibcSPrintfTest, PointerConv) { 364 char buff[64]; 365 int written; 366 367 written = __llvm_libc::sprintf(buff, "%p", nullptr); 368 EXPECT_EQ(written, 9); 369 ASSERT_STREQ(buff, "(nullptr)"); 370 371 written = __llvm_libc::sprintf(buff, "%p", 0x1a2b3c4d); 372 EXPECT_EQ(written, 10); 373 ASSERT_STREQ(buff, "0x1a2b3c4d"); 374 375 written = __llvm_libc::sprintf(buff, "%p", buff); 376 EXPECT_GT(written, 0); 377 } 378 379 TEST(LlvmLibcSPrintfTest, OctConv) { 380 char buff[64]; 381 int written; 382 383 // Basic Tests. 384 385 written = __llvm_libc::sprintf(buff, "%o", 01234); 386 EXPECT_EQ(written, 4); 387 ASSERT_STREQ(buff, "1234"); 388 389 written = __llvm_libc::sprintf(buff, "%o", 04567); 390 EXPECT_EQ(written, 4); 391 ASSERT_STREQ(buff, "4567"); 392 393 // Length Modifier Tests. 394 395 written = __llvm_libc::sprintf(buff, "%hho", 0401); 396 EXPECT_EQ(written, 1); 397 ASSERT_STREQ(buff, "1"); 398 399 written = __llvm_libc::sprintf(buff, "%llo", 01777777777777777777777ull); 400 EXPECT_EQ(written, 22); 401 ASSERT_STREQ(buff, "1777777777777777777777"); // ull max 402 403 written = __llvm_libc::sprintf(buff, "%to", ~ptrdiff_t(0)); 404 if (sizeof(ptrdiff_t) == 8) { 405 EXPECT_EQ(written, 22); 406 ASSERT_STREQ(buff, "1777777777777777777777"); 407 } else if (sizeof(ptrdiff_t) == 4) { 408 EXPECT_EQ(written, 11); 409 ASSERT_STREQ(buff, "37777777777"); 410 } 411 412 // Min Width Tests. 413 414 written = __llvm_libc::sprintf(buff, "%4o", 0701); 415 EXPECT_EQ(written, 4); 416 ASSERT_STREQ(buff, " 701"); 417 418 written = __llvm_libc::sprintf(buff, "%2o", 0107); 419 EXPECT_EQ(written, 3); 420 ASSERT_STREQ(buff, "107"); 421 422 // Precision Tests. 423 424 written = __llvm_libc::sprintf(buff, "%o", 0); 425 EXPECT_EQ(written, 1); 426 ASSERT_STREQ(buff, "0"); 427 428 written = __llvm_libc::sprintf(buff, "%.0o", 0); 429 EXPECT_EQ(written, 0); 430 ASSERT_STREQ(buff, ""); 431 432 written = __llvm_libc::sprintf(buff, "%.5o", 0153); 433 EXPECT_EQ(written, 5); 434 ASSERT_STREQ(buff, "00153"); 435 436 written = __llvm_libc::sprintf(buff, "%.2o", 0135); 437 EXPECT_EQ(written, 3); 438 ASSERT_STREQ(buff, "135"); 439 440 // Flag Tests. 441 442 written = __llvm_libc::sprintf(buff, "%-5o", 0246); 443 EXPECT_EQ(written, 5); 444 ASSERT_STREQ(buff, "246 "); 445 446 written = __llvm_libc::sprintf(buff, "%#o", 0234); 447 EXPECT_EQ(written, 4); 448 ASSERT_STREQ(buff, "0234"); 449 450 written = __llvm_libc::sprintf(buff, "%05o", 0470); 451 EXPECT_EQ(written, 5); 452 ASSERT_STREQ(buff, "00470"); 453 454 written = __llvm_libc::sprintf(buff, "%0#6o", 0753); 455 EXPECT_EQ(written, 6); 456 ASSERT_STREQ(buff, "000753"); 457 458 written = __llvm_libc::sprintf(buff, "%-#6o", 0642); 459 EXPECT_EQ(written, 6); 460 ASSERT_STREQ(buff, "0642 "); 461 462 // Combined Tests. 463 464 written = __llvm_libc::sprintf(buff, "%#-07o", 0703); 465 EXPECT_EQ(written, 7); 466 ASSERT_STREQ(buff, "0703 "); 467 468 written = __llvm_libc::sprintf(buff, "%7.5o", 0314); 469 EXPECT_EQ(written, 7); 470 ASSERT_STREQ(buff, " 00314"); 471 472 written = __llvm_libc::sprintf(buff, "%#9.5o", 0234); 473 EXPECT_EQ(written, 9); 474 ASSERT_STREQ(buff, " 00234"); 475 476 written = __llvm_libc::sprintf(buff, "%-7.5o", 0260); 477 EXPECT_EQ(written, 7); 478 ASSERT_STREQ(buff, "00260 "); 479 480 written = __llvm_libc::sprintf(buff, "%5.4o", 010000); 481 EXPECT_EQ(written, 5); 482 ASSERT_STREQ(buff, "10000"); 483 484 // Multiple Conversion Tests. 485 486 written = __llvm_libc::sprintf(buff, "%10o %-#10o", 0456, 0123); 487 EXPECT_EQ(written, 21); 488 ASSERT_STREQ(buff, " 456 0123 "); 489 490 written = __llvm_libc::sprintf(buff, "%-5.4o%#.4o", 075, 025); 491 EXPECT_EQ(written, 9); 492 ASSERT_STREQ(buff, "0075 0025"); 493 494 written = __llvm_libc::sprintf(buff, "%04hho %#.5llo %-6.3zo", 256 + 077, 495 01000000000000ll, size_t(2)); 496 EXPECT_EQ(written, 26); 497 ASSERT_STREQ(buff, "0077 01000000000000 002 "); 498 } 499 500 #ifndef LLVM_LIBC_PRINTF_DISABLE_FLOAT 501 502 TEST_F(LlvmLibcSPrintfTest, FloatHexExpConv) { 503 __llvm_libc::testutils::ForceRoundingMode r( 504 __llvm_libc::testutils::RoundingMode::Nearest); 505 double inf = __llvm_libc::fputil::FPBits<double>::inf().get_val(); 506 double nan = __llvm_libc::fputil::FPBits<double>::build_nan(1); 507 508 written = __llvm_libc::sprintf(buff, "%a", 1.0); 509 ASSERT_STREQ_LEN(written, buff, "0x1p+0"); 510 511 written = __llvm_libc::sprintf(buff, "%A", -1.0); 512 ASSERT_STREQ_LEN(written, buff, "-0X1P+0"); 513 514 written = __llvm_libc::sprintf(buff, "%a", -0x1.abcdef12345p0); 515 ASSERT_STREQ_LEN(written, buff, "-0x1.abcdef12345p+0"); 516 517 written = __llvm_libc::sprintf(buff, "%A", 0x1.abcdef12345p0); 518 ASSERT_STREQ_LEN(written, buff, "0X1.ABCDEF12345P+0"); 519 520 written = __llvm_libc::sprintf(buff, "%a", 0.0); 521 ASSERT_STREQ_LEN(written, buff, "0x0p+0"); 522 523 written = __llvm_libc::sprintf(buff, "%a", 1.0e100); 524 ASSERT_STREQ_LEN(written, buff, "0x1.249ad2594c37dp+332"); 525 526 written = __llvm_libc::sprintf(buff, "%a", 0.1); 527 ASSERT_STREQ_LEN(written, buff, "0x1.999999999999ap-4"); 528 529 // Subnormal Tests. 530 531 written = __llvm_libc::sprintf(buff, "%a", 0x1.0p-1027); 532 ASSERT_STREQ_LEN(written, buff, "0x0.08p-1022"); 533 534 written = __llvm_libc::sprintf(buff, "%a", 0x1.0p-1025); 535 ASSERT_STREQ_LEN(written, buff, "0x0.2p-1022"); 536 537 written = __llvm_libc::sprintf(buff, "%a", 0x1.0p-1023); 538 ASSERT_STREQ_LEN(written, buff, "0x0.8p-1022"); 539 540 written = __llvm_libc::sprintf(buff, "%a", 0x1.0p-1022); 541 ASSERT_STREQ_LEN(written, buff, "0x1p-1022"); 542 543 written = __llvm_libc::sprintf(buff, "%a", 0x1.0p-1074); 544 ASSERT_STREQ_LEN(written, buff, "0x0.0000000000001p-1022"); 545 546 // Inf/Nan Tests. 547 548 written = __llvm_libc::sprintf(buff, "%a", inf); 549 ASSERT_STREQ_LEN(written, buff, "inf"); 550 551 written = __llvm_libc::sprintf(buff, "%A", -inf); 552 ASSERT_STREQ_LEN(written, buff, "-INF"); 553 554 written = __llvm_libc::sprintf(buff, "%a", nan); 555 ASSERT_STREQ_LEN(written, buff, "nan"); 556 557 written = __llvm_libc::sprintf(buff, "%A", -nan); 558 ASSERT_STREQ_LEN(written, buff, "-NAN"); 559 560 // Length Modifier Tests. 561 562 written = __llvm_libc::sprintf(buff, "%La", 0.1L); 563 #if defined(SPECIAL_X86_LONG_DOUBLE) 564 ASSERT_STREQ_LEN(written, buff, "0xc.ccccccccccccccdp-7"); 565 #elif defined(LONG_DOUBLE_IS_DOUBLE) 566 ASSERT_STREQ_LEN(written, buff, "0x1.999999999999ap-4"); 567 #else // 128 bit long double 568 ASSERT_STREQ_LEN(written, buff, "0x1.999999999999999999999999999ap-4"); 569 #endif 570 571 written = __llvm_libc::sprintf(buff, "%La", 1.0e1000L); 572 #if defined(SPECIAL_X86_LONG_DOUBLE) 573 ASSERT_STREQ_LEN(written, buff, "0xf.38db1f9dd3dac05p+3318"); 574 #elif defined(LONG_DOUBLE_IS_DOUBLE) 575 ASSERT_STREQ_LEN(written, buff, "inf"); 576 #else // 128 bit long double 577 ASSERT_STREQ_LEN(written, buff, "0x1.e71b63f3ba7b580af1a52d2a7379p+3321"); 578 #endif 579 580 written = __llvm_libc::sprintf(buff, "%La", 1.0e-1000L); 581 #if defined(SPECIAL_X86_LONG_DOUBLE) 582 ASSERT_STREQ_LEN(written, buff, "0x8.68a9188a89e1467p-3325"); 583 #elif defined(LONG_DOUBLE_IS_DOUBLE) 584 ASSERT_STREQ_LEN(written, buff, "0x0p+0"); 585 #else // 128 bit long double 586 ASSERT_STREQ_LEN(written, buff, "0x1.0d152311513c28ce202627c06ec2p-3322"); 587 #endif 588 589 // Min Width Tests. 590 591 written = __llvm_libc::sprintf(buff, "%15a", 1.0); 592 ASSERT_STREQ_LEN(written, buff, " 0x1p+0"); 593 594 written = __llvm_libc::sprintf(buff, "%15a", -1.0); 595 ASSERT_STREQ_LEN(written, buff, " -0x1p+0"); 596 597 written = __llvm_libc::sprintf(buff, "%15a", 1.0e10); 598 ASSERT_STREQ_LEN(written, buff, " 0x1.2a05f2p+33"); 599 600 written = __llvm_libc::sprintf(buff, "%15a", -1.0e10); 601 ASSERT_STREQ_LEN(written, buff, "-0x1.2a05f2p+33"); 602 603 written = __llvm_libc::sprintf(buff, "%10a", 1.0e10); 604 ASSERT_STREQ_LEN(written, buff, "0x1.2a05f2p+33"); 605 606 written = __llvm_libc::sprintf(buff, "%5a", inf); 607 ASSERT_STREQ_LEN(written, buff, " inf"); 608 609 written = __llvm_libc::sprintf(buff, "%5a", -nan); 610 ASSERT_STREQ_LEN(written, buff, " -nan"); 611 612 // Precision Tests. 613 614 written = __llvm_libc::sprintf(buff, "%.1a", 1.0); 615 ASSERT_STREQ_LEN(written, buff, "0x1.0p+0"); 616 617 written = __llvm_libc::sprintf(buff, "%.1a", 0.0); 618 ASSERT_STREQ_LEN(written, buff, "0x0.0p+0"); 619 620 written = __llvm_libc::sprintf(buff, "%.1a", 0.1); 621 ASSERT_STREQ_LEN(written, buff, "0x1.ap-4"); 622 623 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.0fp0); 624 ASSERT_STREQ_LEN(written, buff, "0x1.1p+0"); 625 626 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.07p0); 627 ASSERT_STREQ_LEN(written, buff, "0x1.0p+0"); 628 629 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.08p0); 630 ASSERT_STREQ_LEN(written, buff, "0x1.0p+0"); 631 632 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.18p0); 633 ASSERT_STREQ_LEN(written, buff, "0x1.2p+0"); 634 635 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.ffp0); 636 ASSERT_STREQ_LEN(written, buff, "0x2.0p+0"); 637 638 written = __llvm_libc::sprintf(buff, "%.5a", 1.25); 639 ASSERT_STREQ_LEN(written, buff, "0x1.40000p+0"); 640 641 written = __llvm_libc::sprintf(buff, "%.0a", 1.25); 642 ASSERT_STREQ_LEN(written, buff, "0x1p+0"); 643 644 written = __llvm_libc::sprintf(buff, "%.0a", 1.75); 645 ASSERT_STREQ_LEN(written, buff, "0x2p+0"); 646 647 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.0p-1023); 648 ASSERT_STREQ_LEN(written, buff, "0x0.8p-1022"); 649 650 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.8p-1023); 651 ASSERT_STREQ_LEN(written, buff, "0x0.cp-1022"); 652 653 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.0p-1024); 654 ASSERT_STREQ_LEN(written, buff, "0x0.4p-1022"); 655 656 written = __llvm_libc::sprintf(buff, "%.0a", 0x1.0p-1023); 657 ASSERT_STREQ_LEN(written, buff, "0x0p-1022"); 658 659 written = __llvm_libc::sprintf(buff, "%.0a", 0x1.8p-1023); 660 ASSERT_STREQ_LEN(written, buff, "0x1p-1022"); 661 662 written = __llvm_libc::sprintf(buff, "%.0a", 0x1.0p-1024); 663 ASSERT_STREQ_LEN(written, buff, "0x0p-1022"); 664 665 written = __llvm_libc::sprintf(buff, "%.2a", 0x1.0p-1027); 666 ASSERT_STREQ_LEN(written, buff, "0x0.08p-1022"); 667 668 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.0p-1027); 669 ASSERT_STREQ_LEN(written, buff, "0x0.0p-1022"); 670 671 written = __llvm_libc::sprintf(buff, "%.5a", 0.0); 672 ASSERT_STREQ_LEN(written, buff, "0x0.00000p+0"); 673 674 written = __llvm_libc::sprintf(buff, "%.5a", 0x1.008p0); 675 ASSERT_STREQ_LEN(written, buff, "0x1.00800p+0"); 676 677 written = __llvm_libc::sprintf(buff, "%.5a", 0x1.008p10); 678 ASSERT_STREQ_LEN(written, buff, "0x1.00800p+10"); 679 680 written = __llvm_libc::sprintf(buff, "%.5a", nan); 681 ASSERT_STREQ_LEN(written, buff, "nan"); 682 683 written = __llvm_libc::sprintf(buff, "%.1La", 0.1L); 684 #if defined(SPECIAL_X86_LONG_DOUBLE) 685 ASSERT_STREQ_LEN(written, buff, "0xc.dp-7"); 686 #elif defined(LONG_DOUBLE_IS_DOUBLE) 687 ASSERT_STREQ_LEN(written, buff, "0x1.ap-4"); 688 #else // 128 bit long double 689 ASSERT_STREQ_LEN(written, buff, "0x1.ap-4"); 690 #endif 691 692 written = __llvm_libc::sprintf(buff, "%.1La", 0xf.fffffffffffffffp16380L); 693 #if defined(SPECIAL_X86_LONG_DOUBLE) 694 ASSERT_STREQ_LEN(written, buff, "0x1.0p+16384"); 695 #elif defined(LONG_DOUBLE_IS_DOUBLE) 696 ASSERT_STREQ_LEN(written, buff, "inf"); 697 #else // 128 bit long double 698 ASSERT_STREQ_LEN(written, buff, "0x2.0p+16383"); 699 #endif 700 701 // Rounding Mode Tests. 702 703 { 704 __llvm_libc::testutils::ForceRoundingMode r( 705 __llvm_libc::testutils::RoundingMode::Nearest); 706 707 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.08p0); 708 ASSERT_STREQ_LEN(written, buff, "0x1.0p+0"); 709 710 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.18p0); 711 ASSERT_STREQ_LEN(written, buff, "0x1.2p+0"); 712 713 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.04p0); 714 ASSERT_STREQ_LEN(written, buff, "0x1.0p+0"); 715 716 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.14p0); 717 ASSERT_STREQ_LEN(written, buff, "0x1.1p+0"); 718 719 written = __llvm_libc::sprintf(buff, "%.1a", -0x1.08p0); 720 ASSERT_STREQ_LEN(written, buff, "-0x1.0p+0"); 721 722 written = __llvm_libc::sprintf(buff, "%.1a", -0x1.18p0); 723 ASSERT_STREQ_LEN(written, buff, "-0x1.2p+0"); 724 725 written = __llvm_libc::sprintf(buff, "%.1a", -0x1.04p0); 726 ASSERT_STREQ_LEN(written, buff, "-0x1.0p+0"); 727 728 written = __llvm_libc::sprintf(buff, "%.1a", -0x1.14p0); 729 ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0"); 730 } 731 732 { 733 __llvm_libc::testutils::ForceRoundingMode r( 734 __llvm_libc::testutils::RoundingMode::Upward); 735 736 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.08p0); 737 ASSERT_STREQ_LEN(written, buff, "0x1.1p+0"); 738 739 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.18p0); 740 ASSERT_STREQ_LEN(written, buff, "0x1.2p+0"); 741 742 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.04p0); 743 ASSERT_STREQ_LEN(written, buff, "0x1.1p+0"); 744 745 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.14p0); 746 ASSERT_STREQ_LEN(written, buff, "0x1.2p+0"); 747 748 written = __llvm_libc::sprintf(buff, "%.1a", -0x1.08p0); 749 ASSERT_STREQ_LEN(written, buff, "-0x1.0p+0"); 750 751 written = __llvm_libc::sprintf(buff, "%.1a", -0x1.18p0); 752 ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0"); 753 754 written = __llvm_libc::sprintf(buff, "%.1a", -0x1.04p0); 755 ASSERT_STREQ_LEN(written, buff, "-0x1.0p+0"); 756 757 written = __llvm_libc::sprintf(buff, "%.1a", -0x1.14p0); 758 ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0"); 759 } 760 761 { 762 __llvm_libc::testutils::ForceRoundingMode r( 763 __llvm_libc::testutils::RoundingMode::Downward); 764 765 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.08p0); 766 ASSERT_STREQ_LEN(written, buff, "0x1.0p+0"); 767 768 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.18p0); 769 ASSERT_STREQ_LEN(written, buff, "0x1.1p+0"); 770 771 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.04p0); 772 ASSERT_STREQ_LEN(written, buff, "0x1.0p+0"); 773 774 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.14p0); 775 ASSERT_STREQ_LEN(written, buff, "0x1.1p+0"); 776 777 written = __llvm_libc::sprintf(buff, "%.1a", -0x1.08p0); 778 ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0"); 779 780 written = __llvm_libc::sprintf(buff, "%.1a", -0x1.18p0); 781 ASSERT_STREQ_LEN(written, buff, "-0x1.2p+0"); 782 783 written = __llvm_libc::sprintf(buff, "%.1a", -0x1.04p0); 784 ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0"); 785 786 written = __llvm_libc::sprintf(buff, "%.1a", -0x1.14p0); 787 ASSERT_STREQ_LEN(written, buff, "-0x1.2p+0"); 788 } 789 790 { 791 __llvm_libc::testutils::ForceRoundingMode r( 792 __llvm_libc::testutils::RoundingMode::TowardZero); 793 794 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.08p0); 795 ASSERT_STREQ_LEN(written, buff, "0x1.0p+0"); 796 797 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.18p0); 798 ASSERT_STREQ_LEN(written, buff, "0x1.1p+0"); 799 800 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.04p0); 801 ASSERT_STREQ_LEN(written, buff, "0x1.0p+0"); 802 803 written = __llvm_libc::sprintf(buff, "%.1a", 0x1.14p0); 804 ASSERT_STREQ_LEN(written, buff, "0x1.1p+0"); 805 806 written = __llvm_libc::sprintf(buff, "%.1a", -0x1.08p0); 807 ASSERT_STREQ_LEN(written, buff, "-0x1.0p+0"); 808 809 written = __llvm_libc::sprintf(buff, "%.1a", -0x1.18p0); 810 ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0"); 811 812 written = __llvm_libc::sprintf(buff, "%.1a", -0x1.04p0); 813 ASSERT_STREQ_LEN(written, buff, "-0x1.0p+0"); 814 815 written = __llvm_libc::sprintf(buff, "%.1a", -0x1.14p0); 816 ASSERT_STREQ_LEN(written, buff, "-0x1.1p+0"); 817 } 818 819 // Flag Tests. 820 821 written = __llvm_libc::sprintf(buff, "%+a", nan); 822 ASSERT_STREQ_LEN(written, buff, "+nan"); 823 824 written = __llvm_libc::sprintf(buff, "% A", inf); 825 ASSERT_STREQ_LEN(written, buff, " INF"); 826 827 written = __llvm_libc::sprintf(buff, "%-5a", inf); 828 ASSERT_STREQ_LEN(written, buff, "inf "); 829 830 written = __llvm_libc::sprintf(buff, "%+-5A", nan); 831 ASSERT_STREQ_LEN(written, buff, "+NAN "); 832 833 written = __llvm_libc::sprintf(buff, "%+a", 1.0); 834 ASSERT_STREQ_LEN(written, buff, "+0x1p+0"); 835 836 written = __llvm_libc::sprintf(buff, "% a", 0.0); 837 ASSERT_STREQ_LEN(written, buff, " 0x0p+0"); 838 839 written = __llvm_libc::sprintf(buff, "%-10a", 1.5); 840 ASSERT_STREQ_LEN(written, buff, "0x1.8p+0 "); 841 842 written = __llvm_libc::sprintf(buff, "%#a", 1.0); 843 ASSERT_STREQ_LEN(written, buff, "0x1.p+0"); 844 845 written = __llvm_libc::sprintf(buff, "%#.0a", 1.5); 846 ASSERT_STREQ_LEN(written, buff, "0x2.p+0"); 847 848 written = __llvm_libc::sprintf(buff, "%010a", 1.5); 849 ASSERT_STREQ_LEN(written, buff, "0x001.8p+0"); 850 851 written = __llvm_libc::sprintf(buff, "%+- #0a", 0.0); 852 ASSERT_STREQ_LEN(written, buff, "+0x0.p+0"); 853 854 // Combined Tests. 855 856 written = __llvm_libc::sprintf(buff, "%12.3a %-12.3A", 0.1, 256.0); 857 ASSERT_STREQ_LEN(written, buff, " 0x1.99ap-4 0X1.000P+8 "); 858 859 written = __llvm_libc::sprintf(buff, "%+-#12.3a % 012.3a", 0.1256, 1256.0); 860 ASSERT_STREQ_LEN(written, buff, "+0x1.014p-3 0x1.3a0p+10"); 861 } 862 #endif // LLVM_LIBC_PRINTF_DISABLE_FLOAT 863 864 #ifndef LLVM_LIBC_PRINTF_DISABLE_WRITE_INT 865 TEST(LlvmLibcSPrintfTest, WriteIntConv) { 866 char buff[64]; 867 int written; 868 int test_val = -1; 869 870 test_val = -1; 871 written = __llvm_libc::sprintf(buff, "12345%n67890", &test_val); 872 EXPECT_EQ(written, 10); 873 EXPECT_EQ(test_val, 5); 874 ASSERT_STREQ(buff, "1234567890"); 875 876 test_val = -1; 877 written = __llvm_libc::sprintf(buff, "%n", &test_val); 878 EXPECT_EQ(written, 0); 879 EXPECT_EQ(test_val, 0); 880 ASSERT_STREQ(buff, ""); 881 882 test_val = 0x100; 883 written = __llvm_libc::sprintf(buff, "ABC%hhnDEF", &test_val); 884 EXPECT_EQ(written, 6); 885 EXPECT_EQ(test_val, 0x103); 886 ASSERT_STREQ(buff, "ABCDEF"); 887 888 test_val = -1; 889 written = __llvm_libc::sprintf(buff, "%s%n", "87654321", &test_val); 890 EXPECT_EQ(written, 8); 891 EXPECT_EQ(test_val, 8); 892 ASSERT_STREQ(buff, "87654321"); 893 894 written = __llvm_libc::sprintf(buff, "abc123%n", nullptr); 895 EXPECT_LT(written, 0); 896 } 897 #endif // LLVM_LIBC_PRINTF_DISABLE_WRITE_INT 898 899 #ifndef LLVM_LIBC_PRINTF_DISABLE_INDEX_MODE 900 TEST(LlvmLibcSPrintfTest, IndexModeParsing) { 901 char buff[64]; 902 int written; 903 904 written = __llvm_libc::sprintf(buff, "%1$s", "abcDEF123"); 905 EXPECT_EQ(written, 9); 906 ASSERT_STREQ(buff, "abcDEF123"); 907 908 written = __llvm_libc::sprintf(buff, "%1$s %%", "abcDEF123"); 909 EXPECT_EQ(written, 11); 910 ASSERT_STREQ(buff, "abcDEF123 %"); 911 912 written = 913 __llvm_libc::sprintf(buff, "%3$s %1$s %2$s", "is", "hard", "ordering"); 914 EXPECT_EQ(written, 16); 915 ASSERT_STREQ(buff, "ordering is hard"); 916 917 written = __llvm_libc::sprintf( 918 buff, "%10$s %9$s %8$c %7$s %6$s, %6$s %5$s %4$-*1$s %3$.*11$s %2$s. %%", 919 6, "pain", "alphabetical", "such", "is", "this", "do", 'u', "would", 920 "why", 1); 921 EXPECT_EQ(written, 45); 922 ASSERT_STREQ(buff, "why would u do this, this is such a pain. %"); 923 } 924 #endif // LLVM_LIBC_PRINTF_DISABLE_INDEX_MODE 925