From 92598ea0324d75cc86ed729cff5722cd2d3d05c1 Mon Sep 17 00:00:00 2001 From: Sean Middleditch Date: Mon, 15 Jan 2024 11:39:26 -0800 Subject: [PATCH] Add tests for [v]format_append_to_n --- include/nanofmt/format.inl | 14 ++++---- tests/test_format.cpp | 70 ++++++++++++++++++++++++++++---------- 2 files changed, 59 insertions(+), 25 deletions(-) diff --git a/include/nanofmt/format.inl b/include/nanofmt/format.inl index bfc4716..a400eda 100644 --- a/include/nanofmt/format.inl +++ b/include/nanofmt/format.inl @@ -318,24 +318,24 @@ namespace NANOFMT_NS { return result.pos; } - template + template [[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 + template [[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 diff --git a/tests/test_format.cpp b/tests/test_format.cpp index 2c575fc..a6d401c 100644 --- a/tests/test_format.cpp +++ b/tests/test_format.cpp @@ -50,33 +50,33 @@ namespace NANOFMT_NS { static_assert(NANOFMT_NS::detail::has_formatter::value, "has_formatter failed"); static_assert(NANOFMT_NS::detail::has_formatter::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); @@ -84,17 +84,51 @@ TEST_CASE("nanofmt.format.append") { 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;