/* Custom argument formatter tests Copyright (c) 2016, Victor Zverovich All rights reserved. For the license information refer to format.h. */ #include "fmt/printf.h" #include "gtest-extra.h" using fmt::BasicPrintfArgFormatter; // A custom argument formatter that doesn't print `-` for floating-point values // rounded to 0. class CustomArgFormatter : public fmt::BasicArgFormatter { public: CustomArgFormatter(fmt::BasicFormatter &f, fmt::FormatSpec &s, const char *fmt) : fmt::BasicArgFormatter(f, s, fmt) {} void visit_double(double value) { if (round(value * pow(10, spec().precision())) == 0) value = 0; fmt::BasicArgFormatter::visit_double(value); } }; // A custom argument formatter that doesn't print `-` for floating-point values // rounded to 0. class CustomPrintfArgFormatter : public BasicPrintfArgFormatter { public: typedef BasicPrintfArgFormatter Base; CustomPrintfArgFormatter(fmt::BasicWriter &w, fmt::FormatSpec &spec) : Base(w, spec) {} void visit_double(double value) { if (round(value * pow(10, spec().precision())) == 0) value = 0; Base::visit_double(value); } }; std::string custom_vformat(const char *format_str, fmt::format_args args) { fmt::MemoryWriter writer; // Pass custom argument formatter as a template arg to BasicFormatter. fmt::BasicFormatter formatter(args, writer); formatter.format(format_str); return writer.str(); } template std::string custom_format(const char *format_str, const Args & ... args) { auto va = fmt::make_format_args>(args...); return custom_vformat(format_str, va); } std::string custom_vsprintf(const char* format_str, fmt::format_args args) { fmt::MemoryWriter writer; fmt::PrintfFormatter formatter(args, writer); formatter.format(format_str); return writer.str(); } template std::string custom_sprintf(const char *format_str, const Args & ... args) { auto va = fmt::make_format_args>(args...); return custom_vsprintf(format_str, va); } TEST(CustomFormatterTest, Format) { EXPECT_EQ("0.00", custom_format("{:.2f}", -.00001)); EXPECT_EQ("0.00", custom_sprintf("%.2f", -.00001)); }