blob: dd458c5ff3823387f01c1a3da2faa87ba75b6edd [file] [log] [blame]
#include "unit_nanoprintf.h"
#include <cmath>
#include <limits>
#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 "-Wformat-nonliteral"
#endif
#endif
TEST_CASE("npf_bin_len") {
CHECK(npf_bin_len(0) == 1);
CHECK(npf_bin_len(1) == 1);
CHECK(npf_bin_len(0b10) == 2);
CHECK(npf_bin_len(0b100) == 3);
CHECK(npf_bin_len(0b1000) == 4);
CHECK(npf_bin_len(0b10000) == 5);
CHECK(npf_bin_len(0b100000) == 6);
CHECK(npf_bin_len(0b1000000) == 7);
CHECK(npf_bin_len(0b10000000) == 8);
CHECK(npf_bin_len(0b100000001) == 9);
CHECK(npf_bin_len(0b1000000001) == 10);
CHECK(npf_bin_len(0b10000000001) == 11);
CHECK(npf_bin_len(0b100000000001) == 12);
CHECK(npf_bin_len(0b1000000000000) == 13);
CHECK(npf_bin_len(0b10000000000000) == 14);
CHECK(npf_bin_len(0b100000000000000) == 15);
CHECK(npf_bin_len(0b1000000000000000) == 16);
CHECK(npf_bin_len(0x80000000UL) == 32);
#if NANOPRINTF_USE_LARGE_FORMAT_SPECIFIERS == 1
CHECK(npf_bin_len(0x8000000000ULL) == 40);
CHECK(npf_bin_len(0x800000000000ULL) == 48);
CHECK(npf_bin_len(0x80000000000000ULL) == 56);
CHECK(npf_bin_len(0x8000000000000000ULL) == 64);
#endif
}
namespace {
void require_equal(char const *expected, char const *fmt, ...) {
char buf[256];
std::string npf_result; {
va_list args;
va_start(args, fmt);
npf_vsnprintf(buf, sizeof(buf), fmt, args);
va_end(args);
buf[sizeof(buf)-1] = '\0';
npf_result = buf;
}
REQUIRE(npf_result == std::string{expected});
}
}
TEST_CASE("binary") {
SUBCASE("plain") {
require_equal( "0", "%b", 0);
require_equal( "1", "%b", 1);
require_equal( "10", "%b", 0b10);
require_equal( "11", "%b", 0b11);
require_equal( "100", "%b", 0b100);
require_equal( "101", "%b", 0b101);
require_equal( "110", "%b", 0b110);
require_equal( "110", "%b", 0b110);
require_equal( "111", "%b", 0b111);
require_equal("1000", "%b", 0b1000);
require_equal("10000", "%b", 0b10000);
require_equal("100000", "%b", 0b100000);
require_equal("1000000", "%b", 0b1000000);
require_equal("10000000", "%b", 0b10000000);
require_equal( "10010001101000101011001111000", "%b", 0x12345678);
require_equal( "1010101010101010101010101010101", "%b", 0x55555555);
require_equal("10101010101010101010101010101010", "%b", 0xAAAAAAAA);
require_equal("11111111111111111111111111111111", "%b", 0xFFFFFFFF);
}
SUBCASE("length") {
require_equal("11111111", "%hhb", 0xFFFFFFFF); // char
require_equal("1111111111111111", "%hb", 0xFFFFFFFF); // short
}
#if NANOPRINTF_USE_PRECISION_FORMAT_SPECIFIERS == 1
SUBCASE("precision") {
require_equal( "", "%.0b", 0);
require_equal( "0", "%.1b", 0);
require_equal( "00", "%.2b", 0);
require_equal( "000", "%.3b", 0);
require_equal( "0000", "%.4b", 0);
require_equal( "00000", "%.5b", 0);
require_equal( "000000", "%.6b", 0);
require_equal( "0000000", "%.7b", 0);
require_equal( "00000000", "%.8b", 0);
require_equal( "000000000", "%.9b", 0);
require_equal( "0000000000", "%.10b", 0);
require_equal( "00000000000", "%.11b", 0);
require_equal( "000000000000", "%.12b", 0);
require_equal( "0000000000000", "%.13b", 0);
require_equal( "00000000000000", "%.14b", 0);
require_equal( "000000000000000", "%.15b", 0);
require_equal("0000000000000000", "%.16b", 0);
require_equal("00001111", "%.8b", 0b1111);
require_equal("00000000000000000000000000000000", "%.32b", 0);
}
#endif
#if NANOPRINTF_USE_FIELD_WIDTH_FORMAT_SPECIFIERS == 1
SUBCASE("field width") {
require_equal( "0", "%1b", 0);
require_equal(" 0", "%4b", 0);
require_equal(" 11", "%4b", 0b11);
}
#endif
#if NANOPRINTF_USE_LARGE_FORMAT_SPECIFIERS == 1
SUBCASE("large") {
require_equal("100000000000000000000000000000000", "%llb", 0x100000000ULL);
require_equal("100000000000000000000000000000001", "%llb", 0x100000001ULL);
require_equal("111111111111111111111111111111111111", "%llb", 0xFFFFFFFFFULL);
require_equal("1000000000000000000000000000000000000000000000000000000000000000",
"%llb",
std::numeric_limits<long long int>::min());
require_equal( "111111111111111111111111111111111111111111111111111111111111111",
"%llb",
std::numeric_limits<long long int>::max());
}
#endif
SUBCASE("alternate form") {
require_equal("0", "%#b", 0);
require_equal("0b1", "%#b", 1);
require_equal("0B1", "%#B", 1);
require_equal("0b110101", "%#b", 0b110101);
#if NANOPRINTF_USE_FIELD_WIDTH_FORMAT_SPECIFIERS == 1
require_equal(" 0", "%#8b", 0);
require_equal(" 0b11", "%#8b", 0b11);
#if NANOPRINTF_USE_PRECISION_FORMAT_SPECIFIERS == 1
require_equal(" 0b0001", "%#10.4b", 1);
#endif
#endif
}
}