summaryrefslogtreecommitdiffstats
path: root/src/seastar/fmt/test/custom-formatter-test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/seastar/fmt/test/custom-formatter-test.cc')
-rw-r--r--src/seastar/fmt/test/custom-formatter-test.cc52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/seastar/fmt/test/custom-formatter-test.cc b/src/seastar/fmt/test/custom-formatter-test.cc
new file mode 100644
index 00000000..d529771c
--- /dev/null
+++ b/src/seastar/fmt/test/custom-formatter-test.cc
@@ -0,0 +1,52 @@
+// Formatting library for C++ - custom argument formatter tests
+//
+// Copyright (c) 2012 - present, Victor Zverovich
+// All rights reserved.
+//
+// For the license information refer to format.h.
+
+#include "fmt/format.h"
+#include "gtest-extra.h"
+
+// MSVC 2013 is known to be broken.
+#if !FMT_MSC_VER || FMT_MSC_VER > 1800
+
+// A custom argument formatter that doesn't print `-` for floating-point values
+// rounded to 0.
+class custom_arg_formatter :
+ public fmt::arg_formatter<fmt::back_insert_range<fmt::internal::buffer>> {
+ public:
+ typedef fmt::back_insert_range<fmt::internal::buffer> range;
+ typedef fmt::arg_formatter<range> base;
+
+ custom_arg_formatter(
+ fmt::format_context &ctx, fmt::format_specs *s = FMT_NULL)
+ : base(ctx, s) {}
+
+ using base::operator();
+
+ iterator operator()(double value) {
+ // Comparing a float to 0.0 is safe.
+ if (round(value * pow(10, spec()->precision)) == 0.0)
+ value = 0;
+ return base::operator()(value);
+ }
+};
+
+std::string custom_vformat(fmt::string_view format_str, fmt::format_args args) {
+ fmt::memory_buffer buffer;
+ // Pass custom argument formatter as a template arg to vwrite.
+ fmt::vformat_to<custom_arg_formatter>(buffer, format_str, args);
+ return std::string(buffer.data(), buffer.size());
+}
+
+template <typename... Args>
+std::string custom_format(const char *format_str, const Args & ... args) {
+ auto va = fmt::make_format_args(args...);
+ return custom_vformat(format_str, va);
+}
+
+TEST(CustomFormatterTest, Format) {
+ EXPECT_EQ("0.00", custom_format("{:.2f}", -.00001));
+}
+#endif