/* 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::PrintfArgFormatter; // A custom argument formatter that doesn't print `-` for floating-point values // rounded to 0. class CustomArgFormatter : public fmt::ArgFormatter { public: CustomArgFormatter(fmt::Writer &w, fmt::basic_format_context &ctx, fmt::FormatSpec &s) : fmt::ArgFormatter(w, ctx, s) {} using fmt::ArgFormatter::operator(); void operator()(double value) { if (round(value * pow(10, spec().precision())) == 0) value = 0; fmt::ArgFormatter::operator()(value); } }; // A custom argument formatter that doesn't print `-` for floating-point values // rounded to 0. class CustomPrintfArgFormatter : public PrintfArgFormatter { public: CustomPrintfArgFormatter(fmt::BasicWriter &w, fmt::FormatSpec &spec) : PrintfArgFormatter(w, spec) {} using PrintfArgFormatter::operator(); void operator()(double value) { if (round(value * pow(10, spec().precision())) == 0) value = 0; PrintfArgFormatter::operator()(value); } }; std::string custom_vformat(fmt::CStringRef format_str, fmt::format_args args) { fmt::MemoryWriter writer; // Pass custom argument formatter as a template arg to vformat. fmt::vformat(writer, format_str, args); 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); } typedef fmt::printf_context CustomPrintfFormatter; std::string custom_vsprintf( const char* format_str, fmt::basic_format_args args) { fmt::MemoryWriter writer; CustomPrintfFormatter formatter(format_str, args); formatter.format(writer); return writer.str(); } template std::string custom_sprintf(const char *format_str, const Args & ... args) { auto va = fmt::make_xformat_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)); }