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