| #include "unit_nanoprintf.h" |
| |
| #include <climits> |
| #include <string> |
| |
| #if NANOPRINTF_HAVE_GCC_WARNING_PRAGMAS |
| #pragma GCC diagnostic push |
| #if NANOPRINTF_CLANG |
| #pragma GCC diagnostic ignored "-Wformat-pedantic" |
| #pragma GCC diagnostic ignored "-Wold-style-cast" |
| #pragma GCC diagnostic ignored "-Wmissing-prototypes" |
| #endif |
| #endif |
| |
| void require_npf_utoa( |
| std::string const &expected, |
| npf_uint_t val, |
| unsigned base, |
| unsigned case_adjust = 'a' - 'A') { |
| char buf[64]; |
| int const n = npf_utoa_rev(buf, val, base, case_adjust); |
| buf[n] = '\0'; |
| REQUIRE(n == (int)expected.size()); |
| REQUIRE(std::string{buf} == expected); |
| } |
| |
| TEST_CASE("npf_utoa_rev") { |
| SUBCASE("base 10") { |
| require_npf_utoa("0", 0, 10); |
| require_npf_utoa("1", 1, 10); |
| require_npf_utoa("9", 9, 10); |
| require_npf_utoa("01", 10, 10); |
| require_npf_utoa("31", 13, 10); |
| require_npf_utoa("89", 98, 10); |
| require_npf_utoa("99", 99, 10); |
| require_npf_utoa("001", 100, 10); |
| require_npf_utoa("321", 123, 10); |
| require_npf_utoa("999", 999, 10); |
| require_npf_utoa("0001", 1000, 10); |
| require_npf_utoa("4321", 1234, 10); |
| require_npf_utoa("9999", 9999, 10); |
| require_npf_utoa("00001", 10000, 10); |
| require_npf_utoa("54321", 12345, 10); |
| require_npf_utoa("99999", 99999, 10); |
| require_npf_utoa("000001", 100000, 10); |
| } |
| |
| SUBCASE("base 10 maxima") { |
| #if NANOPRINTF_USE_LARGE_FORMAT_SPECIFIERS == 1 |
| #if UINTMAX_MAX == 18446744073709551615u |
| require_npf_utoa("51615590737044764481", UINTMAX_MAX, 10); |
| #else |
| #error Unknown UINTMAX_MAX here, please add another branch. |
| #endif |
| #else |
| #if UINT_MAX == 4294967295 |
| require_npf_utoa("5927694924", UINT_MAX, 10); |
| #else |
| #error Unknown UINT_MAX here, please add another branch. |
| #endif |
| #endif |
| } |
| |
| SUBCASE("base 8") { |
| require_npf_utoa("0", 0, 8); |
| require_npf_utoa("1", 1, 8); |
| require_npf_utoa("7", 7, 8); |
| require_npf_utoa("01", 010, 8); |
| require_npf_utoa("31", 013, 8); |
| require_npf_utoa("71", 017, 8); |
| require_npf_utoa("02", 020, 8); |
| require_npf_utoa("72", 027, 8); |
| require_npf_utoa("03", 030, 8); |
| require_npf_utoa("77", 077, 8); |
| require_npf_utoa("001", 0100, 8); |
| require_npf_utoa("777", 0777, 8); |
| require_npf_utoa("0001", 01000, 8); |
| require_npf_utoa("7777", 07777, 8); |
| require_npf_utoa("00001", 010000, 8); |
| require_npf_utoa("77777", 077777, 8); |
| require_npf_utoa("000001", 0100000, 8); |
| require_npf_utoa("7654321", 01234567, 8); |
| } |
| |
| SUBCASE("base 8 maxima") { |
| #if NANOPRINTF_USE_LARGE_FORMAT_SPECIFIERS == 1 |
| #if UINTMAX_MAX == 18446744073709551615u |
| require_npf_utoa("7777777777777777777771", UINTMAX_MAX, 8); |
| #else |
| #error Unknown UINTMAX_MAX here, please add another branch. |
| #endif |
| #else |
| #if UINT_MAX == 4294967295 |
| require_npf_utoa("77777777773", UINT_MAX, 8); |
| #else |
| #error Unknown UINT_MAX here, please add another branch. |
| #endif |
| #endif |
| } |
| |
| SUBCASE("base 16 lowercase") { |
| require_npf_utoa("0", 0, 16); |
| require_npf_utoa("1", 1, 16); |
| require_npf_utoa("f", 0xf, 16); |
| require_npf_utoa("01", 0x10, 16); |
| require_npf_utoa("c3", 0x3c, 16); |
| require_npf_utoa("ff", 0xff, 16); |
| require_npf_utoa("001", 0x100, 16); |
| require_npf_utoa("fff", 0xfff, 16); |
| require_npf_utoa("0001", 0x1000, 16); |
| require_npf_utoa("ffff", 0xffff, 16); |
| require_npf_utoa("00001", 0x10000, 16); |
| require_npf_utoa("fffff", 0xfffff, 16); |
| require_npf_utoa("000001", 0x100000, 16); |
| require_npf_utoa("4d3c2b1a", 0xa1b2c3d4, 16); |
| } |
| |
| SUBCASE("base 16 uppercase") { |
| require_npf_utoa("12345", 0x54321, 16, 0); |
| require_npf_utoa("FEDCBA98", 0x89abcdef, 16, 0); |
| } |
| |
| SUBCASE("base 16 maxima") { |
| #if NANOPRINTF_USE_LARGE_FORMAT_SPECIFIERS == 1 |
| #if UINTMAX_MAX == 18446744073709551615u |
| require_npf_utoa("ffffffffffffffff", UINTMAX_MAX, 16); |
| #else |
| #error Unknown UINTMAX_MAX here, please add another branch. |
| #endif |
| #else |
| #if UINT_MAX == 4294967295 |
| require_npf_utoa("ffffffff", UINT_MAX, 16); |
| #else |
| #error Unknown UINT_MAX here, please add another branch. |
| #endif |
| #endif |
| } |
| } |