summaryrefslogtreecommitdiffstats
path: root/src/fmt/test/custom-formatter-test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/fmt/test/custom-formatter-test.cc')
-rw-r--r--src/fmt/test/custom-formatter-test.cc56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/fmt/test/custom-formatter-test.cc b/src/fmt/test/custom-formatter-test.cc
new file mode 100644
index 000000000..36007caed
--- /dev/null
+++ b/src/fmt/test/custom-formatter-test.cc
@@ -0,0 +1,56 @@
+// 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.
+
+#ifndef _CRT_SECURE_NO_WARNINGS
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+
+#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::buffer_range<char>> {
+ public:
+ using range = fmt::buffer_range<char>;
+ typedef fmt::arg_formatter<range> base;
+
+ custom_arg_formatter(fmt::format_context& ctx,
+ fmt::format_parse_context* parse_ctx,
+ fmt::format_specs* s = nullptr)
+ : base(ctx, parse_ctx, s) {}
+
+ using base::operator();
+
+ iterator operator()(double value) {
+ // Comparing a float to 0.0 is safe.
+ if (round(value * pow(10, specs()->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