| 
									
										
										
										
											2016-06-08 01:23:32 +02:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  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"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-21 06:59:28 -07:00
										 |  |  | using fmt::BasicPrintfArgFormatter; | 
					
						
							| 
									
										
										
										
											2016-06-08 01:23:32 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | // A custom argument formatter that doesn't print `-` for floating-point values
 | 
					
						
							|  |  |  | // rounded to 0.
 | 
					
						
							|  |  |  | class CustomArgFormatter | 
					
						
							|  |  |  |   : public fmt::BasicArgFormatter<CustomArgFormatter, char> { | 
					
						
							|  |  |  |  public: | 
					
						
							|  |  |  |   CustomArgFormatter(fmt::BasicFormatter<char, CustomArgFormatter> &f, | 
					
						
							|  |  |  |                      fmt::FormatSpec &s, const char *fmt) | 
					
						
							|  |  |  |   : fmt::BasicArgFormatter<CustomArgFormatter, char>(f, s, fmt) {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   void visit_double(double value) { | 
					
						
							|  |  |  |     if (round(value * pow(10, spec().precision())) == 0) | 
					
						
							|  |  |  |       value = 0; | 
					
						
							|  |  |  |     fmt::BasicArgFormatter<CustomArgFormatter, char>::visit_double(value); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // A custom argument formatter that doesn't print `-` for floating-point values
 | 
					
						
							|  |  |  | // rounded to 0.
 | 
					
						
							| 
									
										
										
										
											2016-07-21 06:59:28 -07:00
										 |  |  | class CustomPrintfArgFormatter : | 
					
						
							|  |  |  |     public BasicPrintfArgFormatter<CustomPrintfArgFormatter, char> { | 
					
						
							| 
									
										
										
										
											2016-06-08 01:23:32 +02:00
										 |  |  |  public: | 
					
						
							| 
									
										
										
										
											2016-07-21 06:59:28 -07:00
										 |  |  |   typedef BasicPrintfArgFormatter<CustomPrintfArgFormatter, char> Base; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   CustomPrintfArgFormatter(fmt::BasicWriter<char> &w, fmt::FormatSpec &spec) | 
					
						
							|  |  |  |   : Base(w, spec) {} | 
					
						
							| 
									
										
										
										
											2016-06-08 01:23:32 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   void visit_double(double value) { | 
					
						
							|  |  |  |     if (round(value * pow(10, spec().precision())) == 0) | 
					
						
							|  |  |  |       value = 0; | 
					
						
							| 
									
										
										
										
											2016-07-21 06:59:28 -07:00
										 |  |  |     Base::visit_double(value); | 
					
						
							| 
									
										
										
										
											2016-06-08 01:23:32 +02:00
										 |  |  |   } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | std::string custom_format(const char *format_str, fmt::ArgList args) { | 
					
						
							|  |  |  |   fmt::MemoryWriter writer; | 
					
						
							|  |  |  |   // Pass custom argument formatter as a template arg to BasicFormatter.
 | 
					
						
							|  |  |  |   fmt::BasicFormatter<char, CustomArgFormatter> formatter(args, writer); | 
					
						
							|  |  |  |   formatter.format(format_str); | 
					
						
							|  |  |  |   return writer.str(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | FMT_VARIADIC(std::string, custom_format, const char *) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-20 08:21:13 -07:00
										 |  |  | std::string custom_sprintf(const char* format_str, fmt::ArgList args){ | 
					
						
							| 
									
										
										
										
											2016-06-08 01:23:32 +02:00
										 |  |  |   fmt::MemoryWriter writer; | 
					
						
							| 
									
										
										
										
											2016-07-21 06:59:28 -07:00
										 |  |  |   fmt::PrintfFormatter<char, CustomPrintfArgFormatter> formatter(args, writer); | 
					
						
							| 
									
										
										
										
											2016-07-20 08:21:13 -07:00
										 |  |  |   formatter.format(format_str); | 
					
						
							| 
									
										
										
										
											2016-06-08 01:23:32 +02:00
										 |  |  |   return writer.str(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | FMT_VARIADIC(std::string, custom_sprintf, const char*); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST(CustomFormatterTest, Format) { | 
					
						
							|  |  |  |   EXPECT_EQ("0.00", custom_format("{:.2f}", -.00001)); | 
					
						
							|  |  |  |   EXPECT_EQ("0.00", custom_sprintf("%.2f", -.00001)); | 
					
						
							|  |  |  | } |