222TEST_CASE(
"single_conversion",
"[jau][std::string][jau::cfmt]") {
225 int32_t i32_u = 1234;
229 void *p1a = (
void *)0xaabbccdd_u64;
230 void *p1b = (
void *)0x11223344aabbccdd_u64;
231 void *p2a = (
void *)0x112233aabbccdd_u64;
232 void *p2b = (
void *)0xaabbcc_u64;
233 void *p3a = (
void *)0x112233aabbccdd_u64;
234 void *p3b = (
void *)0xaabbcc_u64;
235 const char sl1[] =
"Hallo";
236 std::string s2 =
"World";
237 std::string_view s2sv = s2;
238 const char *s2p = s2.c_str();
241 double value = 123.45;
242 const int expval = std::ilogb(
value);
243 const double frac =
value / std::scalbn(1.0, expval);
245 fprintf(stderr,
"JAU:10 v %f = %f * 2^%d -> 0x%0" PRIx64
"p%d\n",
value, frac, expval, significand, expval);
248 fprintf(stderr,
"JAU:11 v %f = %f * 2^%d -> 0x%0" PRIx64
"p%d\n",
value, frac, expval2, significand, expval2);
251 float value = 123.45f;
252 const int expval = std::ilogb(
value);
253 const double frac =
value / std::scalbn(1.0, expval);
255 fprintf(stderr,
"JAU:20 v %f = %f * 2^%d -> 0x%0" PRIx32
"p%d\n",
value, frac, expval, significand, expval);
258 fprintf(stderr,
"JAU:21 v %f = %f * 2^%d -> 0x%0" PRIx32
"p%d\n",
value, frac, expval2, significand, expval2);
261 float ivalue = 123.45f;
262 double value = ivalue;
263 const int expval = std::ilogb(
value);
264 const double frac =
value / std::scalbn(1.0, expval);
266 fprintf(stderr,
"JAU:30 v %f = %f * 2^%d -> 0x%0" PRIx64
"p%d\n",
value, frac, expval, significand, expval);
269 fprintf(stderr,
"JAU:31 v %f = %f * 2^%d -> 0x%0" PRIx64
"p%d\n",
value, frac, expval2, significand, expval2);
288 const char *cstr0 =
nullptr;
289 const char *cstr1 =
"Hello World";
295 const void *handle = (
void *)0x12345678;
296 const void *nil =
nullptr;
334 checkFormat(__LINE__,
"p3b %p %0p", &i32_u, &i32_u);
383 const char *str =
nullptr;
385 const char limiter =
'3';
386 const char *limiter_pos =
nullptr;
387 char *endptr =
nullptr;
389 jau_format_check(
"Value end not '%c' @ idx %zd, %p != %p, in: %p '%s' len %zu", limiter, endptr - str, endptr, limiter_pos, str, str, str_len);
390 jau_format_checkLine(
"Value end not '%c' @ idx %zd, %p != %p, in: %p '%s' len %zu", limiter, endptr - str, endptr, limiter_pos, str, str, str_len);
410 enum enum1_unsigned_t { jau1_alpha, jau1_beta, jau1_gamma };
411 enum1_unsigned_t e1_u = jau1_alpha;
413 enum enum2_signed_t { jau2_alpha=-1, jau_beta, jau_gamma };
414 enum2_signed_t e2_s = jau2_alpha;
416 enum class enum3_signed_t { alpha=-1, beta, gamma };
417 enum3_signed_t e3_s = enum3_signed_t::alpha;
423 enum4_unsigned_t e4_u = jau_CAP_CLEAR;
425 static_assert(
true == std::is_enum_v<
decltype(e1_u)>);
426 static_assert(
true == std::is_unsigned_v<std::underlying_type_t<
decltype(e1_u)>>);
428 static_assert(
true == std::is_enum_v<
decltype(e2_s)>);
429 static_assert(
true == std::is_signed_v<std::underlying_type_t<
decltype(e2_s)>>);
431 static_assert(
true == std::is_enum_v<
decltype(e3_s)>);
432 static_assert(
true == std::is_signed_v<std::underlying_type_t<
decltype(e3_s)>>);
434 static_assert(
true == std::is_enum_v<
decltype(e4_u)>);
435 static_assert(
true == std::is_unsigned_v<std::underlying_type_t<
decltype(e4_u)>>);
440 static_assert(4 ==
jau::cfmt::check(
"%u, %d, %d, %u\n", e1_u, e2_s, e3_s, e4_u));
449TEST_CASE(
"integral_conversion",
"[jau][std::string][jau::cfmt]") {
450 static constexpr const char *format_check_exp1 =
"format_check: -1, 2, -3, 4, -5, 6, -7, 8, -9, 10";
451 static constexpr const char *format_check_exp2 =
"format_check: -1, 02, -03, 0004, -0005, 000006, -000007, 00000008, -00000009, 0000000010";
467 jau_format_check(
"format_check: %hhd, %hhu, %hd, %hu, %d, %u, %ld, %lu, %zd, %zu", i1, i2, i3, i4, i5, i6, i7, i8, i9, i10);
468 CHECK(format_check_exp1 ==
jau::format_string(
"format_check: %hhd, %hhu, %hd, %hu, %d, %u, %ld, %lu, %zd, %zu", i1, i2, i3, i4, i5, i6, i7, i8, i9, i10));
470 jau_format_check(
"format_check: %01hhd, %02hhu, %03hd, %04hu, %05d, %06u, %07ld, %08lu, %09zd, %010zu", i1, i2, i3, i4, i5, i6, i7, i8, i9, i10);
471 CHECK(format_check_exp2 ==
jau::format_string(
"format_check: %01hhd, %02hhu, %03hd, %04hu, %05d, %06u, %07ld, %08lu, %09zd, %010zu", i1, i2, i3, i4, i5, i6, i7, i8, i9, i10));
1464TEST_CASE(
"float",
"[jau][std::string][jau::cfmt][float]" ) {
1469 CHECK(buffer ==
" nan");
1472 CHECK(buffer ==
" inf");
1475 CHECK(buffer ==
"-inf ");
1478 CHECK(buffer ==
" +inf");
1481 CHECK(buffer ==
"3.1415");
1484 CHECK(buffer ==
"30343.142");
1487 CHECK(buffer ==
"34");
1490 CHECK(buffer ==
"1");
1493 CHECK(buffer ==
"2");
1496 CHECK(buffer ==
"1.6");
1499 CHECK(buffer ==
"42.90");
1502 CHECK(buffer ==
"42.895200000");
1505 CHECK(buffer ==
"42.8952230000");
1509 CHECK(buffer ==
"42.987654321098");
1513 CHECK(buffer ==
"42.987654321099");
1517 CHECK(buffer ==
"42.98765432109876");
1520 CHECK(buffer ==
"42.98765432109877");
1524 CHECK(buffer ==
"42.9876543210987600");
1528 CHECK(buffer ==
"42.9876543210987700");
1531 CHECK(buffer ==
" 42.90");
1534 CHECK(buffer ==
"+42.90");
1537 CHECK(buffer ==
"+42.9");
1540 CHECK(buffer ==
"42.500000");
1543 CHECK(buffer ==
"42.5");
1546 CHECK(buffer ==
"42167.000000");
1549 CHECK(buffer ==
"-12345.987654321");
1552 CHECK(buffer ==
"4.0");
1555 CHECK(buffer ==
"4");
1558 CHECK(buffer ==
"4");
1561 CHECK(buffer ==
"3");
1564 CHECK(buffer ==
"3.5");
1567 CHECK(buffer ==
"a0.5 ");
1570 CHECK(buffer ==
"a0.5 end");
1573 CHECK(buffer ==
"12345.7");
1576 CHECK(buffer ==
"12345.68");
1579 CHECK(buffer ==
"1.2346E+08");
1582 CHECK(buffer ==
"12345.0");
1585 CHECK(buffer ==
" +1.235e+08");
1588 CHECK(buffer ==
"0.0012");
1591 CHECK(buffer ==
" +0.001234");
1594 CHECK(buffer ==
"+001.234e-05");
1597 CHECK(buffer ==
"-1.23e-308");
1600 CHECK(buffer ==
"+1.230E+308");
1604 CHECK(buffer ==
"1.0e+20");
1607 CHECK(buffer ==
"-1.12345");
1610 CHECK(buffer ==
"-1.00000e+20");
1614 std::stringstream str;
1616 for (
float i = -100000; i < 100000; i += 1) {
1619 str << std::fixed << i / 10000;
1620 fail = fail || buffer != str.str();
1626 str.setf(std::ios::scientific, std::ios::floatfield);
1627 for (
float i = -1e20; i < 1e20; i += 1e15) {
1629 buffer.shrink_to_fit();
1632 REQUIRE(buffer == str.str());
1633 fail = fail || buffer != str.str();
Result formatR(std::string &s, size_t maxLen, std::string_view fmt, const Targs &...args) noexcept
Strict format with type validation of arguments against the format string, appending to the given des...