compile-fp-test.cc 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. // Formatting library for C++ - formatting library tests
  2. //
  3. // Copyright (c) 2012 - present, Victor Zverovich
  4. // All rights reserved.
  5. //
  6. // For the license information refer to format.h.
  7. #include "fmt/compile.h"
  8. #include "gmock/gmock.h"
  9. #if FMT_USE_CONSTEVAL
  10. template <size_t max_string_length, typename Char = char> struct test_string {
  11. template <typename T> constexpr bool operator==(const T& rhs) const noexcept {
  12. return fmt::basic_string_view<Char>(rhs).compare(buffer) == 0;
  13. }
  14. Char buffer[max_string_length]{};
  15. };
  16. template <size_t max_string_length, typename Char = char, typename... Args>
  17. consteval auto test_format(auto format, const Args&... args) {
  18. test_string<max_string_length, Char> string{};
  19. fmt::format_to(string.buffer, format, args...);
  20. return string;
  21. }
  22. TEST(compile_time_formatting_test, floating_point) {
  23. EXPECT_EQ("0", test_format<2>(FMT_COMPILE("{}"), 0.0f));
  24. EXPECT_EQ("392.500000", test_format<11>(FMT_COMPILE("{0:f}"), 392.5f));
  25. EXPECT_EQ("0", test_format<2>(FMT_COMPILE("{:}"), 0.0));
  26. EXPECT_EQ("0.000000", test_format<9>(FMT_COMPILE("{:f}"), 0.0));
  27. EXPECT_EQ("0", test_format<2>(FMT_COMPILE("{:g}"), 0.0));
  28. EXPECT_EQ("392.65", test_format<7>(FMT_COMPILE("{:}"), 392.65));
  29. EXPECT_EQ("392.65", test_format<7>(FMT_COMPILE("{:g}"), 392.65));
  30. EXPECT_EQ("392.65", test_format<7>(FMT_COMPILE("{:G}"), 392.65));
  31. EXPECT_EQ("4.9014e+06", test_format<11>(FMT_COMPILE("{:g}"), 4.9014e6));
  32. EXPECT_EQ("-392.650000", test_format<12>(FMT_COMPILE("{:f}"), -392.65));
  33. EXPECT_EQ("-392.650000", test_format<12>(FMT_COMPILE("{:F}"), -392.65));
  34. EXPECT_EQ("3.926500e+02", test_format<13>(FMT_COMPILE("{0:e}"), 392.65));
  35. EXPECT_EQ("3.926500E+02", test_format<13>(FMT_COMPILE("{0:E}"), 392.65));
  36. EXPECT_EQ("+0000392.6", test_format<11>(FMT_COMPILE("{0:+010.4g}"), 392.65));
  37. EXPECT_EQ("9223372036854775808.000000",
  38. test_format<27>(FMT_COMPILE("{:f}"), 9223372036854775807.0));
  39. constexpr double nan = std::numeric_limits<double>::quiet_NaN();
  40. EXPECT_EQ("nan", test_format<4>(FMT_COMPILE("{}"), nan));
  41. EXPECT_EQ("+nan", test_format<5>(FMT_COMPILE("{:+}"), nan));
  42. if (std::signbit(-nan))
  43. EXPECT_EQ("-nan", test_format<5>(FMT_COMPILE("{}"), -nan));
  44. else
  45. fmt::print("Warning: compiler doesn't handle negative NaN correctly");
  46. constexpr double inf = std::numeric_limits<double>::infinity();
  47. EXPECT_EQ("inf", test_format<4>(FMT_COMPILE("{}"), inf));
  48. EXPECT_EQ("+inf", test_format<5>(FMT_COMPILE("{:+}"), inf));
  49. EXPECT_EQ("-inf", test_format<5>(FMT_COMPILE("{}"), -inf));
  50. }
  51. #endif // FMT_USE_CONSTEVAL