diff options
Diffstat (limited to '')
-rw-r--r-- | src/fmt/test/custom-formatter-test.cc | 56 |
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 |