Skip to content

Commit

Permalink
Add tests for [v]format_append_to_n
Browse files Browse the repository at this point in the history
  • Loading branch information
seanmiddleditch committed Jan 15, 2024
1 parent 8ca10e7 commit 92598ea
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 25 deletions.
14 changes: 7 additions & 7 deletions include/nanofmt/format.inl
Original file line number Diff line number Diff line change
Expand Up @@ -318,24 +318,24 @@ namespace NANOFMT_NS {
return result.pos;
}

template <std::size_t N, typename... Args>
template <typename... Args>
[[nodiscard]] char* format_append_to_n(
char* dest,
std::size_t count,
format_string format_str,
Args const&... args) {
std::size_t const start = ::NANOFMT_NS::strnlen(dest, N);
std::size_t const start = ::NANOFMT_NS::strnlen(dest, count);
return detail::vformat(
format_context{dest + start, dest + count},
dest + start, dest + count,
format_str,
::NANOFMT_NS::make_format_args(args...))
.out();
.pos;
}

template <std::size_t N, typename... Args>
template <typename... Args>
[[nodiscard]] char* vformat_append_to_n(char* dest, std::size_t count, format_string format_str, format_args args) {
std::size_t const start = ::NANOFMT_NS::strnlen(dest, N);
return detail::vformat(format_context{dest + start, dest + count}, format_str, args).out();
std::size_t const start = ::NANOFMT_NS::strnlen(dest, count);
return detail::vformat(dest + start, dest + count, format_str, args).pos;
}

template <std::size_t N, typename... Args>
Expand Down
70 changes: 52 additions & 18 deletions tests/test_format.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,51 +50,85 @@ namespace NANOFMT_NS {
static_assert(NANOFMT_NS::detail::has_formatter<custom_type>::value, "has_formatter failed");
static_assert(NANOFMT_NS::detail::has_formatter<std::string>::value, "has_formatter failed");

TEST_CASE("nanofmt.format.core") {
TEST_CASE("nanofmt.format.format_to.overflow") {
using namespace NANOFMT_NS;

SUBCASE("format_to overflow") {
char buffer[12];
std::memset(buffer, 0xfe, sizeof buffer);
char buffer[12];
std::memset(buffer, 0xfe, sizeof buffer);

char const* const end = format_to(buffer, "Hello, {}! {:09d}", "World", 9001);
REQUIRE(*end == '\0');
char const* const end = format_to(buffer, "Hello, {}! {:09d}", "World", 9001);
REQUIRE(*end == '\0');

CHECK(std::strcmp(buffer, "Hello, Worl") == 0);
}
CHECK(std::strcmp(buffer, "Hello, Worl") == 0);
}

SUBCASE("format_to_n overflow") {
char buffer[12];
char* const end = format_to_n(buffer, sizeof buffer, "Hello, {}! {:09d}", "World", 9001);
TEST_CASE("nanofmt.format.format_to_n.overflow") {
using namespace NANOFMT_NS;

CHECK((end - buffer) == 12);
CHECK(std::strncmp(buffer, "Hello, World", sizeof buffer) == 0);
}
char buffer[12];
char* const end = format_to_n(buffer, sizeof buffer, "Hello, {}! {:09d}", "World", 9001);

CHECK((end - buffer) == 12);
CHECK(std::strncmp(buffer, "Hello, World", sizeof buffer) == 0);
}

TEST_CASE("nanofmt.format.append") {
TEST_CASE("nanofmt.format.format_append_to") {
using namespace NANOFMT_NS;

char buffer[12] = {};
format_to(buffer, "Hello");
format_append_to(buffer, "Hello");
format_append_to(buffer, "{} ", ',');
char* const end = format_append_to(buffer, "World! {:09d}", 9001);

CHECK((end - buffer) == 11);
CHECK(std::strcmp(buffer, "Hello, Worl") == 0);
}

TEST_CASE("nanofmt.vformat.append") {
TEST_CASE("nanofmt.format.vformat_append_to") {
using namespace NANOFMT_NS;

char buffer[12] = {};
vformat_to(buffer, "{} + {}", make_format_args(1, 2));
vformat_append_to(buffer, "{} + {}", make_format_args(1, 2));
char const* const end = vformat_append_to(buffer, " = {}", make_format_args(3));

CHECK((end - buffer) == 9);
CHECK(std::strcmp(buffer, "1 + 2 = 3") == 0);
}

TEST_CASE("nanofmt.format.format_append_to_n") {
using namespace NANOFMT_NS;

char buffer[8] = {};
(void)format_append_to_n(buffer, sizeof(buffer), "Hello");
(void)format_append_to_n(buffer, sizeof(buffer), "{} ", ',');
char* const end = format_append_to_n(buffer, sizeof(buffer), "World! {:09d}", 9001);

CHECK((end - buffer) == sizeof(buffer));
CHECK(std::strncmp(buffer, "Hello, W", end - buffer) == 0);
}

TEST_CASE("nanofmt.format.vformat_append_to") {
using namespace NANOFMT_NS;

char buffer[12] = {};
vformat_append_to(buffer, "{} + {}", make_format_args(1, 2));
char const* const end = vformat_append_to(buffer, " = {}", make_format_args(3));

CHECK((end - buffer) == 9);
CHECK(std::strcmp(buffer, "1 + 2 = 3") == 0);
}

TEST_CASE("nanofmt.format.vformat_append_to_n") {
using namespace NANOFMT_NS;

char buffer[16] = {};
(void)vformat_append_to_n(buffer, sizeof(buffer), "Hello{} ", make_format_args(','));
char* const end = vformat_append_to_n(buffer, sizeof(buffer), "{}! {}", make_format_args("World", 9001));

CHECK((end - buffer) == sizeof(buffer));
CHECK(std::strncmp(buffer, "Hello, World! 900", end - buffer) == 0);
}

TEST_CASE("nanofmt.format.integers") {
using namespace NANOFMT_NS::test;

Expand Down

0 comments on commit 92598ea

Please sign in to comment.