blob: a925d751a4af43823a184afaada34056b234ea42 [file] [log] [blame]
#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
}
}