1 /*
2  Custom argument formatter tests
3 
4  Copyright (c) 2016, Victor Zverovich
5  All rights reserved.
6 
7  For the license information refer to format.h.
8  */
9 
10 #include "fmt/printf.h"
11 #include "gtest-extra.h"
12 
13 using fmt::BasicPrintfArgFormatter;
14 
15 // A custom argument formatter that doesn't print `-` for floating-point values
16 // rounded to 0.
17 class CustomArgFormatter
18   : public fmt::BasicArgFormatter<CustomArgFormatter, char> {
19  public:
CustomArgFormatter(fmt::BasicFormatter<char,CustomArgFormatter> & f,fmt::FormatSpec & s,const char * fmt)20   CustomArgFormatter(fmt::BasicFormatter<char, CustomArgFormatter> &f,
21                      fmt::FormatSpec &s, const char *fmt)
22   : fmt::BasicArgFormatter<CustomArgFormatter, char>(f, s, fmt) {}
23 
visit_double(double value)24   void visit_double(double value) {
25     if (round(value * pow(10, spec().precision())) == 0)
26       value = 0;
27     fmt::BasicArgFormatter<CustomArgFormatter, char>::visit_double(value);
28   }
29 };
30 
31 // A custom argument formatter that doesn't print `-` for floating-point values
32 // rounded to 0.
33 class CustomPrintfArgFormatter :
34     public BasicPrintfArgFormatter<CustomPrintfArgFormatter, char> {
35  public:
36   typedef BasicPrintfArgFormatter<CustomPrintfArgFormatter, char> Base;
37 
CustomPrintfArgFormatter(fmt::BasicWriter<char> & w,fmt::FormatSpec & spec)38   CustomPrintfArgFormatter(fmt::BasicWriter<char> &w, fmt::FormatSpec &spec)
39   : Base(w, spec) {}
40 
visit_double(double value)41   void visit_double(double value) {
42     if (round(value * pow(10, spec().precision())) == 0)
43       value = 0;
44     Base::visit_double(value);
45   }
46 };
47 
custom_format(const char * format_str,fmt::ArgList args)48 std::string custom_format(const char *format_str, fmt::ArgList args) {
49   fmt::MemoryWriter writer;
50   // Pass custom argument formatter as a template arg to BasicFormatter.
51   fmt::BasicFormatter<char, CustomArgFormatter> formatter(args, writer);
52   formatter.format(format_str);
53   return writer.str();
54 }
FMT_VARIADIC(std::string,custom_format,const char *)55 FMT_VARIADIC(std::string, custom_format, const char *)
56 
57 std::string custom_sprintf(const char* format_str, fmt::ArgList args){
58   fmt::MemoryWriter writer;
59   fmt::PrintfFormatter<char, CustomPrintfArgFormatter> formatter(args, writer);
60   formatter.format(format_str);
61   return writer.str();
62 }
63 FMT_VARIADIC(std::string, custom_sprintf, const char*);
64 
TEST(CustomFormatterTest,Format)65 TEST(CustomFormatterTest, Format) {
66   EXPECT_EQ("0.00", custom_format("{:.2f}", -.00001));
67   EXPECT_EQ("0.00", custom_sprintf("%.2f", -.00001));
68 }
69