// 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.

#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::back_insert_range<fmt::internal::buffer>> {
 public:
  typedef fmt::back_insert_range<fmt::internal::buffer> range;
  typedef fmt::arg_formatter<range> base;

  custom_arg_formatter(
      fmt::format_context &ctx, fmt::format_specs *s = FMT_NULL)
  : base(ctx, s) {}

  using base::operator();

  iterator operator()(double value) {
    // Comparing a float to 0.0 is safe.
    if (round(value * pow(10, spec()->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
