| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1 |
// Formatting library for C++ - formatting library tests |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2 |
// |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
3 |
// Copyright (c) 2012 - present, Victor Zverovich |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
4 |
// All rights reserved. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
5 |
// |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
6 |
// For the license information refer to format.h. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
7 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
8 |
// Check if fmt/format.h compiles with windows.h included before it. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
9 |
#ifdef _WIN32 |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
10 |
# include <windows.h> |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
11 |
#endif |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
12 |
// clang-format off |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
13 |
#include "fmt/format.h" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
14 |
// clang-format on |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
15 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
16 |
#include <stdint.h> // uint32_t |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
17 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
18 |
#include <cfenv> // fegetexceptflag and FE_ALL_EXCEPT |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
19 |
#include <climits> // INT_MAX |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
20 |
#include <cmath> // std::signbit |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
21 |
#include <condition_variable> // std::condition_variable |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
22 |
#include <cstring> // std::strlen |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
23 |
#include <iterator> // std::back_inserter |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
24 |
#include <list> // std::list |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
25 |
#include <mutex> // std::mutex |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
26 |
#include <string> // std::string |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
27 |
#include <thread> // std::thread |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
28 |
#include <type_traits> // std::is_default_constructible |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
29 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
30 |
#include "gtest-extra.h" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
31 |
#include "mock-allocator.h" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
32 |
#include "util.h" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
33 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
34 |
using fmt::basic_memory_buffer; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
35 |
using fmt::format_error; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
36 |
using fmt::memory_buffer; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
37 |
using fmt::runtime; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
38 |
using fmt::string_view; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
39 |
using fmt::detail::max_value; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
40 |
using fmt::detail::uint128_fallback; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
41 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
42 |
using testing::Return; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
43 |
using testing::StrictMock; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
44 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
45 |
enum { buffer_size = 256 }; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
46 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
47 |
TEST(uint128_test, ctor) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
48 |
auto n = uint128_fallback(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
49 |
EXPECT_EQ(n, 0); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
50 |
n = uint128_fallback(42); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
51 |
EXPECT_EQ(n, 42); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
52 |
EXPECT_EQ(static_cast<uint64_t>(n), 42); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
53 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
54 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
55 |
TEST(uint128_test, shift) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
56 |
auto n = uint128_fallback(42); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
57 |
n = n << 64; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
58 |
EXPECT_EQ(static_cast<uint64_t>(n), 0); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
59 |
n = n >> 64; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
60 |
EXPECT_EQ(static_cast<uint64_t>(n), 42); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
61 |
n = n << 62; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
62 |
EXPECT_EQ(static_cast<uint64_t>(n >> 64), 0xa); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
63 |
EXPECT_EQ(static_cast<uint64_t>(n), 0x8000000000000000); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
64 |
n = n >> 62; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
65 |
EXPECT_EQ(static_cast<uint64_t>(n), 42); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
66 |
EXPECT_EQ(uint128_fallback(1) << 112, uint128_fallback(0x1000000000000, 0)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
67 |
EXPECT_EQ(uint128_fallback(0x1000000000000, 0) >> 112, uint128_fallback(1)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
68 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
69 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
70 |
TEST(uint128_test, minus) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
71 |
auto n = uint128_fallback(42); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
72 |
EXPECT_EQ(n - 2, 40); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
73 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
74 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
75 |
TEST(uint128_test, plus_assign) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
76 |
auto n = uint128_fallback(32); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
77 |
n += uint128_fallback(10); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
78 |
EXPECT_EQ(n, 42); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
79 |
n = uint128_fallback(max_value<uint64_t>()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
80 |
n += uint128_fallback(1); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
81 |
EXPECT_EQ(n, uint128_fallback(1) << 64); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
82 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
83 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
84 |
TEST(uint128_test, multiply) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
85 |
auto n = uint128_fallback(2251799813685247); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
86 |
n = n * 3611864890; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
87 |
EXPECT_EQ(static_cast<uint64_t>(n >> 64), 440901); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
88 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
89 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
90 |
template <typename Float> void check_isfinite() { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
91 |
using fmt::detail::isfinite; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
92 |
EXPECT_TRUE(isfinite(Float(0.0))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
93 |
EXPECT_TRUE(isfinite(Float(42.0))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
94 |
EXPECT_TRUE(isfinite(Float(-42.0))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
95 |
EXPECT_TRUE(isfinite(Float(fmt::detail::max_value<double>()))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
96 |
// Use double because std::numeric_limits is broken for __float128. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
97 |
using limits = std::numeric_limits<double>; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
98 |
FMT_CONSTEXPR20 auto result = isfinite(Float(limits::infinity())); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
99 |
EXPECT_FALSE(result); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
100 |
EXPECT_FALSE(isfinite(Float(limits::infinity()))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
101 |
EXPECT_FALSE(isfinite(Float(-limits::infinity()))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
102 |
EXPECT_FALSE(isfinite(Float(limits::quiet_NaN()))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
103 |
EXPECT_FALSE(isfinite(Float(-limits::quiet_NaN()))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
104 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
105 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
106 |
TEST(float_test, isfinite) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
107 |
check_isfinite<double>(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
108 |
#if FMT_USE_FLOAT128 |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
109 |
check_isfinite<fmt::detail::float128>(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
110 |
#endif |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
111 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
112 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
113 |
void check_no_fp_exception() { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
114 |
fexcept_t fe; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
115 |
fegetexceptflag(&fe, FE_ALL_EXCEPT); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
116 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
117 |
// No exception flags should have been set |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
118 |
EXPECT_TRUE(fe == 0); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
119 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
120 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
121 |
template <typename Float> void check_isnan() { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
122 |
using fmt::detail::isnan; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
123 |
EXPECT_FALSE(isnan(Float(0.0))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
124 |
EXPECT_FALSE(isnan(Float(42.0))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
125 |
EXPECT_FALSE(isnan(Float(-42.0))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
126 |
EXPECT_FALSE(isnan(Float(fmt::detail::max_value<double>()))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
127 |
// Use double because std::numeric_limits is broken for __float128. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
128 |
using limits = std::numeric_limits<double>; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
129 |
EXPECT_FALSE(isnan(Float(limits::infinity()))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
130 |
EXPECT_FALSE(isnan(Float(-limits::infinity()))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
131 |
EXPECT_TRUE(isnan(Float(limits::quiet_NaN()))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
132 |
EXPECT_TRUE(isnan(Float(-limits::quiet_NaN()))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
133 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
134 |
// Sanity check: make sure no error has occurred before we start |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
135 |
check_no_fp_exception(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
136 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
137 |
// Check that no exception is raised for the non-NaN case |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
138 |
isnan(Float(42.0)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
139 |
check_no_fp_exception(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
140 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
141 |
// Check that no exception is raised for the NaN case |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
142 |
isnan(Float(limits::quiet_NaN())); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
143 |
check_no_fp_exception(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
144 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
145 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
146 |
TEST(float_test, isnan) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
147 |
check_isnan<double>(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
148 |
#if FMT_USE_FLOAT128 |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
149 |
check_isnan<fmt::detail::float128>(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
150 |
#endif |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
151 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
152 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
153 |
struct uint32_pair { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
154 |
uint32_t u[2]; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
155 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
156 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
157 |
TEST(util_test, bit_cast) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
158 |
auto s = fmt::detail::bit_cast<uint32_pair>(uint64_t{42}); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
159 |
EXPECT_EQ(fmt::detail::bit_cast<uint64_t>(s), 42ull); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
160 |
s = fmt::detail::bit_cast<uint32_pair>(~uint64_t{0}); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
161 |
EXPECT_EQ(fmt::detail::bit_cast<uint64_t>(s), ~0ull); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
162 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
163 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
164 |
// Increment a number in a string. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
165 |
void increment(char* s) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
166 |
for (int i = static_cast<int>(std::strlen(s)) - 1; i >= 0; --i) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
167 |
if (s[i] != '9') { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
168 |
++s[i]; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
169 |
break; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
170 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
171 |
s[i] = '0'; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
172 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
173 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
174 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
175 |
TEST(util_test, increment) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
176 |
char s[10] = "123"; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
177 |
increment(s); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
178 |
EXPECT_STREQ("124", s); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
179 |
s[2] = '8'; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
180 |
increment(s); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
181 |
EXPECT_STREQ("129", s); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
182 |
increment(s); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
183 |
EXPECT_STREQ("130", s); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
184 |
s[1] = s[2] = '9'; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
185 |
increment(s); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
186 |
EXPECT_STREQ("200", s); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
187 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
188 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
189 |
TEST(util_test, parse_nonnegative_int) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
190 |
auto s = fmt::string_view("10000000000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
191 |
auto begin = s.begin(), end = s.end(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
192 |
EXPECT_EQ(fmt::detail::parse_nonnegative_int(begin, end, -1), -1); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
193 |
s = "2147483649"; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
194 |
begin = s.begin(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
195 |
end = s.end(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
196 |
EXPECT_EQ(fmt::detail::parse_nonnegative_int(begin, end, -1), -1); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
197 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
198 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
199 |
TEST(format_impl_test, compute_width) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
200 |
EXPECT_EQ(fmt::detail::compute_width("вожык"), 5); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
201 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
202 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
203 |
TEST(util_test, utf8_to_utf16) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
204 |
auto u = fmt::detail::utf8_to_utf16("лошадка"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
205 |
EXPECT_EQ(L"\x043B\x043E\x0448\x0430\x0434\x043A\x0430", u.str()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
206 |
EXPECT_EQ(7, u.size()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
207 |
// U+10437 { DESERET SMALL LETTER YEE } |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
208 |
EXPECT_EQ(L"\xD801\xDC37", fmt::detail::utf8_to_utf16("𐐷").str()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
209 |
EXPECT_THROW_MSG(fmt::detail::utf8_to_utf16("\xc3\x28"), std::runtime_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
210 |
"invalid utf8"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
211 |
EXPECT_THROW_MSG(fmt::detail::utf8_to_utf16(fmt::string_view("л", 1)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
212 |
std::runtime_error, "invalid utf8"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
213 |
EXPECT_EQ(L"123456", fmt::detail::utf8_to_utf16("123456").str()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
214 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
215 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
216 |
TEST(util_test, utf8_to_utf16_empty_string) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
217 |
auto s = std::string(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
218 |
auto u = fmt::detail::utf8_to_utf16(s.c_str()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
219 |
EXPECT_EQ(L"", u.str()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
220 |
EXPECT_EQ(s.size(), u.size()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
221 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
222 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
223 |
TEST(util_test, allocator_ref) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
224 |
using test_allocator_ref = allocator_ref<mock_allocator<int>>; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
225 |
auto check_forwarding = [](mock_allocator<int>& alloc, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
226 |
test_allocator_ref& ref) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
227 |
int mem; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
228 |
// Check if value_type is properly defined. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
229 |
allocator_ref<mock_allocator<int>>::value_type* ptr = &mem; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
230 |
// Check forwarding. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
231 |
EXPECT_CALL(alloc, allocate(42)).WillOnce(Return(ptr)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
232 |
ref.allocate(42); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
233 |
EXPECT_CALL(alloc, deallocate(ptr, 42)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
234 |
ref.deallocate(ptr, 42); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
235 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
236 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
237 |
StrictMock<mock_allocator<int>> alloc; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
238 |
auto ref = test_allocator_ref(&alloc); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
239 |
// Check if allocator_ref forwards to the underlying allocator. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
240 |
check_forwarding(alloc, ref); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
241 |
test_allocator_ref ref2(ref); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
242 |
check_forwarding(alloc, ref2); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
243 |
test_allocator_ref ref3; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
244 |
EXPECT_EQ(nullptr, ref3.get()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
245 |
ref3 = ref; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
246 |
check_forwarding(alloc, ref3); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
247 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
248 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
249 |
TEST(util_test, format_system_error) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
250 |
fmt::memory_buffer message; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
251 |
fmt::format_system_error(message, EDOM, "test"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
252 |
auto ec = std::error_code(EDOM, std::generic_category()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
253 |
EXPECT_EQ(to_string(message), std::system_error(ec, "test").what()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
254 |
message = fmt::memory_buffer(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
255 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
256 |
// Check if std::allocator throws on allocating max size_t / 2 chars. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
257 |
size_t max_size = max_value<size_t>() / 2; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
258 |
bool throws_on_alloc = false; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
259 |
try { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
260 |
auto alloc = std::allocator<char>(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
261 |
alloc.deallocate(alloc.allocate(max_size), max_size); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
262 |
} catch (const std::bad_alloc&) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
263 |
throws_on_alloc = true; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
264 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
265 |
if (!throws_on_alloc) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
266 |
fmt::print(stderr, "warning: std::allocator allocates {} chars\n", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
267 |
max_size); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
268 |
return; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
269 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
270 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
271 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
272 |
TEST(util_test, system_error) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
273 |
auto test_error = fmt::system_error(EDOM, "test"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
274 |
auto ec = std::error_code(EDOM, std::generic_category()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
275 |
EXPECT_STREQ(test_error.what(), std::system_error(ec, "test").what()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
276 |
EXPECT_EQ(test_error.code(), ec); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
277 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
278 |
auto error = std::system_error(std::error_code()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
279 |
try { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
280 |
throw fmt::system_error(EDOM, "test {}", "error"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
281 |
} catch (const std::system_error& e) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
282 |
error = e; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
283 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
284 |
fmt::memory_buffer message; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
285 |
fmt::format_system_error(message, EDOM, "test error"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
286 |
EXPECT_EQ(error.what(), to_string(message)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
287 |
EXPECT_EQ(error.code(), std::error_code(EDOM, std::generic_category())); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
288 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
289 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
290 |
TEST(util_test, report_system_error) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
291 |
fmt::memory_buffer out; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
292 |
fmt::format_system_error(out, EDOM, "test error"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
293 |
out.push_back('\n'); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
294 |
EXPECT_WRITE(stderr, fmt::report_system_error(EDOM, "test error"), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
295 |
to_string(out)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
296 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
297 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
298 |
TEST(memory_buffer_test, ctor) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
299 |
basic_memory_buffer<char, 123> buffer; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
300 |
EXPECT_EQ(static_cast<size_t>(0), buffer.size()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
301 |
EXPECT_EQ(123u, buffer.capacity()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
302 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
303 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
304 |
using std_allocator = allocator_ref<std::allocator<char>>; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
305 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
306 |
TEST(memory_buffer_test, move_ctor_inline_buffer) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
307 |
auto check_move_buffer = |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
308 |
[](const char* str, basic_memory_buffer<char, 5, std_allocator>& buffer) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
309 |
std::allocator<char>* alloc = buffer.get_allocator().get(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
310 |
basic_memory_buffer<char, 5, std_allocator> buffer2(std::move(buffer)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
311 |
// Move shouldn't destroy the inline content of the first buffer. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
312 |
EXPECT_EQ(str, std::string(&buffer[0], buffer.size())); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
313 |
EXPECT_EQ(str, std::string(&buffer2[0], buffer2.size())); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
314 |
EXPECT_EQ(5u, buffer2.capacity()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
315 |
// Move should transfer allocator. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
316 |
EXPECT_EQ(nullptr, buffer.get_allocator().get()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
317 |
EXPECT_EQ(alloc, buffer2.get_allocator().get()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
318 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
319 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
320 |
auto alloc = std::allocator<char>(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
321 |
basic_memory_buffer<char, 5, std_allocator> buffer((std_allocator(&alloc))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
322 |
const char test[] = "test"; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
323 |
buffer.append(string_view(test, 4)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
324 |
check_move_buffer("test", buffer); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
325 |
// Adding one more character fills the inline buffer, but doesn't cause |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
326 |
// dynamic allocation. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
327 |
buffer.push_back('a'); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
328 |
check_move_buffer("testa", buffer); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
329 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
330 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
331 |
TEST(memory_buffer_test, move_ctor_dynamic_buffer) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
332 |
auto alloc = std::allocator<char>(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
333 |
basic_memory_buffer<char, 4, std_allocator> buffer((std_allocator(&alloc))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
334 |
const char test[] = "test"; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
335 |
buffer.append(test, test + 4); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
336 |
const char* inline_buffer_ptr = &buffer[0]; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
337 |
// Adding one more character causes the content to move from the inline to |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
338 |
// a dynamically allocated buffer. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
339 |
buffer.push_back('a'); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
340 |
basic_memory_buffer<char, 4, std_allocator> buffer2(std::move(buffer)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
341 |
// Move should rip the guts of the first buffer. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
342 |
EXPECT_EQ(&buffer[0], inline_buffer_ptr); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
343 |
EXPECT_EQ(buffer.size(), 0); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
344 |
EXPECT_EQ(std::string(&buffer2[0], buffer2.size()), "testa"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
345 |
EXPECT_GT(buffer2.capacity(), 4u); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
346 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
347 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
348 |
void check_move_assign_buffer(const char* str, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
349 |
basic_memory_buffer<char, 5>& buffer) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
350 |
basic_memory_buffer<char, 5> buffer2; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
351 |
buffer2 = std::move(buffer); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
352 |
// Move shouldn't destroy the inline content of the first buffer. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
353 |
EXPECT_EQ(str, std::string(&buffer[0], buffer.size())); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
354 |
EXPECT_EQ(str, std::string(&buffer2[0], buffer2.size())); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
355 |
EXPECT_EQ(5u, buffer2.capacity()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
356 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
357 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
358 |
TEST(memory_buffer_test, move_assignment) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
359 |
basic_memory_buffer<char, 5> buffer; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
360 |
const char test[] = "test"; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
361 |
buffer.append(test, test + 4); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
362 |
check_move_assign_buffer("test", buffer); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
363 |
// Adding one more character fills the inline buffer, but doesn't cause |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
364 |
// dynamic allocation. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
365 |
buffer.push_back('a'); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
366 |
check_move_assign_buffer("testa", buffer); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
367 |
const char* inline_buffer_ptr = &buffer[0]; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
368 |
// Adding one more character causes the content to move from the inline to |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
369 |
// a dynamically allocated buffer. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
370 |
buffer.push_back('b'); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
371 |
basic_memory_buffer<char, 5> buffer2; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
372 |
buffer2 = std::move(buffer); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
373 |
// Move should rip the guts of the first buffer. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
374 |
EXPECT_EQ(inline_buffer_ptr, &buffer[0]); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
375 |
EXPECT_EQ("testab", std::string(&buffer2[0], buffer2.size())); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
376 |
EXPECT_GT(buffer2.capacity(), 5u); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
377 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
378 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
379 |
TEST(memory_buffer_test, grow) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
380 |
using allocator = allocator_ref<mock_allocator<int>>; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
381 |
mock_allocator<int> alloc; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
382 |
basic_memory_buffer<int, 10, allocator> buffer((allocator(&alloc))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
383 |
buffer.resize(7); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
384 |
using fmt::detail::to_unsigned; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
385 |
for (int i = 0; i < 7; ++i) buffer[to_unsigned(i)] = i * i; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
386 |
EXPECT_EQ(10u, buffer.capacity()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
387 |
int mem[20]; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
388 |
mem[7] = 0xdead; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
389 |
EXPECT_CALL(alloc, allocate(20)).WillOnce(Return(mem)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
390 |
buffer.try_reserve(20); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
391 |
EXPECT_EQ(20u, buffer.capacity()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
392 |
// Check if size elements have been copied |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
393 |
for (int i = 0; i < 7; ++i) EXPECT_EQ(i * i, buffer[to_unsigned(i)]); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
394 |
// and no more than that. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
395 |
EXPECT_EQ(0xdead, buffer[7]); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
396 |
EXPECT_CALL(alloc, deallocate(mem, 20)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
397 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
398 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
399 |
TEST(memory_buffer_test, allocator) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
400 |
using test_allocator = allocator_ref<mock_allocator<char>>; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
401 |
basic_memory_buffer<char, 10, test_allocator> buffer; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
402 |
EXPECT_EQ(nullptr, buffer.get_allocator().get()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
403 |
StrictMock<mock_allocator<char>> alloc; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
404 |
char mem; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
405 |
{ |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
406 |
basic_memory_buffer<char, 10, test_allocator> buffer2( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
407 |
(test_allocator(&alloc))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
408 |
EXPECT_EQ(&alloc, buffer2.get_allocator().get()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
409 |
size_t size = 2 * fmt::inline_buffer_size; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
410 |
EXPECT_CALL(alloc, allocate(size)).WillOnce(Return(&mem)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
411 |
buffer2.reserve(size); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
412 |
EXPECT_CALL(alloc, deallocate(&mem, size)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
413 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
414 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
415 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
416 |
TEST(memory_buffer_test, exception_in_deallocate) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
417 |
using test_allocator = allocator_ref<mock_allocator<char>>; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
418 |
StrictMock<mock_allocator<char>> alloc; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
419 |
basic_memory_buffer<char, 10, test_allocator> buffer( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
420 |
(test_allocator(&alloc))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
421 |
size_t size = 2 * fmt::inline_buffer_size; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
422 |
auto mem = std::vector<char>(size); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
423 |
{ |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
424 |
EXPECT_CALL(alloc, allocate(size)).WillOnce(Return(&mem[0])); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
425 |
buffer.resize(size); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
426 |
std::fill(&buffer[0], &buffer[0] + size, 'x'); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
427 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
428 |
auto mem2 = std::vector<char>(2 * size); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
429 |
{ |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
430 |
EXPECT_CALL(alloc, allocate(2 * size)).WillOnce(Return(&mem2[0])); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
431 |
auto e = std::exception(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
432 |
EXPECT_CALL(alloc, deallocate(&mem[0], size)).WillOnce(testing::Throw(e)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
433 |
EXPECT_THROW(buffer.reserve(2 * size), std::exception); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
434 |
EXPECT_EQ(&mem2[0], &buffer[0]); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
435 |
// Check that the data has been copied. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
436 |
for (size_t i = 0; i < size; ++i) EXPECT_EQ('x', buffer[i]); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
437 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
438 |
EXPECT_CALL(alloc, deallocate(&mem2[0], 2 * size)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
439 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
440 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
441 |
template <typename Allocator, size_t MaxSize> |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
442 |
class max_size_allocator : public Allocator { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
443 |
public: |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
444 |
using typename Allocator::value_type; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
445 |
size_t max_size() const noexcept { return MaxSize; } |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
446 |
value_type* allocate(size_t n) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
447 |
if (n > max_size()) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
448 |
throw std::length_error("size > max_size"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
449 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
450 |
return std::allocator_traits<Allocator>::allocate( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
451 |
*static_cast<Allocator*>(this), n); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
452 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
453 |
void deallocate(value_type* p, size_t n) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
454 |
std::allocator_traits<Allocator>::deallocate(*static_cast<Allocator*>(this), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
455 |
p, n); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
456 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
457 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
458 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
459 |
TEST(memory_buffer_test, max_size_allocator) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
460 |
// 160 = 128 + 32 |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
461 |
using test_allocator = max_size_allocator<std::allocator<char>, 160>; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
462 |
basic_memory_buffer<char, 10, test_allocator> buffer; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
463 |
buffer.resize(128); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
464 |
// new_capacity = 128 + 128/2 = 192 > 160 |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
465 |
buffer.resize(160); // Shouldn't throw. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
466 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
467 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
468 |
TEST(memory_buffer_test, max_size_allocator_overflow) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
469 |
using test_allocator = max_size_allocator<std::allocator<char>, 160>; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
470 |
basic_memory_buffer<char, 10, test_allocator> buffer; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
471 |
EXPECT_THROW(buffer.resize(161), std::exception); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
472 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
473 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
474 |
TEST(format_test, exception_from_lib) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
475 |
EXPECT_THROW_MSG(fmt::report_error("test"), format_error, "test"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
476 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
477 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
478 |
TEST(format_test, escape) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
479 |
EXPECT_EQ(fmt::format("{{"), "{"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
480 |
EXPECT_EQ(fmt::format("before {{"), "before {"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
481 |
EXPECT_EQ(fmt::format("{{ after"), "{ after"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
482 |
EXPECT_EQ(fmt::format("before {{ after"), "before { after"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
483 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
484 |
EXPECT_EQ(fmt::format("}}"), "}"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
485 |
EXPECT_EQ(fmt::format("before }}"), "before }"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
486 |
EXPECT_EQ(fmt::format("}} after"), "} after"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
487 |
EXPECT_EQ(fmt::format("before }} after"), "before } after"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
488 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
489 |
EXPECT_EQ(fmt::format("{{}}"), "{}"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
490 |
EXPECT_EQ(fmt::format("{{{0}}}", 42), "{42}"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
491 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
492 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
493 |
TEST(format_test, unmatched_braces) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
494 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{")), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
495 |
"invalid format string"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
496 |
EXPECT_THROW_MSG((void)fmt::format(runtime("}")), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
497 |
"unmatched '}' in format string"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
498 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0{}")), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
499 |
"invalid format string"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
500 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
501 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
502 |
TEST(format_test, no_args) { EXPECT_EQ(fmt::format("test"), "test"); } |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
503 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
504 |
TEST(format_test, args_in_different_positions) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
505 |
EXPECT_EQ(fmt::format("{0}", 42), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
506 |
EXPECT_EQ(fmt::format("before {0}", 42), "before 42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
507 |
EXPECT_EQ(fmt::format("{0} after", 42), "42 after"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
508 |
EXPECT_EQ(fmt::format("before {0} after", 42), "before 42 after"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
509 |
EXPECT_EQ(fmt::format("{0} = {1}", "answer", 42), "answer = 42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
510 |
EXPECT_EQ(fmt::format("{1} is the {0}", "answer", 42), "42 is the answer"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
511 |
EXPECT_EQ(fmt::format("{0}{1}{0}", "abra", "cad"), "abracadabra"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
512 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
513 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
514 |
TEST(format_test, arg_errors) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
515 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{")), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
516 |
"invalid format string"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
517 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{?}")), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
518 |
"invalid format string"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
519 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0")), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
520 |
"invalid format string"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
521 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0}")), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
522 |
"argument not found"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
523 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{00}"), 42), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
524 |
"invalid format string"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
525 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
526 |
auto int_max = std::to_string(INT_MAX); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
527 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{" + int_max)), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
528 |
"invalid format string"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
529 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{" + int_max + "}")), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
530 |
format_error, "argument not found"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
531 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
532 |
auto int_maxer = std::to_string(INT_MAX + 1u); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
533 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{" + int_maxer)), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
534 |
"invalid format string"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
535 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{" + int_maxer + "}")), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
536 |
format_error, "argument not found"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
537 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
538 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
539 |
template <int N> struct test_format { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
540 |
template <typename... T> |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
541 |
static auto format(fmt::string_view fmt, const T&... args) -> std::string { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
542 |
return test_format<N - 1>::format(fmt, N - 1, args...); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
543 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
544 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
545 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
546 |
template <> struct test_format<0> { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
547 |
template <typename... T> |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
548 |
static auto format(fmt::string_view fmt, const T&... args) -> std::string { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
549 |
return fmt::format(runtime(fmt), args...); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
550 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
551 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
552 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
553 |
TEST(format_test, many_args) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
554 |
EXPECT_EQ("19", test_format<20>::format("{19}")); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
555 |
EXPECT_THROW_MSG(test_format<20>::format("{20}"), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
556 |
"argument not found"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
557 |
EXPECT_THROW_MSG(test_format<21>::format("{21}"), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
558 |
"argument not found"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
559 |
using fmt::detail::max_packed_args; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
560 |
std::string format_str = fmt::format("{{{}}}", max_packed_args + 1); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
561 |
EXPECT_THROW_MSG(test_format<max_packed_args>::format(format_str), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
562 |
format_error, "argument not found"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
563 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
564 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
565 |
TEST(format_test, named_arg) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
566 |
EXPECT_EQ("1/a/A", fmt::format("{_1}/{a_}/{A_}", fmt::arg("a_", 'a'), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
567 |
fmt::arg("A_", "A"), fmt::arg("_1", 1))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
568 |
EXPECT_EQ(fmt::format("{0:{width}}", -42, fmt::arg("width", 4)), " -42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
569 |
EXPECT_EQ("st", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
570 |
fmt::format("{0:.{precision}}", "str", fmt::arg("precision", 2))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
571 |
EXPECT_EQ(fmt::format("{} {two}", 1, fmt::arg("two", 2)), "1 2"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
572 |
EXPECT_EQ("42", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
573 |
fmt::format("{c}", fmt::arg("a", 0), fmt::arg("b", 0), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
574 |
fmt::arg("c", 42), fmt::arg("d", 0), fmt::arg("e", 0), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
575 |
fmt::arg("f", 0), fmt::arg("g", 0), fmt::arg("h", 0), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
576 |
fmt::arg("i", 0), fmt::arg("j", 0), fmt::arg("k", 0), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
577 |
fmt::arg("l", 0), fmt::arg("m", 0), fmt::arg("n", 0), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
578 |
fmt::arg("o", 0), fmt::arg("p", 0))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
579 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{a}")), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
580 |
"argument not found"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
581 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{a}"), 42), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
582 |
"argument not found"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
583 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{a} {}"), fmt::arg("a", 2), 42), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
584 |
format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
585 |
"cannot switch from manual to automatic argument indexing"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
586 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
587 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
588 |
TEST(format_test, auto_arg_index) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
589 |
EXPECT_EQ(fmt::format("{}{}{}", 'a', 'b', 'c'), "abc"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
590 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0}{}"), 'a', 'b'), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
591 |
"cannot switch from manual to automatic argument indexing"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
592 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{}{0}"), 'a', 'b'), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
593 |
"cannot switch from automatic to manual argument indexing"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
594 |
EXPECT_EQ(fmt::format("{:.{}}", 1.2345, 2), "1.2"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
595 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0}:.{}"), 1.2345, 2), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
596 |
format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
597 |
"cannot switch from manual to automatic argument indexing"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
598 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:.{0}}"), 1.2345, 2), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
599 |
format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
600 |
"cannot switch from automatic to manual argument indexing"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
601 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{}")), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
602 |
"argument not found"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
603 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
604 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
605 |
TEST(format_test, empty_specs) { EXPECT_EQ(fmt::format("{0:}", 42), "42"); } |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
606 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
607 |
TEST(format_test, left_align) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
608 |
EXPECT_EQ(fmt::format("{0:<4}", 42), "42 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
609 |
EXPECT_EQ(fmt::format("{0:<4o}", 042), "42 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
610 |
EXPECT_EQ(fmt::format("{0:<4x}", 0x42), "42 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
611 |
EXPECT_EQ(fmt::format("{0:<5}", -42), "-42 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
612 |
EXPECT_EQ(fmt::format("{0:<5}", 42u), "42 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
613 |
EXPECT_EQ(fmt::format("{0:<5}", -42l), "-42 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
614 |
EXPECT_EQ(fmt::format("{0:<5}", 42ul), "42 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
615 |
EXPECT_EQ(fmt::format("{0:<5}", -42ll), "-42 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
616 |
EXPECT_EQ(fmt::format("{0:<5}", 42ull), "42 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
617 |
EXPECT_EQ(fmt::format("{0:<5}", -42.0), "-42 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
618 |
EXPECT_EQ(fmt::format("{0:<5}", -42.0l), "-42 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
619 |
EXPECT_EQ(fmt::format("{0:<5}", 'c'), "c "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
620 |
EXPECT_EQ(fmt::format("{0:<5}", "abc"), "abc "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
621 |
EXPECT_EQ(fmt::format("{0:<8}", reinterpret_cast<void*>(0xface)), "0xface "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
622 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
623 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
624 |
TEST(format_test, right_align) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
625 |
EXPECT_EQ(fmt::format("{0:>4}", 42), " 42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
626 |
EXPECT_EQ(fmt::format("{0:>4o}", 042), " 42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
627 |
EXPECT_EQ(fmt::format("{0:>4x}", 0x42), " 42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
628 |
EXPECT_EQ(fmt::format("{0:>5}", -42), " -42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
629 |
EXPECT_EQ(fmt::format("{0:>5}", 42u), " 42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
630 |
EXPECT_EQ(fmt::format("{0:>5}", -42l), " -42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
631 |
EXPECT_EQ(fmt::format("{0:>5}", 42ul), " 42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
632 |
EXPECT_EQ(fmt::format("{0:>5}", -42ll), " -42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
633 |
EXPECT_EQ(fmt::format("{0:>5}", 42ull), " 42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
634 |
EXPECT_EQ(fmt::format("{0:>5}", -42.0), " -42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
635 |
EXPECT_EQ(fmt::format("{0:>5}", -42.0l), " -42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
636 |
EXPECT_EQ(fmt::format("{0:>5}", 'c'), " c"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
637 |
EXPECT_EQ(fmt::format("{0:>5}", "abc"), " abc"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
638 |
EXPECT_EQ(fmt::format("{0:>8}", reinterpret_cast<void*>(0xface)), " 0xface"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
639 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
640 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
641 |
TEST(format_test, center_align) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
642 |
EXPECT_EQ(fmt::format("{0:^5}", 42), " 42 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
643 |
EXPECT_EQ(fmt::format("{0:^5o}", 042), " 42 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
644 |
EXPECT_EQ(fmt::format("{0:^5x}", 0x42), " 42 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
645 |
EXPECT_EQ(fmt::format("{0:^5}", -42), " -42 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
646 |
EXPECT_EQ(fmt::format("{0:^5}", 42u), " 42 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
647 |
EXPECT_EQ(fmt::format("{0:^5}", -42l), " -42 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
648 |
EXPECT_EQ(fmt::format("{0:^5}", 42ul), " 42 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
649 |
EXPECT_EQ(fmt::format("{0:^5}", -42ll), " -42 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
650 |
EXPECT_EQ(fmt::format("{0:^5}", 42ull), " 42 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
651 |
EXPECT_EQ(fmt::format("{0:^5}", -42.0), " -42 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
652 |
EXPECT_EQ(fmt::format("{0:^5}", -42.0l), " -42 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
653 |
EXPECT_EQ(fmt::format("{0:^5}", 'c'), " c "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
654 |
EXPECT_EQ(fmt::format("{0:^6}", "abc"), " abc "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
655 |
EXPECT_EQ(fmt::format("{0:^8}", reinterpret_cast<void*>(0xface)), " 0xface "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
656 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
657 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
658 |
TEST(format_test, fill) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
659 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{<5}"), 'c'), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
660 |
"invalid fill character '{'"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
661 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{<5}}"), 'c'), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
662 |
"invalid fill character '{'"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
663 |
EXPECT_EQ(fmt::format("{0:*>4}", 42), "**42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
664 |
EXPECT_EQ(fmt::format("{0:*>5}", -42), "**-42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
665 |
EXPECT_EQ(fmt::format("{0:*>5}", 42u), "***42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
666 |
EXPECT_EQ(fmt::format("{0:*>5}", -42l), "**-42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
667 |
EXPECT_EQ(fmt::format("{0:*>5}", 42ul), "***42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
668 |
EXPECT_EQ(fmt::format("{0:*>5}", -42ll), "**-42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
669 |
EXPECT_EQ(fmt::format("{0:*>5}", 42ull), "***42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
670 |
EXPECT_EQ(fmt::format("{0:*>5}", -42.0), "**-42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
671 |
EXPECT_EQ(fmt::format("{0:*>5}", -42.0l), "**-42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
672 |
EXPECT_EQ(fmt::format("{0:*<5}", 'c'), "c****"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
673 |
EXPECT_EQ(fmt::format("{0:*<5}", "abc"), "abc**"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
674 |
EXPECT_EQ("**0xface", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
675 |
fmt::format("{0:*>8}", reinterpret_cast<void*>(0xface))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
676 |
EXPECT_EQ(fmt::format("{:}=", "foo"), "foo="); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
677 |
EXPECT_EQ(std::string("\0\0\0*", 4), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
678 |
fmt::format(string_view("{:\0>4}", 6), '*')); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
679 |
EXPECT_EQ(fmt::format("{0:ж>4}", 42), "жж42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
680 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:\x80\x80\x80\x80\x80>}"), 0), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
681 |
format_error, "invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
682 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
683 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
684 |
TEST(format_test, plus_sign) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
685 |
EXPECT_EQ(fmt::format("{0:+}", 42), "+42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
686 |
EXPECT_EQ(fmt::format("{0:+}", -42), "-42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
687 |
EXPECT_EQ(fmt::format("{0:+}", 42), "+42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
688 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:+}"), 42u), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
689 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
690 |
EXPECT_EQ(fmt::format("{0:+}", 42l), "+42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
691 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:+}"), 42ul), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
692 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
693 |
EXPECT_EQ(fmt::format("{0:+}", 42ll), "+42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
694 |
#if FMT_USE_INT128 |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
695 |
EXPECT_EQ(fmt::format("{0:+}", __int128_t(42)), "+42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
696 |
#endif |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
697 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:+}"), 42ull), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
698 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
699 |
EXPECT_EQ(fmt::format("{0:+}", 42.0), "+42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
700 |
EXPECT_EQ(fmt::format("{0:+}", 42.0l), "+42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
701 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:+}"), 'c'), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
702 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
703 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:+}"), "abc"), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
704 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
705 |
EXPECT_THROW_MSG( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
706 |
(void)fmt::format(runtime("{0:+}"), reinterpret_cast<void*>(0x42)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
707 |
format_error, "invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
708 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
709 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
710 |
TEST(format_test, minus_sign) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
711 |
EXPECT_EQ(fmt::format("{0:-}", 42), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
712 |
EXPECT_EQ(fmt::format("{0:-}", -42), "-42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
713 |
EXPECT_EQ(fmt::format("{0:-}", 42), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
714 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:-}"), 42u), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
715 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
716 |
EXPECT_EQ(fmt::format("{0:-}", 42l), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
717 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:-}"), 42ul), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
718 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
719 |
EXPECT_EQ(fmt::format("{0:-}", 42ll), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
720 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:-}"), 42ull), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
721 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
722 |
EXPECT_EQ(fmt::format("{0:-}", 42.0), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
723 |
EXPECT_EQ(fmt::format("{0:-}", 42.0l), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
724 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:-}"), 'c'), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
725 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
726 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:-}"), "abc"), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
727 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
728 |
EXPECT_THROW_MSG( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
729 |
(void)fmt::format(runtime("{0:-}"), reinterpret_cast<void*>(0x42)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
730 |
format_error, "invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
731 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
732 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
733 |
TEST(format_test, space_sign) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
734 |
EXPECT_EQ(fmt::format("{0: }", 42), " 42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
735 |
EXPECT_EQ(fmt::format("{0: }", -42), "-42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
736 |
EXPECT_EQ(fmt::format("{0: }", 42), " 42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
737 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0: }"), 42u), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
738 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
739 |
EXPECT_EQ(fmt::format("{0: }", 42l), " 42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
740 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0: }"), 42ul), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
741 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
742 |
EXPECT_EQ(fmt::format("{0: }", 42ll), " 42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
743 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0: }"), 42ull), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
744 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
745 |
EXPECT_EQ(fmt::format("{0: }", 42.0), " 42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
746 |
EXPECT_EQ(fmt::format("{0: }", 42.0l), " 42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
747 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0: }"), 'c'), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
748 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
749 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0: }"), "abc"), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
750 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
751 |
EXPECT_THROW_MSG( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
752 |
(void)fmt::format(runtime("{0: }"), reinterpret_cast<void*>(0x42)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
753 |
format_error, "invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
754 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
755 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
756 |
TEST(format_test, hash_flag) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
757 |
EXPECT_EQ(fmt::format("{0:#}", 42), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
758 |
EXPECT_EQ(fmt::format("{0:#}", -42), "-42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
759 |
EXPECT_EQ(fmt::format("{0:#b}", 42), "0b101010"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
760 |
EXPECT_EQ(fmt::format("{0:#B}", 42), "0B101010"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
761 |
EXPECT_EQ(fmt::format("{0:#b}", -42), "-0b101010"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
762 |
EXPECT_EQ(fmt::format("{0:#x}", 0x42), "0x42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
763 |
EXPECT_EQ(fmt::format("{0:#X}", 0x42), "0X42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
764 |
EXPECT_EQ(fmt::format("{0:#x}", -0x42), "-0x42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
765 |
EXPECT_EQ(fmt::format("{0:#o}", 0), "0"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
766 |
EXPECT_EQ(fmt::format("{0:#o}", 042), "042"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
767 |
EXPECT_EQ(fmt::format("{0:#o}", -042), "-042"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
768 |
EXPECT_EQ(fmt::format("{0:#}", 42u), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
769 |
EXPECT_EQ(fmt::format("{0:#x}", 0x42u), "0x42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
770 |
EXPECT_EQ(fmt::format("{0:#o}", 042u), "042"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
771 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
772 |
EXPECT_EQ(fmt::format("{0:#}", -42l), "-42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
773 |
EXPECT_EQ(fmt::format("{0:#x}", 0x42l), "0x42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
774 |
EXPECT_EQ(fmt::format("{0:#x}", -0x42l), "-0x42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
775 |
EXPECT_EQ(fmt::format("{0:#o}", 042l), "042"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
776 |
EXPECT_EQ(fmt::format("{0:#o}", -042l), "-042"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
777 |
EXPECT_EQ(fmt::format("{0:#}", 42ul), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
778 |
EXPECT_EQ(fmt::format("{0:#x}", 0x42ul), "0x42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
779 |
EXPECT_EQ(fmt::format("{0:#o}", 042ul), "042"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
780 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
781 |
EXPECT_EQ(fmt::format("{0:#}", -42ll), "-42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
782 |
EXPECT_EQ(fmt::format("{0:#x}", 0x42ll), "0x42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
783 |
EXPECT_EQ(fmt::format("{0:#x}", -0x42ll), "-0x42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
784 |
EXPECT_EQ(fmt::format("{0:#o}", 042ll), "042"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
785 |
EXPECT_EQ(fmt::format("{0:#o}", -042ll), "-042"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
786 |
EXPECT_EQ(fmt::format("{0:#}", 42ull), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
787 |
EXPECT_EQ(fmt::format("{0:#x}", 0x42ull), "0x42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
788 |
EXPECT_EQ(fmt::format("{0:#o}", 042ull), "042"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
789 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
790 |
EXPECT_EQ(fmt::format("{0:#}", -42.0), "-42."); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
791 |
EXPECT_EQ(fmt::format("{0:#}", -42.0l), "-42."); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
792 |
EXPECT_EQ(fmt::format("{:#.0e}", 42.0), "4.e+01"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
793 |
EXPECT_EQ(fmt::format("{:#.0f}", 0.01), "0."); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
794 |
EXPECT_EQ(fmt::format("{:#.2g}", 0.5), "0.50"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
795 |
EXPECT_EQ(fmt::format("{:#.0f}", 0.5), "0."); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
796 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:#"), 'c'), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
797 |
"missing '}' in format string"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
798 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:#}"), 'c'), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
799 |
"invalid format specifier for char"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
800 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:#}"), "abc"), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
801 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
802 |
EXPECT_THROW_MSG( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
803 |
(void)fmt::format(runtime("{0:#}"), reinterpret_cast<void*>(0x42)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
804 |
format_error, "invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
805 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
806 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
807 |
TEST(format_test, zero_flag) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
808 |
EXPECT_EQ(fmt::format("{0:0}", 42), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
809 |
EXPECT_EQ(fmt::format("{0:05}", -42), "-0042"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
810 |
EXPECT_EQ(fmt::format("{0:05}", 42u), "00042"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
811 |
EXPECT_EQ(fmt::format("{0:05}", -42l), "-0042"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
812 |
EXPECT_EQ(fmt::format("{0:05}", 42ul), "00042"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
813 |
EXPECT_EQ(fmt::format("{0:05}", -42ll), "-0042"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
814 |
EXPECT_EQ(fmt::format("{0:05}", 42ull), "00042"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
815 |
EXPECT_EQ(fmt::format("{0:07}", -42.0), "-000042"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
816 |
EXPECT_EQ(fmt::format("{0:07}", -42.0l), "-000042"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
817 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:0"), 'c'), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
818 |
"missing '}' in format string"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
819 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:05}"), 'c'), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
820 |
"invalid format specifier for char"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
821 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:05}"), "abc"), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
822 |
"format specifier requires numeric argument"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
823 |
EXPECT_THROW_MSG( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
824 |
(void)fmt::format(runtime("{0:05}"), reinterpret_cast<void*>(0x42)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
825 |
format_error, "format specifier requires numeric argument"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
826 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
827 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
828 |
TEST(format_test, zero_flag_and_align) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
829 |
// If the 0 character and an align option both appear, the 0 character is |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
830 |
// ignored. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
831 |
EXPECT_EQ(fmt::format("{:<05}", 42), "42 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
832 |
EXPECT_EQ(fmt::format("{:<05}", -42), "-42 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
833 |
EXPECT_EQ(fmt::format("{:^05}", 42), " 42 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
834 |
EXPECT_EQ(fmt::format("{:^05}", -42), " -42 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
835 |
EXPECT_EQ(fmt::format("{:>05}", 42), " 42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
836 |
EXPECT_EQ(fmt::format("{:>05}", -42), " -42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
837 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
838 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
839 |
TEST(format_test, width) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
840 |
auto int_maxer = std::to_string(INT_MAX + 1u); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
841 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:" + int_maxer), 0), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
842 |
format_error, "number is too big"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
843 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:" + int_maxer + "}"), 0), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
844 |
format_error, "number is too big"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
845 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
846 |
EXPECT_EQ(fmt::format("{:4}", -42), " -42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
847 |
EXPECT_EQ(fmt::format("{:5}", 42u), " 42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
848 |
EXPECT_EQ(fmt::format("{:6}", -42l), " -42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
849 |
EXPECT_EQ(fmt::format("{:7}", 42ul), " 42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
850 |
EXPECT_EQ(fmt::format("{:6}", -42ll), " -42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
851 |
EXPECT_EQ(fmt::format("{:7}", 42ull), " 42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
852 |
EXPECT_EQ(fmt::format("{:8}", -1.23), " -1.23"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
853 |
EXPECT_EQ(fmt::format("{:9}", -1.23l), " -1.23"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
854 |
EXPECT_EQ(fmt::format("{:10}", reinterpret_cast<void*>(0xcafe)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
855 |
" 0xcafe"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
856 |
EXPECT_EQ(fmt::format("{:11}", 'x'), "x "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
857 |
EXPECT_EQ(fmt::format("{:12}", "str"), "str "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
858 |
EXPECT_EQ(fmt::format("{:*^6}", "🤡"), "**🤡**"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
859 |
EXPECT_EQ(fmt::format("{:*^8}", "你好"), "**你好**"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
860 |
EXPECT_EQ(fmt::format("{:#6}", 42.0), " 42."); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
861 |
EXPECT_EQ(fmt::format("{:6c}", static_cast<int>('x')), "x "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
862 |
EXPECT_EQ(fmt::format("{:>06.0f}", 0.00884311), " 0"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
863 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
864 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
865 |
TEST(format_test, runtime_width) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
866 |
auto int_maxer = std::to_string(INT_MAX + 1u); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
867 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{" + int_maxer), 0), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
868 |
format_error, "invalid format string"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
869 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{" + int_maxer + "}"), 0), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
870 |
format_error, "argument not found"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
871 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{" + int_maxer + "}}"), 0), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
872 |
format_error, "argument not found"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
873 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
874 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{"), 0), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
875 |
"invalid format string"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
876 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{}"), 0), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
877 |
"cannot switch from manual to automatic argument indexing"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
878 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{?}}"), 0), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
879 |
"invalid format string"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
880 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{1}}"), 0), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
881 |
"argument not found"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
882 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
883 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{0:}}"), 0), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
884 |
"invalid format string"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
885 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
886 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{1}}"), 0, -1), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
887 |
"negative width"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
888 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{1}}"), 0, (INT_MAX + 1u)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
889 |
format_error, "number is too big"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
890 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{1}}"), 0, -1l), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
891 |
"negative width"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
892 |
if (fmt::detail::const_check(sizeof(long) > sizeof(int))) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
893 |
long value = INT_MAX; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
894 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{1}}"), 0, (value + 1)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
895 |
format_error, "number is too big"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
896 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
897 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{1}}"), 0, (INT_MAX + 1ul)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
898 |
format_error, "number is too big"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
899 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
900 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{1}}"), 0, '0'), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
901 |
"width is not integer"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
902 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{1}}"), 0, 0.0), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
903 |
"width is not integer"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
904 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
905 |
EXPECT_EQ(fmt::format("{0:{1}}", -42, 4), " -42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
906 |
EXPECT_EQ(fmt::format("{0:{1}}", 42u, 5), " 42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
907 |
EXPECT_EQ(fmt::format("{0:{1}}", -42l, 6), " -42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
908 |
EXPECT_EQ(fmt::format("{0:{1}}", 42ul, 7), " 42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
909 |
EXPECT_EQ(fmt::format("{0:{1}}", -42ll, 6), " -42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
910 |
EXPECT_EQ(fmt::format("{0:{1}}", 42ull, 7), " 42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
911 |
EXPECT_EQ(fmt::format("{0:{1}}", -1.23, 8), " -1.23"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
912 |
EXPECT_EQ(fmt::format("{0:{1}}", -1.23l, 9), " -1.23"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
913 |
EXPECT_EQ(" 0xcafe", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
914 |
fmt::format("{0:{1}}", reinterpret_cast<void*>(0xcafe), 10)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
915 |
EXPECT_EQ(fmt::format("{0:{1}}", 'x', 11), "x "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
916 |
EXPECT_EQ(fmt::format("{0:{1}}", "str", 12), "str "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
917 |
EXPECT_EQ(fmt::format("{:{}}", 42, short(4)), " 42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
918 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
919 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
920 |
TEST(format_test, precision) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
921 |
char format_str[buffer_size]; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
922 |
safe_sprintf(format_str, "{0:.%u", UINT_MAX); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
923 |
increment(format_str + 4); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
924 |
EXPECT_THROW_MSG((void)fmt::format(runtime(format_str), 0.0), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
925 |
"number is too big"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
926 |
size_t size = std::strlen(format_str); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
927 |
format_str[size] = '}'; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
928 |
format_str[size + 1] = 0; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
929 |
EXPECT_THROW_MSG((void)fmt::format(runtime(format_str), 0.0), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
930 |
"number is too big"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
931 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
932 |
safe_sprintf(format_str, "{0:.%u", INT_MAX + 1u); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
933 |
EXPECT_THROW_MSG((void)fmt::format(runtime(format_str), 0.0), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
934 |
"number is too big"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
935 |
safe_sprintf(format_str, "{0:.%u}", INT_MAX + 1u); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
936 |
EXPECT_THROW_MSG((void)fmt::format(runtime(format_str), 0.0), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
937 |
"number is too big"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
938 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
939 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:."), 0.0), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
940 |
"invalid precision"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
941 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.}"), 0.0), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
942 |
"invalid precision"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
943 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
944 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.2"), 0), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
945 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
946 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.2}"), 42), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
947 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
948 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.2f}"), 42), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
949 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
950 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.2}"), 42u), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
951 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
952 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.2f}"), 42u), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
953 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
954 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.2}"), 42l), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
955 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
956 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.2f}"), 42l), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
957 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
958 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.2}"), 42ul), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
959 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
960 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.2f}"), 42ul), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
961 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
962 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.2}"), 42ll), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
963 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
964 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.2f}"), 42ll), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
965 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
966 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.2}"), 42ull), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
967 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
968 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.2f}"), 42ull), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
969 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
970 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:3.0}"), 'x'), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
971 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
972 |
EXPECT_EQ(fmt::format("{0:.2}", 1.2345), "1.2"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
973 |
EXPECT_EQ(fmt::format("{0:.2}", 1.2345l), "1.2"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
974 |
EXPECT_EQ(fmt::format("{:.2}", 1.234e56), "1.2e+56"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
975 |
EXPECT_EQ(fmt::format("{0:.3}", 1.1), "1.1"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
976 |
EXPECT_EQ(fmt::format("{:.0e}", 1.0L), "1e+00"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
977 |
EXPECT_EQ(fmt::format("{:9.1e}", 0.0), " 0.0e+00"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
978 |
EXPECT_EQ(fmt::format("{:.7f}", 0.0000000000000071054273576010018587L), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
979 |
"0.0000000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
980 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
981 |
EXPECT_EQ( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
982 |
fmt::format("{:.494}", 4.9406564584124654E-324), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
983 |
"4.9406564584124654417656879286822137236505980261432476442558568250067550" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
984 |
"727020875186529983636163599237979656469544571773092665671035593979639877" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
985 |
"479601078187812630071319031140452784581716784898210368871863605699873072" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
986 |
"305000638740915356498438731247339727316961514003171538539807412623856559" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
987 |
"117102665855668676818703956031062493194527159149245532930545654440112748" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
988 |
"012970999954193198940908041656332452475714786901472678015935523861155013" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
989 |
"480352649347201937902681071074917033322268447533357208324319361e-324"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
990 |
EXPECT_EQ( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
991 |
fmt::format("{:.1074f}", 1.1125369292536e-308), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
992 |
"0.0000000000000000000000000000000000000000000000000000000000000000000000" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
993 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
994 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
995 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
996 |
"000000000000000000000111253692925360019747947051741965785554081512200979" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
997 |
"355021686109411883779182127659725163430929750364498219730822952552570601" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
998 |
"152163505899912777129583674906301179059298598412303893909188340988729019" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
999 |
"014361467448914817838555156840459458527907308695109202499990850735085304" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1000 |
"478476991912072201449236975063640913461919914396877093174125167509869762" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1001 |
"482369631100360266123742648159508919592746619553246586039571522788247697" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1002 |
"156360766271842991667238355464496455107749716934387136380536472531224398" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1003 |
"559833794807213172371254492216255558078524900147957309382830827524104234" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1004 |
"530961756787819847850302379672357738807808384667004752163416921762619527" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1005 |
"462847642037420991432005657440259928195996762610375541867198059294212446" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1006 |
"81962777939941034720757232455434770912461317493580281734466552734375"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1007 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1008 |
std::string outputs[] = { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1009 |
"-0X1.41FE3FFE71C9E000000000000000000000000000000000000000000000000000000" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1010 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1011 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1012 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1013 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1014 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1015 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1016 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1017 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1018 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1019 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1020 |
"000000000000000000000000000000000000000000000000000P+127", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1021 |
"-0XA.0FF1FFF38E4F0000000000000000000000000000000000000000000000000000000" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1022 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1023 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1024 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1025 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1026 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1027 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1028 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1029 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1030 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1031 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1032 |
"000000000000000000000000000000000000000000000000000P+124"}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1033 |
EXPECT_THAT(outputs, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1034 |
testing::Contains(fmt::format("{:.838A}", -2.14001164E+38))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1035 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1036 |
if (std::numeric_limits<long double>::digits == 64) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1037 |
auto ld = (std::numeric_limits<long double>::min)(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1038 |
EXPECT_EQ(fmt::format("{:.0}", ld), "3e-4932"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1039 |
EXPECT_EQ( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1040 |
fmt::format("{:0g}", std::numeric_limits<long double>::denorm_min()), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1041 |
"3.6452e-4951"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1042 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1043 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1044 |
EXPECT_EQ(fmt::format("{:#.0f}", 123.0), "123."); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1045 |
EXPECT_EQ(fmt::format("{:.02f}", 1.234), "1.23"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1046 |
EXPECT_EQ(fmt::format("{:.1g}", 0.001), "0.001"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1047 |
EXPECT_EQ(fmt::format("{}", 1019666432.0f), "1019666400"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1048 |
EXPECT_EQ(fmt::format("{:.0e}", 9.5), "1e+01"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1049 |
EXPECT_EQ(fmt::format("{:.1e}", 1e-34), "1.0e-34"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1050 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1051 |
EXPECT_THROW_MSG( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1052 |
(void)fmt::format(runtime("{0:.2}"), reinterpret_cast<void*>(0xcafe)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1053 |
format_error, "invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1054 |
EXPECT_THROW_MSG( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1055 |
(void)fmt::format(runtime("{0:.2f}"), reinterpret_cast<void*>(0xcafe)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1056 |
format_error, "invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1057 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:.{}e}"), 42.0, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1058 |
fmt::detail::max_value<int>()), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1059 |
format_error, "number is too big"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1060 |
EXPECT_THROW_MSG( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1061 |
(void)fmt::format("{:.2147483646f}", -2.2121295195081227E+304), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1062 |
format_error, "number is too big"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1063 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1064 |
EXPECT_EQ(fmt::format("{0:.2}", "str"), "st"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1065 |
EXPECT_EQ(fmt::format("{0:.5}", "вожыкі"), "вожык"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1066 |
EXPECT_EQ(fmt::format("{0:.6}", "123456\xad"), "123456"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1067 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1068 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1069 |
TEST(xchar_test, utf8_precision) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1070 |
auto result = fmt::format("{:.4}", "caf\u00e9s"); // cafés |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1071 |
EXPECT_EQ(fmt::detail::compute_width(result), 4); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1072 |
EXPECT_EQ(result, "caf\u00e9"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1073 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1074 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1075 |
TEST(format_test, runtime_precision) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1076 |
char format_str[buffer_size]; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1077 |
safe_sprintf(format_str, "{0:.{%u", UINT_MAX); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1078 |
increment(format_str + 5); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1079 |
EXPECT_THROW_MSG((void)fmt::format(runtime(format_str), 0.0), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1080 |
"invalid format string"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1081 |
size_t size = std::strlen(format_str); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1082 |
format_str[size] = '}'; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1083 |
format_str[size + 1] = 0; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1084 |
EXPECT_THROW_MSG((void)fmt::format(runtime(format_str), 0.0), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1085 |
"argument not found"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1086 |
format_str[size + 1] = '}'; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1087 |
format_str[size + 2] = 0; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1088 |
EXPECT_THROW_MSG((void)fmt::format(runtime(format_str), 0.0), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1089 |
"argument not found"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1090 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1091 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{"), 0.0), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1092 |
"invalid format string"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1093 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{}"), 0.0), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1094 |
"cannot switch from manual to automatic argument indexing"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1095 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{?}}"), 0.0), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1096 |
"invalid format string"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1097 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}"), 0, 0), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1098 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1099 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}}"), 0.0), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1100 |
"argument not found"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1101 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1102 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{0:}}"), 0.0), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1103 |
"invalid format string"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1104 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1105 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}}"), 0.0, -1), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1106 |
format_error, "negative precision"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1107 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}}"), 0.0, (INT_MAX + 1u)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1108 |
format_error, "number is too big"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1109 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}}"), 0.0, -1l), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1110 |
format_error, "negative precision"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1111 |
if (fmt::detail::const_check(sizeof(long) > sizeof(int))) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1112 |
long value = INT_MAX; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1113 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}}"), 0.0, (value + 1)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1114 |
format_error, "number is too big"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1115 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1116 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}}"), 0.0, (INT_MAX + 1ul)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1117 |
format_error, "number is too big"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1118 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1119 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}}"), 0.0, '0'), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1120 |
format_error, "precision is not integer"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1121 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}}"), 0.0, 0.0), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1122 |
format_error, "precision is not integer"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1123 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1124 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}}"), 42, 2), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1125 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1126 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}f}"), 42, 2), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1127 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1128 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}}"), 42u, 2), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1129 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1130 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}f}"), 42u, 2), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1131 |
format_error, "invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1132 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}}"), 42l, 2), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1133 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1134 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}f}"), 42l, 2), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1135 |
format_error, "invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1136 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}}"), 42ul, 2), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1137 |
format_error, "invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1138 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}f}"), 42ul, 2), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1139 |
format_error, "invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1140 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}}"), 42ll, 2), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1141 |
format_error, "invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1142 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}f}"), 42ll, 2), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1143 |
format_error, "invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1144 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}}"), 42ull, 2), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1145 |
format_error, "invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1146 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}f}"), 42ull, 2), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1147 |
format_error, "invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1148 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:3.{1}}"), 'x', 0), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1149 |
format_error, "invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1150 |
EXPECT_EQ(fmt::format("{0:.{1}}", 1.2345, 2), "1.2"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1151 |
EXPECT_EQ(fmt::format("{1:.{0}}", 2, 1.2345l), "1.2"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1152 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1153 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}}"), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1154 |
reinterpret_cast<void*>(0xcafe), 2), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1155 |
format_error, "invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1156 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}f}"), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1157 |
reinterpret_cast<void*>(0xcafe), 2), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1158 |
format_error, "invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1159 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1160 |
EXPECT_EQ(fmt::format("{0:.{1}}", "str", 2), "st"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1161 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1162 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1163 |
TEST(format_test, format_bool) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1164 |
EXPECT_EQ(fmt::format("{}", true), "true"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1165 |
EXPECT_EQ(fmt::format("{}", false), "false"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1166 |
EXPECT_EQ(fmt::format("{:d}", true), "1"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1167 |
EXPECT_EQ(fmt::format("{:5}", true), "true "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1168 |
EXPECT_EQ(fmt::format("{:s}", true), "true"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1169 |
EXPECT_EQ(fmt::format("{:s}", false), "false"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1170 |
EXPECT_EQ(fmt::format("{:6s}", false), "false "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1171 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:c}"), false), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1172 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1173 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1174 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1175 |
TEST(format_test, format_short) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1176 |
short s = 42; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1177 |
EXPECT_EQ(fmt::format("{0:d}", s), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1178 |
unsigned short us = 42; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1179 |
EXPECT_EQ(fmt::format("{0:d}", us), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1180 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1181 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1182 |
template <typename T> |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1183 |
void check_unknown_types(const T& value, const char* types, const char*) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1184 |
char format_str[buffer_size]; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1185 |
const char* special = ".0123456789L?}"; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1186 |
for (int i = CHAR_MIN; i <= CHAR_MAX; ++i) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1187 |
char c = static_cast<char>(i); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1188 |
if (std::strchr(types, c) || std::strchr(special, c) || !c) continue; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1189 |
safe_sprintf(format_str, "{0:10%c}", c); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1190 |
const char* message = "invalid format specifier"; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1191 |
EXPECT_THROW_MSG((void)fmt::format(runtime(format_str), value), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1192 |
format_error, message) |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1193 |
<< format_str << " " << message; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1194 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1195 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1196 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1197 |
TEST(format_test, format_int) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1198 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:v"), 42), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1199 |
"invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1200 |
check_unknown_types(42, "bBdoxXnLc", "integer"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1201 |
EXPECT_EQ(fmt::format("{:c}", static_cast<int>('x')), "x"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1202 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1203 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1204 |
TEST(format_test, format_bin) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1205 |
EXPECT_EQ(fmt::format("{0:b}", 0), "0"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1206 |
EXPECT_EQ(fmt::format("{0:b}", 42), "101010"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1207 |
EXPECT_EQ(fmt::format("{0:b}", 42u), "101010"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1208 |
EXPECT_EQ(fmt::format("{0:b}", -42), "-101010"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1209 |
EXPECT_EQ(fmt::format("{0:b}", 12345), "11000000111001"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1210 |
EXPECT_EQ(fmt::format("{0:b}", 0x12345678), "10010001101000101011001111000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1211 |
EXPECT_EQ("10010000101010111100110111101111", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1212 |
fmt::format("{0:b}", 0x90ABCDEF)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1213 |
EXPECT_EQ("11111111111111111111111111111111", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1214 |
fmt::format("{0:b}", max_value<uint32_t>())); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1215 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1216 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1217 |
#if FMT_USE_INT128 |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1218 |
constexpr auto int128_max = static_cast<__int128_t>( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1219 |
(static_cast<__uint128_t>(1) << ((__SIZEOF_INT128__ * CHAR_BIT) - 1)) - 1); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1220 |
constexpr auto int128_min = -int128_max - 1; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1221 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1222 |
constexpr auto uint128_max = ~static_cast<__uint128_t>(0); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1223 |
#endif |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1224 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1225 |
TEST(format_test, format_dec) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1226 |
EXPECT_EQ(fmt::format("{0}", 0), "0"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1227 |
EXPECT_EQ(fmt::format("{0}", 42), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1228 |
EXPECT_EQ(fmt::format("{:}>", 42), "42>"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1229 |
EXPECT_EQ(fmt::format("{0:d}", 42), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1230 |
EXPECT_EQ(fmt::format("{0}", 42u), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1231 |
EXPECT_EQ(fmt::format("{0}", -42), "-42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1232 |
EXPECT_EQ(fmt::format("{0}", 12345), "12345"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1233 |
EXPECT_EQ(fmt::format("{0}", 67890), "67890"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1234 |
#if FMT_USE_INT128 |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1235 |
EXPECT_EQ(fmt::format("{0}", static_cast<__int128_t>(0)), "0"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1236 |
EXPECT_EQ(fmt::format("{0}", static_cast<__uint128_t>(0)), "0"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1237 |
EXPECT_EQ("9223372036854775808", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1238 |
fmt::format("{0}", static_cast<__int128_t>(INT64_MAX) + 1)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1239 |
EXPECT_EQ("-9223372036854775809", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1240 |
fmt::format("{0}", static_cast<__int128_t>(INT64_MIN) - 1)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1241 |
EXPECT_EQ("18446744073709551616", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1242 |
fmt::format("{0}", static_cast<__int128_t>(UINT64_MAX) + 1)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1243 |
EXPECT_EQ("170141183460469231731687303715884105727", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1244 |
fmt::format("{0}", int128_max)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1245 |
EXPECT_EQ("-170141183460469231731687303715884105728", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1246 |
fmt::format("{0}", int128_min)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1247 |
EXPECT_EQ("340282366920938463463374607431768211455", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1248 |
fmt::format("{0}", uint128_max)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1249 |
#endif |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1250 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1251 |
char buffer[buffer_size]; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1252 |
safe_sprintf(buffer, "%d", INT_MIN); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1253 |
EXPECT_EQ(buffer, fmt::format("{0}", INT_MIN)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1254 |
safe_sprintf(buffer, "%d", INT_MAX); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1255 |
EXPECT_EQ(buffer, fmt::format("{0}", INT_MAX)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1256 |
safe_sprintf(buffer, "%u", UINT_MAX); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1257 |
EXPECT_EQ(buffer, fmt::format("{0}", UINT_MAX)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1258 |
safe_sprintf(buffer, "%ld", 0 - static_cast<unsigned long>(LONG_MIN)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1259 |
EXPECT_EQ(buffer, fmt::format("{0}", LONG_MIN)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1260 |
safe_sprintf(buffer, "%ld", LONG_MAX); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1261 |
EXPECT_EQ(buffer, fmt::format("{0}", LONG_MAX)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1262 |
safe_sprintf(buffer, "%lu", ULONG_MAX); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1263 |
EXPECT_EQ(buffer, fmt::format("{0}", ULONG_MAX)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1264 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1265 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1266 |
TEST(format_test, format_hex) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1267 |
EXPECT_EQ(fmt::format("{0:x}", 0), "0"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1268 |
EXPECT_EQ(fmt::format("{0:x}", 0x42), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1269 |
EXPECT_EQ(fmt::format("{0:x}", 0x42u), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1270 |
EXPECT_EQ(fmt::format("{0:x}", -0x42), "-42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1271 |
EXPECT_EQ(fmt::format("{0:x}", 0x12345678), "12345678"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1272 |
EXPECT_EQ(fmt::format("{0:x}", 0x90abcdef), "90abcdef"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1273 |
EXPECT_EQ(fmt::format("{0:X}", 0x12345678), "12345678"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1274 |
EXPECT_EQ(fmt::format("{0:X}", 0x90ABCDEF), "90ABCDEF"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1275 |
#if FMT_USE_INT128 |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1276 |
EXPECT_EQ(fmt::format("{0:x}", static_cast<__int128_t>(0)), "0"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1277 |
EXPECT_EQ(fmt::format("{0:x}", static_cast<__uint128_t>(0)), "0"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1278 |
EXPECT_EQ("8000000000000000", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1279 |
fmt::format("{0:x}", static_cast<__int128_t>(INT64_MAX) + 1)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1280 |
EXPECT_EQ("-8000000000000001", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1281 |
fmt::format("{0:x}", static_cast<__int128_t>(INT64_MIN) - 1)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1282 |
EXPECT_EQ("10000000000000000", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1283 |
fmt::format("{0:x}", static_cast<__int128_t>(UINT64_MAX) + 1)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1284 |
EXPECT_EQ("7fffffffffffffffffffffffffffffff", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1285 |
fmt::format("{0:x}", int128_max)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1286 |
EXPECT_EQ("-80000000000000000000000000000000", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1287 |
fmt::format("{0:x}", int128_min)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1288 |
EXPECT_EQ("ffffffffffffffffffffffffffffffff", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1289 |
fmt::format("{0:x}", uint128_max)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1290 |
#endif |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1291 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1292 |
char buffer[buffer_size]; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1293 |
safe_sprintf(buffer, "-%x", 0 - static_cast<unsigned>(INT_MIN)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1294 |
EXPECT_EQ(buffer, fmt::format("{0:x}", INT_MIN)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1295 |
safe_sprintf(buffer, "%x", INT_MAX); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1296 |
EXPECT_EQ(buffer, fmt::format("{0:x}", INT_MAX)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1297 |
safe_sprintf(buffer, "%x", UINT_MAX); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1298 |
EXPECT_EQ(buffer, fmt::format("{0:x}", UINT_MAX)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1299 |
safe_sprintf(buffer, "-%lx", 0 - static_cast<unsigned long>(LONG_MIN)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1300 |
EXPECT_EQ(buffer, fmt::format("{0:x}", LONG_MIN)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1301 |
safe_sprintf(buffer, "%lx", LONG_MAX); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1302 |
EXPECT_EQ(buffer, fmt::format("{0:x}", LONG_MAX)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1303 |
safe_sprintf(buffer, "%lx", ULONG_MAX); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1304 |
EXPECT_EQ(buffer, fmt::format("{0:x}", ULONG_MAX)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1305 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1306 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1307 |
TEST(format_test, format_oct) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1308 |
EXPECT_EQ(fmt::format("{0:o}", 0), "0"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1309 |
EXPECT_EQ(fmt::format("{0:o}", 042), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1310 |
EXPECT_EQ(fmt::format("{0:o}", 042u), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1311 |
EXPECT_EQ(fmt::format("{0:o}", -042), "-42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1312 |
EXPECT_EQ(fmt::format("{0:o}", 012345670), "12345670"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1313 |
#if FMT_USE_INT128 |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1314 |
EXPECT_EQ(fmt::format("{0:o}", static_cast<__int128_t>(0)), "0"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1315 |
EXPECT_EQ(fmt::format("{0:o}", static_cast<__uint128_t>(0)), "0"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1316 |
EXPECT_EQ("1000000000000000000000", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1317 |
fmt::format("{0:o}", static_cast<__int128_t>(INT64_MAX) + 1)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1318 |
EXPECT_EQ("-1000000000000000000001", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1319 |
fmt::format("{0:o}", static_cast<__int128_t>(INT64_MIN) - 1)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1320 |
EXPECT_EQ("2000000000000000000000", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1321 |
fmt::format("{0:o}", static_cast<__int128_t>(UINT64_MAX) + 1)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1322 |
EXPECT_EQ("1777777777777777777777777777777777777777777", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1323 |
fmt::format("{0:o}", int128_max)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1324 |
EXPECT_EQ("-2000000000000000000000000000000000000000000", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1325 |
fmt::format("{0:o}", int128_min)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1326 |
EXPECT_EQ("3777777777777777777777777777777777777777777", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1327 |
fmt::format("{0:o}", uint128_max)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1328 |
#endif |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1329 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1330 |
char buffer[buffer_size]; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1331 |
safe_sprintf(buffer, "-%o", 0 - static_cast<unsigned>(INT_MIN)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1332 |
EXPECT_EQ(buffer, fmt::format("{0:o}", INT_MIN)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1333 |
safe_sprintf(buffer, "%o", INT_MAX); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1334 |
EXPECT_EQ(buffer, fmt::format("{0:o}", INT_MAX)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1335 |
safe_sprintf(buffer, "%o", UINT_MAX); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1336 |
EXPECT_EQ(buffer, fmt::format("{0:o}", UINT_MAX)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1337 |
safe_sprintf(buffer, "-%lo", 0 - static_cast<unsigned long>(LONG_MIN)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1338 |
EXPECT_EQ(buffer, fmt::format("{0:o}", LONG_MIN)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1339 |
safe_sprintf(buffer, "%lo", LONG_MAX); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1340 |
EXPECT_EQ(buffer, fmt::format("{0:o}", LONG_MAX)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1341 |
safe_sprintf(buffer, "%lo", ULONG_MAX); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1342 |
EXPECT_EQ(buffer, fmt::format("{0:o}", ULONG_MAX)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1343 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1344 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1345 |
TEST(format_test, format_int_locale) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1346 |
EXPECT_EQ(fmt::format("{:L}", 1234), "1234"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1347 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1348 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1349 |
TEST(format_test, format_float) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1350 |
EXPECT_EQ(fmt::format("{}", 0.0f), "0"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1351 |
EXPECT_EQ(fmt::format("{0:f}", 392.5f), "392.500000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1352 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1353 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1354 |
TEST(format_test, format_double) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1355 |
EXPECT_EQ(fmt::format("{}", 0.0), "0"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1356 |
check_unknown_types(1.2, "eEfFgGaAnL%", "double"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1357 |
EXPECT_EQ(fmt::format("{:}", 0.0), "0"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1358 |
EXPECT_EQ(fmt::format("{:f}", 0.0), "0.000000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1359 |
EXPECT_EQ(fmt::format("{:g}", 0.0), "0"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1360 |
EXPECT_EQ(fmt::format("{:}", 392.65), "392.65"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1361 |
EXPECT_EQ(fmt::format("{:g}", 392.65), "392.65"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1362 |
EXPECT_EQ(fmt::format("{:G}", 392.65), "392.65"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1363 |
EXPECT_EQ(fmt::format("{:g}", 4.9014e6), "4.9014e+06"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1364 |
EXPECT_EQ(fmt::format("{:f}", 392.65), "392.650000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1365 |
EXPECT_EQ(fmt::format("{:F}", 392.65), "392.650000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1366 |
EXPECT_EQ(fmt::format("{:L}", 42.0), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1367 |
EXPECT_EQ(fmt::format("{:24a}", 4.2f), " 0x1.0cccccp+2"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1368 |
EXPECT_EQ(fmt::format("{:24a}", 4.2), " 0x1.0cccccccccccdp+2"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1369 |
EXPECT_EQ(fmt::format("{:<24a}", 4.2), "0x1.0cccccccccccdp+2 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1370 |
EXPECT_EQ(fmt::format("{0:e}", 392.65), "3.926500e+02"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1371 |
EXPECT_EQ(fmt::format("{0:E}", 392.65), "3.926500E+02"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1372 |
EXPECT_EQ(fmt::format("{0:+010.4g}", 392.65), "+0000392.6"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1373 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1374 |
#if FMT_CPLUSPLUS >= 201703L |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1375 |
double xd = 0x1.ffffffffffp+2; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1376 |
EXPECT_EQ(fmt::format("{:.10a}", xd), "0x1.ffffffffffp+2"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1377 |
EXPECT_EQ(fmt::format("{:.9a}", xd), "0x2.000000000p+2"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1378 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1379 |
if (std::numeric_limits<long double>::digits == 64) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1380 |
auto ld = 0xf.ffffffffffp-3l; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1381 |
EXPECT_EQ(fmt::format("{:a}", ld), "0xf.ffffffffffp-3"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1382 |
EXPECT_EQ(fmt::format("{:.10a}", ld), "0xf.ffffffffffp-3"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1383 |
EXPECT_EQ(fmt::format("{:.9a}", ld), "0x1.000000000p+1"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1384 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1385 |
#endif |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1386 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1387 |
if (fmt::detail::const_check(std::numeric_limits<double>::is_iec559)) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1388 |
double d = (std::numeric_limits<double>::min)(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1389 |
EXPECT_EQ(fmt::format("{:a}", d), "0x1p-1022"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1390 |
EXPECT_EQ(fmt::format("{:#a}", d), "0x1.p-1022"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1391 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1392 |
d = (std::numeric_limits<double>::max)(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1393 |
EXPECT_EQ(fmt::format("{:a}", d), "0x1.fffffffffffffp+1023"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1394 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1395 |
d = std::numeric_limits<double>::denorm_min(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1396 |
EXPECT_EQ(fmt::format("{:a}", d), "0x0.0000000000001p-1022"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1397 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1398 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1399 |
if (std::numeric_limits<long double>::digits == 64) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1400 |
auto ld = (std::numeric_limits<long double>::min)(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1401 |
EXPECT_EQ(fmt::format("{:a}", ld), "0x8p-16385"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1402 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1403 |
ld = (std::numeric_limits<long double>::max)(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1404 |
EXPECT_EQ(fmt::format("{:a}", ld), "0xf.fffffffffffffffp+16380"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1405 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1406 |
ld = std::numeric_limits<long double>::denorm_min(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1407 |
EXPECT_EQ(fmt::format("{:a}", ld), "0x0.000000000000001p-16382"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1408 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1409 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1410 |
EXPECT_EQ(fmt::format("{:.10a}", 4.2), "0x1.0ccccccccdp+2"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1411 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1412 |
EXPECT_EQ(fmt::format("{:a}", -42.0), "-0x1.5p+5"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1413 |
EXPECT_EQ(fmt::format("{:A}", -42.0), "-0X1.5P+5"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1414 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1415 |
EXPECT_EQ(fmt::format("{:f}", 9223372036854775807.0), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1416 |
"9223372036854775808.000000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1417 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1418 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1419 |
TEST(format_test, precision_rounding) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1420 |
EXPECT_EQ(fmt::format("{:.0f}", 0.0), "0"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1421 |
EXPECT_EQ(fmt::format("{:.0f}", 0.01), "0"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1422 |
EXPECT_EQ(fmt::format("{:.0f}", 0.1), "0"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1423 |
EXPECT_EQ(fmt::format("{:.3f}", 0.00049), "0.000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1424 |
EXPECT_EQ(fmt::format("{:.3f}", 0.0005), "0.001"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1425 |
EXPECT_EQ(fmt::format("{:.3f}", 0.00149), "0.001"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1426 |
EXPECT_EQ(fmt::format("{:.3f}", 0.0015), "0.002"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1427 |
EXPECT_EQ(fmt::format("{:.3f}", 0.9999), "1.000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1428 |
EXPECT_EQ(fmt::format("{:.3}", 0.00123), "0.00123"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1429 |
EXPECT_EQ(fmt::format("{:.16g}", 0.1), "0.1"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1430 |
EXPECT_EQ(fmt::format("{:.0}", 1.0), "1"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1431 |
EXPECT_EQ("225.51575035152063720", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1432 |
fmt::format("{:.17f}", 225.51575035152064)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1433 |
EXPECT_EQ(fmt::format("{:.1f}", -761519619559038.2), "-761519619559038.2"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1434 |
EXPECT_EQ("1.9156918820264798e-56", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1435 |
fmt::format("{}", 1.9156918820264798e-56)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1436 |
EXPECT_EQ(fmt::format("{:.4f}", 7.2809479766055470e-15), "0.0000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1437 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1438 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1439 |
TEST(format_test, prettify_float) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1440 |
EXPECT_EQ(fmt::format("{}", 1e-4), "0.0001"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1441 |
EXPECT_EQ(fmt::format("{}", 1e-5), "1e-05"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1442 |
EXPECT_EQ(fmt::format("{}", 1e15), "1000000000000000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1443 |
EXPECT_EQ(fmt::format("{}", 1e16), "1e+16"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1444 |
EXPECT_EQ(fmt::format("{}", 9.999e-5), "9.999e-05"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1445 |
EXPECT_EQ(fmt::format("{}", 1e10), "10000000000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1446 |
EXPECT_EQ(fmt::format("{}", 1e11), "100000000000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1447 |
EXPECT_EQ(fmt::format("{}", 1234e7), "12340000000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1448 |
EXPECT_EQ(fmt::format("{}", 1234e-2), "12.34"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1449 |
EXPECT_EQ(fmt::format("{}", 1234e-6), "0.001234"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1450 |
EXPECT_EQ(fmt::format("{}", 0.1f), "0.1"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1451 |
EXPECT_EQ(fmt::format("{}", 1.35631564e-19f), "1.3563156e-19"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1452 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1453 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1454 |
TEST(format_test, format_nan) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1455 |
double nan = std::numeric_limits<double>::quiet_NaN(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1456 |
EXPECT_EQ(fmt::format("{}", nan), "nan"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1457 |
EXPECT_EQ(fmt::format("{:+}", nan), "+nan"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1458 |
EXPECT_EQ(fmt::format("{:+06}", nan), " +nan"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1459 |
EXPECT_EQ(fmt::format("{:<+06}", nan), "+nan "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1460 |
EXPECT_EQ(fmt::format("{:^+06}", nan), " +nan "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1461 |
EXPECT_EQ(fmt::format("{:>+06}", nan), " +nan"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1462 |
if (std::signbit(-nan)) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1463 |
EXPECT_EQ(fmt::format("{}", -nan), "-nan"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1464 |
EXPECT_EQ(fmt::format("{:+06}", -nan), " -nan"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1465 |
} else { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1466 |
fmt::print("Warning: compiler doesn't handle negative NaN correctly"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1467 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1468 |
EXPECT_EQ(fmt::format("{: }", nan), " nan"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1469 |
EXPECT_EQ(fmt::format("{:F}", nan), "NAN"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1470 |
EXPECT_EQ(fmt::format("{:<7}", nan), "nan "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1471 |
EXPECT_EQ(fmt::format("{:^7}", nan), " nan "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1472 |
EXPECT_EQ(fmt::format("{:>7}", nan), " nan"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1473 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1474 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1475 |
TEST(format_test, format_infinity) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1476 |
double inf = std::numeric_limits<double>::infinity(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1477 |
EXPECT_EQ(fmt::format("{}", inf), "inf"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1478 |
EXPECT_EQ(fmt::format("{:+}", inf), "+inf"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1479 |
EXPECT_EQ(fmt::format("{}", -inf), "-inf"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1480 |
EXPECT_EQ(fmt::format("{:+06}", inf), " +inf"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1481 |
EXPECT_EQ(fmt::format("{:+06}", -inf), " -inf"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1482 |
EXPECT_EQ(fmt::format("{:<+06}", inf), "+inf "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1483 |
EXPECT_EQ(fmt::format("{:^+06}", inf), " +inf "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1484 |
EXPECT_EQ(fmt::format("{:>+06}", inf), " +inf"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1485 |
EXPECT_EQ(fmt::format("{: }", inf), " inf"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1486 |
EXPECT_EQ(fmt::format("{:F}", inf), "INF"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1487 |
EXPECT_EQ(fmt::format("{:<7}", inf), "inf "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1488 |
EXPECT_EQ(fmt::format("{:^7}", inf), " inf "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1489 |
EXPECT_EQ(fmt::format("{:>7}", inf), " inf"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1490 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1491 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1492 |
TEST(format_test, format_long_double) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1493 |
EXPECT_EQ(fmt::format("{0:}", 0.0l), "0"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1494 |
EXPECT_EQ(fmt::format("{0:f}", 0.0l), "0.000000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1495 |
EXPECT_EQ(fmt::format("{:.1f}", 0.000000001l), "0.0"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1496 |
EXPECT_EQ(fmt::format("{:.2f}", 0.099l), "0.10"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1497 |
EXPECT_EQ(fmt::format("{0:}", 392.65l), "392.65"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1498 |
EXPECT_EQ(fmt::format("{0:g}", 392.65l), "392.65"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1499 |
EXPECT_EQ(fmt::format("{0:G}", 392.65l), "392.65"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1500 |
EXPECT_EQ(fmt::format("{0:f}", 392.65l), "392.650000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1501 |
EXPECT_EQ(fmt::format("{0:F}", 392.65l), "392.650000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1502 |
char buffer[buffer_size]; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1503 |
safe_sprintf(buffer, "%Le", 392.65l); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1504 |
EXPECT_EQ(buffer, fmt::format("{0:e}", 392.65l)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1505 |
EXPECT_EQ(fmt::format("{0:+010.4g}", 392.64l), "+0000392.6"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1506 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1507 |
auto ld = 3.31l; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1508 |
if (fmt::detail::is_double_double<decltype(ld)>::value) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1509 |
safe_sprintf(buffer, "%a", static_cast<double>(ld)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1510 |
EXPECT_EQ(buffer, fmt::format("{:a}", ld)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1511 |
} else if (std::numeric_limits<long double>::digits == 64) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1512 |
EXPECT_EQ(fmt::format("{:a}", ld), "0xd.3d70a3d70a3d70ap-2"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1513 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1514 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1515 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1516 |
TEST(format_test, format_char) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1517 |
const char types[] = "cbBdoxX"; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1518 |
check_unknown_types('a', types, "char"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1519 |
EXPECT_EQ(fmt::format("{0}", 'a'), "a"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1520 |
EXPECT_EQ(fmt::format("{0:c}", 'z'), "z"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1521 |
int n = 'x'; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1522 |
for (const char* type = types + 1; *type; ++type) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1523 |
std::string format_str = fmt::format("{{:{}}}", *type); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1524 |
EXPECT_EQ(fmt::format(runtime(format_str), n), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1525 |
fmt::format(runtime(format_str), 'x')) |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1526 |
<< format_str; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1527 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1528 |
EXPECT_EQ(fmt::format("{:02X}", n), fmt::format("{:02X}", 'x')); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1529 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1530 |
EXPECT_EQ(fmt::format("{}", '\n'), "\n"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1531 |
EXPECT_EQ(fmt::format("{:?}", '\n'), "'\\n'"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1532 |
EXPECT_EQ(fmt::format("{:x}", '\xff'), "ff"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1533 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1534 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1535 |
TEST(format_test, format_volatile_char) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1536 |
volatile char c = 'x'; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1537 |
EXPECT_EQ(fmt::format("{}", c), "x"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1538 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1539 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1540 |
TEST(format_test, format_unsigned_char) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1541 |
EXPECT_EQ(fmt::format("{}", static_cast<unsigned char>(42)), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1542 |
EXPECT_EQ(fmt::format("{}", static_cast<uint8_t>(42)), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1543 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1544 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1545 |
TEST(format_test, format_cstring) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1546 |
check_unknown_types("test", "sp", "string"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1547 |
EXPECT_EQ(fmt::format("{0}", "test"), "test"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1548 |
EXPECT_EQ(fmt::format("{0:s}", "test"), "test"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1549 |
char nonconst[] = "nonconst"; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1550 |
EXPECT_EQ(fmt::format("{0}", nonconst), "nonconst"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1551 |
auto nullstr = static_cast<const char*>(nullptr); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1552 |
EXPECT_THROW_MSG((void)fmt::format("{}", nullstr), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1553 |
"string pointer is null"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1554 |
EXPECT_THROW_MSG((void)fmt::format("{:s}", nullstr), format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1555 |
"string pointer is null"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1556 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1557 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1558 |
void function_pointer_test(int, double, std::string) {} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1559 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1560 |
TEST(format_test, format_pointer) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1561 |
check_unknown_types(reinterpret_cast<void*>(0x1234), "p", "pointer"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1562 |
EXPECT_EQ(fmt::format("{0}", static_cast<void*>(nullptr)), "0x0"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1563 |
EXPECT_EQ(fmt::format("{0}", reinterpret_cast<void*>(0x1234)), "0x1234"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1564 |
EXPECT_EQ(fmt::format("{0:p}", reinterpret_cast<void*>(0x1234)), "0x1234"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1565 |
// On CHERI (or other fat-pointer) systems, the size of a pointer is greater |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1566 |
// than the size an integer that can hold a virtual address. There is no |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1567 |
// portable address-as-an-integer type (yet) in C++, so we use `size_t` as |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1568 |
// the closest equivalent for now. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1569 |
EXPECT_EQ("0x" + std::string(sizeof(size_t) * CHAR_BIT / 4, 'f'), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1570 |
fmt::format("{0}", reinterpret_cast<void*>(~uintptr_t()))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1571 |
EXPECT_EQ("0x1234", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1572 |
fmt::format("{}", fmt::ptr(reinterpret_cast<int*>(0x1234)))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1573 |
EXPECT_EQ(fmt::format("{}", fmt::detail::bit_cast<const void*>( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1574 |
&function_pointer_test)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1575 |
fmt::format("{}", fmt::ptr(function_pointer_test))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1576 |
EXPECT_EQ(fmt::format("{}", nullptr), "0x0"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1577 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1578 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1579 |
TEST(format_test, write_uintptr_fallback) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1580 |
// Test that formatting a pointer by converting it to uint128_fallback works. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1581 |
// This is needed to support systems without uintptr_t. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1582 |
auto s = std::string(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1583 |
fmt::detail::write_ptr<char>( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1584 |
std::back_inserter(s), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1585 |
fmt::detail::bit_cast<fmt::detail::uint128_fallback>( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1586 |
reinterpret_cast<void*>(0xface)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1587 |
nullptr); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1588 |
EXPECT_EQ(s, "0xface"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1589 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1590 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1591 |
enum class color { red, green, blue }; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1592 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1593 |
namespace test_ns { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1594 |
enum class color { red, green, blue }; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1595 |
using fmt::enums::format_as; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1596 |
} // namespace test_ns |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1597 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1598 |
TEST(format_test, format_enum_class) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1599 |
EXPECT_EQ(fmt::format("{}", fmt::underlying(color::red)), "0"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1600 |
EXPECT_EQ(fmt::format("{}", test_ns::color::red), "0"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1601 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1602 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1603 |
TEST(format_test, format_string) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1604 |
EXPECT_EQ(fmt::format("{0}", std::string("test")), "test"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1605 |
EXPECT_EQ(fmt::format("{0}", std::string("test")), "test"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1606 |
EXPECT_EQ(fmt::format("{:?}", std::string("test")), "\"test\""); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1607 |
EXPECT_EQ(fmt::format("{:*^10?}", std::string("test")), "**\"test\"**"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1608 |
EXPECT_EQ(fmt::format("{:?}", std::string("\test")), "\"\\test\""); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1609 |
EXPECT_THROW((void)fmt::format(fmt::runtime("{:x}"), std::string("test")), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1610 |
fmt::format_error); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1611 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1612 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1613 |
TEST(format_test, format_string_view) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1614 |
EXPECT_EQ(fmt::format("{}", string_view("test")), "test"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1615 |
EXPECT_EQ(fmt::format("{:?}", string_view("t\nst")), "\"t\\nst\""); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1616 |
EXPECT_EQ(fmt::format("{}", string_view()), ""); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1617 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1618 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1619 |
#ifdef FMT_USE_STRING_VIEW |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1620 |
struct string_viewable {}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1621 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1622 |
FMT_BEGIN_NAMESPACE |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1623 |
template <> struct formatter<string_viewable> : formatter<std::string_view> { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1624 |
auto format(string_viewable, format_context& ctx) const |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1625 |
-> decltype(ctx.out()) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1626 |
return formatter<std::string_view>::format("foo", ctx); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1627 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1628 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1629 |
FMT_END_NAMESPACE |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1630 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1631 |
TEST(format_test, format_std_string_view) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1632 |
EXPECT_EQ(fmt::format("{}", std::string_view("test")), "test"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1633 |
EXPECT_EQ(fmt::format("{}", string_viewable()), "foo"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1634 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1635 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1636 |
struct explicitly_convertible_to_std_string_view { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1637 |
explicit operator std::string_view() const { return "foo"; } |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1638 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1639 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1640 |
template <> |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1641 |
struct fmt::formatter<explicitly_convertible_to_std_string_view> |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1642 |
: formatter<std::string_view> { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1643 |
auto format(explicitly_convertible_to_std_string_view v, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1644 |
format_context& ctx) const -> decltype(ctx.out()) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1645 |
return fmt::format_to(ctx.out(), "'{}'", std::string_view(v)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1646 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1647 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1648 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1649 |
TEST(format_test, format_explicitly_convertible_to_std_string_view) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1650 |
EXPECT_EQ("'foo'", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1651 |
fmt::format("{}", explicitly_convertible_to_std_string_view())); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1652 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1653 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1654 |
struct convertible_to_std_string_view { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1655 |
operator std::string_view() const noexcept { return "Hi there"; } |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1656 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1657 |
FMT_BEGIN_NAMESPACE |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1658 |
template <> |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1659 |
class formatter<convertible_to_std_string_view> |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1660 |
: public formatter<std::string_view> {}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1661 |
FMT_END_NAMESPACE |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1662 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1663 |
TEST(format_test, format_implicitly_convertible_and_inherits_string_view) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1664 |
static_assert(fmt::is_formattable<convertible_to_std_string_view>{}, ""); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1665 |
EXPECT_EQ("Hi there", fmt::format("{}", convertible_to_std_string_view{})); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1666 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1667 |
#endif |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1668 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1669 |
class Answer {}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1670 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1671 |
FMT_BEGIN_NAMESPACE |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1672 |
template <> struct formatter<date> { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1673 |
template <typename ParseContext> |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1674 |
FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1675 |
auto it = ctx.begin(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1676 |
if (it != ctx.end() && *it == 'd') ++it; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1677 |
return it; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1678 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1679 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1680 |
auto format(const date& d, format_context& ctx) const -> decltype(ctx.out()) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1681 |
// Namespace-qualify to avoid ambiguity with std::format_to. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1682 |
fmt::format_to(ctx.out(), "{}-{}-{}", d.year(), d.month(), d.day()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1683 |
return ctx.out(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1684 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1685 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1686 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1687 |
template <> struct formatter<Answer> : formatter<int> { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1688 |
template <typename FormatContext> |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1689 |
auto format(Answer, FormatContext& ctx) const -> decltype(ctx.out()) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1690 |
return formatter<int>::format(42, ctx); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1691 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1692 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1693 |
FMT_END_NAMESPACE |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1694 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1695 |
TEST(format_test, format_custom) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1696 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:s}"), date(2012, 12, 9)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1697 |
format_error, "unknown format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1698 |
EXPECT_EQ(fmt::format("{0}", Answer()), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1699 |
EXPECT_EQ(fmt::format("{:04}", Answer()), "0042"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1700 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1701 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1702 |
TEST(format_test, format_to_custom) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1703 |
char buf[10] = {}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1704 |
auto end = fmt::format_to(buf, "{}", Answer()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1705 |
EXPECT_EQ(end, buf + 2); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1706 |
EXPECT_STREQ(buf, "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1707 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1708 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1709 |
TEST(format_test, format_string_from_speed_test) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1710 |
EXPECT_EQ("1.2340000000:0042:+3.13:str:0x3e8:X:%", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1711 |
fmt::format("{0:0.10f}:{1:04}:{2:+g}:{3}:{4}:{5}:%", 1.234, 42, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1712 |
3.13, "str", reinterpret_cast<void*>(1000), 'X')); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1713 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1714 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1715 |
TEST(format_test, format_examples) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1716 |
std::string message = fmt::format("The answer is {}", 42); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1717 |
EXPECT_EQ("The answer is 42", message); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1718 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1719 |
EXPECT_EQ(fmt::format("{}", 42), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1720 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1721 |
memory_buffer out; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1722 |
fmt::format_to(std::back_inserter(out), "The answer is {}.", 42); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1723 |
EXPECT_EQ("The answer is 42.", to_string(out)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1724 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1725 |
const char* filename = "nonexistent"; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1726 |
FILE* ftest = safe_fopen(filename, "r"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1727 |
if (ftest) fclose(ftest); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1728 |
int error_code = errno; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1729 |
EXPECT_TRUE(ftest == nullptr); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1730 |
EXPECT_SYSTEM_ERROR( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1731 |
{ |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1732 |
FILE* f = safe_fopen(filename, "r"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1733 |
if (!f) |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1734 |
throw fmt::system_error(errno, "Cannot open file '{}'", filename); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1735 |
fclose(f); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1736 |
}, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1737 |
error_code, "Cannot open file 'nonexistent'"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1738 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1739 |
EXPECT_EQ("First, thou shalt count to three", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1740 |
fmt::format("First, thou shalt count to {0}", "three")); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1741 |
EXPECT_EQ(fmt::format("Bring me a {}", "shrubbery"), "Bring me a shrubbery"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1742 |
EXPECT_EQ(fmt::format("From {} to {}", 1, 3), "From 1 to 3"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1743 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1744 |
char buffer[buffer_size]; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1745 |
safe_sprintf(buffer, "%03.2f", -1.2); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1746 |
EXPECT_EQ(buffer, fmt::format("{:03.2f}", -1.2)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1747 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1748 |
EXPECT_EQ(fmt::format("{0}, {1}, {2}", 'a', 'b', 'c'), "a, b, c"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1749 |
EXPECT_EQ(fmt::format("{}, {}, {}", 'a', 'b', 'c'), "a, b, c"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1750 |
EXPECT_EQ(fmt::format("{2}, {1}, {0}", 'a', 'b', 'c'), "c, b, a"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1751 |
EXPECT_EQ(fmt::format("{0}{1}{0}", "abra", "cad"), "abracadabra"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1752 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1753 |
EXPECT_EQ("left aligned ", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1754 |
fmt::format("{:<30}", "left aligned")); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1755 |
EXPECT_EQ(" right aligned", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1756 |
fmt::format("{:>30}", "right aligned")); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1757 |
EXPECT_EQ(" centered ", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1758 |
fmt::format("{:^30}", "centered")); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1759 |
EXPECT_EQ("***********centered***********", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1760 |
fmt::format("{:*^30}", "centered")); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1761 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1762 |
EXPECT_EQ(fmt::format("{:+f}; {:+f}", 3.14, -3.14), "+3.140000; -3.140000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1763 |
EXPECT_EQ(fmt::format("{: f}; {: f}", 3.14, -3.14), " 3.140000; -3.140000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1764 |
EXPECT_EQ(fmt::format("{:-f}; {:-f}", 3.14, -3.14), "3.140000; -3.140000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1765 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1766 |
EXPECT_EQ("int: 42; hex: 2a; oct: 52", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1767 |
fmt::format("int: {0:d}; hex: {0:x}; oct: {0:o}", 42)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1768 |
EXPECT_EQ("int: 42; hex: 0x2a; oct: 052", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1769 |
fmt::format("int: {0:d}; hex: {0:#x}; oct: {0:#o}", 42)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1770 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1771 |
EXPECT_EQ(fmt::format("The answer is {}", 42), "The answer is 42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1772 |
EXPECT_THROW_MSG( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1773 |
(void)fmt::format(runtime("The answer is {:d}"), "forty-two"), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1774 |
format_error, "invalid format specifier"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1775 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1776 |
EXPECT_WRITE( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1777 |
stdout, fmt::print("{}", std::numeric_limits<double>::infinity()), "inf"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1778 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1779 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1780 |
TEST(format_test, print) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1781 |
EXPECT_WRITE(stdout, fmt::print("Don't {}!", "panic"), "Don't panic!"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1782 |
EXPECT_WRITE(stderr, fmt::print(stderr, "Don't {}!", "panic"), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1783 |
"Don't panic!"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1784 |
EXPECT_WRITE(stdout, fmt::println("Don't {}!", "panic"), "Don't panic!\n"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1785 |
EXPECT_WRITE(stderr, fmt::println(stderr, "Don't {}!", "panic"), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1786 |
"Don't panic!\n"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1787 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1788 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1789 |
TEST(format_test, big_print) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1790 |
enum { count = 5000 }; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1791 |
auto big_print = []() { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1792 |
for (int i = 0; i < count / 5; ++i) fmt::print("xxxxx"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1793 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1794 |
EXPECT_WRITE(stdout, big_print(), std::string(count, 'x')); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1795 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1796 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1797 |
// Windows CRT implements _IOLBF incorrectly (full buffering). |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1798 |
#if FMT_USE_FCNTL && !defined(_WIN32) |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1799 |
TEST(format_test, line_buffering) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1800 |
auto pipe = fmt::pipe(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1801 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1802 |
int write_fd = pipe.write_end.descriptor(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1803 |
auto write_end = pipe.write_end.fdopen("w"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1804 |
setvbuf(write_end.get(), nullptr, _IOLBF, 4096); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1805 |
write_end.print("42\n"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1806 |
close(write_fd); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1807 |
try { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1808 |
write_end.close(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1809 |
} catch (const std::system_error&) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1810 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1811 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1812 |
auto read_end = pipe.read_end.fdopen("r"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1813 |
std::thread reader([&]() { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1814 |
int n = 0; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1815 |
int result = fscanf(read_end.get(), "%d", &n); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1816 |
(void)result; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1817 |
EXPECT_EQ(n, 42); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1818 |
}); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1819 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1820 |
reader.join(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1821 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1822 |
#endif |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1823 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1824 |
struct deadlockable { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1825 |
int value = 0; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1826 |
mutable std::mutex mutex; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1827 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1828 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1829 |
FMT_BEGIN_NAMESPACE |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1830 |
template <> struct formatter<deadlockable> { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1831 |
FMT_CONSTEXPR auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1832 |
return ctx.begin(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1833 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1834 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1835 |
auto format(const deadlockable& d, format_context& ctx) const |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1836 |
-> decltype(ctx.out()) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1837 |
std::lock_guard<std::mutex> lock(d.mutex); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1838 |
return format_to(ctx.out(), "{}", d.value); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1839 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1840 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1841 |
FMT_END_NAMESPACE |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1842 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1843 |
TEST(format_test, locking_formatter) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1844 |
auto f = fmt::buffered_file(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1845 |
try { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1846 |
f = fmt::buffered_file("/dev/null", "w"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1847 |
} catch (const std::system_error&) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1848 |
fmt::print(stderr, "warning: /dev/null is not supported\n"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1849 |
return; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1850 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1851 |
deadlockable d; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1852 |
auto t = std::thread([&]() { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1853 |
fmt::print(f.get(), "start t\n"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1854 |
std::lock_guard<std::mutex> lock(d.mutex); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1855 |
for (int i = 0; i < 1000000; ++i) d.value += 10; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1856 |
fmt::print(f.get(), "done\n"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1857 |
}); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1858 |
for (int i = 0; i < 100; ++i) fmt::print(f.get(), "{}", d); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1859 |
t.join(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1860 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1861 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1862 |
TEST(format_test, variadic) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1863 |
EXPECT_EQ(fmt::format("{}c{}", "ab", 1), "abc1"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1864 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1865 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1866 |
TEST(format_test, bytes) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1867 |
auto s = fmt::format("{:10}", fmt::bytes("ёжик")); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1868 |
EXPECT_EQ("ёжик ", s); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1869 |
EXPECT_EQ(10, s.size()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1870 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1871 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1872 |
TEST(format_test, group_digits_view) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1873 |
EXPECT_EQ(fmt::format("{}", fmt::group_digits(10000000)), "10,000,000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1874 |
EXPECT_EQ(fmt::format("{:8}", fmt::group_digits(1000)), " 1,000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1875 |
EXPECT_EQ(fmt::format("{}", fmt::group_digits(-10000000)), "-10,000,000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1876 |
EXPECT_EQ(fmt::format("{:8}", fmt::group_digits(-1000)), " -1,000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1877 |
EXPECT_EQ(fmt::format("{:8}", fmt::group_digits(-100)), " -100"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1878 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1879 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1880 |
#ifdef __cpp_generic_lambdas |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1881 |
struct point { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1882 |
double x, y; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1883 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1884 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1885 |
FMT_BEGIN_NAMESPACE |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1886 |
template <> struct formatter<point> : nested_formatter<double> { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1887 |
auto format(point p, format_context& ctx) const -> decltype(ctx.out()) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1888 |
return write_padded(ctx, [this, p](auto out) -> decltype(out) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1889 |
return fmt::format_to(out, "({}, {})", this->nested(p.x), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1890 |
this->nested(p.y)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1891 |
}); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1892 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1893 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1894 |
FMT_END_NAMESPACE |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1895 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1896 |
TEST(format_test, nested_formatter) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1897 |
EXPECT_EQ(fmt::format("{:>16.2f}", point{1, 2}), " (1.00, 2.00)"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1898 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1899 |
#endif // __cpp_generic_lambdas |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1900 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1901 |
enum test_enum { foo, bar }; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1902 |
auto format_as(test_enum e) -> int { return e; } |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1903 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1904 |
std::string vformat_message(int id, const char* format, fmt::format_args args) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1905 |
auto buffer = fmt::memory_buffer(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1906 |
fmt::format_to(fmt::appender(buffer), "[{}] ", id); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1907 |
vformat_to(fmt::appender(buffer), format, args); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1908 |
return to_string(buffer); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1909 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1910 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1911 |
template <typename... Args> |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1912 |
std::string format_message(int id, const char* format, const Args&... args) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1913 |
auto va = fmt::make_format_args(args...); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1914 |
return vformat_message(id, format, va); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1915 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1916 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1917 |
TEST(format_test, format_message_example) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1918 |
EXPECT_EQ("[42] something happened", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1919 |
format_message(42, "{} happened", "something")); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1920 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1921 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1922 |
template <typename... Args> |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1923 |
void print_error(const char* file, int line, const char* format, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1924 |
const Args&... args) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1925 |
fmt::print("{}: {}: ", file, line); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1926 |
fmt::print(format, args...); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1927 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1928 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1929 |
TEST(format_test, unpacked_args) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1930 |
EXPECT_EQ("0123456789abcdefg", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1931 |
fmt::format("{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}", 0, 1, 2, 3, 4, 5, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1932 |
6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f', 'g')); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1933 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1934 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1935 |
constexpr char with_null[3] = {'{', '}', '\0'}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1936 |
constexpr char no_null[2] = {'{', '}'}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1937 |
static constexpr const char static_with_null[3] = {'{', '}', '\0'}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1938 |
static constexpr const char static_no_null[2] = {'{', '}'}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1939 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1940 |
TEST(format_test, compile_time_string) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1941 |
EXPECT_EQ(fmt::format(FMT_STRING("foo")), "foo"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1942 |
EXPECT_EQ(fmt::format(FMT_STRING("{}"), 42), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1943 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1944 |
#if FMT_USE_NONTYPE_TEMPLATE_ARGS |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1945 |
using namespace fmt::literals; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1946 |
EXPECT_EQ("foobar", fmt::format(FMT_STRING("{foo}{bar}"), "bar"_a = "bar", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1947 |
"foo"_a = "foo")); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1948 |
EXPECT_EQ(fmt::format(FMT_STRING("")), ""); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1949 |
EXPECT_EQ(fmt::format(FMT_STRING(""), "arg"_a = 42), ""); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1950 |
EXPECT_EQ(fmt::format(FMT_STRING("{answer}"), "answer"_a = Answer()), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1951 |
EXPECT_EQ(fmt::format(FMT_STRING("{} {two}"), 1, "two"_a = 2), "1 2"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1952 |
#endif |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1953 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1954 |
(void)static_with_null; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1955 |
(void)static_no_null; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1956 |
#ifndef _MSC_VER |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1957 |
EXPECT_EQ(fmt::format(FMT_STRING(static_with_null), 42), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1958 |
EXPECT_EQ(fmt::format(FMT_STRING(static_no_null), 42), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1959 |
#endif |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1960 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1961 |
(void)with_null; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1962 |
(void)no_null; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1963 |
#if FMT_CPLUSPLUS >= 201703L |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1964 |
EXPECT_EQ(fmt::format(FMT_STRING(with_null), 42), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1965 |
EXPECT_EQ(fmt::format(FMT_STRING(no_null), 42), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1966 |
#endif |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1967 |
#if defined(FMT_USE_STRING_VIEW) && FMT_CPLUSPLUS >= 201703L |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1968 |
EXPECT_EQ(fmt::format(FMT_STRING(std::string_view("{}")), 42), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1969 |
#endif |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1970 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1971 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1972 |
TEST(format_test, custom_format_compile_time_string) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1973 |
EXPECT_EQ(fmt::format(FMT_STRING("{}"), Answer()), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1974 |
auto answer = Answer(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1975 |
EXPECT_EQ(fmt::format(FMT_STRING("{}"), answer), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1976 |
char buf[10] = {}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1977 |
fmt::format_to(buf, FMT_STRING("{}"), answer); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1978 |
const Answer const_answer = Answer(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1979 |
EXPECT_EQ(fmt::format(FMT_STRING("{}"), const_answer), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1980 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1981 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1982 |
#if FMT_USE_USER_DEFINED_LITERALS |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1983 |
TEST(format_test, named_arg_udl) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1984 |
using namespace fmt::literals; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1985 |
auto udl_a = fmt::format("{first}{second}{first}{third}", "first"_a = "abra", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1986 |
"second"_a = "cad", "third"_a = 99); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1987 |
EXPECT_EQ( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1988 |
fmt::format("{first}{second}{first}{third}", fmt::arg("first", "abra"), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1989 |
fmt::arg("second", "cad"), fmt::arg("third", 99)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1990 |
udl_a); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1991 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1992 |
EXPECT_EQ(fmt::format("{answer}", "answer"_a = Answer()), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1993 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1994 |
#endif // FMT_USE_USER_DEFINED_LITERALS |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1995 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1996 |
TEST(format_test, enum) { EXPECT_EQ(fmt::format("{}", foo), "0"); } |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1997 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1998 |
TEST(format_test, formatter_not_specialized) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1999 |
static_assert(!fmt::has_formatter<fmt::formatter<test_enum>, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2000 |
fmt::format_context>::value, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2001 |
""); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2002 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2003 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2004 |
#if FMT_HAS_FEATURE(cxx_strong_enums) |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2005 |
enum big_enum : unsigned long long { big_enum_value = 5000000000ULL }; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2006 |
auto format_as(big_enum e) -> unsigned long long { return e; } |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2007 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2008 |
TEST(format_test, strong_enum) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2009 |
EXPECT_EQ(fmt::format("{}", big_enum_value), "5000000000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2010 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2011 |
#endif |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2012 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2013 |
TEST(format_test, non_null_terminated_format_string) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2014 |
EXPECT_EQ(fmt::format(string_view("{}foo", 2), 42), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2015 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2016 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2017 |
namespace adl_test { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2018 |
namespace fmt { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2019 |
namespace detail { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2020 |
struct foo {}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2021 |
template <typename, typename OutputIt> void write(OutputIt, foo) = delete; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2022 |
} // namespace detail |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2023 |
} // namespace fmt |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2024 |
} // namespace adl_test |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2025 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2026 |
FMT_BEGIN_NAMESPACE |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2027 |
template <> |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2028 |
struct formatter<adl_test::fmt::detail::foo> : formatter<std::string> { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2029 |
auto format(adl_test::fmt::detail::foo, format_context& ctx) const |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2030 |
-> decltype(ctx.out()) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2031 |
return formatter<std::string>::format("foo", ctx); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2032 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2033 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2034 |
FMT_END_NAMESPACE |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2035 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2036 |
TEST(format_test, to_string) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2037 |
EXPECT_EQ(fmt::to_string(42), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2038 |
EXPECT_EQ(fmt::to_string(reinterpret_cast<void*>(0x1234)), "0x1234"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2039 |
EXPECT_EQ(fmt::to_string(adl_test::fmt::detail::foo()), "foo"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2040 |
EXPECT_EQ(fmt::to_string(foo), "0"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2041 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2042 |
#if FMT_USE_FLOAT128 |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2043 |
EXPECT_EQ(fmt::to_string(__float128(0.5)), "0.5"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2044 |
#endif |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2045 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2046 |
#if defined(FMT_USE_STRING_VIEW) && FMT_CPLUSPLUS >= 201703L |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2047 |
EXPECT_EQ(fmt::to_string(std::string_view()), ""); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2048 |
#endif |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2049 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2050 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2051 |
TEST(format_test, output_iterators) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2052 |
std::list<char> out; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2053 |
fmt::format_to(std::back_inserter(out), "{}", 42); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2054 |
EXPECT_EQ("42", std::string(out.begin(), out.end())); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2055 |
std::stringstream s; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2056 |
fmt::format_to(std::ostream_iterator<char>(s), "{}", 42); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2057 |
EXPECT_EQ("42", s.str()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2058 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2059 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2060 |
TEST(format_test, fill_via_appender) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2061 |
fmt::memory_buffer buf; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2062 |
auto it = fmt::appender(buf); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2063 |
std::fill_n(it, 3, '~'); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2064 |
EXPECT_EQ(fmt::to_string(buf), "~~~"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2065 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2066 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2067 |
TEST(format_test, formatted_size) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2068 |
EXPECT_EQ(2u, fmt::formatted_size("{}", 42)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2069 |
EXPECT_EQ(2u, fmt::formatted_size(std::locale(), "{}", 42)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2070 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2071 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2072 |
TEST(format_test, format_to_no_args) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2073 |
std::string s; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2074 |
fmt::format_to(std::back_inserter(s), "test"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2075 |
EXPECT_EQ("test", s); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2076 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2077 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2078 |
TEST(format_test, format_to) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2079 |
std::string s; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2080 |
fmt::format_to(std::back_inserter(s), "part{0}", 1); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2081 |
EXPECT_EQ("part1", s); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2082 |
fmt::format_to(std::back_inserter(s), "part{0}", 2); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2083 |
EXPECT_EQ("part1part2", s); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2084 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2085 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2086 |
TEST(format_test, format_to_memory_buffer) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2087 |
auto buf = fmt::basic_memory_buffer<char, 100>(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2088 |
fmt::format_to(fmt::appender(buf), "{}", "foo"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2089 |
EXPECT_EQ("foo", to_string(buf)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2090 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2091 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2092 |
TEST(format_test, format_to_vector) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2093 |
std::vector<char> v; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2094 |
fmt::format_to(std::back_inserter(v), "{}", "foo"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2095 |
EXPECT_EQ(string_view(v.data(), v.size()), "foo"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2096 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2097 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2098 |
struct nongrowing_container { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2099 |
using value_type = char; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2100 |
void push_back(char) { throw std::runtime_error("can't take it any more"); } |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2101 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2102 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2103 |
TEST(format_test, format_to_propagates_exceptions) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2104 |
auto c = nongrowing_container(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2105 |
EXPECT_THROW(fmt::format_to(std::back_inserter(c), "{}", 42), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2106 |
std::runtime_error); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2107 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2108 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2109 |
TEST(format_test, format_to_n) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2110 |
char buffer[4]; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2111 |
buffer[3] = 'x'; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2112 |
auto result = fmt::format_to_n(buffer, 3, "{}", 12345); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2113 |
EXPECT_EQ(5u, result.size); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2114 |
EXPECT_EQ(buffer + 3, result.out); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2115 |
EXPECT_EQ("123x", fmt::string_view(buffer, 4)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2116 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2117 |
result = fmt::format_to_n(buffer, 3, "{:s}", "foobar"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2118 |
EXPECT_EQ(6u, result.size); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2119 |
EXPECT_EQ(buffer + 3, result.out); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2120 |
EXPECT_EQ("foox", fmt::string_view(buffer, 4)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2121 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2122 |
buffer[0] = 'x'; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2123 |
buffer[1] = 'x'; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2124 |
buffer[2] = 'x'; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2125 |
result = fmt::format_to_n(buffer, 3, "{}", 'A'); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2126 |
EXPECT_EQ(1u, result.size); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2127 |
EXPECT_EQ(buffer + 1, result.out); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2128 |
EXPECT_EQ("Axxx", fmt::string_view(buffer, 4)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2129 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2130 |
result = fmt::format_to_n(buffer, 3, "{}{} ", 'B', 'C'); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2131 |
EXPECT_EQ(3u, result.size); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2132 |
EXPECT_EQ(buffer + 3, result.out); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2133 |
EXPECT_EQ("BC x", fmt::string_view(buffer, 4)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2134 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2135 |
result = fmt::format_to_n(buffer, 4, "{}", "ABCDE"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2136 |
EXPECT_EQ(5u, result.size); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2137 |
EXPECT_EQ("ABCD", fmt::string_view(buffer, 4)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2138 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2139 |
buffer[3] = 'x'; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2140 |
result = fmt::format_to_n(buffer, 3, "{}", std::string(1000, '*')); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2141 |
EXPECT_EQ(1000u, result.size); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2142 |
EXPECT_EQ("***x", fmt::string_view(buffer, 4)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2143 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2144 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2145 |
struct test_output_iterator { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2146 |
char* data; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2147 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2148 |
using iterator_category = std::output_iterator_tag; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2149 |
using value_type = void; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2150 |
using difference_type = void; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2151 |
using pointer = void; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2152 |
using reference = void; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2153 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2154 |
auto operator++() -> test_output_iterator& { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2155 |
++data; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2156 |
return *this; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2157 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2158 |
auto operator++(int) -> test_output_iterator { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2159 |
auto tmp = *this; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2160 |
++data; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2161 |
return tmp; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2162 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2163 |
auto operator*() -> char& { return *data; } |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2164 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2165 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2166 |
TEST(format_test, format_to_n_output_iterator) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2167 |
char buf[10] = {}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2168 |
fmt::format_to_n(test_output_iterator{buf}, 10, "{}", 42); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2169 |
EXPECT_STREQ(buf, "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2170 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2171 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2172 |
TEST(format_test, vformat_to) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2173 |
using context = fmt::format_context; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2174 |
int n = 42; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2175 |
auto args = fmt::make_format_args<context>(n); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2176 |
auto s = std::string(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2177 |
fmt::vformat_to(std::back_inserter(s), "{}", args); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2178 |
EXPECT_EQ(s, "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2179 |
s.clear(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2180 |
fmt::vformat_to(std::back_inserter(s), FMT_STRING("{}"), args); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2181 |
EXPECT_EQ(s, "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2182 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2183 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2184 |
TEST(format_test, char_traits_not_ambiguous) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2185 |
// Test that we don't inject detail names into the std namespace. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2186 |
using namespace std; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2187 |
auto c = char_traits<char>::char_type(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2188 |
(void)c; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2189 |
#if FMT_CPLUSPLUS >= 201103L |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2190 |
auto s = std::string(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2191 |
auto lval = begin(s); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2192 |
(void)lval; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2193 |
#endif |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2194 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2195 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2196 |
struct check_back_appender {}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2197 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2198 |
FMT_BEGIN_NAMESPACE |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2199 |
template <> struct formatter<check_back_appender> { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2200 |
FMT_CONSTEXPR auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2201 |
return ctx.begin(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2202 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2203 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2204 |
template <typename Context> |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2205 |
auto format(check_back_appender, Context& ctx) const -> decltype(ctx.out()) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2206 |
auto out = ctx.out(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2207 |
static_assert(std::is_same<decltype(++out), decltype(out)&>::value, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2208 |
"needs to satisfy weakly_incrementable"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2209 |
*out = 'y'; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2210 |
return ++out; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2211 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2212 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2213 |
FMT_END_NAMESPACE |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2214 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2215 |
TEST(format_test, back_insert_slicing) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2216 |
EXPECT_EQ(fmt::format("{}", check_back_appender{}), "y"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2217 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2218 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2219 |
namespace test { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2220 |
enum class scoped_enum_as_int {}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2221 |
auto format_as(scoped_enum_as_int) -> int { return 42; } |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2222 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2223 |
enum class scoped_enum_as_string_view {}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2224 |
auto format_as(scoped_enum_as_string_view) -> fmt::string_view { return "foo"; } |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2225 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2226 |
enum class scoped_enum_as_string {}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2227 |
auto format_as(scoped_enum_as_string) -> std::string { return "foo"; } |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2228 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2229 |
struct struct_as_int {}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2230 |
auto format_as(struct_as_int) -> int { return 42; } |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2231 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2232 |
struct struct_as_const_reference { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2233 |
const std::string name = "foo"; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2234 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2235 |
auto format_as(const struct_as_const_reference& s) -> const std::string& { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2236 |
return s.name; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2237 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2238 |
} // namespace test |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2239 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2240 |
TEST(format_test, format_as) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2241 |
EXPECT_EQ(fmt::format("{}", test::scoped_enum_as_int()), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2242 |
EXPECT_EQ(fmt::format("{}", test::scoped_enum_as_string_view()), "foo"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2243 |
EXPECT_EQ(fmt::format("{}", test::scoped_enum_as_string()), "foo"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2244 |
EXPECT_EQ(fmt::format("{}", test::struct_as_int()), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2245 |
EXPECT_EQ(fmt::format("{}", test::struct_as_const_reference()), "foo"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2246 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2247 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2248 |
TEST(format_test, format_as_to_string) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2249 |
EXPECT_EQ(fmt::to_string(test::scoped_enum_as_int()), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2250 |
EXPECT_EQ(fmt::to_string(test::scoped_enum_as_string_view()), "foo"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2251 |
EXPECT_EQ(fmt::to_string(test::scoped_enum_as_string()), "foo"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2252 |
EXPECT_EQ(fmt::to_string(test::struct_as_int()), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2253 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2254 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2255 |
template <typename Char, typename T> auto check_enabled_formatter() -> bool { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2256 |
static_assert(std::is_default_constructible<fmt::formatter<T, Char>>::value, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2257 |
""); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2258 |
return true; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2259 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2260 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2261 |
template <typename Char, typename... T> void check_enabled_formatters() { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2262 |
auto dummy = {check_enabled_formatter<Char, T>()...}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2263 |
(void)dummy; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2264 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2265 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2266 |
TEST(format_test, test_formatters_enabled) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2267 |
using custom_string = |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2268 |
std::basic_string<char, std::char_traits<char>, mock_allocator<char>>; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2269 |
using custom_wstring = std::basic_string<wchar_t, std::char_traits<wchar_t>, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2270 |
mock_allocator<wchar_t>>; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2271 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2272 |
check_enabled_formatters<char, bool, char, signed char, unsigned char, short, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2273 |
unsigned short, int, unsigned, long, unsigned long, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2274 |
long long, unsigned long long, float, double, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2275 |
long double, void*, const void*, char*, const char*, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2276 |
std::string, custom_string, std::nullptr_t>(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2277 |
check_enabled_formatters< |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2278 |
wchar_t, bool, wchar_t, signed char, unsigned char, short, unsigned short, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2279 |
int, unsigned, long, unsigned long, long long, unsigned long long, float, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2280 |
double, long double, void*, const void*, wchar_t*, const wchar_t*, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2281 |
std::wstring, custom_wstring, std::nullptr_t>(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2282 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2283 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2284 |
TEST(format_int_test, data) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2285 |
fmt::format_int format_int(42); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2286 |
EXPECT_EQ(std::string(format_int.data(), format_int.size()), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2287 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2288 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2289 |
TEST(format_int_test, format_int) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2290 |
EXPECT_EQ(fmt::format_int(42).str(), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2291 |
EXPECT_EQ(fmt::format_int(42).size(), 2u); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2292 |
EXPECT_EQ(fmt::format_int(-42).str(), "-42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2293 |
EXPECT_EQ(fmt::format_int(-42).size(), 3u); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2294 |
EXPECT_EQ(fmt::format_int(42ul).str(), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2295 |
EXPECT_EQ(fmt::format_int(-42l).str(), "-42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2296 |
EXPECT_EQ(fmt::format_int(42ull).str(), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2297 |
EXPECT_EQ(fmt::format_int(-42ll).str(), "-42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2298 |
EXPECT_EQ(fmt::format_int(max_value<int64_t>()).str(), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2299 |
std::to_string(max_value<int64_t>())); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2300 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2301 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2302 |
#ifndef FMT_STATIC_THOUSANDS_SEPARATOR |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2303 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2304 |
# include <locale> |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2305 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2306 |
class format_facet : public fmt::format_facet<std::locale> { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2307 |
protected: |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2308 |
struct int_formatter { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2309 |
fmt::appender out; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2310 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2311 |
template <typename T, FMT_ENABLE_IF(fmt::detail::is_integer<T>::value)> |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2312 |
auto operator()(T value) -> bool { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2313 |
fmt::format_to(out, "[{}]", value); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2314 |
return true; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2315 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2316 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2317 |
template <typename T, FMT_ENABLE_IF(!fmt::detail::is_integer<T>::value)> |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2318 |
auto operator()(T) -> bool { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2319 |
return false; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2320 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2321 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2322 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2323 |
auto do_put(fmt::appender out, fmt::loc_value val, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2324 |
const fmt::format_specs&) const -> bool override; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2325 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2326 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2327 |
auto format_facet::do_put(fmt::appender out, fmt::loc_value val, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2328 |
const fmt::format_specs&) const -> bool { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2329 |
return val.visit(int_formatter{out}); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2330 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2331 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2332 |
TEST(format_test, format_facet) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2333 |
auto loc = std::locale(std::locale(), new format_facet()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2334 |
EXPECT_EQ(fmt::format(loc, "{:L}", 42), "[42]"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2335 |
EXPECT_EQ(fmt::format(loc, "{:L}", -42), "[-42]"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2336 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2337 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2338 |
TEST(format_test, format_facet_separator) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2339 |
// U+2019 RIGHT SINGLE QUOTATION MARK is a digit separator in the de_CH |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2340 |
// locale. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2341 |
auto loc = |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2342 |
std::locale({}, new fmt::format_facet<std::locale>("\xe2\x80\x99")); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2343 |
EXPECT_EQ(fmt::format(loc, "{:L}", 1000), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2344 |
"1\xe2\x80\x99" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2345 |
"000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2346 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2347 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2348 |
TEST(format_test, format_facet_grouping) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2349 |
auto loc = |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2350 |
std::locale({}, new fmt::format_facet<std::locale>(",", {1, 2, 3})); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2351 |
EXPECT_EQ(fmt::format(loc, "{:L}", 1234567890), "1,234,567,89,0"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2352 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2353 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2354 |
TEST(format_test, format_named_arg_with_locale) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2355 |
EXPECT_EQ(fmt::format(std::locale(), "{answer}", fmt::arg("answer", 42)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2356 |
"42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2357 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2358 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2359 |
TEST(format_test, format_locale) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2360 |
auto loc = std::locale({}, new fmt::format_facet<std::locale>(",")); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2361 |
EXPECT_EQ(fmt::format(loc, "{:Lx}", 123456789), "7,5bc,d15"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2362 |
EXPECT_EQ(fmt::format(loc, "{:#Lb}", -123456789), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2363 |
"-0b111,010,110,111,100,110,100,010,101"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2364 |
EXPECT_EQ(fmt::format(loc, "{:10Lo}", 12345), " 30,071"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2365 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2366 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2367 |
#endif // FMT_STATIC_THOUSANDS_SEPARATOR |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2368 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2369 |
struct convertible_to_nonconst_cstring { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2370 |
operator char*() const { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2371 |
static char c[] = "bar"; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2372 |
return c; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2373 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2374 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2375 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2376 |
FMT_BEGIN_NAMESPACE |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2377 |
template <> |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2378 |
struct formatter<convertible_to_nonconst_cstring> : formatter<char*> {}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2379 |
FMT_END_NAMESPACE |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2380 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2381 |
TEST(format_test, formatter_nonconst_char) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2382 |
EXPECT_EQ(fmt::format("{}", convertible_to_nonconst_cstring()), "bar"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2383 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2384 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2385 |
namespace adl_test { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2386 |
template <typename... T> void make_format_args(const T&...) = delete; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2387 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2388 |
struct string : std::string {}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2389 |
} // namespace adl_test |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2390 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2391 |
// Test that formatting functions compile when make_format_args is found by ADL. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2392 |
TEST(format_test, adl) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2393 |
// Only check compilation and don't run the code to avoid polluting the output |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2394 |
// and since the output is tested elsewhere. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2395 |
if (fmt::detail::const_check(true)) return; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2396 |
auto s = adl_test::string(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2397 |
char buf[10]; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2398 |
(void)fmt::format("{}", s); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2399 |
fmt::format_to(buf, "{}", s); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2400 |
fmt::format_to_n(buf, 10, "{}", s); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2401 |
(void)fmt::formatted_size("{}", s); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2402 |
fmt::print("{}", s); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2403 |
fmt::print(stdout, "{}", s); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2404 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2405 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2406 |
struct convertible_to_int { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2407 |
operator int() const { return 42; } |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2408 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2409 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2410 |
struct convertible_to_cstring { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2411 |
operator const char*() const { return "foo"; } |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2412 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2413 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2414 |
FMT_BEGIN_NAMESPACE |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2415 |
template <> struct formatter<convertible_to_int> { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2416 |
FMT_CONSTEXPR auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2417 |
return ctx.begin(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2418 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2419 |
auto format(convertible_to_int, format_context& ctx) const |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2420 |
-> decltype(ctx.out()) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2421 |
auto out = ctx.out(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2422 |
*out++ = 'x'; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2423 |
return out; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2424 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2425 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2426 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2427 |
template <> struct formatter<convertible_to_cstring> { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2428 |
FMT_CONSTEXPR auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2429 |
return ctx.begin(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2430 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2431 |
auto format(convertible_to_cstring, format_context& ctx) const |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2432 |
-> decltype(ctx.out()) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2433 |
auto out = ctx.out(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2434 |
*out++ = 'y'; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2435 |
return out; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2436 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2437 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2438 |
FMT_END_NAMESPACE |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2439 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2440 |
TEST(format_test, formatter_overrides_implicit_conversion) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2441 |
EXPECT_EQ(fmt::format("{}", convertible_to_int()), "x"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2442 |
EXPECT_EQ(fmt::format("{}", convertible_to_cstring()), "y"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2443 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2444 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2445 |
struct ustring { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2446 |
using value_type = unsigned; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2447 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2448 |
auto find_first_of(value_type, size_t) const -> size_t; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2449 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2450 |
auto data() const -> const char*; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2451 |
auto size() const -> size_t; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2452 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2453 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2454 |
FMT_BEGIN_NAMESPACE |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2455 |
template <> struct formatter<ustring> : formatter<std::string> { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2456 |
auto format(const ustring&, format_context& ctx) const |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2457 |
-> decltype(ctx.out()) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2458 |
return formatter<std::string>::format("ustring", ctx); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2459 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2460 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2461 |
FMT_END_NAMESPACE |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2462 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2463 |
TEST(format_test, ustring) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2464 |
EXPECT_EQ(fmt::format("{}", ustring()), "ustring"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2465 |
} |
|
|
1970-01-01 00:00 |
2466 |
|