From dc970f4b74132d9636ef261c72326df05965d422 Mon Sep 17 00:00:00 2001 From: Fred Miller Date: Tue, 14 Jul 2020 23:56:55 +0800 Subject: [PATCH] Add test for user-defined types formatting --- test/CMakeLists.txt | 1 + test/user-defined-type-test.cc | 43 ++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 test/user-defined-type-test.cc diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 89176633..6040e510 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -108,6 +108,7 @@ add_fmt_test(printf-test) add_fmt_test(custom-formatter-test) add_fmt_test(ranges-test) add_fmt_test(scan-test) +add_fmt_test(user-defined-type-test) if (NOT MSVC_BUILD_STATIC) add_fmt_executable(posix-mock-test diff --git a/test/user-defined-type-test.cc b/test/user-defined-type-test.cc new file mode 100644 index 00000000..97d04d2b --- /dev/null +++ b/test/user-defined-type-test.cc @@ -0,0 +1,43 @@ +#ifndef _CRT_SECURE_NO_WARNINGS +# define _CRT_SECURE_NO_WARNINGS +#endif + +#include + +#include "fmt/format.h" +#include "gtest-extra.h" + +enum struct color { red, green, blue }; + +template <> struct fmt::formatter { + constexpr auto parse(format_parse_context& ctx) { + auto it = ctx.begin(); + if (it == ctx.end()) throw fmt::format_error("incomplete format string"); + if (*it != '}') throw fmt::format_error("unknown format specs"); + return it; + } + template auto format(color c, FormatContext& ctx) { + static const char red_s[] = "red", green_s[] = "green", blue_s[] = "blue"; + const char *begin_p, *end_p; + switch (c) { + case color::red: + begin_p = std::begin(red_s); + end_p = std::end(red_s); + break; + case color::green: + begin_p = std::begin(green_s); + end_p = std::end(green_s); + break; + case color::blue: + begin_p = std::begin(blue_s); + end_p = std::end(blue_s); + break; + } + return std::copy(begin_p, end_p - 1, ctx.out()); + } +}; + +TEST(UserDefinedTypeTest, Format) { + EXPECT_EQ("red green blue", + fmt::format("{} {} {}", color::red, color::green, color::blue)); +}