1 //===----------------------------------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #ifndef TEST_STD_UTILITIES_FORMAT_FORMAT_FUNCTIONS_FORMAT_TESTS_H
10 #define TEST_STD_UTILITIES_FORMAT_FORMAT_FUNCTIONS_FORMAT_TESTS_H
21 #include "string_literal.h"
22 #include "test_macros.h"
23 #include "format.functions.common.h"
25 // In this file the following template types are used:
26 // TestFunction must be callable as check(expected-result, string-to-format, args-to-format...)
27 // ExceptionTest must be callable as check_exception(expected-exception, string-to-format, args-to-format...)
29 enum class execution_modus
{ partial
, full
};
31 template <class CharT
>
32 std::vector
<std::basic_string_view
<CharT
>> invalid_types(std::string_view valid
) {
33 std::vector
<std::basic_string_view
<CharT
>> result
;
37 result.push_back(SV("Invalid formatter type {:" #T "}")); \
41 constexpr std::string_view types
= "aAbBcdeEfFgGopPsxX?";
43 constexpr std::string_view types
= "aAbBcdeEfFgGopPsxX";
46 for (auto type
: types
) {
47 if (valid
.find(type
) != std::string::npos
)
73 assert(false && "Add the type to the list of cases.");
81 template <class CharT
, class TestFunction
>
82 void format_test_buffer_copy(TestFunction check
) {
84 check(SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
86 SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
88 check(SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
89 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
91 SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
92 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
94 check(SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
95 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
96 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
97 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
99 SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
100 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
101 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
102 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
104 check(SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
105 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
106 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
107 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
108 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
109 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
110 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
111 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
113 SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
114 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
115 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
116 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
117 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
118 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
119 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
120 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
123 SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
124 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
125 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
126 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
127 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
128 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
129 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
130 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
131 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
132 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
133 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
134 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
135 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
136 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
137 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
138 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
140 SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
141 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
142 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
143 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
144 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
145 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
146 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
147 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
148 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
149 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
150 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
151 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
152 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
153 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
154 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
155 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
157 // *** copy + push_back ***
159 check(SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
162 SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
164 check(SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
165 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
168 SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
169 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
171 check(SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
172 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
173 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
174 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
177 SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
178 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
179 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
180 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
182 check(SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
183 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
184 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
185 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
186 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
187 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
188 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
189 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
192 SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
193 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
194 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
195 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
196 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
197 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
198 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
199 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
202 SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
203 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
204 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
205 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
206 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
207 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
208 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
209 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
210 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
211 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
212 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
213 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
214 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
215 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
216 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
217 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
220 SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
221 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
222 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
223 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
224 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
225 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
226 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
227 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
228 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
229 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
230 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
231 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
232 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
233 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
234 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
235 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
237 // *** push_back + copy ***
240 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
242 SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
245 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
246 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
248 SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
249 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
252 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
253 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
254 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
255 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
257 SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
258 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
259 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
260 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
263 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
264 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
265 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
266 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
267 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
268 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
269 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
270 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
272 SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
273 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
274 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
275 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
276 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
277 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
278 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
279 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
283 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
284 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
285 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
286 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
287 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
288 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
289 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
290 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
291 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
292 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
293 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
294 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
295 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
296 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
297 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
298 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"),
300 SV("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
301 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
302 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
303 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
304 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
305 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
306 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
307 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
308 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
309 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
310 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
311 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
312 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
313 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
314 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
315 "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"));
318 template <class CharT
, class TestFunction
>
319 void format_test_buffer_full(TestFunction check
) {
321 check(SV("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"), SV("{:|<64}"), SV(""));
323 check(SV("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
324 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"),
328 check(SV("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
329 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
330 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
331 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"),
335 check(SV("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
336 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
337 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
338 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
339 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
340 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
341 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
342 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"),
346 check(SV("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
347 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
348 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
349 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
350 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
351 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
352 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
353 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
354 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
355 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
356 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
357 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
358 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
359 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
360 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
361 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"),
365 // *** fill + push_back ***
367 check(SV("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
372 check(SV("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
373 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
378 check(SV("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
379 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
380 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
381 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
386 check(SV("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
387 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
388 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
389 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
390 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
391 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
392 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
393 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
398 check(SV("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
399 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
400 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
401 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
402 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
403 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
404 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
405 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
406 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
407 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
408 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
409 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
410 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
411 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
412 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
413 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
418 // *** push_back + fill ***
421 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"),
426 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
427 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"),
432 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
433 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
434 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
435 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"),
440 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
441 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
442 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
443 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
444 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
445 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
446 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
447 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"),
452 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
453 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
454 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
455 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
456 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
457 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
458 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
459 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
460 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
461 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
462 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
463 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
464 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
465 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
466 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
467 "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"),
472 // Using a const ref for world and universe so a string literal will be a character array.
473 // When passed as character array W and U have different types.
474 template <class CharT
, class W
, class U
, class TestFunction
, class ExceptionTest
>
475 void format_test_string(const W
& world
, const U
& universe
, TestFunction check
, ExceptionTest check_exception
) {
477 // *** Valid input tests ***
478 // Unused argument is ignored. TODO FMT what does the Standard mandate?
479 check(SV("hello world"), SV("hello {}"), world
, universe
);
480 check(SV("hello world and universe"), SV("hello {} and {}"), world
, universe
);
481 check(SV("hello world"), SV("hello {0}"), world
, universe
);
482 check(SV("hello universe"), SV("hello {1}"), world
, universe
);
483 check(SV("hello universe and world"), SV("hello {1} and {0}"), world
, universe
);
485 check(SV("hello world"), SV("hello {:_>}"), world
);
486 check(SV("hello world "), SV("hello {:8}"), world
);
487 check(SV("hello world"), SV("hello {:>8}"), world
);
488 check(SV("hello ___world"), SV("hello {:_>8}"), world
);
489 check(SV("hello _world__"), SV("hello {:_^8}"), world
);
490 check(SV("hello world___"), SV("hello {:_<8}"), world
);
492 // The fill character ':' is allowed here (P0645) but not in ranges (P2286).
493 check(SV("hello :::world"), SV("hello {::>8}"), world
);
494 check(SV("hello <<<world"), SV("hello {:<>8}"), world
);
495 check(SV("hello ^^^world"), SV("hello {:^>8}"), world
);
497 check(SV("hello $world"), SV("hello {:$>{}}"), world
, 6);
498 check(SV("hello $world"), SV("hello {0:$>{1}}"), world
, 6);
499 check(SV("hello $world"), SV("hello {1:$>{0}}"), 6, world
);
501 check(SV("hello world"), SV("hello {:.5}"), world
);
502 check(SV("hello unive"), SV("hello {:.5}"), universe
);
504 check(SV("hello univer"), SV("hello {:.{}}"), universe
, 6);
505 check(SV("hello univer"), SV("hello {0:.{1}}"), universe
, 6);
506 check(SV("hello univer"), SV("hello {1:.{0}}"), 6, universe
);
508 check(SV("hello %world%"), SV("hello {:%^7.7}"), world
);
509 check(SV("hello univers"), SV("hello {:%^7.7}"), universe
);
510 check(SV("hello %world%"), SV("hello {:%^{}.{}}"), world
, 7, 7);
511 check(SV("hello %world%"), SV("hello {0:%^{1}.{2}}"), world
, 7, 7);
512 check(SV("hello %world%"), SV("hello {0:%^{2}.{1}}"), world
, 7, 7);
513 check(SV("hello %world%"), SV("hello {1:%^{0}.{2}}"), 7, world
, 7);
515 check(SV("hello world"), SV("hello {:_>s}"), world
);
516 check(SV("hello $world"), SV("hello {:$>{}s}"), world
, 6);
517 check(SV("hello world"), SV("hello {:.5s}"), world
);
518 check(SV("hello univer"), SV("hello {:.{}s}"), universe
, 6);
519 check(SV("hello %world%"), SV("hello {:%^7.7s}"), world
);
521 check(SV("hello #####uni"), SV("hello {:#>8.3s}"), universe
);
522 check(SV("hello ##uni###"), SV("hello {:#^8.3s}"), universe
);
523 check(SV("hello uni#####"), SV("hello {:#<8.3s}"), universe
);
526 check_exception("The format specifier should consume the input or end with a '}'", SV("hello {:-}"), world
);
528 // *** alternate form ***
529 check_exception("The format specifier should consume the input or end with a '}'", SV("hello {:#}"), world
);
531 // *** zero-padding ***
532 check_exception("The width option should not have a leading zero", SV("hello {:0}"), world
);
535 // Width 0 allowed, but not useful for string arguments.
536 check(SV("hello world"), SV("hello {:{}}"), world
, 0);
538 #ifdef _LIBCPP_VERSION
539 // This limit isn't specified in the Standard.
540 static_assert(std::__format::__number_max
== 2'147'483'647, "Update the assert and the test.");
541 check_exception("The numeric value of the format specifier is too large", SV("{:2147483648}"), world
);
542 check_exception("The numeric value of the format specifier is too large", SV("{:5000000000}"), world
);
543 check_exception("The numeric value of the format specifier is too large", SV("{:10000000000}"), world
);
546 check_exception("An argument index may not have a negative value", SV("hello {:{}}"), world
, -1);
547 check_exception("The value of the argument index exceeds its maximum value", SV("hello {:{}}"), world
, unsigned(-1));
549 "The argument index value is too large for the number of arguments supplied", SV("hello {:{}}"), world
);
551 "Replacement argument isn't a standard signed or unsigned integer type", SV("hello {:{}}"), world
, universe
);
552 check_exception("Using manual argument numbering in automatic argument numbering mode", SV("hello {:{0}}"), world
, 1);
553 check_exception("Using automatic argument numbering in manual argument numbering mode", SV("hello {0:{}}"), world
, 1);
554 // Arg-id may not have leading zeros.
555 check_exception("The argument index is invalid", SV("hello {0:{01}}"), world
, 1);
558 #ifdef _LIBCPP_VERSION
559 // This limit isn't specified in the Standard.
560 static_assert(std::__format::__number_max
== 2'147'483'647, "Update the assert and the test.");
561 check_exception("The numeric value of the format specifier is too large", SV("{:.2147483648}"), world
);
562 check_exception("The numeric value of the format specifier is too large", SV("{:.5000000000}"), world
);
563 check_exception("The numeric value of the format specifier is too large", SV("{:.10000000000}"), world
);
566 // Precision 0 allowed, but not useful for string arguments.
567 check(SV("hello "), SV("hello {:.{}}"), world
, 0);
568 // Precision may have leading zeros. Secondly tests the value is still base 10.
569 check(SV("hello 0123456789"), SV("hello {:.000010}"), STR("0123456789abcdef"));
570 check_exception("An argument index may not have a negative value", SV("hello {:.{}}"), world
, -1);
571 check_exception("The value of the argument index exceeds its maximum value", SV("hello {:.{}}"), world
, ~0u);
573 "The argument index value is too large for the number of arguments supplied", SV("hello {:.{}}"), world
);
575 "Replacement argument isn't a standard signed or unsigned integer type", SV("hello {:.{}}"), world
, universe
);
576 check_exception("Using manual argument numbering in automatic argument numbering mode", SV("hello {:.{0}}"), world
,
578 check_exception("Using automatic argument numbering in manual argument numbering mode", SV("hello {0:.{}}"), world
,
580 // Arg-id may not have leading zeros.
581 check_exception("The argument index is invalid", SV("hello {0:.{01}}"), world
, 1);
583 // *** locale-specific form ***
584 check_exception("The format specifier should consume the input or end with a '}'", SV("hello {:L}"), world
);
587 #if TEST_STD_VER > 20
588 const char* valid_types
= "s?";
590 const char* valid_types
= "s";
592 for (const auto& fmt
: invalid_types
<CharT
>(valid_types
))
593 check_exception("The type option contains an invalid value for a string formatting argument", fmt
, world
);
596 template <class CharT
, class TestFunction
>
597 void format_test_string_unicode([[maybe_unused
]] TestFunction check
) {
598 // unicode.pass.cpp and ascii.pass.cpp have additional tests.
599 #ifndef TEST_HAS_NO_UNICODE
600 // Make sure all possible types are tested. For clarity don't use macros.
601 if constexpr (std::same_as
<CharT
, char>) {
602 const char* c_string
= "aßc";
603 check(SV("*aßc*"), SV("{:*^5}"), c_string
);
604 check(SV("*aß*"), SV("{:*^4.2}"), c_string
);
606 check(SV("*aßc*"), SV("{:*^5}"), const_cast<char*>(c_string
));
607 check(SV("*aß*"), SV("{:*^4.2}"), const_cast<char*>(c_string
));
609 check(SV("*aßc*"), SV("{:*^5}"), "aßc");
610 check(SV("*aß*"), SV("{:*^4.2}"), "aßc");
612 check(SV("*aßc*"), SV("{:*^5}"), std::string("aßc"));
613 check(SV("*aß*"), SV("{:*^4.2}"), std::string("aßc"));
615 check(SV("*aßc*"), SV("{:*^5}"), std::string_view("aßc"));
616 check(SV("*aß*"), SV("{:*^4.2}"), std::string_view("aßc"));
618 # ifndef TEST_HAS_NO_WIDE_CHARACTERS
620 const wchar_t* c_string
= L
"aßc";
621 check(SV("*aßc*"), SV("{:*^5}"), c_string
);
622 check(SV("*aß*"), SV("{:*^4.2}"), c_string
);
624 check(SV("*aßc*"), SV("{:*^5}"), const_cast<wchar_t*>(c_string
));
625 check(SV("*aß*"), SV("{:*^4.2}"), const_cast<wchar_t*>(c_string
));
627 check(SV("*aßc*"), SV("{:*^5}"), L
"aßc");
628 check(SV("*aß*"), SV("{:*^4.2}"), L
"aßc");
630 check(SV("*aßc*"), SV("{:*^5}"), std::wstring(L
"aßc"));
631 check(SV("*aß*"), SV("{:*^4.2}"), std::wstring(L
"aßc"));
633 check(SV("*aßc*"), SV("{:*^5}"), std::wstring_view(L
"aßc"));
634 check(SV("*aß*"), SV("{:*^4.2}"), std::wstring_view(L
"aßc"));
636 # endif // TEST_HAS_NO_WIDE_CHARACTERS
638 // ß requires one column
639 check(SV("aßc"), SV("{}"), STR("aßc"));
641 check(SV("aßc"), SV("{:.3}"), STR("aßc"));
642 check(SV("aß"), SV("{:.2}"), STR("aßc"));
643 check(SV("a"), SV("{:.1}"), STR("aßc"));
645 check(SV("aßc"), SV("{:3.3}"), STR("aßc"));
646 check(SV("aß"), SV("{:2.2}"), STR("aßc"));
647 check(SV("a"), SV("{:1.1}"), STR("aßc"));
649 check(SV("aßc---"), SV("{:-<6}"), STR("aßc"));
650 check(SV("-aßc--"), SV("{:-^6}"), STR("aßc"));
651 check(SV("---aßc"), SV("{:->6}"), STR("aßc"));
653 // \u1000 requires two columns
654 check(SV("a\u1110c"), SV("{}"), STR("a\u1110c"));
656 check(SV("a\u1100c"), SV("{:.4}"), STR("a\u1100c"));
657 check(SV("a\u1100"), SV("{:.3}"), STR("a\u1100c"));
658 check(SV("a"), SV("{:.2}"), STR("a\u1100c"));
659 check(SV("a"), SV("{:.1}"), STR("a\u1100c"));
661 check(SV("a\u1100c"), SV("{:-<4.4}"), STR("a\u1100c"));
662 check(SV("a\u1100"), SV("{:-<3.3}"), STR("a\u1100c"));
663 check(SV("a-"), SV("{:-<2.2}"), STR("a\u1100c"));
664 check(SV("a"), SV("{:-<1.1}"), STR("a\u1100c"));
666 check(SV("a\u1110c---"), SV("{:-<7}"), STR("a\u1110c"));
667 check(SV("-a\u1110c--"), SV("{:-^7}"), STR("a\u1110c"));
668 check(SV("---a\u1110c"), SV("{:->7}"), STR("a\u1110c"));
670 // Examples used in P1868R2
671 check(SV("*\u0041*"), SV("{:*^3}"), STR("\u0041")); // { LATIN CAPITAL LETTER A }
672 check(SV("*\u00c1*"), SV("{:*^3}"), STR("\u00c1")); // { LATIN CAPITAL LETTER A WITH ACUTE }
673 check(SV("*\u0041\u0301*"),
675 STR("\u0041\u0301")); // { LATIN CAPITAL LETTER A } { COMBINING ACUTE ACCENT }
676 check(SV("*\u0132*"), SV("{:*^3}"), STR("\u0132")); // { LATIN CAPITAL LIGATURE IJ }
677 check(SV("*\u0394*"), SV("{:*^3}"), STR("\u0394")); // { GREEK CAPITAL LETTER DELTA }
679 check(SV("*\u0429*"), SV("{:*^3}"), STR("\u0429")); // { CYRILLIC CAPITAL LETTER SHCHA }
680 check(SV("*\u05d0*"), SV("{:*^3}"), STR("\u05d0")); // { HEBREW LETTER ALEF }
681 check(SV("*\u0634*"), SV("{:*^3}"), STR("\u0634")); // { ARABIC LETTER SHEEN }
682 check(SV("*\u3009*"), SV("{:*^4}"), STR("\u3009")); // { RIGHT-POINTING ANGLE BRACKET }
683 check(SV("*\u754c*"), SV("{:*^4}"), STR("\u754c")); // { CJK Unified Ideograph-754C }
684 check(SV("*\U0001f921*"), SV("{:*^4}"), STR("\U0001f921")); // { UNICORN FACE }
685 check(SV("*\U0001f468\u200d\U0001F469\u200d\U0001F467\u200d\U0001F466*"),
687 STR("\U0001f468\u200d\U0001F469\u200d\U0001F467\u200d\U0001F466")); // { Family: Man, Woman, Girl, Boy }
688 #endif // TEST_HAS_NO_UNICODE
691 template <class CharT
, class TestFunction
, class ExceptionTest
>
692 void format_string_tests(TestFunction check
, ExceptionTest check_exception
) {
693 std::basic_string
<CharT
> world
= STR("world");
694 std::basic_string
<CharT
> universe
= STR("universe");
696 // Test a string literal in a way it won't decay to a pointer.
697 if constexpr (std::same_as
<CharT
, char>)
698 format_test_string
<CharT
>("world", "universe", check
, check_exception
);
699 #ifndef TEST_HAS_NO_WIDE_CHARACTERS
701 format_test_string
<CharT
>(L
"world", L
"universe", check
, check_exception
);
704 format_test_string
<CharT
>(world
.c_str(), universe
.c_str(), check
, check_exception
);
705 format_test_string
<CharT
>(const_cast<CharT
*>(world
.c_str()), const_cast<CharT
*>(universe
.c_str()), check
,
707 format_test_string
<CharT
>(std::basic_string_view
<CharT
>(world
), std::basic_string_view
<CharT
>(universe
), check
,
709 format_test_string
<CharT
>(world
, universe
, check
, check_exception
);
710 format_test_string_unicode
<CharT
>(check
);
713 template <class CharT
, class TestFunction
, class ExceptionTest
>
714 void format_test_bool(TestFunction check
, ExceptionTest check_exception
) {
716 // *** align-fill & width ***
717 check(SV("answer is 'true '"), SV("answer is '{:7}'"), true);
718 check(SV("answer is ' true'"), SV("answer is '{:>7}'"), true);
719 check(SV("answer is 'true '"), SV("answer is '{:<7}'"), true);
720 check(SV("answer is ' true '"), SV("answer is '{:^7}'"), true);
722 check(SV("answer is 'false '"), SV("answer is '{:8s}'"), false);
723 check(SV("answer is ' false'"), SV("answer is '{:>8s}'"), false);
724 check(SV("answer is 'false '"), SV("answer is '{:<8s}'"), false);
725 check(SV("answer is ' false '"), SV("answer is '{:^8s}'"), false);
727 // The fill character ':' is allowed here (P0645) but not in ranges (P2286).
728 check(SV("answer is ':::true'"), SV("answer is '{::>7}'"), true);
729 check(SV("answer is 'true:::'"), SV("answer is '{::<7}'"), true);
730 check(SV("answer is ':true::'"), SV("answer is '{::^7}'"), true);
732 check(SV("answer is '---false'"), SV("answer is '{:->8s}'"), false);
733 check(SV("answer is 'false---'"), SV("answer is '{:-<8s}'"), false);
734 check(SV("answer is '-false--'"), SV("answer is '{:-^8s}'"), false);
737 check_exception("The format specifier for a bool does not allow the sign option", SV("{:-}"), true);
738 check_exception("The format specifier for a bool does not allow the sign option", SV("{:+}"), true);
739 check_exception("The format specifier for a bool does not allow the sign option", SV("{: }"), true);
741 check_exception("The format specifier for a bool does not allow the sign option", SV("{:-s}"), true);
742 check_exception("The format specifier for a bool does not allow the sign option", SV("{:+s}"), true);
743 check_exception("The format specifier for a bool does not allow the sign option", SV("{: s}"), true);
745 // *** alternate form ***
746 check_exception("The format specifier for a bool does not allow the alternate form option", SV("{:#}"), true);
747 check_exception("The format specifier for a bool does not allow the alternate form option", SV("{:#s}"), true);
749 // *** zero-padding ***
750 check_exception("The format specifier for a bool does not allow the zero-padding option", SV("{:0}"), true);
751 check_exception("The format specifier for a bool does not allow the zero-padding option", SV("{:0s}"), true);
754 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.}"), true);
755 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.0}"), true);
756 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.42}"), true);
758 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.s}"), true);
759 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.0s}"), true);
760 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.42s}"), true);
762 // *** locale-specific form ***
763 // See locale-specific_form.pass.cpp
766 for (const auto& fmt
: invalid_types
<CharT
>("bBdosxX"))
767 check_exception("The type option contains an invalid value for a bool formatting argument", fmt
, true);
770 template <class CharT
, class TestFunction
, class ExceptionTest
>
771 void format_test_bool_as_integer(TestFunction check
, ExceptionTest check_exception
) {
772 // *** align-fill & width ***
773 check(SV("answer is '1'"), SV("answer is '{:<1d}'"), true);
774 check(SV("answer is '1 '"), SV("answer is '{:<2d}'"), true);
775 check(SV("answer is '0 '"), SV("answer is '{:<2d}'"), false);
777 check(SV("answer is ' 1'"), SV("answer is '{:6d}'"), true);
778 check(SV("answer is ' 1'"), SV("answer is '{:>6d}'"), true);
779 check(SV("answer is '1 '"), SV("answer is '{:<6d}'"), true);
780 check(SV("answer is ' 1 '"), SV("answer is '{:^6d}'"), true);
782 // The fill character ':' is allowed here (P0645) but not in ranges (P2286).
783 check(SV("answer is ':::::0'"), SV("answer is '{::>6d}'"), false);
784 check(SV("answer is '0:::::'"), SV("answer is '{::<6d}'"), false);
785 check(SV("answer is '::0:::'"), SV("answer is '{::^6d}'"), false);
787 // Test whether zero padding is ignored
788 check(SV("answer is ' 1'"), SV("answer is '{:>06d}'"), true);
789 check(SV("answer is '1 '"), SV("answer is '{:<06d}'"), true);
790 check(SV("answer is ' 1 '"), SV("answer is '{:^06d}'"), true);
793 check(SV("answer is 1"), SV("answer is {:d}"), true);
794 check(SV("answer is 0"), SV("answer is {:-d}"), false);
795 check(SV("answer is +1"), SV("answer is {:+d}"), true);
796 check(SV("answer is 0"), SV("answer is {: d}"), false);
798 // *** alternate form ***
799 check(SV("answer is +1"), SV("answer is {:+#d}"), true);
800 check(SV("answer is +1"), SV("answer is {:+b}"), true);
801 check(SV("answer is +0b1"), SV("answer is {:+#b}"), true);
802 check(SV("answer is +0B1"), SV("answer is {:+#B}"), true);
803 check(SV("answer is +1"), SV("answer is {:+o}"), true);
804 check(SV("answer is +01"), SV("answer is {:+#o}"), true);
805 check(SV("answer is +1"), SV("answer is {:+x}"), true);
806 check(SV("answer is +0x1"), SV("answer is {:+#x}"), true);
807 check(SV("answer is +1"), SV("answer is {:+X}"), true);
808 check(SV("answer is +0X1"), SV("answer is {:+#X}"), true);
810 check(SV("answer is 0"), SV("answer is {:#d}"), false);
811 check(SV("answer is 0"), SV("answer is {:b}"), false);
812 check(SV("answer is 0b0"), SV("answer is {:#b}"), false);
813 check(SV("answer is 0B0"), SV("answer is {:#B}"), false);
814 check(SV("answer is 0"), SV("answer is {:o}"), false);
815 check(SV("answer is 0"), SV("answer is {:#o}"), false);
816 check(SV("answer is 0"), SV("answer is {:x}"), false);
817 check(SV("answer is 0x0"), SV("answer is {:#x}"), false);
818 check(SV("answer is 0"), SV("answer is {:X}"), false);
819 check(SV("answer is 0X0"), SV("answer is {:#X}"), false);
821 // *** zero-padding & width ***
822 check(SV("answer is +00000000001"), SV("answer is {:+#012d}"), true);
823 check(SV("answer is +00000000001"), SV("answer is {:+012b}"), true);
824 check(SV("answer is +0b000000001"), SV("answer is {:+#012b}"), true);
825 check(SV("answer is +0B000000001"), SV("answer is {:+#012B}"), true);
826 check(SV("answer is +00000000001"), SV("answer is {:+012o}"), true);
827 check(SV("answer is +00000000001"), SV("answer is {:+#012o}"), true);
828 check(SV("answer is +00000000001"), SV("answer is {:+012x}"), true);
829 check(SV("answer is +0x000000001"), SV("answer is {:+#012x}"), true);
830 check(SV("answer is +00000000001"), SV("answer is {:+012X}"), true);
831 check(SV("answer is +0X000000001"), SV("answer is {:+#012X}"), true);
833 check(SV("answer is 000000000000"), SV("answer is {:#012d}"), false);
834 check(SV("answer is 000000000000"), SV("answer is {:012b}"), false);
835 check(SV("answer is 0b0000000000"), SV("answer is {:#012b}"), false);
836 check(SV("answer is 0B0000000000"), SV("answer is {:#012B}"), false);
837 check(SV("answer is 000000000000"), SV("answer is {:012o}"), false);
838 check(SV("answer is 000000000000"), SV("answer is {:#012o}"), false);
839 check(SV("answer is 000000000000"), SV("answer is {:012x}"), false);
840 check(SV("answer is 0x0000000000"), SV("answer is {:#012x}"), false);
841 check(SV("answer is 000000000000"), SV("answer is {:012X}"), false);
842 check(SV("answer is 0X0000000000"), SV("answer is {:#012X}"), false);
845 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.}"), true);
846 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.0}"), true);
847 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.42}"), true);
849 // *** locale-specific form ***
850 // See locale-specific_form.pass.cpp
853 for (const auto& fmt
: invalid_types
<CharT
>("bBcdosxX"))
854 check_exception("The type option contains an invalid value for a bool formatting argument", fmt
, true);
857 template <class I
, class CharT
, class TestFunction
, class ExceptionTest
>
858 void format_test_integer_as_integer(TestFunction check
, ExceptionTest check_exception
) {
859 // *** align-fill & width ***
860 check(SV("answer is '42'"), SV("answer is '{:<1}'"), I(42));
861 check(SV("answer is '42'"), SV("answer is '{:<2}'"), I(42));
862 check(SV("answer is '42 '"), SV("answer is '{:<3}'"), I(42));
864 check(SV("answer is ' 42'"), SV("answer is '{:7}'"), I(42));
865 check(SV("answer is ' 42'"), SV("answer is '{:>7}'"), I(42));
866 check(SV("answer is '42 '"), SV("answer is '{:<7}'"), I(42));
867 check(SV("answer is ' 42 '"), SV("answer is '{:^7}'"), I(42));
869 // The fill character ':' is allowed here (P0645) but not in ranges (P2286).
870 check(SV("answer is ':::::42'"), SV("answer is '{::>7}'"), I(42));
871 check(SV("answer is '42:::::'"), SV("answer is '{::<7}'"), I(42));
872 check(SV("answer is '::42:::'"), SV("answer is '{::^7}'"), I(42));
874 // Test whether zero padding is ignored
875 check(SV("answer is ' 42'"), SV("answer is '{:>07}'"), I(42));
876 check(SV("answer is '42 '"), SV("answer is '{:<07}'"), I(42));
877 check(SV("answer is ' 42 '"), SV("answer is '{:^07}'"), I(42));
880 if constexpr (std::signed_integral
<I
>)
881 check(SV("answer is -42"), SV("answer is {}"), I(-42));
882 check(SV("answer is 0"), SV("answer is {}"), I(0));
883 check(SV("answer is 42"), SV("answer is {}"), I(42));
885 if constexpr (std::signed_integral
<I
>)
886 check(SV("answer is -42"), SV("answer is {:-}"), I(-42));
887 check(SV("answer is 0"), SV("answer is {:-}"), I(0));
888 check(SV("answer is 42"), SV("answer is {:-}"), I(42));
890 if constexpr (std::signed_integral
<I
>)
891 check(SV("answer is -42"), SV("answer is {:+}"), I(-42));
892 check(SV("answer is +0"), SV("answer is {:+}"), I(0));
893 check(SV("answer is +42"), SV("answer is {:+}"), I(42));
895 if constexpr (std::signed_integral
<I
>)
896 check(SV("answer is -42"), SV("answer is {: }"), I(-42));
897 check(SV("answer is 0"), SV("answer is {: }"), I(0));
898 check(SV("answer is 42"), SV("answer is {: }"), I(42));
900 // *** alternate form ***
901 if constexpr (std::signed_integral
<I
>) {
902 check(SV("answer is -42"), SV("answer is {:#}"), I(-42));
903 check(SV("answer is -42"), SV("answer is {:#d}"), I(-42));
904 check(SV("answer is -101010"), SV("answer is {:b}"), I(-42));
905 check(SV("answer is -0b101010"), SV("answer is {:#b}"), I(-42));
906 check(SV("answer is -0B101010"), SV("answer is {:#B}"), I(-42));
907 check(SV("answer is -52"), SV("answer is {:o}"), I(-42));
908 check(SV("answer is -052"), SV("answer is {:#o}"), I(-42));
909 check(SV("answer is -2a"), SV("answer is {:x}"), I(-42));
910 check(SV("answer is -0x2a"), SV("answer is {:#x}"), I(-42));
911 check(SV("answer is -2A"), SV("answer is {:X}"), I(-42));
912 check(SV("answer is -0X2A"), SV("answer is {:#X}"), I(-42));
914 check(SV("answer is 0"), SV("answer is {:#}"), I(0));
915 check(SV("answer is 0"), SV("answer is {:#d}"), I(0));
916 check(SV("answer is 0"), SV("answer is {:b}"), I(0));
917 check(SV("answer is 0b0"), SV("answer is {:#b}"), I(0));
918 check(SV("answer is 0B0"), SV("answer is {:#B}"), I(0));
919 check(SV("answer is 0"), SV("answer is {:o}"), I(0));
920 check(SV("answer is 0"), SV("answer is {:#o}"), I(0));
921 check(SV("answer is 0"), SV("answer is {:x}"), I(0));
922 check(SV("answer is 0x0"), SV("answer is {:#x}"), I(0));
923 check(SV("answer is 0"), SV("answer is {:X}"), I(0));
924 check(SV("answer is 0X0"), SV("answer is {:#X}"), I(0));
926 check(SV("answer is +42"), SV("answer is {:+#}"), I(42));
927 check(SV("answer is +42"), SV("answer is {:+#d}"), I(42));
928 check(SV("answer is +101010"), SV("answer is {:+b}"), I(42));
929 check(SV("answer is +0b101010"), SV("answer is {:+#b}"), I(42));
930 check(SV("answer is +0B101010"), SV("answer is {:+#B}"), I(42));
931 check(SV("answer is +52"), SV("answer is {:+o}"), I(42));
932 check(SV("answer is +052"), SV("answer is {:+#o}"), I(42));
933 check(SV("answer is +2a"), SV("answer is {:+x}"), I(42));
934 check(SV("answer is +0x2a"), SV("answer is {:+#x}"), I(42));
935 check(SV("answer is +2A"), SV("answer is {:+X}"), I(42));
936 check(SV("answer is +0X2A"), SV("answer is {:+#X}"), I(42));
938 // *** zero-padding & width ***
939 if constexpr (std::signed_integral
<I
>) {
940 check(SV("answer is -00000000042"), SV("answer is {:#012}"), I(-42));
941 check(SV("answer is -00000000042"), SV("answer is {:#012d}"), I(-42));
942 check(SV("answer is -00000101010"), SV("answer is {:012b}"), I(-42));
943 check(SV("answer is -0b000101010"), SV("answer is {:#012b}"), I(-42));
944 check(SV("answer is -0B000101010"), SV("answer is {:#012B}"), I(-42));
945 check(SV("answer is -00000000052"), SV("answer is {:012o}"), I(-42));
946 check(SV("answer is -00000000052"), SV("answer is {:#012o}"), I(-42));
947 check(SV("answer is -0000000002a"), SV("answer is {:012x}"), I(-42));
948 check(SV("answer is -0x00000002a"), SV("answer is {:#012x}"), I(-42));
949 check(SV("answer is -0000000002A"), SV("answer is {:012X}"), I(-42));
950 check(SV("answer is -0X00000002A"), SV("answer is {:#012X}"), I(-42));
953 check(SV("answer is 000000000000"), SV("answer is {:#012}"), I(0));
954 check(SV("answer is 000000000000"), SV("answer is {:#012d}"), I(0));
955 check(SV("answer is 000000000000"), SV("answer is {:012b}"), I(0));
956 check(SV("answer is 0b0000000000"), SV("answer is {:#012b}"), I(0));
957 check(SV("answer is 0B0000000000"), SV("answer is {:#012B}"), I(0));
958 check(SV("answer is 000000000000"), SV("answer is {:012o}"), I(0));
959 check(SV("answer is 000000000000"), SV("answer is {:#012o}"), I(0));
960 check(SV("answer is 000000000000"), SV("answer is {:012x}"), I(0));
961 check(SV("answer is 0x0000000000"), SV("answer is {:#012x}"), I(0));
962 check(SV("answer is 000000000000"), SV("answer is {:012X}"), I(0));
963 check(SV("answer is 0X0000000000"), SV("answer is {:#012X}"), I(0));
965 check(SV("answer is +00000000042"), SV("answer is {:+#012}"), I(42));
966 check(SV("answer is +00000000042"), SV("answer is {:+#012d}"), I(42));
967 check(SV("answer is +00000101010"), SV("answer is {:+012b}"), I(42));
968 check(SV("answer is +0b000101010"), SV("answer is {:+#012b}"), I(42));
969 check(SV("answer is +0B000101010"), SV("answer is {:+#012B}"), I(42));
970 check(SV("answer is +00000000052"), SV("answer is {:+012o}"), I(42));
971 check(SV("answer is +00000000052"), SV("answer is {:+#012o}"), I(42));
972 check(SV("answer is +0000000002a"), SV("answer is {:+012x}"), I(42));
973 check(SV("answer is +0x00000002a"), SV("answer is {:+#012x}"), I(42));
974 check(SV("answer is +0000000002A"), SV("answer is {:+012X}"), I(42));
975 check(SV("answer is +0X00000002A"), SV("answer is {:+#012X}"), I(42));
978 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.}"), I(0));
979 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.0}"), I(0));
980 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.42}"), I(0));
982 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.{}}"), I(0));
983 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.{}}"), I(0), true);
984 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.{}}"), I(0), 1.0);
986 // *** locale-specific form ***
987 // See locale-specific_form.pass.cpp
990 for (const auto& fmt
: invalid_types
<CharT
>("bBcdoxX"))
991 check_exception("The type option contains an invalid value for an integer formatting argument", fmt
, I(0));
994 template <class I
, class CharT
, class TestFunction
, class ExceptionTest
>
995 void format_test_integer_as_char(TestFunction check
, ExceptionTest check_exception
) {
996 // *** align-fill & width ***
997 check(SV("answer is '* '"), SV("answer is '{:6c}'"), I(42));
998 check(SV("answer is ' *'"), SV("answer is '{:>6c}'"), I(42));
999 check(SV("answer is '* '"), SV("answer is '{:<6c}'"), I(42));
1000 check(SV("answer is ' * '"), SV("answer is '{:^6c}'"), I(42));
1002 // The fill character ':' is allowed here (P0645) but not in ranges (P2286).
1003 check(SV("answer is ':::::*'"), SV("answer is '{::>6c}'"), I(42));
1004 check(SV("answer is '*:::::'"), SV("answer is '{::<6c}'"), I(42));
1005 check(SV("answer is '::*:::'"), SV("answer is '{::^6c}'"), I(42));
1008 check(SV("answer is *"), SV("answer is {:c}"), I(42));
1009 check_exception("The format specifier for an integer does not allow the sign option", SV("answer is {:-c}"), I(42));
1010 check_exception("The format specifier for an integer does not allow the sign option", SV("answer is {:+c}"), I(42));
1011 check_exception("The format specifier for an integer does not allow the sign option", SV("answer is {: c}"), I(42));
1013 // *** alternate form ***
1015 "The format specifier for an integer does not allow the alternate form option", SV("answer is {:#c}"), I(42));
1017 // *** zero-padding & width ***
1019 "The format specifier for an integer does not allow the zero-padding option", SV("answer is {:01c}"), I(42));
1021 // *** precision ***
1022 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.c}"), I(0));
1023 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.0c}"), I(0));
1024 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.42c}"), I(0));
1026 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.{}c}"), I(0));
1027 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.{}c}"), I(0), true);
1028 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.{}c}"), I(0), 1.0);
1030 // *** locale-specific form ***
1031 // Note it has no effect but it's allowed.
1032 check(SV("answer is '*'"), SV("answer is '{:Lc}'"), I(42));
1035 for (const auto& fmt
: invalid_types
<CharT
>("bBcdoxX"))
1036 check_exception("The type option contains an invalid value for an integer formatting argument", fmt
, I(42));
1038 // *** Validate range ***
1039 // The code has some duplications to keep the if statement readable.
1040 if constexpr (std::signed_integral
<CharT
>) {
1041 if constexpr (std::signed_integral
<I
> && sizeof(I
) > sizeof(CharT
)) {
1042 check_exception("Integral value outside the range of the char type", SV("{:c}"), std::numeric_limits
<I
>::min());
1043 check_exception("Integral value outside the range of the char type", SV("{:c}"), std::numeric_limits
<I
>::max());
1044 } else if constexpr (std::unsigned_integral
<I
> && sizeof(I
) >= sizeof(CharT
)) {
1045 check_exception("Integral value outside the range of the char type", SV("{:c}"), std::numeric_limits
<I
>::max());
1047 } else if constexpr (sizeof(I
) > sizeof(CharT
)) {
1048 check_exception("Integral value outside the range of the char type", SV("{:c}"), std::numeric_limits
<I
>::max());
1052 template <class I
, class CharT
, class TestFunction
, class ExceptionTest
>
1053 void format_test_integer(TestFunction check
, ExceptionTest check_exception
) {
1054 format_test_integer_as_integer
<I
, CharT
>(check
, check_exception
);
1055 format_test_integer_as_char
<I
, CharT
>(check
, check_exception
);
1058 template <class CharT
, class TestFunction
, class ExceptionTest
>
1059 void format_test_signed_integer(TestFunction check
, ExceptionTest check_exception
) {
1060 format_test_integer
<signed char, CharT
>(check
, check_exception
);
1061 format_test_integer
<short, CharT
>(check
, check_exception
);
1062 format_test_integer
<int, CharT
>(check
, check_exception
);
1063 format_test_integer
<long, CharT
>(check
, check_exception
);
1064 format_test_integer
<long long, CharT
>(check
, check_exception
);
1065 #ifndef TEST_HAS_NO_INT128
1066 format_test_integer
<__int128_t
, CharT
>(check
, check_exception
);
1068 // *** check the minima and maxima ***
1069 check(SV("-0b10000000"), SV("{:#b}"), std::numeric_limits
<std::int8_t>::min());
1070 check(SV("-0200"), SV("{:#o}"), std::numeric_limits
<std::int8_t>::min());
1071 check(SV("-128"), SV("{:#}"), std::numeric_limits
<std::int8_t>::min());
1072 check(SV("-0x80"), SV("{:#x}"), std::numeric_limits
<std::int8_t>::min());
1074 check(SV("-0b1000000000000000"), SV("{:#b}"), std::numeric_limits
<std::int16_t>::min());
1075 check(SV("-0100000"), SV("{:#o}"), std::numeric_limits
<std::int16_t>::min());
1076 check(SV("-32768"), SV("{:#}"), std::numeric_limits
<std::int16_t>::min());
1077 check(SV("-0x8000"), SV("{:#x}"), std::numeric_limits
<std::int16_t>::min());
1079 check(SV("-0b10000000000000000000000000000000"), SV("{:#b}"), std::numeric_limits
<std::int32_t>::min());
1080 check(SV("-020000000000"), SV("{:#o}"), std::numeric_limits
<std::int32_t>::min());
1081 check(SV("-2147483648"), SV("{:#}"), std::numeric_limits
<std::int32_t>::min());
1082 check(SV("-0x80000000"), SV("{:#x}"), std::numeric_limits
<std::int32_t>::min());
1084 check(SV("-0b1000000000000000000000000000000000000000000000000000000000000000"),
1086 std::numeric_limits
<std::int64_t>::min());
1087 check(SV("-01000000000000000000000"), SV("{:#o}"), std::numeric_limits
<std::int64_t>::min());
1088 check(SV("-9223372036854775808"), SV("{:#}"), std::numeric_limits
<std::int64_t>::min());
1089 check(SV("-0x8000000000000000"), SV("{:#x}"), std::numeric_limits
<std::int64_t>::min());
1091 #ifndef TEST_HAS_NO_INT128
1092 check(SV("-0b1000000000000000000000000000000000000000000000000000000000000000"
1093 "0000000000000000000000000000000000000000000000000000000000000000"),
1095 std::numeric_limits
<__int128_t
>::min());
1096 check(SV("-02000000000000000000000000000000000000000000"), SV("{:#o}"), std::numeric_limits
<__int128_t
>::min());
1097 check(SV("-170141183460469231731687303715884105728"), SV("{:#}"), std::numeric_limits
<__int128_t
>::min());
1098 check(SV("-0x80000000000000000000000000000000"), SV("{:#x}"), std::numeric_limits
<__int128_t
>::min());
1101 check(SV("0b1111111"), SV("{:#b}"), std::numeric_limits
<std::int8_t>::max());
1102 check(SV("0177"), SV("{:#o}"), std::numeric_limits
<std::int8_t>::max());
1103 check(SV("127"), SV("{:#}"), std::numeric_limits
<std::int8_t>::max());
1104 check(SV("0x7f"), SV("{:#x}"), std::numeric_limits
<std::int8_t>::max());
1106 check(SV("0b111111111111111"), SV("{:#b}"), std::numeric_limits
<std::int16_t>::max());
1107 check(SV("077777"), SV("{:#o}"), std::numeric_limits
<std::int16_t>::max());
1108 check(SV("32767"), SV("{:#}"), std::numeric_limits
<std::int16_t>::max());
1109 check(SV("0x7fff"), SV("{:#x}"), std::numeric_limits
<std::int16_t>::max());
1111 check(SV("0b1111111111111111111111111111111"), SV("{:#b}"), std::numeric_limits
<std::int32_t>::max());
1112 check(SV("017777777777"), SV("{:#o}"), std::numeric_limits
<std::int32_t>::max());
1113 check(SV("2147483647"), SV("{:#}"), std::numeric_limits
<std::int32_t>::max());
1114 check(SV("0x7fffffff"), SV("{:#x}"), std::numeric_limits
<std::int32_t>::max());
1116 check(SV("0b111111111111111111111111111111111111111111111111111111111111111"),
1118 std::numeric_limits
<std::int64_t>::max());
1119 check(SV("0777777777777777777777"), SV("{:#o}"), std::numeric_limits
<std::int64_t>::max());
1120 check(SV("9223372036854775807"), SV("{:#}"), std::numeric_limits
<std::int64_t>::max());
1121 check(SV("0x7fffffffffffffff"), SV("{:#x}"), std::numeric_limits
<std::int64_t>::max());
1123 #ifndef TEST_HAS_NO_INT128
1124 check(SV("0b111111111111111111111111111111111111111111111111111111111111111"
1125 "1111111111111111111111111111111111111111111111111111111111111111"),
1127 std::numeric_limits
<__int128_t
>::max());
1128 check(SV("01777777777777777777777777777777777777777777"), SV("{:#o}"), std::numeric_limits
<__int128_t
>::max());
1129 check(SV("170141183460469231731687303715884105727"), SV("{:#}"), std::numeric_limits
<__int128_t
>::max());
1130 check(SV("0x7fffffffffffffffffffffffffffffff"), SV("{:#x}"), std::numeric_limits
<__int128_t
>::max());
1134 template <class CharT
, class TestFunction
, class ExceptionTest
>
1135 void format_test_unsigned_integer(TestFunction check
, ExceptionTest check_exception
) {
1136 format_test_integer
<unsigned char, CharT
>(check
, check_exception
);
1137 format_test_integer
<unsigned short, CharT
>(check
, check_exception
);
1138 format_test_integer
<unsigned, CharT
>(check
, check_exception
);
1139 format_test_integer
<unsigned long, CharT
>(check
, check_exception
);
1140 format_test_integer
<unsigned long long, CharT
>(check
, check_exception
);
1141 #ifndef TEST_HAS_NO_INT128
1142 format_test_integer
<__uint128_t
, CharT
>(check
, check_exception
);
1144 // *** test the maxima ***
1145 check(SV("0b11111111"), SV("{:#b}"), std::numeric_limits
<std::uint8_t>::max());
1146 check(SV("0377"), SV("{:#o}"), std::numeric_limits
<std::uint8_t>::max());
1147 check(SV("255"), SV("{:#}"), std::numeric_limits
<std::uint8_t>::max());
1148 check(SV("0xff"), SV("{:#x}"), std::numeric_limits
<std::uint8_t>::max());
1150 check(SV("0b1111111111111111"), SV("{:#b}"), std::numeric_limits
<std::uint16_t>::max());
1151 check(SV("0177777"), SV("{:#o}"), std::numeric_limits
<std::uint16_t>::max());
1152 check(SV("65535"), SV("{:#}"), std::numeric_limits
<std::uint16_t>::max());
1153 check(SV("0xffff"), SV("{:#x}"), std::numeric_limits
<std::uint16_t>::max());
1155 check(SV("0b11111111111111111111111111111111"), SV("{:#b}"), std::numeric_limits
<std::uint32_t>::max());
1156 check(SV("037777777777"), SV("{:#o}"), std::numeric_limits
<std::uint32_t>::max());
1157 check(SV("4294967295"), SV("{:#}"), std::numeric_limits
<std::uint32_t>::max());
1158 check(SV("0xffffffff"), SV("{:#x}"), std::numeric_limits
<std::uint32_t>::max());
1160 check(SV("0b1111111111111111111111111111111111111111111111111111111111111111"),
1162 std::numeric_limits
<std::uint64_t>::max());
1163 check(SV("01777777777777777777777"), SV("{:#o}"), std::numeric_limits
<std::uint64_t>::max());
1164 check(SV("18446744073709551615"), SV("{:#}"), std::numeric_limits
<std::uint64_t>::max());
1165 check(SV("0xffffffffffffffff"), SV("{:#x}"), std::numeric_limits
<std::uint64_t>::max());
1167 #ifndef TEST_HAS_NO_INT128
1168 check(SV("0b1111111111111111111111111111111111111111111111111111111111111111"
1169 "1111111111111111111111111111111111111111111111111111111111111111"),
1171 std::numeric_limits
<__uint128_t
>::max());
1172 check(SV("03777777777777777777777777777777777777777777"), SV("{:#o}"), std::numeric_limits
<__uint128_t
>::max());
1173 check(SV("340282366920938463463374607431768211455"), SV("{:#}"), std::numeric_limits
<__uint128_t
>::max());
1174 check(SV("0xffffffffffffffffffffffffffffffff"), SV("{:#x}"), std::numeric_limits
<__uint128_t
>::max());
1178 template <class CharT
, class TestFunction
, class ExceptionTest
>
1179 void format_test_char(TestFunction check
, ExceptionTest check_exception
) {
1181 // ***** Char type *****
1182 // *** align-fill & width ***
1183 check(SV("answer is '* '"), SV("answer is '{:6}'"), CharT('*'));
1184 check(SV("answer is ' *'"), SV("answer is '{:>6}'"), CharT('*'));
1185 check(SV("answer is '* '"), SV("answer is '{:<6}'"), CharT('*'));
1186 check(SV("answer is ' * '"), SV("answer is '{:^6}'"), CharT('*'));
1188 check(SV("answer is '* '"), SV("answer is '{:6c}'"), CharT('*'));
1189 check(SV("answer is ' *'"), SV("answer is '{:>6c}'"), CharT('*'));
1190 check(SV("answer is '* '"), SV("answer is '{:<6c}'"), CharT('*'));
1191 check(SV("answer is ' * '"), SV("answer is '{:^6c}'"), CharT('*'));
1193 // The fill character ':' is allowed here (P0645) but not in ranges (P2286).
1194 check(SV("answer is ':::::*'"), SV("answer is '{::>6}'"), CharT('*'));
1195 check(SV("answer is '*:::::'"), SV("answer is '{::<6}'"), CharT('*'));
1196 check(SV("answer is '::*:::'"), SV("answer is '{::^6}'"), CharT('*'));
1198 check(SV("answer is '-----*'"), SV("answer is '{:->6c}'"), CharT('*'));
1199 check(SV("answer is '*-----'"), SV("answer is '{:-<6c}'"), CharT('*'));
1200 check(SV("answer is '--*---'"), SV("answer is '{:-^6c}'"), CharT('*'));
1203 check_exception("The format specifier for a character does not allow the sign option", SV("{:-}"), CharT('*'));
1204 check_exception("The format specifier for a character does not allow the sign option", SV("{:+}"), CharT('*'));
1205 check_exception("The format specifier for a character does not allow the sign option", SV("{: }"), CharT('*'));
1207 check_exception("The format specifier for a character does not allow the sign option", SV("{:-c}"), CharT('*'));
1208 check_exception("The format specifier for a character does not allow the sign option", SV("{:+c}"), CharT('*'));
1209 check_exception("The format specifier for a character does not allow the sign option", SV("{: c}"), CharT('*'));
1211 // *** alternate form ***
1213 "The format specifier for a character does not allow the alternate form option", SV("{:#}"), CharT('*'));
1215 "The format specifier for a character does not allow the alternate form option", SV("{:#c}"), CharT('*'));
1217 // *** zero-padding ***
1219 "The format specifier for a character does not allow the zero-padding option", SV("{:0}"), CharT('*'));
1221 "The format specifier for a character does not allow the zero-padding option", SV("{:0c}"), CharT('*'));
1223 // *** precision ***
1224 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.}"), CharT('*'));
1225 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.0}"), CharT('*'));
1226 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.42}"), CharT('*'));
1228 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.c}"), CharT('*'));
1229 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.0c}"), CharT('*'));
1230 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.42c}"), CharT('*'));
1232 // *** locale-specific form ***
1233 // Note it has no effect but it's allowed.
1234 check(SV("answer is '*'"), SV("answer is '{:L}'"), '*');
1235 check(SV("answer is '*'"), SV("answer is '{:Lc}'"), '*');
1238 #if TEST_STD_VER > 20
1239 const char* valid_types
= "bBcdoxX?";
1241 const char* valid_types
= "bBcdoxX";
1243 for (const auto& fmt
: invalid_types
<CharT
>(valid_types
))
1244 check_exception("The type option contains an invalid value for a character formatting argument", fmt
, CharT('*'));
1247 template <class CharT
, class TestFunction
, class ExceptionTest
>
1248 void format_test_char_as_integer(TestFunction check
, ExceptionTest check_exception
) {
1249 // *** align-fill & width ***
1250 check(SV("answer is '42'"), SV("answer is '{:<1d}'"), CharT('*'));
1252 check(SV("answer is '42'"), SV("answer is '{:<2d}'"), CharT('*'));
1253 check(SV("answer is '42 '"), SV("answer is '{:<3d}'"), CharT('*'));
1255 check(SV("answer is ' 42'"), SV("answer is '{:7d}'"), CharT('*'));
1256 check(SV("answer is ' 42'"), SV("answer is '{:>7d}'"), CharT('*'));
1257 check(SV("answer is '42 '"), SV("answer is '{:<7d}'"), CharT('*'));
1258 check(SV("answer is ' 42 '"), SV("answer is '{:^7d}'"), CharT('*'));
1260 // The fill character ':' is allowed here (P0645) but not in ranges (P2286).
1261 check(SV("answer is ':::::42'"), SV("answer is '{::>7d}'"), CharT('*'));
1262 check(SV("answer is '42:::::'"), SV("answer is '{::<7d}'"), CharT('*'));
1263 check(SV("answer is '::42:::'"), SV("answer is '{::^7d}'"), CharT('*'));
1265 // Test whether zero padding is ignored
1266 check(SV("answer is ' 42'"), SV("answer is '{:>07d}'"), CharT('*'));
1267 check(SV("answer is '42 '"), SV("answer is '{:<07d}'"), CharT('*'));
1268 check(SV("answer is ' 42 '"), SV("answer is '{:^07d}'"), CharT('*'));
1271 check(SV("answer is 42"), SV("answer is {:d}"), CharT('*'));
1272 check(SV("answer is 42"), SV("answer is {:-d}"), CharT('*'));
1273 check(SV("answer is +42"), SV("answer is {:+d}"), CharT('*'));
1274 check(SV("answer is 42"), SV("answer is {: d}"), CharT('*'));
1276 // *** alternate form ***
1277 check(SV("answer is +42"), SV("answer is {:+#d}"), CharT('*'));
1278 check(SV("answer is +101010"), SV("answer is {:+b}"), CharT('*'));
1279 check(SV("answer is +0b101010"), SV("answer is {:+#b}"), CharT('*'));
1280 check(SV("answer is +0B101010"), SV("answer is {:+#B}"), CharT('*'));
1281 check(SV("answer is +52"), SV("answer is {:+o}"), CharT('*'));
1282 check(SV("answer is +052"), SV("answer is {:+#o}"), CharT('*'));
1283 check(SV("answer is +2a"), SV("answer is {:+x}"), CharT('*'));
1284 check(SV("answer is +0x2a"), SV("answer is {:+#x}"), CharT('*'));
1285 check(SV("answer is +2A"), SV("answer is {:+X}"), CharT('*'));
1286 check(SV("answer is +0X2A"), SV("answer is {:+#X}"), CharT('*'));
1288 // *** zero-padding & width ***
1289 check(SV("answer is +00000000042"), SV("answer is {:+#012d}"), CharT('*'));
1290 check(SV("answer is +00000101010"), SV("answer is {:+012b}"), CharT('*'));
1291 check(SV("answer is +0b000101010"), SV("answer is {:+#012b}"), CharT('*'));
1292 check(SV("answer is +0B000101010"), SV("answer is {:+#012B}"), CharT('*'));
1293 check(SV("answer is +00000000052"), SV("answer is {:+012o}"), CharT('*'));
1294 check(SV("answer is +00000000052"), SV("answer is {:+#012o}"), CharT('*'));
1295 check(SV("answer is +0000000002a"), SV("answer is {:+012x}"), CharT('*'));
1296 check(SV("answer is +0x00000002a"), SV("answer is {:+#012x}"), CharT('*'));
1297 check(SV("answer is +0000000002A"), SV("answer is {:+012X}"), CharT('*'));
1299 check(SV("answer is +0X00000002A"), SV("answer is {:+#012X}"), CharT('*'));
1301 // *** precision ***
1302 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.d}"), CharT('*'));
1303 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.0d}"), CharT('*'));
1304 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.42d}"), CharT('*'));
1306 // *** locale-specific form ***
1307 // See locale-specific_form.pass.cpp
1310 #if TEST_STD_VER > 20
1311 const char* valid_types
= "bBcdoxX?";
1313 const char* valid_types
= "bBcdoxX";
1315 for (const auto& fmt
: invalid_types
<CharT
>(valid_types
))
1316 check_exception("The type option contains an invalid value for a character formatting argument", fmt
, CharT('*'));
1319 template <class F
, class CharT
, class TestFunction
>
1320 void format_test_floating_point_hex_lower_case(TestFunction check
) {
1321 auto nan_pos
= std::numeric_limits
<F
>::quiet_NaN(); // "nan"
1322 auto nan_neg
= std::copysign(nan_pos
, static_cast<decltype(nan_pos
)>(-1.0)); // "-nan"
1324 // Test whether the hexadecimal letters are the proper case.
1325 // The precision is too large for float, so two tests are used.
1326 check(SV("answer is '1.abcp+0'"), SV("answer is '{:a}'"), F(0x1.abcp
+0));
1327 check(SV("answer is '1.defp+0'"), SV("answer is '{:a}'"), F(0x1.defp
+0));
1329 // *** align-fill & width ***
1330 check(SV("answer is ' 1p-2'"), SV("answer is '{:7a}'"), F(0.25));
1331 check(SV("answer is ' 1p-2'"), SV("answer is '{:>7a}'"), F(0.25));
1332 check(SV("answer is '1p-2 '"), SV("answer is '{:<7a}'"), F(0.25));
1333 check(SV("answer is ' 1p-2 '"), SV("answer is '{:^7a}'"), F(0.25));
1335 // The fill character ':' is allowed here (P0645) but not in ranges (P2286).
1336 check(SV("answer is ':::1p-3'"), SV("answer is '{::>7a}'"), F(125e-3));
1337 check(SV("answer is '1p-3:::'"), SV("answer is '{::<7a}'"), F(125e-3));
1338 check(SV("answer is ':1p-3::'"), SV("answer is '{::^7a}'"), F(125e-3));
1340 check(SV("answer is '***inf'"), SV("answer is '{:*>6a}'"), std::numeric_limits
<F
>::infinity());
1341 check(SV("answer is 'inf***'"), SV("answer is '{:*<6a}'"), std::numeric_limits
<F
>::infinity());
1342 check(SV("answer is '*inf**'"), SV("answer is '{:*^6a}'"), std::numeric_limits
<F
>::infinity());
1344 check(SV("answer is '###-inf'"), SV("answer is '{:#>7a}'"), -std::numeric_limits
<F
>::infinity());
1345 check(SV("answer is '-inf###'"), SV("answer is '{:#<7a}'"), -std::numeric_limits
<F
>::infinity());
1346 check(SV("answer is '#-inf##'"), SV("answer is '{:#^7a}'"), -std::numeric_limits
<F
>::infinity());
1348 check(SV("answer is '^^^nan'"), SV("answer is '{:^>6a}'"), nan_pos
);
1349 check(SV("answer is 'nan^^^'"), SV("answer is '{:^<6a}'"), nan_pos
);
1350 check(SV("answer is '^nan^^'"), SV("answer is '{:^^6a}'"), nan_pos
);
1352 check(SV("answer is '000-nan'"), SV("answer is '{:0>7a}'"), nan_neg
);
1353 check(SV("answer is '-nan000'"), SV("answer is '{:0<7a}'"), nan_neg
);
1354 check(SV("answer is '0-nan00'"), SV("answer is '{:0^7a}'"), nan_neg
);
1356 // Test whether zero padding is ignored
1357 check(SV("answer is ' 1p-2'"), SV("answer is '{:>07a}'"), F(0.25));
1358 check(SV("answer is '1p-2 '"), SV("answer is '{:<07a}'"), F(0.25));
1359 check(SV("answer is ' 1p-2 '"), SV("answer is '{:^07a}'"), F(0.25));
1362 check(SV("answer is '0p+0'"), SV("answer is '{:a}'"), F(0));
1363 check(SV("answer is '0p+0'"), SV("answer is '{:-a}'"), F(0));
1364 check(SV("answer is '+0p+0'"), SV("answer is '{:+a}'"), F(0));
1365 check(SV("answer is ' 0p+0'"), SV("answer is '{: a}'"), F(0));
1367 check(SV("answer is '-0p+0'"), SV("answer is '{:a}'"), F(-0.));
1368 check(SV("answer is '-0p+0'"), SV("answer is '{:-a}'"), F(-0.));
1369 check(SV("answer is '-0p+0'"), SV("answer is '{:+a}'"), F(-0.));
1370 check(SV("answer is '-0p+0'"), SV("answer is '{: a}'"), F(-0.));
1372 // [format.string.std]/5 The sign option applies to floating-point infinity and NaN.
1373 check(SV("answer is 'inf'"), SV("answer is '{:a}'"), std::numeric_limits
<F
>::infinity());
1374 check(SV("answer is 'inf'"), SV("answer is '{:-a}'"), std::numeric_limits
<F
>::infinity());
1375 check(SV("answer is '+inf'"), SV("answer is '{:+a}'"), std::numeric_limits
<F
>::infinity());
1376 check(SV("answer is ' inf'"), SV("answer is '{: a}'"), std::numeric_limits
<F
>::infinity());
1378 check(SV("answer is '-inf'"), SV("answer is '{:a}'"), -std::numeric_limits
<F
>::infinity());
1379 check(SV("answer is '-inf'"), SV("answer is '{:-a}'"), -std::numeric_limits
<F
>::infinity());
1380 check(SV("answer is '-inf'"), SV("answer is '{:+a}'"), -std::numeric_limits
<F
>::infinity());
1381 check(SV("answer is '-inf'"), SV("answer is '{: a}'"), -std::numeric_limits
<F
>::infinity());
1383 check(SV("answer is 'nan'"), SV("answer is '{:a}'"), nan_pos
);
1384 check(SV("answer is 'nan'"), SV("answer is '{:-a}'"), nan_pos
);
1385 check(SV("answer is '+nan'"), SV("answer is '{:+a}'"), nan_pos
);
1386 check(SV("answer is ' nan'"), SV("answer is '{: a}'"), nan_pos
);
1388 check(SV("answer is '-nan'"), SV("answer is '{:a}'"), nan_neg
);
1389 check(SV("answer is '-nan'"), SV("answer is '{:-a}'"), nan_neg
);
1390 check(SV("answer is '-nan'"), SV("answer is '{:+a}'"), nan_neg
);
1391 check(SV("answer is '-nan'"), SV("answer is '{: a}'"), nan_neg
);
1393 // *** alternate form ***
1394 // When precision is zero there's no decimal point except when the alternate form is specified.
1395 check(SV("answer is '0p+0'"), SV("answer is '{:a}'"), F(0));
1396 check(SV("answer is '0.p+0'"), SV("answer is '{:#a}'"), F(0));
1398 check(SV("answer is '1p+1'"), SV("answer is '{:.0a}'"), F(2.5));
1399 check(SV("answer is '1.p+1'"), SV("answer is '{:#.0a}'"), F(2.5));
1400 check(SV("answer is '1.4p+1'"), SV("answer is '{:#a}'"), F(2.5));
1402 check(SV("answer is 'inf'"), SV("answer is '{:#a}'"), std::numeric_limits
<F
>::infinity());
1403 check(SV("answer is '-inf'"), SV("answer is '{:#a}'"), -std::numeric_limits
<F
>::infinity());
1405 check(SV("answer is 'nan'"), SV("answer is '{:#a}'"), nan_pos
);
1406 check(SV("answer is '-nan'"), SV("answer is '{:#a}'"), nan_neg
);
1408 // *** zero-padding & width ***
1409 check(SV("answer is '1p-5'"), SV("answer is '{:04a}'"), 0.03125);
1410 check(SV("answer is '+1p-5'"), SV("answer is '{:+05a}'"), 0.03125);
1411 check(SV("answer is '+01p-5'"), SV("answer is '{:+06a}'"), 0.03125);
1413 check(SV("answer is '0001p-5'"), SV("answer is '{:07a}'"), 0.03125);
1414 check(SV("answer is '0001p-5'"), SV("answer is '{:-07a}'"), 0.03125);
1415 check(SV("answer is '+001p-5'"), SV("answer is '{:+07a}'"), 0.03125);
1416 check(SV("answer is ' 001p-5'"), SV("answer is '{: 07a}'"), 0.03125);
1418 check(SV("answer is ' inf'"), SV("answer is '{:010a}'"), std::numeric_limits
<F
>::infinity());
1419 check(SV("answer is ' inf'"), SV("answer is '{:-010a}'"), std::numeric_limits
<F
>::infinity());
1420 check(SV("answer is ' +inf'"), SV("answer is '{:+010a}'"), std::numeric_limits
<F
>::infinity());
1421 check(SV("answer is ' inf'"), SV("answer is '{: 010a}'"), std::numeric_limits
<F
>::infinity());
1423 check(SV("answer is ' -inf'"), SV("answer is '{:010a}'"), -std::numeric_limits
<F
>::infinity());
1424 check(SV("answer is ' -inf'"), SV("answer is '{:-010a}'"), -std::numeric_limits
<F
>::infinity());
1425 check(SV("answer is ' -inf'"), SV("answer is '{:+010a}'"), -std::numeric_limits
<F
>::infinity());
1426 check(SV("answer is ' -inf'"), SV("answer is '{: 010a}'"), -std::numeric_limits
<F
>::infinity());
1428 check(SV("answer is ' nan'"), SV("answer is '{:010a}'"), nan_pos
);
1429 check(SV("answer is ' nan'"), SV("answer is '{:-010a}'"), nan_pos
);
1430 check(SV("answer is ' +nan'"), SV("answer is '{:+010a}'"), nan_pos
);
1431 check(SV("answer is ' nan'"), SV("answer is '{: 010a}'"), nan_pos
);
1433 check(SV("answer is ' -nan'"), SV("answer is '{:010a}'"), nan_neg
);
1434 check(SV("answer is ' -nan'"), SV("answer is '{:-010a}'"), nan_neg
);
1435 check(SV("answer is ' -nan'"), SV("answer is '{:+010a}'"), nan_neg
);
1436 check(SV("answer is ' -nan'"), SV("answer is '{: 010a}'"), nan_neg
);
1438 // *** precision ***
1439 // See format_test_floating_point_hex_lower_case_precision
1441 // *** locale-specific form ***
1442 // See locale-specific_form.pass.cpp
1445 template <class F
, class CharT
, class TestFunction
>
1446 void format_test_floating_point_hex_upper_case(TestFunction check
) {
1447 auto nan_pos
= std::numeric_limits
<F
>::quiet_NaN(); // "nan"
1448 auto nan_neg
= std::copysign(nan_pos
, static_cast<decltype(nan_pos
)>(-1.0)); // "-nan"
1450 // Test whether the hexadecimal letters are the proper case.
1451 // The precision is too large for float, so two tests are used.
1452 check(SV("answer is '1.ABCP+0'"), SV("answer is '{:A}'"), F(0x1.abcp
+0));
1453 check(SV("answer is '1.DEFP+0'"), SV("answer is '{:A}'"), F(0x1.defp
+0));
1455 // *** align-fill & width ***
1456 check(SV("answer is ' 1P-2'"), SV("answer is '{:7A}'"), F(0.25));
1457 check(SV("answer is ' 1P-2'"), SV("answer is '{:>7A}'"), F(0.25));
1458 check(SV("answer is '1P-2 '"), SV("answer is '{:<7A}'"), F(0.25));
1459 check(SV("answer is ' 1P-2 '"), SV("answer is '{:^7A}'"), F(0.25));
1461 check(SV("answer is '---1P-3'"), SV("answer is '{:->7A}'"), F(125e-3));
1462 check(SV("answer is '1P-3---'"), SV("answer is '{:-<7A}'"), F(125e-3));
1463 check(SV("answer is '-1P-3--'"), SV("answer is '{:-^7A}'"), F(125e-3));
1465 check(SV("answer is '***INF'"), SV("answer is '{:*>6A}'"), std::numeric_limits
<F
>::infinity());
1466 check(SV("answer is 'INF***'"), SV("answer is '{:*<6A}'"), std::numeric_limits
<F
>::infinity());
1467 check(SV("answer is '*INF**'"), SV("answer is '{:*^6A}'"), std::numeric_limits
<F
>::infinity());
1469 check(SV("answer is '###-INF'"), SV("answer is '{:#>7A}'"), -std::numeric_limits
<F
>::infinity());
1470 check(SV("answer is '-INF###'"), SV("answer is '{:#<7A}'"), -std::numeric_limits
<F
>::infinity());
1471 check(SV("answer is '#-INF##'"), SV("answer is '{:#^7A}'"), -std::numeric_limits
<F
>::infinity());
1473 check(SV("answer is '^^^NAN'"), SV("answer is '{:^>6A}'"), nan_pos
);
1474 check(SV("answer is 'NAN^^^'"), SV("answer is '{:^<6A}'"), nan_pos
);
1475 check(SV("answer is '^NAN^^'"), SV("answer is '{:^^6A}'"), nan_pos
);
1477 check(SV("answer is '000-NAN'"), SV("answer is '{:0>7A}'"), nan_neg
);
1478 check(SV("answer is '-NAN000'"), SV("answer is '{:0<7A}'"), nan_neg
);
1479 check(SV("answer is '0-NAN00'"), SV("answer is '{:0^7A}'"), nan_neg
);
1481 // Test whether zero padding is ignored
1482 check(SV("answer is ' 1P-2'"), SV("answer is '{:>07A}'"), F(0.25));
1483 check(SV("answer is '1P-2 '"), SV("answer is '{:<07A}'"), F(0.25));
1484 check(SV("answer is ' 1P-2 '"), SV("answer is '{:^07A}'"), F(0.25));
1487 check(SV("answer is '0P+0'"), SV("answer is '{:A}'"), F(0));
1488 check(SV("answer is '0P+0'"), SV("answer is '{:-A}'"), F(0));
1489 check(SV("answer is '+0P+0'"), SV("answer is '{:+A}'"), F(0));
1490 check(SV("answer is ' 0P+0'"), SV("answer is '{: A}'"), F(0));
1492 check(SV("answer is '-0P+0'"), SV("answer is '{:A}'"), F(-0.));
1493 check(SV("answer is '-0P+0'"), SV("answer is '{:-A}'"), F(-0.));
1494 check(SV("answer is '-0P+0'"), SV("answer is '{:+A}'"), F(-0.));
1495 check(SV("answer is '-0P+0'"), SV("answer is '{: A}'"), F(-0.));
1497 // [format.string.std]/5 The sign option applies to floating-point infinity and NaN.
1498 check(SV("answer is 'INF'"), SV("answer is '{:A}'"), std::numeric_limits
<F
>::infinity());
1499 check(SV("answer is 'INF'"), SV("answer is '{:-A}'"), std::numeric_limits
<F
>::infinity());
1500 check(SV("answer is '+INF'"), SV("answer is '{:+A}'"), std::numeric_limits
<F
>::infinity());
1501 check(SV("answer is ' INF'"), SV("answer is '{: A}'"), std::numeric_limits
<F
>::infinity());
1503 check(SV("answer is '-INF'"), SV("answer is '{:A}'"), -std::numeric_limits
<F
>::infinity());
1504 check(SV("answer is '-INF'"), SV("answer is '{:-A}'"), -std::numeric_limits
<F
>::infinity());
1505 check(SV("answer is '-INF'"), SV("answer is '{:+A}'"), -std::numeric_limits
<F
>::infinity());
1506 check(SV("answer is '-INF'"), SV("answer is '{: A}'"), -std::numeric_limits
<F
>::infinity());
1508 check(SV("answer is 'NAN'"), SV("answer is '{:A}'"), nan_pos
);
1509 check(SV("answer is 'NAN'"), SV("answer is '{:-A}'"), nan_pos
);
1510 check(SV("answer is '+NAN'"), SV("answer is '{:+A}'"), nan_pos
);
1511 check(SV("answer is ' NAN'"), SV("answer is '{: A}'"), nan_pos
);
1513 check(SV("answer is '-NAN'"), SV("answer is '{:A}'"), nan_neg
);
1514 check(SV("answer is '-NAN'"), SV("answer is '{:-A}'"), nan_neg
);
1515 check(SV("answer is '-NAN'"), SV("answer is '{:+A}'"), nan_neg
);
1516 check(SV("answer is '-NAN'"), SV("answer is '{: A}'"), nan_neg
);
1518 // *** alternate form ***
1519 // When precision is zero there's no decimal point except when the alternate form is specified.
1520 check(SV("answer is '0P+0'"), SV("answer is '{:A}'"), F(0));
1521 check(SV("answer is '0.P+0'"), SV("answer is '{:#A}'"), F(0));
1523 check(SV("answer is '1P+1'"), SV("answer is '{:.0A}'"), F(2.5));
1524 check(SV("answer is '1.P+1'"), SV("answer is '{:#.0A}'"), F(2.5));
1525 check(SV("answer is '1.4P+1'"), SV("answer is '{:#A}'"), F(2.5));
1527 check(SV("answer is 'INF'"), SV("answer is '{:#A}'"), std::numeric_limits
<F
>::infinity());
1528 check(SV("answer is '-INF'"), SV("answer is '{:#A}'"), -std::numeric_limits
<F
>::infinity());
1530 check(SV("answer is 'NAN'"), SV("answer is '{:#A}'"), nan_pos
);
1531 check(SV("answer is '-NAN'"), SV("answer is '{:#A}'"), nan_neg
);
1533 // *** zero-padding & width ***
1534 check(SV("answer is '1P-5'"), SV("answer is '{:04A}'"), 0.03125);
1535 check(SV("answer is '+1P-5'"), SV("answer is '{:+05A}'"), 0.03125);
1536 check(SV("answer is '+01P-5'"), SV("answer is '{:+06A}'"), 0.03125);
1538 check(SV("answer is '0001P-5'"), SV("answer is '{:07A}'"), 0.03125);
1539 check(SV("answer is '0001P-5'"), SV("answer is '{:-07A}'"), 0.03125);
1540 check(SV("answer is '+001P-5'"), SV("answer is '{:+07A}'"), 0.03125);
1541 check(SV("answer is ' 001P-5'"), SV("answer is '{: 07A}'"), 0.03125);
1543 check(SV("answer is ' INF'"), SV("answer is '{:010A}'"), std::numeric_limits
<F
>::infinity());
1544 check(SV("answer is ' INF'"), SV("answer is '{:-010A}'"), std::numeric_limits
<F
>::infinity());
1545 check(SV("answer is ' +INF'"), SV("answer is '{:+010A}'"), std::numeric_limits
<F
>::infinity());
1546 check(SV("answer is ' INF'"), SV("answer is '{: 010A}'"), std::numeric_limits
<F
>::infinity());
1548 check(SV("answer is ' -INF'"), SV("answer is '{:010A}'"), -std::numeric_limits
<F
>::infinity());
1549 check(SV("answer is ' -INF'"), SV("answer is '{:-010A}'"), -std::numeric_limits
<F
>::infinity());
1550 check(SV("answer is ' -INF'"), SV("answer is '{:+010A}'"), -std::numeric_limits
<F
>::infinity());
1551 check(SV("answer is ' -INF'"), SV("answer is '{: 010A}'"), -std::numeric_limits
<F
>::infinity());
1553 check(SV("answer is ' NAN'"), SV("answer is '{:010A}'"), nan_pos
);
1554 check(SV("answer is ' NAN'"), SV("answer is '{:-010A}'"), nan_pos
);
1555 check(SV("answer is ' +NAN'"), SV("answer is '{:+010A}'"), nan_pos
);
1556 check(SV("answer is ' NAN'"), SV("answer is '{: 010A}'"), nan_pos
);
1558 check(SV("answer is ' -NAN'"), SV("answer is '{:010A}'"), nan_neg
);
1559 check(SV("answer is ' -NAN'"), SV("answer is '{:-010A}'"), nan_neg
);
1560 check(SV("answer is ' -NAN'"), SV("answer is '{:+010A}'"), nan_neg
);
1561 check(SV("answer is ' -NAN'"), SV("answer is '{: 010A}'"), nan_neg
);
1563 // *** precision ***
1564 // See format_test_floating_point_hex_upper_case_precision
1566 // *** locale-specific form ***
1567 // See locale-specific_form.pass.cpp
1570 template <class F
, class CharT
, class TestFunction
>
1571 void format_test_floating_point_hex_lower_case_precision(TestFunction check
) {
1572 auto nan_pos
= std::numeric_limits
<F
>::quiet_NaN(); // "nan"
1573 auto nan_neg
= std::copysign(nan_pos
, static_cast<decltype(nan_pos
)>(-1.0)); // "-nan"
1575 // *** align-fill & width ***
1576 check(SV("answer is ' 1.000000p-2'"), SV("answer is '{:14.6a}'"), F(0.25));
1577 check(SV("answer is ' 1.000000p-2'"), SV("answer is '{:>14.6a}'"), F(0.25));
1578 check(SV("answer is '1.000000p-2 '"), SV("answer is '{:<14.6a}'"), F(0.25));
1579 check(SV("answer is ' 1.000000p-2 '"), SV("answer is '{:^14.6a}'"), F(0.25));
1581 check(SV("answer is '---1.000000p-3'"), SV("answer is '{:->14.6a}'"), F(125e-3));
1582 check(SV("answer is '1.000000p-3---'"), SV("answer is '{:-<14.6a}'"), F(125e-3));
1583 check(SV("answer is '-1.000000p-3--'"), SV("answer is '{:-^14.6a}'"), F(125e-3));
1585 check(SV("answer is '***inf'"), SV("answer is '{:*>6.6a}'"), std::numeric_limits
<F
>::infinity());
1586 check(SV("answer is 'inf***'"), SV("answer is '{:*<6.6a}'"), std::numeric_limits
<F
>::infinity());
1587 check(SV("answer is '*inf**'"), SV("answer is '{:*^6.6a}'"), std::numeric_limits
<F
>::infinity());
1589 check(SV("answer is '###-inf'"), SV("answer is '{:#>7.6a}'"), -std::numeric_limits
<F
>::infinity());
1590 check(SV("answer is '-inf###'"), SV("answer is '{:#<7.6a}'"), -std::numeric_limits
<F
>::infinity());
1591 check(SV("answer is '#-inf##'"), SV("answer is '{:#^7.6a}'"), -std::numeric_limits
<F
>::infinity());
1593 check(SV("answer is '^^^nan'"), SV("answer is '{:^>6.6a}'"), nan_pos
);
1594 check(SV("answer is 'nan^^^'"), SV("answer is '{:^<6.6a}'"), nan_pos
);
1595 check(SV("answer is '^nan^^'"), SV("answer is '{:^^6.6a}'"), nan_pos
);
1597 check(SV("answer is '000-nan'"), SV("answer is '{:0>7.6a}'"), nan_neg
);
1598 check(SV("answer is '-nan000'"), SV("answer is '{:0<7.6a}'"), nan_neg
);
1599 check(SV("answer is '0-nan00'"), SV("answer is '{:0^7.6a}'"), nan_neg
);
1601 // Test whether zero padding is ignored
1602 check(SV("answer is ' 1.000000p-2'"), SV("answer is '{:>014.6a}'"), F(0.25));
1603 check(SV("answer is '1.000000p-2 '"), SV("answer is '{:<014.6a}'"), F(0.25));
1604 check(SV("answer is ' 1.000000p-2 '"), SV("answer is '{:^014.6a}'"), F(0.25));
1607 check(SV("answer is '0.000000p+0'"), SV("answer is '{:.6a}'"), F(0));
1608 check(SV("answer is '0.000000p+0'"), SV("answer is '{:-.6a}'"), F(0));
1609 check(SV("answer is '+0.000000p+0'"), SV("answer is '{:+.6a}'"), F(0));
1610 check(SV("answer is ' 0.000000p+0'"), SV("answer is '{: .6a}'"), F(0));
1612 check(SV("answer is '-0.000000p+0'"), SV("answer is '{:.6a}'"), F(-0.));
1613 check(SV("answer is '-0.000000p+0'"), SV("answer is '{:-.6a}'"), F(-0.));
1614 check(SV("answer is '-0.000000p+0'"), SV("answer is '{:+.6a}'"), F(-0.));
1615 check(SV("answer is '-0.000000p+0'"), SV("answer is '{: .6a}'"), F(-0.));
1617 // [format.string.std]/5 The sign option applies to floating-point infinity and NaN.
1618 check(SV("answer is 'inf'"), SV("answer is '{:.6a}'"), std::numeric_limits
<F
>::infinity());
1619 check(SV("answer is 'inf'"), SV("answer is '{:-.6a}'"), std::numeric_limits
<F
>::infinity());
1620 check(SV("answer is '+inf'"), SV("answer is '{:+.6a}'"), std::numeric_limits
<F
>::infinity());
1621 check(SV("answer is ' inf'"), SV("answer is '{: .6a}'"), std::numeric_limits
<F
>::infinity());
1623 check(SV("answer is '-inf'"), SV("answer is '{:.6a}'"), -std::numeric_limits
<F
>::infinity());
1624 check(SV("answer is '-inf'"), SV("answer is '{:-.6a}'"), -std::numeric_limits
<F
>::infinity());
1625 check(SV("answer is '-inf'"), SV("answer is '{:+.6a}'"), -std::numeric_limits
<F
>::infinity());
1626 check(SV("answer is '-inf'"), SV("answer is '{: .6a}'"), -std::numeric_limits
<F
>::infinity());
1628 check(SV("answer is 'nan'"), SV("answer is '{:.6a}'"), nan_pos
);
1629 check(SV("answer is 'nan'"), SV("answer is '{:-.6a}'"), nan_pos
);
1630 check(SV("answer is '+nan'"), SV("answer is '{:+.6a}'"), nan_pos
);
1631 check(SV("answer is ' nan'"), SV("answer is '{: .6a}'"), nan_pos
);
1633 check(SV("answer is '-nan'"), SV("answer is '{:.6a}'"), nan_neg
);
1634 check(SV("answer is '-nan'"), SV("answer is '{:-.6a}'"), nan_neg
);
1635 check(SV("answer is '-nan'"), SV("answer is '{:+.6a}'"), nan_neg
);
1636 check(SV("answer is '-nan'"), SV("answer is '{: .6a}'"), nan_neg
);
1638 // *** alternate form ***
1639 check(SV("answer is '1.400000p+1'"), SV("answer is '{:#.6a}'"), F(2.5));
1641 check(SV("answer is 'inf'"), SV("answer is '{:#.6a}'"), std::numeric_limits
<F
>::infinity());
1642 check(SV("answer is '-inf'"), SV("answer is '{:#.6a}'"), -std::numeric_limits
<F
>::infinity());
1644 check(SV("answer is 'nan'"), SV("answer is '{:#.6a}'"), nan_pos
);
1645 check(SV("answer is '-nan'"), SV("answer is '{:#.6a}'"), nan_neg
);
1647 // *** zero-padding & width ***
1648 check(SV("answer is '1.000000p-5'"), SV("answer is '{:011.6a}'"), 0.03125);
1649 check(SV("answer is '+1.000000p-5'"), SV("answer is '{:+012.6a}'"), 0.03125);
1650 check(SV("answer is '+01.000000p-5'"), SV("answer is '{:+013.6a}'"), 0.03125);
1652 check(SV("answer is '0001.000000p-5'"), SV("answer is '{:014.6a}'"), 0.03125);
1653 check(SV("answer is '0001.000000p-5'"), SV("answer is '{:-014.6a}'"), 0.03125);
1654 check(SV("answer is '+001.000000p-5'"), SV("answer is '{:+014.6a}'"), 0.03125);
1655 check(SV("answer is ' 001.000000p-5'"), SV("answer is '{: 014.6a}'"), 0.03125);
1657 check(SV("answer is ' inf'"), SV("answer is '{:010.6a}'"), std::numeric_limits
<F
>::infinity());
1658 check(SV("answer is ' inf'"), SV("answer is '{:-010.6a}'"), std::numeric_limits
<F
>::infinity());
1659 check(SV("answer is ' +inf'"), SV("answer is '{:+010.6a}'"), std::numeric_limits
<F
>::infinity());
1660 check(SV("answer is ' inf'"), SV("answer is '{: 010.6a}'"), std::numeric_limits
<F
>::infinity());
1662 check(SV("answer is ' -inf'"), SV("answer is '{:010.6a}'"), -std::numeric_limits
<F
>::infinity());
1663 check(SV("answer is ' -inf'"), SV("answer is '{:-010.6a}'"), -std::numeric_limits
<F
>::infinity());
1664 check(SV("answer is ' -inf'"), SV("answer is '{:+010.6a}'"), -std::numeric_limits
<F
>::infinity());
1665 check(SV("answer is ' -inf'"), SV("answer is '{: 010.6a}'"), -std::numeric_limits
<F
>::infinity());
1667 check(SV("answer is ' nan'"), SV("answer is '{:010.6a}'"), nan_pos
);
1668 check(SV("answer is ' nan'"), SV("answer is '{:-010.6a}'"), nan_pos
);
1669 check(SV("answer is ' +nan'"), SV("answer is '{:+010.6a}'"), nan_pos
);
1670 check(SV("answer is ' nan'"), SV("answer is '{: 010.6a}'"), nan_pos
);
1672 check(SV("answer is ' -nan'"), SV("answer is '{:010.6a}'"), nan_neg
);
1673 check(SV("answer is ' -nan'"), SV("answer is '{:-010.6a}'"), nan_neg
);
1674 check(SV("answer is ' -nan'"), SV("answer is '{:+010.6a}'"), nan_neg
);
1675 check(SV("answer is ' -nan'"), SV("answer is '{: 010.6a}'"), nan_neg
);
1677 // *** locale-specific form ***
1678 // See locale-specific_form.pass.cpp
1681 template <class F
, class CharT
, class TestFunction
>
1682 void format_test_floating_point_hex_upper_case_precision(TestFunction check
) {
1683 auto nan_pos
= std::numeric_limits
<F
>::quiet_NaN(); // "nan"
1684 auto nan_neg
= std::copysign(nan_pos
, static_cast<decltype(nan_pos
)>(-1.0)); // "-nan"
1686 // *** align-fill & width ***
1687 check(SV("answer is ' 1.000000P-2'"), SV("answer is '{:14.6A}'"), F(0.25));
1688 check(SV("answer is ' 1.000000P-2'"), SV("answer is '{:>14.6A}'"), F(0.25));
1689 check(SV("answer is '1.000000P-2 '"), SV("answer is '{:<14.6A}'"), F(0.25));
1690 check(SV("answer is ' 1.000000P-2 '"), SV("answer is '{:^14.6A}'"), F(0.25));
1692 check(SV("answer is '---1.000000P-3'"), SV("answer is '{:->14.6A}'"), F(125e-3));
1693 check(SV("answer is '1.000000P-3---'"), SV("answer is '{:-<14.6A}'"), F(125e-3));
1694 check(SV("answer is '-1.000000P-3--'"), SV("answer is '{:-^14.6A}'"), F(125e-3));
1696 check(SV("answer is '***INF'"), SV("answer is '{:*>6.6A}'"), std::numeric_limits
<F
>::infinity());
1697 check(SV("answer is 'INF***'"), SV("answer is '{:*<6.6A}'"), std::numeric_limits
<F
>::infinity());
1698 check(SV("answer is '*INF**'"), SV("answer is '{:*^6.6A}'"), std::numeric_limits
<F
>::infinity());
1700 check(SV("answer is '###-INF'"), SV("answer is '{:#>7.6A}'"), -std::numeric_limits
<F
>::infinity());
1701 check(SV("answer is '-INF###'"), SV("answer is '{:#<7.6A}'"), -std::numeric_limits
<F
>::infinity());
1702 check(SV("answer is '#-INF##'"), SV("answer is '{:#^7.6A}'"), -std::numeric_limits
<F
>::infinity());
1704 check(SV("answer is '^^^NAN'"), SV("answer is '{:^>6.6A}'"), nan_pos
);
1705 check(SV("answer is 'NAN^^^'"), SV("answer is '{:^<6.6A}'"), nan_pos
);
1706 check(SV("answer is '^NAN^^'"), SV("answer is '{:^^6.6A}'"), nan_pos
);
1708 check(SV("answer is '000-NAN'"), SV("answer is '{:0>7.6A}'"), nan_neg
);
1709 check(SV("answer is '-NAN000'"), SV("answer is '{:0<7.6A}'"), nan_neg
);
1710 check(SV("answer is '0-NAN00'"), SV("answer is '{:0^7.6A}'"), nan_neg
);
1712 // Test whether zero padding is ignored
1713 check(SV("answer is ' 1.000000P-2'"), SV("answer is '{:>014.6A}'"), F(0.25));
1714 check(SV("answer is '1.000000P-2 '"), SV("answer is '{:<014.6A}'"), F(0.25));
1715 check(SV("answer is ' 1.000000P-2 '"), SV("answer is '{:^014.6A}'"), F(0.25));
1718 check(SV("answer is '0.000000P+0'"), SV("answer is '{:.6A}'"), F(0));
1719 check(SV("answer is '0.000000P+0'"), SV("answer is '{:-.6A}'"), F(0));
1720 check(SV("answer is '+0.000000P+0'"), SV("answer is '{:+.6A}'"), F(0));
1721 check(SV("answer is ' 0.000000P+0'"), SV("answer is '{: .6A}'"), F(0));
1723 check(SV("answer is '-0.000000P+0'"), SV("answer is '{:.6A}'"), F(-0.));
1724 check(SV("answer is '-0.000000P+0'"), SV("answer is '{:-.6A}'"), F(-0.));
1725 check(SV("answer is '-0.000000P+0'"), SV("answer is '{:+.6A}'"), F(-0.));
1726 check(SV("answer is '-0.000000P+0'"), SV("answer is '{: .6A}'"), F(-0.));
1728 // [format.string.std]/5 The sign option applies to floating-point infinity and NaN.
1729 check(SV("answer is 'INF'"), SV("answer is '{:.6A}'"), std::numeric_limits
<F
>::infinity());
1730 check(SV("answer is 'INF'"), SV("answer is '{:-.6A}'"), std::numeric_limits
<F
>::infinity());
1731 check(SV("answer is '+INF'"), SV("answer is '{:+.6A}'"), std::numeric_limits
<F
>::infinity());
1732 check(SV("answer is ' INF'"), SV("answer is '{: .6A}'"), std::numeric_limits
<F
>::infinity());
1734 check(SV("answer is '-INF'"), SV("answer is '{:.6A}'"), -std::numeric_limits
<F
>::infinity());
1735 check(SV("answer is '-INF'"), SV("answer is '{:-.6A}'"), -std::numeric_limits
<F
>::infinity());
1736 check(SV("answer is '-INF'"), SV("answer is '{:+.6A}'"), -std::numeric_limits
<F
>::infinity());
1737 check(SV("answer is '-INF'"), SV("answer is '{: .6A}'"), -std::numeric_limits
<F
>::infinity());
1739 check(SV("answer is 'NAN'"), SV("answer is '{:.6A}'"), nan_pos
);
1740 check(SV("answer is 'NAN'"), SV("answer is '{:-.6A}'"), nan_pos
);
1741 check(SV("answer is '+NAN'"), SV("answer is '{:+.6A}'"), nan_pos
);
1742 check(SV("answer is ' NAN'"), SV("answer is '{: .6A}'"), nan_pos
);
1744 check(SV("answer is '-NAN'"), SV("answer is '{:.6A}'"), nan_neg
);
1745 check(SV("answer is '-NAN'"), SV("answer is '{:-.6A}'"), nan_neg
);
1746 check(SV("answer is '-NAN'"), SV("answer is '{:+.6A}'"), nan_neg
);
1747 check(SV("answer is '-NAN'"), SV("answer is '{: .6A}'"), nan_neg
);
1749 // *** alternate form ***
1750 check(SV("answer is '1.400000P+1'"), SV("answer is '{:#.6A}'"), F(2.5));
1752 check(SV("answer is 'INF'"), SV("answer is '{:#.6A}'"), std::numeric_limits
<F
>::infinity());
1753 check(SV("answer is '-INF'"), SV("answer is '{:#.6A}'"), -std::numeric_limits
<F
>::infinity());
1755 check(SV("answer is 'NAN'"), SV("answer is '{:#.6A}'"), nan_pos
);
1756 check(SV("answer is '-NAN'"), SV("answer is '{:#.6A}'"), nan_neg
);
1758 // *** zero-padding & width ***
1759 check(SV("answer is '1.000000P-5'"), SV("answer is '{:011.6A}'"), 0.03125);
1760 check(SV("answer is '+1.000000P-5'"), SV("answer is '{:+012.6A}'"), 0.03125);
1761 check(SV("answer is '+01.000000P-5'"), SV("answer is '{:+013.6A}'"), 0.03125);
1763 check(SV("answer is '0001.000000P-5'"), SV("answer is '{:014.6A}'"), 0.03125);
1764 check(SV("answer is '0001.000000P-5'"), SV("answer is '{:-014.6A}'"), 0.03125);
1765 check(SV("answer is '+001.000000P-5'"), SV("answer is '{:+014.6A}'"), 0.03125);
1766 check(SV("answer is ' 001.000000P-5'"), SV("answer is '{: 014.6A}'"), 0.03125);
1768 check(SV("answer is ' INF'"), SV("answer is '{:010.6A}'"), std::numeric_limits
<F
>::infinity());
1769 check(SV("answer is ' INF'"), SV("answer is '{:-010.6A}'"), std::numeric_limits
<F
>::infinity());
1770 check(SV("answer is ' +INF'"), SV("answer is '{:+010.6A}'"), std::numeric_limits
<F
>::infinity());
1771 check(SV("answer is ' INF'"), SV("answer is '{: 010.6A}'"), std::numeric_limits
<F
>::infinity());
1773 check(SV("answer is ' -INF'"), SV("answer is '{:010.6A}'"), -std::numeric_limits
<F
>::infinity());
1774 check(SV("answer is ' -INF'"), SV("answer is '{:-010.6A}'"), -std::numeric_limits
<F
>::infinity());
1775 check(SV("answer is ' -INF'"), SV("answer is '{:+010.6A}'"), -std::numeric_limits
<F
>::infinity());
1776 check(SV("answer is ' -INF'"), SV("answer is '{: 010.6A}'"), -std::numeric_limits
<F
>::infinity());
1778 check(SV("answer is ' NAN'"), SV("answer is '{:010.6A}'"), nan_pos
);
1779 check(SV("answer is ' NAN'"), SV("answer is '{:-010.6A}'"), nan_pos
);
1780 check(SV("answer is ' +NAN'"), SV("answer is '{:+010.6A}'"), nan_pos
);
1781 check(SV("answer is ' NAN'"), SV("answer is '{: 010.6A}'"), nan_pos
);
1783 check(SV("answer is ' -NAN'"), SV("answer is '{:010.6A}'"), nan_neg
);
1784 check(SV("answer is ' -NAN'"), SV("answer is '{:-010.6A}'"), nan_neg
);
1785 check(SV("answer is ' -NAN'"), SV("answer is '{:+010.6A}'"), nan_neg
);
1786 check(SV("answer is ' -NAN'"), SV("answer is '{: 010.6A}'"), nan_neg
);
1788 // *** locale-specific form ***
1789 // See locale-specific_form.pass.cpp
1792 template <class F
, class CharT
, class TestFunction
>
1793 void format_test_floating_point_scientific_lower_case(TestFunction check
) {
1794 auto nan_pos
= std::numeric_limits
<F
>::quiet_NaN(); // "nan"
1795 auto nan_neg
= std::copysign(nan_pos
, static_cast<decltype(nan_pos
)>(-1.0)); // "-nan"
1797 // *** align-fill & width ***
1798 check(SV("answer is ' 2.500000e-01'"), SV("answer is '{:15e}'"), F(0.25));
1799 check(SV("answer is ' 2.500000e-01'"), SV("answer is '{:>15e}'"), F(0.25));
1800 check(SV("answer is '2.500000e-01 '"), SV("answer is '{:<15e}'"), F(0.25));
1801 check(SV("answer is ' 2.500000e-01 '"), SV("answer is '{:^15e}'"), F(0.25));
1803 check(SV("answer is '---1.250000e-01'"), SV("answer is '{:->15e}'"), F(125e-3));
1804 check(SV("answer is '1.250000e-01---'"), SV("answer is '{:-<15e}'"), F(125e-3));
1805 check(SV("answer is '-1.250000e-01--'"), SV("answer is '{:-^15e}'"), F(125e-3));
1807 check(SV("answer is '***inf'"), SV("answer is '{:*>6e}'"), std::numeric_limits
<F
>::infinity());
1808 check(SV("answer is 'inf***'"), SV("answer is '{:*<6e}'"), std::numeric_limits
<F
>::infinity());
1809 check(SV("answer is '*inf**'"), SV("answer is '{:*^6e}'"), std::numeric_limits
<F
>::infinity());
1811 check(SV("answer is '###-inf'"), SV("answer is '{:#>7e}'"), -std::numeric_limits
<F
>::infinity());
1812 check(SV("answer is '-inf###'"), SV("answer is '{:#<7e}'"), -std::numeric_limits
<F
>::infinity());
1813 check(SV("answer is '#-inf##'"), SV("answer is '{:#^7e}'"), -std::numeric_limits
<F
>::infinity());
1815 check(SV("answer is '^^^nan'"), SV("answer is '{:^>6e}'"), nan_pos
);
1816 check(SV("answer is 'nan^^^'"), SV("answer is '{:^<6e}'"), nan_pos
);
1817 check(SV("answer is '^nan^^'"), SV("answer is '{:^^6e}'"), nan_pos
);
1819 check(SV("answer is '000-nan'"), SV("answer is '{:0>7e}'"), nan_neg
);
1820 check(SV("answer is '-nan000'"), SV("answer is '{:0<7e}'"), nan_neg
);
1821 check(SV("answer is '0-nan00'"), SV("answer is '{:0^7e}'"), nan_neg
);
1823 // Test whether zero padding is ignored
1824 check(SV("answer is ' 2.500000e-01'"), SV("answer is '{:>015e}'"), F(0.25));
1825 check(SV("answer is '2.500000e-01 '"), SV("answer is '{:<015e}'"), F(0.25));
1826 check(SV("answer is ' 2.500000e-01 '"), SV("answer is '{:^015e}'"), F(0.25));
1829 check(SV("answer is '0.000000e+00'"), SV("answer is '{:e}'"), F(0));
1830 check(SV("answer is '0.000000e+00'"), SV("answer is '{:-e}'"), F(0));
1831 check(SV("answer is '+0.000000e+00'"), SV("answer is '{:+e}'"), F(0));
1832 check(SV("answer is ' 0.000000e+00'"), SV("answer is '{: e}'"), F(0));
1834 check(SV("answer is '-0.000000e+00'"), SV("answer is '{:e}'"), F(-0.));
1835 check(SV("answer is '-0.000000e+00'"), SV("answer is '{:-e}'"), F(-0.));
1836 check(SV("answer is '-0.000000e+00'"), SV("answer is '{:+e}'"), F(-0.));
1837 check(SV("answer is '-0.000000e+00'"), SV("answer is '{: e}'"), F(-0.));
1839 // [format.string.std]/5 The sign option applies to floating-point infinity and NaN.
1840 check(SV("answer is 'inf'"), SV("answer is '{:e}'"), std::numeric_limits
<F
>::infinity());
1841 check(SV("answer is 'inf'"), SV("answer is '{:-e}'"), std::numeric_limits
<F
>::infinity());
1842 check(SV("answer is '+inf'"), SV("answer is '{:+e}'"), std::numeric_limits
<F
>::infinity());
1843 check(SV("answer is ' inf'"), SV("answer is '{: e}'"), std::numeric_limits
<F
>::infinity());
1845 check(SV("answer is '-inf'"), SV("answer is '{:e}'"), -std::numeric_limits
<F
>::infinity());
1846 check(SV("answer is '-inf'"), SV("answer is '{:-e}'"), -std::numeric_limits
<F
>::infinity());
1847 check(SV("answer is '-inf'"), SV("answer is '{:+e}'"), -std::numeric_limits
<F
>::infinity());
1848 check(SV("answer is '-inf'"), SV("answer is '{: e}'"), -std::numeric_limits
<F
>::infinity());
1850 check(SV("answer is 'nan'"), SV("answer is '{:e}'"), nan_pos
);
1851 check(SV("answer is 'nan'"), SV("answer is '{:-e}'"), nan_pos
);
1852 check(SV("answer is '+nan'"), SV("answer is '{:+e}'"), nan_pos
);
1853 check(SV("answer is ' nan'"), SV("answer is '{: e}'"), nan_pos
);
1855 check(SV("answer is '-nan'"), SV("answer is '{:e}'"), nan_neg
);
1856 check(SV("answer is '-nan'"), SV("answer is '{:-e}'"), nan_neg
);
1857 check(SV("answer is '-nan'"), SV("answer is '{:+e}'"), nan_neg
);
1858 check(SV("answer is '-nan'"), SV("answer is '{: e}'"), nan_neg
);
1860 // *** alternate form **
1861 // When precision is zero there's no decimal point except when the alternate form is specified.
1862 check(SV("answer is '0e+00'"), SV("answer is '{:.0e}'"), F(0));
1863 check(SV("answer is '0.e+00'"), SV("answer is '{:#.0e}'"), F(0));
1865 check(SV("answer is '0.000000e+00'"), SV("answer is '{:#e}'"), F(0));
1866 check(SV("answer is '2.500000e+00'"), SV("answer is '{:#e}'"), F(2.5));
1868 check(SV("answer is 'inf'"), SV("answer is '{:#e}'"), std::numeric_limits
<F
>::infinity());
1869 check(SV("answer is '-inf'"), SV("answer is '{:#e}'"), -std::numeric_limits
<F
>::infinity());
1871 check(SV("answer is 'nan'"), SV("answer is '{:#e}'"), nan_pos
);
1872 check(SV("answer is '-nan'"), SV("answer is '{:#e}'"), nan_neg
);
1874 // *** zero-padding & width ***
1875 check(SV("answer is '3.125000e-02'"), SV("answer is '{:07e}'"), 0.03125);
1876 check(SV("answer is '+3.125000e-02'"), SV("answer is '{:+07e}'"), 0.03125);
1877 check(SV("answer is '+3.125000e-02'"), SV("answer is '{:+08e}'"), 0.03125);
1878 check(SV("answer is '+3.125000e-02'"), SV("answer is '{:+09e}'"), 0.03125);
1880 check(SV("answer is '003.125000e-02'"), SV("answer is '{:014e}'"), 0.03125);
1881 check(SV("answer is '003.125000e-02'"), SV("answer is '{:-014e}'"), 0.03125);
1882 check(SV("answer is '+03.125000e-02'"), SV("answer is '{:+014e}'"), 0.03125);
1883 check(SV("answer is ' 03.125000e-02'"), SV("answer is '{: 014e}'"), 0.03125);
1885 check(SV("answer is ' inf'"), SV("answer is '{:010e}'"), std::numeric_limits
<F
>::infinity());
1886 check(SV("answer is ' inf'"), SV("answer is '{:-010e}'"), std::numeric_limits
<F
>::infinity());
1887 check(SV("answer is ' +inf'"), SV("answer is '{:+010e}'"), std::numeric_limits
<F
>::infinity());
1888 check(SV("answer is ' inf'"), SV("answer is '{: 010e}'"), std::numeric_limits
<F
>::infinity());
1890 check(SV("answer is ' -inf'"), SV("answer is '{:010e}'"), -std::numeric_limits
<F
>::infinity());
1891 check(SV("answer is ' -inf'"), SV("answer is '{:-010e}'"), -std::numeric_limits
<F
>::infinity());
1892 check(SV("answer is ' -inf'"), SV("answer is '{:+010e}'"), -std::numeric_limits
<F
>::infinity());
1893 check(SV("answer is ' -inf'"), SV("answer is '{: 010e}'"), -std::numeric_limits
<F
>::infinity());
1895 check(SV("answer is ' nan'"), SV("answer is '{:010e}'"), nan_pos
);
1896 check(SV("answer is ' nan'"), SV("answer is '{:-010e}'"), nan_pos
);
1897 check(SV("answer is ' +nan'"), SV("answer is '{:+010e}'"), nan_pos
);
1898 check(SV("answer is ' nan'"), SV("answer is '{: 010e}'"), nan_pos
);
1900 check(SV("answer is ' -nan'"), SV("answer is '{:010e}'"), nan_neg
);
1901 check(SV("answer is ' -nan'"), SV("answer is '{:-010e}'"), nan_neg
);
1902 check(SV("answer is ' -nan'"), SV("answer is '{:+010e}'"), nan_neg
);
1903 check(SV("answer is ' -nan'"), SV("answer is '{: 010e}'"), nan_neg
);
1905 // *** precision ***
1906 check(SV("answer is '3e-02'"), SV("answer is '{:.0e}'"), 0.03125);
1907 check(SV("answer is '3.1e-02'"), SV("answer is '{:.1e}'"), 0.03125);
1908 check(SV("answer is '3.125e-02'"), SV("answer is '{:.3e}'"), 0.03125);
1909 check(SV("answer is '3.1250000000e-02'"), SV("answer is '{:.10e}'"), 0.03125);
1911 // *** locale-specific form ***
1912 // See locale-specific_form.pass.cpp
1915 template <class F
, class CharT
, class TestFunction
>
1916 void format_test_floating_point_scientific_upper_case(TestFunction check
) {
1917 auto nan_pos
= std::numeric_limits
<F
>::quiet_NaN(); // "nan"
1918 auto nan_neg
= std::copysign(nan_pos
, static_cast<decltype(nan_pos
)>(-1.0)); // "-nan"
1920 // *** align-fill & width ***
1921 check(SV("answer is ' 2.500000E-01'"), SV("answer is '{:15E}'"), F(0.25));
1922 check(SV("answer is ' 2.500000E-01'"), SV("answer is '{:>15E}'"), F(0.25));
1923 check(SV("answer is '2.500000E-01 '"), SV("answer is '{:<15E}'"), F(0.25));
1924 check(SV("answer is ' 2.500000E-01 '"), SV("answer is '{:^15E}'"), F(0.25));
1926 check(SV("answer is '---1.250000E-01'"), SV("answer is '{:->15E}'"), F(125e-3));
1927 check(SV("answer is '1.250000E-01---'"), SV("answer is '{:-<15E}'"), F(125e-3));
1928 check(SV("answer is '-1.250000E-01--'"), SV("answer is '{:-^15E}'"), F(125e-3));
1930 check(SV("answer is '***INF'"), SV("answer is '{:*>6E}'"), std::numeric_limits
<F
>::infinity());
1931 check(SV("answer is 'INF***'"), SV("answer is '{:*<6E}'"), std::numeric_limits
<F
>::infinity());
1932 check(SV("answer is '*INF**'"), SV("answer is '{:*^6E}'"), std::numeric_limits
<F
>::infinity());
1934 check(SV("answer is '###-INF'"), SV("answer is '{:#>7E}'"), -std::numeric_limits
<F
>::infinity());
1935 check(SV("answer is '-INF###'"), SV("answer is '{:#<7E}'"), -std::numeric_limits
<F
>::infinity());
1936 check(SV("answer is '#-INF##'"), SV("answer is '{:#^7E}'"), -std::numeric_limits
<F
>::infinity());
1938 check(SV("answer is '^^^NAN'"), SV("answer is '{:^>6E}'"), nan_pos
);
1939 check(SV("answer is 'NAN^^^'"), SV("answer is '{:^<6E}'"), nan_pos
);
1940 check(SV("answer is '^NAN^^'"), SV("answer is '{:^^6E}'"), nan_pos
);
1942 check(SV("answer is '000-NAN'"), SV("answer is '{:0>7E}'"), nan_neg
);
1943 check(SV("answer is '-NAN000'"), SV("answer is '{:0<7E}'"), nan_neg
);
1944 check(SV("answer is '0-NAN00'"), SV("answer is '{:0^7E}'"), nan_neg
);
1946 // Test whether zero padding is ignored
1947 check(SV("answer is ' 2.500000E-01'"), SV("answer is '{:>015E}'"), F(0.25));
1948 check(SV("answer is '2.500000E-01 '"), SV("answer is '{:<015E}'"), F(0.25));
1949 check(SV("answer is ' 2.500000E-01 '"), SV("answer is '{:^015E}'"), F(0.25));
1952 check(SV("answer is '0.000000E+00'"), SV("answer is '{:E}'"), F(0));
1953 check(SV("answer is '0.000000E+00'"), SV("answer is '{:-E}'"), F(0));
1954 check(SV("answer is '+0.000000E+00'"), SV("answer is '{:+E}'"), F(0));
1955 check(SV("answer is ' 0.000000E+00'"), SV("answer is '{: E}'"), F(0));
1957 check(SV("answer is '-0.000000E+00'"), SV("answer is '{:E}'"), F(-0.));
1958 check(SV("answer is '-0.000000E+00'"), SV("answer is '{:-E}'"), F(-0.));
1959 check(SV("answer is '-0.000000E+00'"), SV("answer is '{:+E}'"), F(-0.));
1960 check(SV("answer is '-0.000000E+00'"), SV("answer is '{: E}'"), F(-0.));
1962 // [format.string.std]/5 The sign option applies to floating-point infinity and NaN.
1963 check(SV("answer is 'INF'"), SV("answer is '{:E}'"), std::numeric_limits
<F
>::infinity());
1964 check(SV("answer is 'INF'"), SV("answer is '{:-E}'"), std::numeric_limits
<F
>::infinity());
1965 check(SV("answer is '+INF'"), SV("answer is '{:+E}'"), std::numeric_limits
<F
>::infinity());
1966 check(SV("answer is ' INF'"), SV("answer is '{: E}'"), std::numeric_limits
<F
>::infinity());
1968 check(SV("answer is '-INF'"), SV("answer is '{:E}'"), -std::numeric_limits
<F
>::infinity());
1969 check(SV("answer is '-INF'"), SV("answer is '{:-E}'"), -std::numeric_limits
<F
>::infinity());
1970 check(SV("answer is '-INF'"), SV("answer is '{:+E}'"), -std::numeric_limits
<F
>::infinity());
1971 check(SV("answer is '-INF'"), SV("answer is '{: E}'"), -std::numeric_limits
<F
>::infinity());
1973 check(SV("answer is 'NAN'"), SV("answer is '{:E}'"), nan_pos
);
1974 check(SV("answer is 'NAN'"), SV("answer is '{:-E}'"), nan_pos
);
1975 check(SV("answer is '+NAN'"), SV("answer is '{:+E}'"), nan_pos
);
1976 check(SV("answer is ' NAN'"), SV("answer is '{: E}'"), nan_pos
);
1978 check(SV("answer is '-NAN'"), SV("answer is '{:E}'"), nan_neg
);
1979 check(SV("answer is '-NAN'"), SV("answer is '{:-E}'"), nan_neg
);
1980 check(SV("answer is '-NAN'"), SV("answer is '{:+E}'"), nan_neg
);
1981 check(SV("answer is '-NAN'"), SV("answer is '{: E}'"), nan_neg
);
1983 // *** alternate form **
1984 // When precision is zero there's no decimal point except when the alternate form is specified.
1985 check(SV("answer is '0E+00'"), SV("answer is '{:.0E}'"), F(0));
1986 check(SV("answer is '0.E+00'"), SV("answer is '{:#.0E}'"), F(0));
1988 check(SV("answer is '0.000000E+00'"), SV("answer is '{:#E}'"), F(0));
1989 check(SV("answer is '2.500000E+00'"), SV("answer is '{:#E}'"), F(2.5));
1991 check(SV("answer is 'INF'"), SV("answer is '{:#E}'"), std::numeric_limits
<F
>::infinity());
1992 check(SV("answer is '-INF'"), SV("answer is '{:#E}'"), -std::numeric_limits
<F
>::infinity());
1994 check(SV("answer is 'NAN'"), SV("answer is '{:#E}'"), nan_pos
);
1995 check(SV("answer is '-NAN'"), SV("answer is '{:#E}'"), nan_neg
);
1997 // *** zero-padding & width ***
1998 check(SV("answer is '3.125000E-02'"), SV("answer is '{:07E}'"), 0.03125);
1999 check(SV("answer is '+3.125000E-02'"), SV("answer is '{:+07E}'"), 0.03125);
2000 check(SV("answer is '+3.125000E-02'"), SV("answer is '{:+08E}'"), 0.03125);
2001 check(SV("answer is '+3.125000E-02'"), SV("answer is '{:+09E}'"), 0.03125);
2003 check(SV("answer is '003.125000E-02'"), SV("answer is '{:014E}'"), 0.03125);
2004 check(SV("answer is '003.125000E-02'"), SV("answer is '{:-014E}'"), 0.03125);
2005 check(SV("answer is '+03.125000E-02'"), SV("answer is '{:+014E}'"), 0.03125);
2006 check(SV("answer is ' 03.125000E-02'"), SV("answer is '{: 014E}'"), 0.03125);
2008 check(SV("answer is ' INF'"), SV("answer is '{:010E}'"), std::numeric_limits
<F
>::infinity());
2009 check(SV("answer is ' INF'"), SV("answer is '{:-010E}'"), std::numeric_limits
<F
>::infinity());
2010 check(SV("answer is ' +INF'"), SV("answer is '{:+010E}'"), std::numeric_limits
<F
>::infinity());
2011 check(SV("answer is ' INF'"), SV("answer is '{: 010E}'"), std::numeric_limits
<F
>::infinity());
2013 check(SV("answer is ' -INF'"), SV("answer is '{:010E}'"), -std::numeric_limits
<F
>::infinity());
2014 check(SV("answer is ' -INF'"), SV("answer is '{:-010E}'"), -std::numeric_limits
<F
>::infinity());
2015 check(SV("answer is ' -INF'"), SV("answer is '{:+010E}'"), -std::numeric_limits
<F
>::infinity());
2016 check(SV("answer is ' -INF'"), SV("answer is '{: 010E}'"), -std::numeric_limits
<F
>::infinity());
2018 check(SV("answer is ' NAN'"), SV("answer is '{:010E}'"), nan_pos
);
2019 check(SV("answer is ' NAN'"), SV("answer is '{:-010E}'"), nan_pos
);
2020 check(SV("answer is ' +NAN'"), SV("answer is '{:+010E}'"), nan_pos
);
2021 check(SV("answer is ' NAN'"), SV("answer is '{: 010E}'"), nan_pos
);
2023 check(SV("answer is ' -NAN'"), SV("answer is '{:010E}'"), nan_neg
);
2024 check(SV("answer is ' -NAN'"), SV("answer is '{:-010E}'"), nan_neg
);
2025 check(SV("answer is ' -NAN'"), SV("answer is '{:+010E}'"), nan_neg
);
2026 check(SV("answer is ' -NAN'"), SV("answer is '{: 010E}'"), nan_neg
);
2028 // *** precision ***
2029 check(SV("answer is '3E-02'"), SV("answer is '{:.0E}'"), 0.03125);
2030 check(SV("answer is '3.1E-02'"), SV("answer is '{:.1E}'"), 0.03125);
2031 check(SV("answer is '3.125E-02'"), SV("answer is '{:.3E}'"), 0.03125);
2032 check(SV("answer is '3.1250000000E-02'"), SV("answer is '{:.10E}'"), 0.03125);
2034 // *** locale-specific form ***
2035 // See locale-specific_form.pass.cpp
2038 template <class F
, class CharT
, class TestFunction
>
2039 void format_test_floating_point_fixed_lower_case(TestFunction check
) {
2040 auto nan_pos
= std::numeric_limits
<F
>::quiet_NaN(); // "nan"
2041 auto nan_neg
= std::copysign(nan_pos
, static_cast<decltype(nan_pos
)>(-1.0)); // "-nan"
2043 // *** align-fill & width ***
2044 check(SV("answer is ' 0.250000'"), SV("answer is '{:11f}'"), F(0.25));
2045 check(SV("answer is ' 0.250000'"), SV("answer is '{:>11f}'"), F(0.25));
2046 check(SV("answer is '0.250000 '"), SV("answer is '{:<11f}'"), F(0.25));
2047 check(SV("answer is ' 0.250000 '"), SV("answer is '{:^11f}'"), F(0.25));
2049 check(SV("answer is '---0.125000'"), SV("answer is '{:->11f}'"), F(125e-3));
2050 check(SV("answer is '0.125000---'"), SV("answer is '{:-<11f}'"), F(125e-3));
2051 check(SV("answer is '-0.125000--'"), SV("answer is '{:-^11f}'"), F(125e-3));
2053 check(SV("answer is '***inf'"), SV("answer is '{:*>6f}'"), std::numeric_limits
<F
>::infinity());
2054 check(SV("answer is 'inf***'"), SV("answer is '{:*<6f}'"), std::numeric_limits
<F
>::infinity());
2055 check(SV("answer is '*inf**'"), SV("answer is '{:*^6f}'"), std::numeric_limits
<F
>::infinity());
2057 check(SV("answer is '###-inf'"), SV("answer is '{:#>7f}'"), -std::numeric_limits
<F
>::infinity());
2058 check(SV("answer is '-inf###'"), SV("answer is '{:#<7f}'"), -std::numeric_limits
<F
>::infinity());
2059 check(SV("answer is '#-inf##'"), SV("answer is '{:#^7f}'"), -std::numeric_limits
<F
>::infinity());
2061 check(SV("answer is '^^^nan'"), SV("answer is '{:^>6f}'"), nan_pos
);
2062 check(SV("answer is 'nan^^^'"), SV("answer is '{:^<6f}'"), nan_pos
);
2063 check(SV("answer is '^nan^^'"), SV("answer is '{:^^6f}'"), nan_pos
);
2065 check(SV("answer is '000-nan'"), SV("answer is '{:0>7f}'"), nan_neg
);
2066 check(SV("answer is '-nan000'"), SV("answer is '{:0<7f}'"), nan_neg
);
2067 check(SV("answer is '0-nan00'"), SV("answer is '{:0^7f}'"), nan_neg
);
2069 // Test whether zero padding is ignored
2070 check(SV("answer is ' 0.250000'"), SV("answer is '{:>011f}'"), F(0.25));
2071 check(SV("answer is '0.250000 '"), SV("answer is '{:<011f}'"), F(0.25));
2072 check(SV("answer is ' 0.250000 '"), SV("answer is '{:^011f}'"), F(0.25));
2075 check(SV("answer is '0.000000'"), SV("answer is '{:f}'"), F(0));
2076 check(SV("answer is '0.000000'"), SV("answer is '{:-f}'"), F(0));
2077 check(SV("answer is '+0.000000'"), SV("answer is '{:+f}'"), F(0));
2078 check(SV("answer is ' 0.000000'"), SV("answer is '{: f}'"), F(0));
2080 check(SV("answer is '-0.000000'"), SV("answer is '{:f}'"), F(-0.));
2081 check(SV("answer is '-0.000000'"), SV("answer is '{:-f}'"), F(-0.));
2082 check(SV("answer is '-0.000000'"), SV("answer is '{:+f}'"), F(-0.));
2083 check(SV("answer is '-0.000000'"), SV("answer is '{: f}'"), F(-0.));
2085 // [format.string.std]/5 The sign option applies to floating-point infinity and NaN.
2086 check(SV("answer is 'inf'"), SV("answer is '{:f}'"), std::numeric_limits
<F
>::infinity());
2087 check(SV("answer is 'inf'"), SV("answer is '{:-f}'"), std::numeric_limits
<F
>::infinity());
2088 check(SV("answer is '+inf'"), SV("answer is '{:+f}'"), std::numeric_limits
<F
>::infinity());
2089 check(SV("answer is ' inf'"), SV("answer is '{: f}'"), std::numeric_limits
<F
>::infinity());
2091 check(SV("answer is '-inf'"), SV("answer is '{:f}'"), -std::numeric_limits
<F
>::infinity());
2092 check(SV("answer is '-inf'"), SV("answer is '{:-f}'"), -std::numeric_limits
<F
>::infinity());
2093 check(SV("answer is '-inf'"), SV("answer is '{:+f}'"), -std::numeric_limits
<F
>::infinity());
2094 check(SV("answer is '-inf'"), SV("answer is '{: f}'"), -std::numeric_limits
<F
>::infinity());
2096 check(SV("answer is 'nan'"), SV("answer is '{:f}'"), nan_pos
);
2097 check(SV("answer is 'nan'"), SV("answer is '{:-f}'"), nan_pos
);
2098 check(SV("answer is '+nan'"), SV("answer is '{:+f}'"), nan_pos
);
2099 check(SV("answer is ' nan'"), SV("answer is '{: f}'"), nan_pos
);
2101 check(SV("answer is '-nan'"), SV("answer is '{:f}'"), nan_neg
);
2102 check(SV("answer is '-nan'"), SV("answer is '{:-f}'"), nan_neg
);
2103 check(SV("answer is '-nan'"), SV("answer is '{:+f}'"), nan_neg
);
2104 check(SV("answer is '-nan'"), SV("answer is '{: f}'"), nan_neg
);
2106 // *** alternate form **
2107 // When precision is zero there's no decimal point except when the alternate form is specified.
2108 check(SV("answer is '0'"), SV("answer is '{:.0f}'"), F(0));
2109 check(SV("answer is '0.'"), SV("answer is '{:#.0f}'"), F(0));
2111 check(SV("answer is '0.000000'"), SV("answer is '{:#f}'"), F(0));
2112 check(SV("answer is '2.500000'"), SV("answer is '{:#f}'"), F(2.5));
2114 check(SV("answer is 'inf'"), SV("answer is '{:#f}'"), std::numeric_limits
<F
>::infinity());
2115 check(SV("answer is '-inf'"), SV("answer is '{:#f}'"), -std::numeric_limits
<F
>::infinity());
2117 check(SV("answer is 'nan'"), SV("answer is '{:#f}'"), nan_pos
);
2118 check(SV("answer is '-nan'"), SV("answer is '{:#f}'"), nan_neg
);
2120 // *** zero-padding & width ***
2121 check(SV("answer is '0.031250'"), SV("answer is '{:07f}'"), 0.03125);
2122 check(SV("answer is '+0.031250'"), SV("answer is '{:+07f}'"), 0.03125);
2123 check(SV("answer is '+0.031250'"), SV("answer is '{:+08f}'"), 0.03125);
2124 check(SV("answer is '+0.031250'"), SV("answer is '{:+09f}'"), 0.03125);
2126 check(SV("answer is '000.031250'"), SV("answer is '{:010f}'"), 0.03125);
2127 check(SV("answer is '000.031250'"), SV("answer is '{:-010f}'"), 0.03125);
2128 check(SV("answer is '+00.031250'"), SV("answer is '{:+010f}'"), 0.03125);
2129 check(SV("answer is ' 00.031250'"), SV("answer is '{: 010f}'"), 0.03125);
2131 check(SV("answer is ' inf'"), SV("answer is '{:010f}'"), std::numeric_limits
<F
>::infinity());
2132 check(SV("answer is ' inf'"), SV("answer is '{:-010f}'"), std::numeric_limits
<F
>::infinity());
2133 check(SV("answer is ' +inf'"), SV("answer is '{:+010f}'"), std::numeric_limits
<F
>::infinity());
2134 check(SV("answer is ' inf'"), SV("answer is '{: 010f}'"), std::numeric_limits
<F
>::infinity());
2136 check(SV("answer is ' -inf'"), SV("answer is '{:010f}'"), -std::numeric_limits
<F
>::infinity());
2137 check(SV("answer is ' -inf'"), SV("answer is '{:-010f}'"), -std::numeric_limits
<F
>::infinity());
2138 check(SV("answer is ' -inf'"), SV("answer is '{:+010f}'"), -std::numeric_limits
<F
>::infinity());
2139 check(SV("answer is ' -inf'"), SV("answer is '{: 010f}'"), -std::numeric_limits
<F
>::infinity());
2141 check(SV("answer is ' nan'"), SV("answer is '{:010f}'"), nan_pos
);
2142 check(SV("answer is ' nan'"), SV("answer is '{:-010f}'"), nan_pos
);
2143 check(SV("answer is ' +nan'"), SV("answer is '{:+010f}'"), nan_pos
);
2144 check(SV("answer is ' nan'"), SV("answer is '{: 010f}'"), nan_pos
);
2146 check(SV("answer is ' -nan'"), SV("answer is '{:010f}'"), nan_neg
);
2147 check(SV("answer is ' -nan'"), SV("answer is '{:-010f}'"), nan_neg
);
2148 check(SV("answer is ' -nan'"), SV("answer is '{:+010f}'"), nan_neg
);
2149 check(SV("answer is ' -nan'"), SV("answer is '{: 010f}'"), nan_neg
);
2151 // *** precision ***
2152 check(SV("answer is '0'"), SV("answer is '{:.0f}'"), 0.03125);
2153 check(SV("answer is '0.0'"), SV("answer is '{:.1f}'"), 0.03125);
2154 check(SV("answer is '0.03125'"), SV("answer is '{:.5f}'"), 0.03125);
2155 check(SV("answer is '0.0312500000'"), SV("answer is '{:.10f}'"), 0.03125);
2157 // *** locale-specific form ***
2158 // See locale-specific_form.pass.cpp
2161 template <class F
, class CharT
, class TestFunction
>
2162 void format_test_floating_point_fixed_upper_case(TestFunction check
) {
2163 auto nan_pos
= std::numeric_limits
<F
>::quiet_NaN(); // "nan"
2164 auto nan_neg
= std::copysign(nan_pos
, static_cast<decltype(nan_pos
)>(-1.0)); // "-nan"
2166 // *** align-fill & width ***
2167 check(SV("answer is ' 0.250000'"), SV("answer is '{:11F}'"), F(0.25));
2168 check(SV("answer is ' 0.250000'"), SV("answer is '{:>11F}'"), F(0.25));
2169 check(SV("answer is '0.250000 '"), SV("answer is '{:<11F}'"), F(0.25));
2170 check(SV("answer is ' 0.250000 '"), SV("answer is '{:^11F}'"), F(0.25));
2172 check(SV("answer is '---0.125000'"), SV("answer is '{:->11F}'"), F(125e-3));
2173 check(SV("answer is '0.125000---'"), SV("answer is '{:-<11F}'"), F(125e-3));
2174 check(SV("answer is '-0.125000--'"), SV("answer is '{:-^11F}'"), F(125e-3));
2176 check(SV("answer is '***INF'"), SV("answer is '{:*>6F}'"), std::numeric_limits
<F
>::infinity());
2177 check(SV("answer is 'INF***'"), SV("answer is '{:*<6F}'"), std::numeric_limits
<F
>::infinity());
2178 check(SV("answer is '*INF**'"), SV("answer is '{:*^6F}'"), std::numeric_limits
<F
>::infinity());
2180 check(SV("answer is '###-INF'"), SV("answer is '{:#>7F}'"), -std::numeric_limits
<F
>::infinity());
2181 check(SV("answer is '-INF###'"), SV("answer is '{:#<7F}'"), -std::numeric_limits
<F
>::infinity());
2182 check(SV("answer is '#-INF##'"), SV("answer is '{:#^7F}'"), -std::numeric_limits
<F
>::infinity());
2184 check(SV("answer is '^^^NAN'"), SV("answer is '{:^>6F}'"), nan_pos
);
2185 check(SV("answer is 'NAN^^^'"), SV("answer is '{:^<6F}'"), nan_pos
);
2186 check(SV("answer is '^NAN^^'"), SV("answer is '{:^^6F}'"), nan_pos
);
2188 check(SV("answer is '000-NAN'"), SV("answer is '{:0>7F}'"), nan_neg
);
2189 check(SV("answer is '-NAN000'"), SV("answer is '{:0<7F}'"), nan_neg
);
2190 check(SV("answer is '0-NAN00'"), SV("answer is '{:0^7F}'"), nan_neg
);
2192 // Test whether zero padding is ignored
2193 check(SV("answer is ' 0.250000'"), SV("answer is '{:>011F}'"), F(0.25));
2194 check(SV("answer is '0.250000 '"), SV("answer is '{:<011F}'"), F(0.25));
2195 check(SV("answer is ' 0.250000 '"), SV("answer is '{:^011F}'"), F(0.25));
2198 check(SV("answer is '0.000000'"), SV("answer is '{:F}'"), F(0));
2199 check(SV("answer is '0.000000'"), SV("answer is '{:-F}'"), F(0));
2200 check(SV("answer is '+0.000000'"), SV("answer is '{:+F}'"), F(0));
2201 check(SV("answer is ' 0.000000'"), SV("answer is '{: F}'"), F(0));
2203 check(SV("answer is '-0.000000'"), SV("answer is '{:F}'"), F(-0.));
2204 check(SV("answer is '-0.000000'"), SV("answer is '{:-F}'"), F(-0.));
2205 check(SV("answer is '-0.000000'"), SV("answer is '{:+F}'"), F(-0.));
2206 check(SV("answer is '-0.000000'"), SV("answer is '{: F}'"), F(-0.));
2208 // [format.string.std]/5 The sign option applies to floating-point infinity and NaN.
2209 check(SV("answer is 'INF'"), SV("answer is '{:F}'"), std::numeric_limits
<F
>::infinity());
2210 check(SV("answer is 'INF'"), SV("answer is '{:-F}'"), std::numeric_limits
<F
>::infinity());
2211 check(SV("answer is '+INF'"), SV("answer is '{:+F}'"), std::numeric_limits
<F
>::infinity());
2212 check(SV("answer is ' INF'"), SV("answer is '{: F}'"), std::numeric_limits
<F
>::infinity());
2214 check(SV("answer is '-INF'"), SV("answer is '{:F}'"), -std::numeric_limits
<F
>::infinity());
2215 check(SV("answer is '-INF'"), SV("answer is '{:-F}'"), -std::numeric_limits
<F
>::infinity());
2216 check(SV("answer is '-INF'"), SV("answer is '{:+F}'"), -std::numeric_limits
<F
>::infinity());
2217 check(SV("answer is '-INF'"), SV("answer is '{: F}'"), -std::numeric_limits
<F
>::infinity());
2219 check(SV("answer is 'NAN'"), SV("answer is '{:F}'"), nan_pos
);
2220 check(SV("answer is 'NAN'"), SV("answer is '{:-F}'"), nan_pos
);
2221 check(SV("answer is '+NAN'"), SV("answer is '{:+F}'"), nan_pos
);
2222 check(SV("answer is ' NAN'"), SV("answer is '{: F}'"), nan_pos
);
2224 check(SV("answer is '-NAN'"), SV("answer is '{:F}'"), nan_neg
);
2225 check(SV("answer is '-NAN'"), SV("answer is '{:-F}'"), nan_neg
);
2226 check(SV("answer is '-NAN'"), SV("answer is '{:+F}'"), nan_neg
);
2227 check(SV("answer is '-NAN'"), SV("answer is '{: F}'"), nan_neg
);
2229 // *** alternate form **
2230 // When precision is zero there's no decimal point except when the alternate form is specified.
2231 check(SV("answer is '0'"), SV("answer is '{:.0F}'"), F(0));
2232 check(SV("answer is '0.'"), SV("answer is '{:#.0F}'"), F(0));
2234 check(SV("answer is '0.000000'"), SV("answer is '{:#F}'"), F(0));
2235 check(SV("answer is '2.500000'"), SV("answer is '{:#F}'"), F(2.5));
2237 check(SV("answer is 'INF'"), SV("answer is '{:#F}'"), std::numeric_limits
<F
>::infinity());
2238 check(SV("answer is '-INF'"), SV("answer is '{:#F}'"), -std::numeric_limits
<F
>::infinity());
2240 check(SV("answer is 'NAN'"), SV("answer is '{:#F}'"), nan_pos
);
2241 check(SV("answer is '-NAN'"), SV("answer is '{:#F}'"), nan_neg
);
2243 // *** zero-padding & width ***
2244 check(SV("answer is '0.031250'"), SV("answer is '{:07F}'"), 0.03125);
2245 check(SV("answer is '+0.031250'"), SV("answer is '{:+07F}'"), 0.03125);
2246 check(SV("answer is '+0.031250'"), SV("answer is '{:+08F}'"), 0.03125);
2247 check(SV("answer is '+0.031250'"), SV("answer is '{:+09F}'"), 0.03125);
2249 check(SV("answer is '000.031250'"), SV("answer is '{:010F}'"), 0.03125);
2250 check(SV("answer is '000.031250'"), SV("answer is '{:-010F}'"), 0.03125);
2251 check(SV("answer is '+00.031250'"), SV("answer is '{:+010F}'"), 0.03125);
2252 check(SV("answer is ' 00.031250'"), SV("answer is '{: 010F}'"), 0.03125);
2254 check(SV("answer is ' INF'"), SV("answer is '{:010F}'"), std::numeric_limits
<F
>::infinity());
2255 check(SV("answer is ' INF'"), SV("answer is '{:-010F}'"), std::numeric_limits
<F
>::infinity());
2256 check(SV("answer is ' +INF'"), SV("answer is '{:+010F}'"), std::numeric_limits
<F
>::infinity());
2257 check(SV("answer is ' INF'"), SV("answer is '{: 010F}'"), std::numeric_limits
<F
>::infinity());
2259 check(SV("answer is ' -INF'"), SV("answer is '{:010F}'"), -std::numeric_limits
<F
>::infinity());
2260 check(SV("answer is ' -INF'"), SV("answer is '{:-010F}'"), -std::numeric_limits
<F
>::infinity());
2261 check(SV("answer is ' -INF'"), SV("answer is '{:+010F}'"), -std::numeric_limits
<F
>::infinity());
2262 check(SV("answer is ' -INF'"), SV("answer is '{: 010F}'"), -std::numeric_limits
<F
>::infinity());
2264 check(SV("answer is ' NAN'"), SV("answer is '{:010F}'"), nan_pos
);
2265 check(SV("answer is ' NAN'"), SV("answer is '{:-010F}'"), nan_pos
);
2266 check(SV("answer is ' +NAN'"), SV("answer is '{:+010F}'"), nan_pos
);
2267 check(SV("answer is ' NAN'"), SV("answer is '{: 010F}'"), nan_pos
);
2269 check(SV("answer is ' -NAN'"), SV("answer is '{:010F}'"), nan_neg
);
2270 check(SV("answer is ' -NAN'"), SV("answer is '{:-010F}'"), nan_neg
);
2271 check(SV("answer is ' -NAN'"), SV("answer is '{:+010F}'"), nan_neg
);
2272 check(SV("answer is ' -NAN'"), SV("answer is '{: 010F}'"), nan_neg
);
2274 // *** precision ***
2275 check(SV("answer is '0'"), SV("answer is '{:.0F}'"), 0.03125);
2276 check(SV("answer is '0.0'"), SV("answer is '{:.1F}'"), 0.03125);
2277 check(SV("answer is '0.03125'"), SV("answer is '{:.5F}'"), 0.03125);
2278 check(SV("answer is '0.0312500000'"), SV("answer is '{:.10F}'"), 0.03125);
2280 // *** locale-specific form ***
2281 // See locale-specific_form.pass.cpp
2284 template <class F
, class CharT
, class TestFunction
>
2285 void format_test_floating_point_general_lower_case(TestFunction check
) {
2286 auto nan_pos
= std::numeric_limits
<F
>::quiet_NaN(); // "nan"
2287 auto nan_neg
= std::copysign(nan_pos
, static_cast<decltype(nan_pos
)>(-1.0)); // "-nan"
2289 // *** align-fill & width ***
2290 check(SV("answer is ' 0.25'"), SV("answer is '{:7g}'"), F(0.25));
2291 check(SV("answer is ' 0.25'"), SV("answer is '{:>7g}'"), F(0.25));
2292 check(SV("answer is '0.25 '"), SV("answer is '{:<7g}'"), F(0.25));
2293 check(SV("answer is ' 0.25 '"), SV("answer is '{:^7g}'"), F(0.25));
2295 check(SV("answer is '---0.125'"), SV("answer is '{:->8g}'"), F(125e-3));
2296 check(SV("answer is '0.125---'"), SV("answer is '{:-<8g}'"), F(125e-3));
2297 check(SV("answer is '-0.125--'"), SV("answer is '{:-^8g}'"), F(125e-3));
2299 check(SV("answer is '***inf'"), SV("answer is '{:*>6g}'"), std::numeric_limits
<F
>::infinity());
2300 check(SV("answer is 'inf***'"), SV("answer is '{:*<6g}'"), std::numeric_limits
<F
>::infinity());
2301 check(SV("answer is '*inf**'"), SV("answer is '{:*^6g}'"), std::numeric_limits
<F
>::infinity());
2303 check(SV("answer is '###-inf'"), SV("answer is '{:#>7g}'"), -std::numeric_limits
<F
>::infinity());
2304 check(SV("answer is '-inf###'"), SV("answer is '{:#<7g}'"), -std::numeric_limits
<F
>::infinity());
2305 check(SV("answer is '#-inf##'"), SV("answer is '{:#^7g}'"), -std::numeric_limits
<F
>::infinity());
2307 check(SV("answer is '^^^nan'"), SV("answer is '{:^>6g}'"), nan_pos
);
2308 check(SV("answer is 'nan^^^'"), SV("answer is '{:^<6g}'"), nan_pos
);
2309 check(SV("answer is '^nan^^'"), SV("answer is '{:^^6g}'"), nan_pos
);
2311 check(SV("answer is '000-nan'"), SV("answer is '{:0>7g}'"), nan_neg
);
2312 check(SV("answer is '-nan000'"), SV("answer is '{:0<7g}'"), nan_neg
);
2313 check(SV("answer is '0-nan00'"), SV("answer is '{:0^7g}'"), nan_neg
);
2315 // Test whether zero padding is ignored
2316 check(SV("answer is ' 0.25'"), SV("answer is '{:>07g}'"), F(0.25));
2317 check(SV("answer is '0.25 '"), SV("answer is '{:<07g}'"), F(0.25));
2318 check(SV("answer is ' 0.25 '"), SV("answer is '{:^07g}'"), F(0.25));
2321 check(SV("answer is '0'"), SV("answer is '{:g}'"), F(0));
2322 check(SV("answer is '0'"), SV("answer is '{:-g}'"), F(0));
2323 check(SV("answer is '+0'"), SV("answer is '{:+g}'"), F(0));
2324 check(SV("answer is ' 0'"), SV("answer is '{: g}'"), F(0));
2326 check(SV("answer is '-0'"), SV("answer is '{:g}'"), F(-0.));
2327 check(SV("answer is '-0'"), SV("answer is '{:-g}'"), F(-0.));
2328 check(SV("answer is '-0'"), SV("answer is '{:+g}'"), F(-0.));
2329 check(SV("answer is '-0'"), SV("answer is '{: g}'"), F(-0.));
2331 // [format.string.std]/5 The sign option applies to floating-point infinity and NaN.
2332 check(SV("answer is 'inf'"), SV("answer is '{:g}'"), std::numeric_limits
<F
>::infinity());
2333 check(SV("answer is 'inf'"), SV("answer is '{:-g}'"), std::numeric_limits
<F
>::infinity());
2334 check(SV("answer is '+inf'"), SV("answer is '{:+g}'"), std::numeric_limits
<F
>::infinity());
2335 check(SV("answer is ' inf'"), SV("answer is '{: g}'"), std::numeric_limits
<F
>::infinity());
2337 check(SV("answer is '-inf'"), SV("answer is '{:g}'"), -std::numeric_limits
<F
>::infinity());
2338 check(SV("answer is '-inf'"), SV("answer is '{:-g}'"), -std::numeric_limits
<F
>::infinity());
2339 check(SV("answer is '-inf'"), SV("answer is '{:+g}'"), -std::numeric_limits
<F
>::infinity());
2340 check(SV("answer is '-inf'"), SV("answer is '{: g}'"), -std::numeric_limits
<F
>::infinity());
2342 check(SV("answer is 'nan'"), SV("answer is '{:g}'"), nan_pos
);
2343 check(SV("answer is 'nan'"), SV("answer is '{:-g}'"), nan_pos
);
2344 check(SV("answer is '+nan'"), SV("answer is '{:+g}'"), nan_pos
);
2345 check(SV("answer is ' nan'"), SV("answer is '{: g}'"), nan_pos
);
2347 check(SV("answer is '-nan'"), SV("answer is '{:g}'"), nan_neg
);
2348 check(SV("answer is '-nan'"), SV("answer is '{:-g}'"), nan_neg
);
2349 check(SV("answer is '-nan'"), SV("answer is '{:+g}'"), nan_neg
);
2350 check(SV("answer is '-nan'"), SV("answer is '{: g}'"), nan_neg
);
2352 // *** alternate form **
2353 // When precision is zero there's no decimal point except when the alternate form is specified.
2354 check(SV("answer is '0'"), SV("answer is '{:.0g}'"), F(0));
2355 check(SV("answer is '0.'"), SV("answer is '{:#.0g}'"), F(0));
2357 check(SV("answer is '0.00000'"), SV("answer is '{:#g}'"), F(0));
2358 check(SV("answer is '2.50000'"), SV("answer is '{:#g}'"), F(2.5));
2360 check(SV("answer is 'inf'"), SV("answer is '{:#g}'"), std::numeric_limits
<F
>::infinity());
2361 check(SV("answer is '-inf'"), SV("answer is '{:#g}'"), -std::numeric_limits
<F
>::infinity());
2363 check(SV("answer is 'nan'"), SV("answer is '{:#g}'"), nan_pos
);
2364 check(SV("answer is '-nan'"), SV("answer is '{:#g}'"), nan_neg
);
2366 // *** zero-padding & width ***
2367 check(SV("answer is '0.03125'"), SV("answer is '{:06g}'"), 0.03125);
2368 check(SV("answer is '+0.03125'"), SV("answer is '{:+06g}'"), 0.03125);
2369 check(SV("answer is '+0.03125'"), SV("answer is '{:+07g}'"), 0.03125);
2370 check(SV("answer is '+0.03125'"), SV("answer is '{:+08g}'"), 0.03125);
2372 check(SV("answer is '000.03125'"), SV("answer is '{:09g}'"), 0.03125);
2373 check(SV("answer is '000.03125'"), SV("answer is '{:-09g}'"), 0.03125);
2374 check(SV("answer is '+00.03125'"), SV("answer is '{:+09g}'"), 0.03125);
2375 check(SV("answer is ' 00.03125'"), SV("answer is '{: 09g}'"), 0.03125);
2377 check(SV("answer is ' inf'"), SV("answer is '{:010g}'"), std::numeric_limits
<F
>::infinity());
2378 check(SV("answer is ' inf'"), SV("answer is '{:-010g}'"), std::numeric_limits
<F
>::infinity());
2379 check(SV("answer is ' +inf'"), SV("answer is '{:+010g}'"), std::numeric_limits
<F
>::infinity());
2380 check(SV("answer is ' inf'"), SV("answer is '{: 010g}'"), std::numeric_limits
<F
>::infinity());
2382 check(SV("answer is ' -inf'"), SV("answer is '{:010g}'"), -std::numeric_limits
<F
>::infinity());
2383 check(SV("answer is ' -inf'"), SV("answer is '{:-010g}'"), -std::numeric_limits
<F
>::infinity());
2384 check(SV("answer is ' -inf'"), SV("answer is '{:+010g}'"), -std::numeric_limits
<F
>::infinity());
2385 check(SV("answer is ' -inf'"), SV("answer is '{: 010g}'"), -std::numeric_limits
<F
>::infinity());
2387 check(SV("answer is ' nan'"), SV("answer is '{:010g}'"), nan_pos
);
2388 check(SV("answer is ' nan'"), SV("answer is '{:-010g}'"), nan_pos
);
2389 check(SV("answer is ' +nan'"), SV("answer is '{:+010g}'"), nan_pos
);
2390 check(SV("answer is ' nan'"), SV("answer is '{: 010g}'"), nan_pos
);
2392 check(SV("answer is ' -nan'"), SV("answer is '{:010g}'"), nan_neg
);
2393 check(SV("answer is ' -nan'"), SV("answer is '{:-010g}'"), nan_neg
);
2394 check(SV("answer is ' -nan'"), SV("answer is '{:+010g}'"), nan_neg
);
2395 check(SV("answer is ' -nan'"), SV("answer is '{: 010g}'"), nan_neg
);
2397 // *** precision ***
2398 check(SV("answer is '0.03'"), SV("answer is '{:.0g}'"), 0.03125);
2399 check(SV("answer is '0.03'"), SV("answer is '{:.1g}'"), 0.03125);
2400 check(SV("answer is '0.031'"), SV("answer is '{:.2g}'"), 0.03125);
2401 check(SV("answer is '0.0312'"), SV("answer is '{:.3g}'"), 0.03125);
2402 check(SV("answer is '0.03125'"), SV("answer is '{:.4g}'"), 0.03125);
2403 check(SV("answer is '0.03125'"), SV("answer is '{:.5g}'"), 0.03125);
2404 check(SV("answer is '0.03125'"), SV("answer is '{:.10g}'"), 0.03125);
2406 // *** precision & alternate form ***
2408 // Output validated with printf("%#xg")
2409 check(SV("answer is '1.'"), SV("answer is '{:#.{}g}'"), 1.2, 0);
2410 check(SV("answer is '1.'"), SV("answer is '{:#.{}g}'"), 1.2, 1);
2411 check(SV("answer is '1.2'"), SV("answer is '{:#.{}g}'"), 1.2, 2);
2412 check(SV("answer is '1.20'"), SV("answer is '{:#.{}g}'"), 1.2, 3);
2413 check(SV("answer is '1.200'"), SV("answer is '{:#.{}g}'"), 1.2, 4);
2414 check(SV("answer is '1.2000'"), SV("answer is '{:#.{}g}'"), 1.2, 5);
2415 check(SV("answer is '1.20000'"), SV("answer is '{:#.{}g}'"), 1.2, 6);
2417 check(SV("answer is '1.e+03'"), SV("answer is '{:#.{}g}'"), 1200.0, 0);
2418 check(SV("answer is '1.e+03'"), SV("answer is '{:#.{}g}'"), 1200.0, 1);
2419 check(SV("answer is '1.2e+03'"), SV("answer is '{:#.{}g}'"), 1200.0, 2);
2420 check(SV("answer is '1.20e+03'"), SV("answer is '{:#.{}g}'"), 1200.0, 3);
2421 check(SV("answer is '1200.'"), SV("answer is '{:#.{}g}'"), 1200.0, 4);
2422 check(SV("answer is '1200.0'"), SV("answer is '{:#.{}g}'"), 1200.0, 5);
2423 check(SV("answer is '1200.00'"), SV("answer is '{:#.{}g}'"), 1200.0, 6);
2425 check(SV("answer is '1.e+06'"), SV("answer is '{:#.{}g}'"), 1200000.0, 0);
2426 check(SV("answer is '1.e+06'"), SV("answer is '{:#.{}g}'"), 1200000.0, 1);
2427 check(SV("answer is '1.2e+06'"), SV("answer is '{:#.{}g}'"), 1200000.0, 2);
2428 check(SV("answer is '1.20e+06'"), SV("answer is '{:#.{}g}'"), 1200000.0, 3);
2429 check(SV("answer is '1.200e+06'"), SV("answer is '{:#.{}g}'"), 1200000.0, 4);
2430 check(SV("answer is '1.2000e+06'"), SV("answer is '{:#.{}g}'"), 1200000.0, 5);
2431 check(SV("answer is '1.20000e+06'"), SV("answer is '{:#.{}g}'"), 1200000.0, 6);
2433 // *** locale-specific form ***
2434 // See locale-specific_form.pass.cpp
2437 template <class F
, class CharT
, class TestFunction
>
2438 void format_test_floating_point_general_upper_case(TestFunction check
) {
2439 auto nan_pos
= std::numeric_limits
<F
>::quiet_NaN(); // "nan"
2440 auto nan_neg
= std::copysign(nan_pos
, static_cast<decltype(nan_pos
)>(-1.0)); // "-nan"
2442 // *** align-fill & width ***
2443 check(SV("answer is ' 0.25'"), SV("answer is '{:7G}'"), F(0.25));
2444 check(SV("answer is ' 0.25'"), SV("answer is '{:>7G}'"), F(0.25));
2445 check(SV("answer is '0.25 '"), SV("answer is '{:<7G}'"), F(0.25));
2446 check(SV("answer is ' 0.25 '"), SV("answer is '{:^7G}'"), F(0.25));
2448 check(SV("answer is '---0.125'"), SV("answer is '{:->8G}'"), F(125e-3));
2449 check(SV("answer is '0.125---'"), SV("answer is '{:-<8G}'"), F(125e-3));
2450 check(SV("answer is '-0.125--'"), SV("answer is '{:-^8G}'"), F(125e-3));
2452 check(SV("answer is '***INF'"), SV("answer is '{:*>6G}'"), std::numeric_limits
<F
>::infinity());
2453 check(SV("answer is 'INF***'"), SV("answer is '{:*<6G}'"), std::numeric_limits
<F
>::infinity());
2454 check(SV("answer is '*INF**'"), SV("answer is '{:*^6G}'"), std::numeric_limits
<F
>::infinity());
2456 check(SV("answer is '###-INF'"), SV("answer is '{:#>7G}'"), -std::numeric_limits
<F
>::infinity());
2457 check(SV("answer is '-INF###'"), SV("answer is '{:#<7G}'"), -std::numeric_limits
<F
>::infinity());
2458 check(SV("answer is '#-INF##'"), SV("answer is '{:#^7G}'"), -std::numeric_limits
<F
>::infinity());
2460 check(SV("answer is '^^^NAN'"), SV("answer is '{:^>6G}'"), nan_pos
);
2461 check(SV("answer is 'NAN^^^'"), SV("answer is '{:^<6G}'"), nan_pos
);
2462 check(SV("answer is '^NAN^^'"), SV("answer is '{:^^6G}'"), nan_pos
);
2464 check(SV("answer is '000-NAN'"), SV("answer is '{:0>7G}'"), nan_neg
);
2465 check(SV("answer is '-NAN000'"), SV("answer is '{:0<7G}'"), nan_neg
);
2466 check(SV("answer is '0-NAN00'"), SV("answer is '{:0^7G}'"), nan_neg
);
2468 // Test whether zero padding is ignored
2469 check(SV("answer is ' 0.25'"), SV("answer is '{:>07G}'"), F(0.25));
2470 check(SV("answer is '0.25 '"), SV("answer is '{:<07G}'"), F(0.25));
2471 check(SV("answer is ' 0.25 '"), SV("answer is '{:^07G}'"), F(0.25));
2474 check(SV("answer is '0'"), SV("answer is '{:G}'"), F(0));
2475 check(SV("answer is '0'"), SV("answer is '{:-G}'"), F(0));
2476 check(SV("answer is '+0'"), SV("answer is '{:+G}'"), F(0));
2477 check(SV("answer is ' 0'"), SV("answer is '{: G}'"), F(0));
2479 check(SV("answer is '-0'"), SV("answer is '{:G}'"), F(-0.));
2480 check(SV("answer is '-0'"), SV("answer is '{:-G}'"), F(-0.));
2481 check(SV("answer is '-0'"), SV("answer is '{:+G}'"), F(-0.));
2482 check(SV("answer is '-0'"), SV("answer is '{: G}'"), F(-0.));
2484 // [format.string.std]/5 The sign option applies to floating-point infinity and NaN.
2485 check(SV("answer is 'INF'"), SV("answer is '{:G}'"), std::numeric_limits
<F
>::infinity());
2486 check(SV("answer is 'INF'"), SV("answer is '{:-G}'"), std::numeric_limits
<F
>::infinity());
2487 check(SV("answer is '+INF'"), SV("answer is '{:+G}'"), std::numeric_limits
<F
>::infinity());
2488 check(SV("answer is ' INF'"), SV("answer is '{: G}'"), std::numeric_limits
<F
>::infinity());
2490 check(SV("answer is '-INF'"), SV("answer is '{:G}'"), -std::numeric_limits
<F
>::infinity());
2491 check(SV("answer is '-INF'"), SV("answer is '{:-G}'"), -std::numeric_limits
<F
>::infinity());
2492 check(SV("answer is '-INF'"), SV("answer is '{:+G}'"), -std::numeric_limits
<F
>::infinity());
2493 check(SV("answer is '-INF'"), SV("answer is '{: G}'"), -std::numeric_limits
<F
>::infinity());
2495 check(SV("answer is 'NAN'"), SV("answer is '{:G}'"), nan_pos
);
2496 check(SV("answer is 'NAN'"), SV("answer is '{:-G}'"), nan_pos
);
2497 check(SV("answer is '+NAN'"), SV("answer is '{:+G}'"), nan_pos
);
2498 check(SV("answer is ' NAN'"), SV("answer is '{: G}'"), nan_pos
);
2500 check(SV("answer is '-NAN'"), SV("answer is '{:G}'"), nan_neg
);
2501 check(SV("answer is '-NAN'"), SV("answer is '{:-G}'"), nan_neg
);
2502 check(SV("answer is '-NAN'"), SV("answer is '{:+G}'"), nan_neg
);
2503 check(SV("answer is '-NAN'"), SV("answer is '{: G}'"), nan_neg
);
2505 // *** alternate form **
2506 // When precision is zero there's no decimal point except when the alternate form is specified.
2507 check(SV("answer is '0'"), SV("answer is '{:.0G}'"), F(0));
2508 check(SV("answer is '0.'"), SV("answer is '{:#.0G}'"), F(0));
2510 check(SV("answer is '0.00000'"), SV("answer is '{:#G}'"), F(0));
2511 check(SV("answer is '2.50000'"), SV("answer is '{:#G}'"), F(2.5));
2513 check(SV("answer is 'INF'"), SV("answer is '{:#G}'"), std::numeric_limits
<F
>::infinity());
2514 check(SV("answer is '-INF'"), SV("answer is '{:#G}'"), -std::numeric_limits
<F
>::infinity());
2516 check(SV("answer is 'NAN'"), SV("answer is '{:#G}'"), nan_pos
);
2517 check(SV("answer is '-NAN'"), SV("answer is '{:#G}'"), nan_neg
);
2519 // *** zero-padding & width ***
2520 check(SV("answer is '0.03125'"), SV("answer is '{:06G}'"), 0.03125);
2521 check(SV("answer is '+0.03125'"), SV("answer is '{:+06G}'"), 0.03125);
2522 check(SV("answer is '+0.03125'"), SV("answer is '{:+07G}'"), 0.03125);
2523 check(SV("answer is '+0.03125'"), SV("answer is '{:+08G}'"), 0.03125);
2525 check(SV("answer is '000.03125'"), SV("answer is '{:09G}'"), 0.03125);
2526 check(SV("answer is '000.03125'"), SV("answer is '{:-09G}'"), 0.03125);
2527 check(SV("answer is '+00.03125'"), SV("answer is '{:+09G}'"), 0.03125);
2528 check(SV("answer is ' 00.03125'"), SV("answer is '{: 09G}'"), 0.03125);
2530 check(SV("answer is ' INF'"), SV("answer is '{:010G}'"), std::numeric_limits
<F
>::infinity());
2531 check(SV("answer is ' INF'"), SV("answer is '{:-010G}'"), std::numeric_limits
<F
>::infinity());
2532 check(SV("answer is ' +INF'"), SV("answer is '{:+010G}'"), std::numeric_limits
<F
>::infinity());
2533 check(SV("answer is ' INF'"), SV("answer is '{: 010G}'"), std::numeric_limits
<F
>::infinity());
2535 check(SV("answer is ' -INF'"), SV("answer is '{:010G}'"), -std::numeric_limits
<F
>::infinity());
2536 check(SV("answer is ' -INF'"), SV("answer is '{:-010G}'"), -std::numeric_limits
<F
>::infinity());
2537 check(SV("answer is ' -INF'"), SV("answer is '{:+010G}'"), -std::numeric_limits
<F
>::infinity());
2538 check(SV("answer is ' -INF'"), SV("answer is '{: 010G}'"), -std::numeric_limits
<F
>::infinity());
2540 check(SV("answer is ' NAN'"), SV("answer is '{:010G}'"), nan_pos
);
2541 check(SV("answer is ' NAN'"), SV("answer is '{:-010G}'"), nan_pos
);
2542 check(SV("answer is ' +NAN'"), SV("answer is '{:+010G}'"), nan_pos
);
2543 check(SV("answer is ' NAN'"), SV("answer is '{: 010G}'"), nan_pos
);
2545 check(SV("answer is ' -NAN'"), SV("answer is '{:010G}'"), nan_neg
);
2546 check(SV("answer is ' -NAN'"), SV("answer is '{:-010G}'"), nan_neg
);
2547 check(SV("answer is ' -NAN'"), SV("answer is '{:+010G}'"), nan_neg
);
2548 check(SV("answer is ' -NAN'"), SV("answer is '{: 010G}'"), nan_neg
);
2550 // *** precision ***
2551 check(SV("answer is '0.03'"), SV("answer is '{:.0G}'"), 0.03125);
2552 check(SV("answer is '0.03'"), SV("answer is '{:.1G}'"), 0.03125);
2553 check(SV("answer is '0.031'"), SV("answer is '{:.2G}'"), 0.03125);
2554 check(SV("answer is '0.0312'"), SV("answer is '{:.3G}'"), 0.03125);
2555 check(SV("answer is '0.03125'"), SV("answer is '{:.4G}'"), 0.03125);
2556 check(SV("answer is '0.03125'"), SV("answer is '{:.5G}'"), 0.03125);
2557 check(SV("answer is '0.03125'"), SV("answer is '{:.10G}'"), 0.03125);
2559 // *** precision & alternate form ***
2561 // Output validated with printf("%#xg")
2562 check(SV("answer is '1.'"), SV("answer is '{:#.{}G}'"), 1.2, 0);
2563 check(SV("answer is '1.'"), SV("answer is '{:#.{}G}'"), 1.2, 1);
2564 check(SV("answer is '1.2'"), SV("answer is '{:#.{}G}'"), 1.2, 2);
2565 check(SV("answer is '1.20'"), SV("answer is '{:#.{}G}'"), 1.2, 3);
2566 check(SV("answer is '1.200'"), SV("answer is '{:#.{}G}'"), 1.2, 4);
2567 check(SV("answer is '1.2000'"), SV("answer is '{:#.{}G}'"), 1.2, 5);
2568 check(SV("answer is '1.20000'"), SV("answer is '{:#.{}G}'"), 1.2, 6);
2570 check(SV("answer is '1.E+03'"), SV("answer is '{:#.{}G}'"), 1200.0, 0);
2571 check(SV("answer is '1.E+03'"), SV("answer is '{:#.{}G}'"), 1200.0, 1);
2572 check(SV("answer is '1.2E+03'"), SV("answer is '{:#.{}G}'"), 1200.0, 2);
2573 check(SV("answer is '1.20E+03'"), SV("answer is '{:#.{}G}'"), 1200.0, 3);
2574 check(SV("answer is '1200.'"), SV("answer is '{:#.{}G}'"), 1200.0, 4);
2575 check(SV("answer is '1200.0'"), SV("answer is '{:#.{}G}'"), 1200.0, 5);
2576 check(SV("answer is '1200.00'"), SV("answer is '{:#.{}G}'"), 1200.0, 6);
2578 check(SV("answer is '1.E+06'"), SV("answer is '{:#.{}G}'"), 1200000.0, 0);
2579 check(SV("answer is '1.E+06'"), SV("answer is '{:#.{}G}'"), 1200000.0, 1);
2580 check(SV("answer is '1.2E+06'"), SV("answer is '{:#.{}G}'"), 1200000.0, 2);
2581 check(SV("answer is '1.20E+06'"), SV("answer is '{:#.{}G}'"), 1200000.0, 3);
2582 check(SV("answer is '1.200E+06'"), SV("answer is '{:#.{}G}'"), 1200000.0, 4);
2583 check(SV("answer is '1.2000E+06'"), SV("answer is '{:#.{}G}'"), 1200000.0, 5);
2584 check(SV("answer is '1.20000E+06'"), SV("answer is '{:#.{}G}'"), 1200000.0, 6);
2586 // *** locale-specific form ***
2587 // See locale-specific_form.pass.cpp
2590 template <class F
, class CharT
, class TestFunction
>
2591 void format_test_floating_point_default(TestFunction check
) {
2592 auto nan_pos
= std::numeric_limits
<F
>::quiet_NaN(); // "nan"
2593 auto nan_neg
= std::copysign(nan_pos
, static_cast<decltype(nan_pos
)>(-1.0)); // "-nan"
2595 // *** align-fill & width ***
2596 check(SV("answer is ' 0.25'"), SV("answer is '{:7}'"), F(0.25));
2597 check(SV("answer is ' 0.25'"), SV("answer is '{:>7}'"), F(0.25));
2598 check(SV("answer is '0.25 '"), SV("answer is '{:<7}'"), F(0.25));
2599 check(SV("answer is ' 0.25 '"), SV("answer is '{:^7}'"), F(0.25));
2601 check(SV("answer is '---0.125'"), SV("answer is '{:->8}'"), F(125e-3));
2602 check(SV("answer is '0.125---'"), SV("answer is '{:-<8}'"), F(125e-3));
2603 check(SV("answer is '-0.125--'"), SV("answer is '{:-^8}'"), F(125e-3));
2605 check(SV("answer is '***inf'"), SV("answer is '{:*>6}'"), std::numeric_limits
<F
>::infinity());
2606 check(SV("answer is 'inf***'"), SV("answer is '{:*<6}'"), std::numeric_limits
<F
>::infinity());
2607 check(SV("answer is '*inf**'"), SV("answer is '{:*^6}'"), std::numeric_limits
<F
>::infinity());
2609 check(SV("answer is '###-inf'"), SV("answer is '{:#>7}'"), -std::numeric_limits
<F
>::infinity());
2610 check(SV("answer is '-inf###'"), SV("answer is '{:#<7}'"), -std::numeric_limits
<F
>::infinity());
2611 check(SV("answer is '#-inf##'"), SV("answer is '{:#^7}'"), -std::numeric_limits
<F
>::infinity());
2613 check(SV("answer is '^^^nan'"), SV("answer is '{:^>6}'"), nan_pos
);
2614 check(SV("answer is 'nan^^^'"), SV("answer is '{:^<6}'"), nan_pos
);
2615 check(SV("answer is '^nan^^'"), SV("answer is '{:^^6}'"), nan_pos
);
2617 check(SV("answer is '000-nan'"), SV("answer is '{:0>7}'"), nan_neg
);
2618 check(SV("answer is '-nan000'"), SV("answer is '{:0<7}'"), nan_neg
);
2619 check(SV("answer is '0-nan00'"), SV("answer is '{:0^7}'"), nan_neg
);
2621 // Test whether zero padding is ignored
2622 check(SV("answer is ' 0.25'"), SV("answer is '{:>07}'"), F(0.25));
2623 check(SV("answer is '0.25 '"), SV("answer is '{:<07}'"), F(0.25));
2624 check(SV("answer is ' 0.25 '"), SV("answer is '{:^07}'"), F(0.25));
2627 check(SV("answer is '0'"), SV("answer is '{:}'"), F(0));
2628 check(SV("answer is '0'"), SV("answer is '{:-}'"), F(0));
2629 check(SV("answer is '+0'"), SV("answer is '{:+}'"), F(0));
2630 check(SV("answer is ' 0'"), SV("answer is '{: }'"), F(0));
2632 check(SV("answer is '-0'"), SV("answer is '{:}'"), F(-0.));
2633 check(SV("answer is '-0'"), SV("answer is '{:-}'"), F(-0.));
2634 check(SV("answer is '-0'"), SV("answer is '{:+}'"), F(-0.));
2635 check(SV("answer is '-0'"), SV("answer is '{: }'"), F(-0.));
2637 // [format.string.std]/5 The sign option applies to floating-point infinity and NaN.
2638 check(SV("answer is 'inf'"), SV("answer is '{:}'"), std::numeric_limits
<F
>::infinity());
2639 check(SV("answer is 'inf'"), SV("answer is '{:-}'"), std::numeric_limits
<F
>::infinity());
2640 check(SV("answer is '+inf'"), SV("answer is '{:+}'"), std::numeric_limits
<F
>::infinity());
2641 check(SV("answer is ' inf'"), SV("answer is '{: }'"), std::numeric_limits
<F
>::infinity());
2643 check(SV("answer is '-inf'"), SV("answer is '{:}'"), -std::numeric_limits
<F
>::infinity());
2644 check(SV("answer is '-inf'"), SV("answer is '{:-}'"), -std::numeric_limits
<F
>::infinity());
2645 check(SV("answer is '-inf'"), SV("answer is '{:+}'"), -std::numeric_limits
<F
>::infinity());
2646 check(SV("answer is '-inf'"), SV("answer is '{: }'"), -std::numeric_limits
<F
>::infinity());
2648 check(SV("answer is 'nan'"), SV("answer is '{:}'"), nan_pos
);
2649 check(SV("answer is 'nan'"), SV("answer is '{:-}'"), nan_pos
);
2650 check(SV("answer is '+nan'"), SV("answer is '{:+}'"), nan_pos
);
2651 check(SV("answer is ' nan'"), SV("answer is '{: }'"), nan_pos
);
2653 check(SV("answer is '-nan'"), SV("answer is '{:}'"), nan_neg
);
2654 check(SV("answer is '-nan'"), SV("answer is '{:-}'"), nan_neg
);
2655 check(SV("answer is '-nan'"), SV("answer is '{:+}'"), nan_neg
);
2656 check(SV("answer is '-nan'"), SV("answer is '{: }'"), nan_neg
);
2658 // *** alternate form ***
2659 check(SV("answer is '0.'"), SV("answer is '{:#}'"), F(0));
2660 check(SV("answer is '2.5'"), SV("answer is '{:#}'"), F(2.5));
2662 check(SV("answer is 'inf'"), SV("answer is '{:#}'"), std::numeric_limits
<F
>::infinity());
2663 check(SV("answer is '-inf'"), SV("answer is '{:#}'"), -std::numeric_limits
<F
>::infinity());
2665 check(SV("answer is 'nan'"), SV("answer is '{:#}'"), nan_pos
);
2666 check(SV("answer is '-nan'"), SV("answer is '{:#}'"), nan_neg
);
2668 // *** zero-padding & width ***
2669 check(SV("answer is '0.03125'"), SV("answer is '{:07}'"), 0.03125);
2670 check(SV("answer is '+0.03125'"), SV("answer is '{:+07}'"), 0.03125);
2671 check(SV("answer is '+0.03125'"), SV("answer is '{:+08}'"), 0.03125);
2672 check(SV("answer is '+00.03125'"), SV("answer is '{:+09}'"), 0.03125);
2674 check(SV("answer is '0000.03125'"), SV("answer is '{:010}'"), 0.03125);
2675 check(SV("answer is '0000.03125'"), SV("answer is '{:-010}'"), 0.03125);
2676 check(SV("answer is '+000.03125'"), SV("answer is '{:+010}'"), 0.03125);
2677 check(SV("answer is ' 000.03125'"), SV("answer is '{: 010}'"), 0.03125);
2679 check(SV("answer is ' inf'"), SV("answer is '{:010}'"), std::numeric_limits
<F
>::infinity());
2680 check(SV("answer is ' inf'"), SV("answer is '{:-010}'"), std::numeric_limits
<F
>::infinity());
2681 check(SV("answer is ' +inf'"), SV("answer is '{:+010}'"), std::numeric_limits
<F
>::infinity());
2682 check(SV("answer is ' inf'"), SV("answer is '{: 010}'"), std::numeric_limits
<F
>::infinity());
2684 check(SV("answer is ' -inf'"), SV("answer is '{:010}'"), -std::numeric_limits
<F
>::infinity());
2685 check(SV("answer is ' -inf'"), SV("answer is '{:-010}'"), -std::numeric_limits
<F
>::infinity());
2686 check(SV("answer is ' -inf'"), SV("answer is '{:+010}'"), -std::numeric_limits
<F
>::infinity());
2687 check(SV("answer is ' -inf'"), SV("answer is '{: 010}'"), -std::numeric_limits
<F
>::infinity());
2689 check(SV("answer is ' nan'"), SV("answer is '{:010}'"), nan_pos
);
2690 check(SV("answer is ' nan'"), SV("answer is '{:-010}'"), nan_pos
);
2691 check(SV("answer is ' +nan'"), SV("answer is '{:+010}'"), nan_pos
);
2692 check(SV("answer is ' nan'"), SV("answer is '{: 010}'"), nan_pos
);
2694 check(SV("answer is ' -nan'"), SV("answer is '{:010}'"), nan_neg
);
2695 check(SV("answer is ' -nan'"), SV("answer is '{:-010}'"), nan_neg
);
2696 check(SV("answer is ' -nan'"), SV("answer is '{:+010}'"), nan_neg
);
2697 check(SV("answer is ' -nan'"), SV("answer is '{: 010}'"), nan_neg
);
2699 // *** precision ***
2700 // See format_test_floating_point_default_precision
2702 // *** locale-specific form ***
2703 // See locale-specific_form.pass.cpp
2706 template <class F
, class CharT
, class TestFunction
>
2707 void format_test_floating_point_default_precision(TestFunction check
) {
2709 auto nan_pos
= std::numeric_limits
<F
>::quiet_NaN(); // "nan"
2710 auto nan_neg
= std::copysign(nan_pos
, static_cast<decltype(nan_pos
)>(-1.0)); // "-nan"
2712 // *** align-fill & width ***
2713 check(SV("answer is ' 0.25'"), SV("answer is '{:7.6}'"), F(0.25));
2714 check(SV("answer is ' 0.25'"), SV("answer is '{:>7.6}'"), F(0.25));
2715 check(SV("answer is '0.25 '"), SV("answer is '{:<7.6}'"), F(0.25));
2716 check(SV("answer is ' 0.25 '"), SV("answer is '{:^7.6}'"), F(0.25));
2718 check(SV("answer is '---0.125'"), SV("answer is '{:->8.6}'"), F(125e-3));
2719 check(SV("answer is '0.125---'"), SV("answer is '{:-<8.6}'"), F(125e-3));
2720 check(SV("answer is '-0.125--'"), SV("answer is '{:-^8.6}'"), F(125e-3));
2722 check(SV("answer is '***inf'"), SV("answer is '{:*>6.6}'"), std::numeric_limits
<F
>::infinity());
2723 check(SV("answer is 'inf***'"), SV("answer is '{:*<6.6}'"), std::numeric_limits
<F
>::infinity());
2724 check(SV("answer is '*inf**'"), SV("answer is '{:*^6.6}'"), std::numeric_limits
<F
>::infinity());
2726 check(SV("answer is '###-inf'"), SV("answer is '{:#>7.6}'"), -std::numeric_limits
<F
>::infinity());
2727 check(SV("answer is '-inf###'"), SV("answer is '{:#<7.6}'"), -std::numeric_limits
<F
>::infinity());
2728 check(SV("answer is '#-inf##'"), SV("answer is '{:#^7.6}'"), -std::numeric_limits
<F
>::infinity());
2730 check(SV("answer is '^^^nan'"), SV("answer is '{:^>6.6}'"), nan_pos
);
2731 check(SV("answer is 'nan^^^'"), SV("answer is '{:^<6.6}'"), nan_pos
);
2732 check(SV("answer is '^nan^^'"), SV("answer is '{:^^6.6}'"), nan_pos
);
2734 check(SV("answer is '000-nan'"), SV("answer is '{:0>7.6}'"), nan_neg
);
2735 check(SV("answer is '-nan000'"), SV("answer is '{:0<7.6}'"), nan_neg
);
2736 check(SV("answer is '0-nan00'"), SV("answer is '{:0^7.6}'"), nan_neg
);
2738 // Test whether zero padding is ignored
2739 check(SV("answer is ' 0.25'"), SV("answer is '{:>07.6}'"), F(0.25));
2740 check(SV("answer is '0.25 '"), SV("answer is '{:<07.6}'"), F(0.25));
2741 check(SV("answer is ' 0.25 '"), SV("answer is '{:^07.6}'"), F(0.25));
2744 check(SV("answer is '0'"), SV("answer is '{:.6}'"), F(0));
2745 check(SV("answer is '0'"), SV("answer is '{:-.6}'"), F(0));
2746 check(SV("answer is '+0'"), SV("answer is '{:+.6}'"), F(0));
2747 check(SV("answer is ' 0'"), SV("answer is '{: .6}'"), F(0));
2749 check(SV("answer is '-0'"), SV("answer is '{:.6}'"), F(-0.));
2750 check(SV("answer is '-0'"), SV("answer is '{:-.6}'"), F(-0.));
2751 check(SV("answer is '-0'"), SV("answer is '{:+.6}'"), F(-0.));
2752 check(SV("answer is '-0'"), SV("answer is '{: .6}'"), F(-0.));
2754 // [format.string.std]/5 The sign option applies to floating-point infinity and NaN.
2755 check(SV("answer is 'inf'"), SV("answer is '{:.6}'"), std::numeric_limits
<F
>::infinity());
2756 check(SV("answer is 'inf'"), SV("answer is '{:-.6}'"), std::numeric_limits
<F
>::infinity());
2757 check(SV("answer is '+inf'"), SV("answer is '{:+.6}'"), std::numeric_limits
<F
>::infinity());
2758 check(SV("answer is ' inf'"), SV("answer is '{: .6}'"), std::numeric_limits
<F
>::infinity());
2760 check(SV("answer is '-inf'"), SV("answer is '{:.6}'"), -std::numeric_limits
<F
>::infinity());
2761 check(SV("answer is '-inf'"), SV("answer is '{:-.6}'"), -std::numeric_limits
<F
>::infinity());
2762 check(SV("answer is '-inf'"), SV("answer is '{:+.6}'"), -std::numeric_limits
<F
>::infinity());
2763 check(SV("answer is '-inf'"), SV("answer is '{: .6}'"), -std::numeric_limits
<F
>::infinity());
2765 check(SV("answer is 'nan'"), SV("answer is '{:.6}'"), nan_pos
);
2766 check(SV("answer is 'nan'"), SV("answer is '{:-.6}'"), nan_pos
);
2767 check(SV("answer is '+nan'"), SV("answer is '{:+.6}'"), nan_pos
);
2768 check(SV("answer is ' nan'"), SV("answer is '{: .6}'"), nan_pos
);
2770 check(SV("answer is '-nan'"), SV("answer is '{:.6}'"), nan_neg
);
2771 check(SV("answer is '-nan'"), SV("answer is '{:-.6}'"), nan_neg
);
2772 check(SV("answer is '-nan'"), SV("answer is '{:+.6}'"), nan_neg
);
2773 check(SV("answer is '-nan'"), SV("answer is '{: .6}'"), nan_neg
);
2775 // *** alternate form **
2776 // When precision is zero there's no decimal point except when the alternate form is specified.
2777 // Note unlike the g and G option the trailing zeros are still removed.
2778 check(SV("answer is '0'"), SV("answer is '{:.0}'"), F(0));
2779 check(SV("answer is '0.'"), SV("answer is '{:#.0}'"), F(0));
2781 check(SV("answer is '0.'"), SV("answer is '{:#.6}'"), F(0));
2782 check(SV("answer is '2.5'"), SV("answer is '{:#.6}'"), F(2.5));
2784 check(SV("answer is 'inf'"), SV("answer is '{:#.6}'"), std::numeric_limits
<F
>::infinity());
2785 check(SV("answer is '-inf'"), SV("answer is '{:#.6}'"), -std::numeric_limits
<F
>::infinity());
2787 check(SV("answer is 'nan'"), SV("answer is '{:#.6}'"), nan_pos
);
2788 check(SV("answer is '-nan'"), SV("answer is '{:#.6}'"), nan_neg
);
2790 // *** zero-padding & width ***
2791 check(SV("answer is '0.03125'"), SV("answer is '{:06.6}'"), 0.03125);
2792 check(SV("answer is '+0.03125'"), SV("answer is '{:+06.6}'"), 0.03125);
2793 check(SV("answer is '+0.03125'"), SV("answer is '{:+07.6}'"), 0.03125);
2794 check(SV("answer is '+0.03125'"), SV("answer is '{:+08.6}'"), 0.03125);
2796 check(SV("answer is '000.03125'"), SV("answer is '{:09.6}'"), 0.03125);
2797 check(SV("answer is '000.03125'"), SV("answer is '{:-09.6}'"), 0.03125);
2798 check(SV("answer is '+00.03125'"), SV("answer is '{:+09.6}'"), 0.03125);
2799 check(SV("answer is ' 00.03125'"), SV("answer is '{: 09.6}'"), 0.03125);
2801 check(SV("answer is ' inf'"), SV("answer is '{:010.6}'"), std::numeric_limits
<F
>::infinity());
2802 check(SV("answer is ' inf'"), SV("answer is '{:-010.6}'"), std::numeric_limits
<F
>::infinity());
2803 check(SV("answer is ' +inf'"), SV("answer is '{:+010.6}'"), std::numeric_limits
<F
>::infinity());
2804 check(SV("answer is ' inf'"), SV("answer is '{: 010.6}'"), std::numeric_limits
<F
>::infinity());
2806 check(SV("answer is ' -inf'"), SV("answer is '{:010.6}'"), -std::numeric_limits
<F
>::infinity());
2807 check(SV("answer is ' -inf'"), SV("answer is '{:-010.6}'"), -std::numeric_limits
<F
>::infinity());
2808 check(SV("answer is ' -inf'"), SV("answer is '{:+010.6}'"), -std::numeric_limits
<F
>::infinity());
2809 check(SV("answer is ' -inf'"), SV("answer is '{: 010.6}'"), -std::numeric_limits
<F
>::infinity());
2811 check(SV("answer is ' nan'"), SV("answer is '{:010.6}'"), nan_pos
);
2812 check(SV("answer is ' nan'"), SV("answer is '{:-010.6}'"), nan_pos
);
2813 check(SV("answer is ' +nan'"), SV("answer is '{:+010.6}'"), nan_pos
);
2814 check(SV("answer is ' nan'"), SV("answer is '{: 010.6}'"), nan_pos
);
2816 check(SV("answer is ' -nan'"), SV("answer is '{:010.6}'"), nan_neg
);
2817 check(SV("answer is ' -nan'"), SV("answer is '{:-010.6}'"), nan_neg
);
2818 check(SV("answer is ' -nan'"), SV("answer is '{:+010.6}'"), nan_neg
);
2819 check(SV("answer is ' -nan'"), SV("answer is '{: 010.6}'"), nan_neg
);
2821 // *** precision ***
2822 check(SV("answer is '0.03'"), SV("answer is '{:.0}'"), 0.03125);
2823 check(SV("answer is '0.03'"), SV("answer is '{:.1}'"), 0.03125);
2824 check(SV("answer is '0.031'"), SV("answer is '{:.2}'"), 0.03125);
2825 check(SV("answer is '0.0312'"), SV("answer is '{:.3}'"), 0.03125);
2826 check(SV("answer is '0.03125'"), SV("answer is '{:.4}'"), 0.03125);
2827 check(SV("answer is '0.03125'"), SV("answer is '{:.5}'"), 0.03125);
2828 check(SV("answer is '0.03125'"), SV("answer is '{:.10}'"), 0.03125);
2830 // *** precision & alternate form ***
2832 check(SV("answer is '1.'"), SV("answer is '{:#.{}}'"), 1.2, 0);
2833 check(SV("answer is '1.'"), SV("answer is '{:#.{}}'"), 1.2, 1);
2834 check(SV("answer is '1.2'"), SV("answer is '{:#.{}}'"), 1.2, 2);
2835 check(SV("answer is '1.2'"), SV("answer is '{:#.{}}'"), 1.2, 3);
2836 check(SV("answer is '1.2'"), SV("answer is '{:#.{}}'"), 1.2, 4);
2837 check(SV("answer is '1.2'"), SV("answer is '{:#.{}}'"), 1.2, 5);
2838 check(SV("answer is '1.2'"), SV("answer is '{:#.{}}'"), 1.2, 6);
2840 check(SV("answer is '1.e+03'"), SV("answer is '{:#.{}}'"), 1200.0, 0);
2841 check(SV("answer is '1.e+03'"), SV("answer is '{:#.{}}'"), 1200.0, 1);
2842 check(SV("answer is '1.2e+03'"), SV("answer is '{:#.{}}'"), 1200.0, 2);
2843 check(SV("answer is '1.2e+03'"), SV("answer is '{:#.{}}'"), 1200.0, 3);
2844 check(SV("answer is '1200.'"), SV("answer is '{:#.{}}'"), 1200.0, 4);
2845 check(SV("answer is '1200.'"), SV("answer is '{:#.{}}'"), 1200.0, 5);
2846 check(SV("answer is '1200.'"), SV("answer is '{:#.{}}'"), 1200.0, 6);
2848 check(SV("answer is '1.e+06'"), SV("answer is '{:#.{}}'"), 1200000.0, 0);
2849 check(SV("answer is '1.e+06'"), SV("answer is '{:#.{}}'"), 1200000.0, 1);
2850 check(SV("answer is '1.2e+06'"), SV("answer is '{:#.{}}'"), 1200000.0, 2);
2851 check(SV("answer is '1.2e+06'"), SV("answer is '{:#.{}}'"), 1200000.0, 3);
2852 check(SV("answer is '1.2e+06'"), SV("answer is '{:#.{}}'"), 1200000.0, 4);
2853 check(SV("answer is '1.2e+06'"), SV("answer is '{:#.{}}'"), 1200000.0, 5);
2854 check(SV("answer is '1.2e+06'"), SV("answer is '{:#.{}}'"), 1200000.0, 6);
2856 // *** locale-specific form ***
2857 // See locale-specific_form.pass.cpp
2860 template <class F
, class CharT
, class TestFunction
>
2861 void format_test_floating_point_PR58714(TestFunction check
) {
2862 check(SV("+1234"), SV("{:+}"), F(1234.0));
2863 check(SV("+1.348p+10"), SV("{:+a}"), F(1234.0));
2864 check(SV("+1.234000e+03"), SV("{:+e}"), F(1234.0));
2865 check(SV("+1234.000000"), SV("{:+f}"), F(1234.0));
2866 check(SV("+1234"), SV("{:+g}"), F(1234.0));
2868 check(SV("1234."), SV("{:#}"), F(1234.0));
2869 check(SV("1.348p+10"), SV("{:#a}"), F(1234.0));
2870 check(SV("1.234000e+03"), SV("{:#e}"), F(1234.0));
2871 check(SV("1234.000000"), SV("{:#f}"), F(1234.0));
2872 check(SV("1234.00"), SV("{:#g}"), F(1234.0));
2874 check(SV("4.e+30"), SV("{:#}"), F(4.0e+30));
2875 check(SV("1.p+102"), SV("{:#a}"), F(0x4.0p
+100));
2876 check(SV("4.000000e+30"), SV("{:#e}"), F(4.0e+30));
2877 check(SV("5070602400912917605986812821504.000000"), SV("{:#f}"), F(0x4.0p
+100));
2878 check(SV("4.00000e+30"), SV("{:#g}"), F(4.0e+30));
2880 check(SV("1234."), SV("{:#.6}"), F(1234.0)); // # does not restore zeros
2881 check(SV("1.348000p+10"), SV("{:#.6a}"), F(1234.0));
2882 check(SV("1.234000e+03"), SV("{:#.6e}"), F(1234.0));
2883 check(SV("1234.000000"), SV("{:#.6f}"), F(1234.0));
2884 check(SV("1234.00"), SV("{:#.6g}"), F(1234.0));
2886 check(SV("-1234."), SV("{:#}"), F(-1234.0));
2887 check(SV("-1.348p+10"), SV("{:#a}"), F(-1234.0));
2888 check(SV("-1.234000e+03"), SV("{:#e}"), F(-1234.0));
2889 check(SV("-1234.000000"), SV("{:#f}"), F(-1234.0));
2890 check(SV("-1234.00"), SV("{:#g}"), F(-1234.0));
2892 check(SV("-1234."), SV("{:#.6}"), F(-1234.0)); // # does not restore zeros
2893 check(SV("-1.348000p+10"), SV("{:#.6a}"), F(-1234.0));
2894 check(SV("-1.234000e+03"), SV("{:#.6e}"), F(-1234.0));
2895 check(SV("-1234.000000"), SV("{:#.6f}"), F(-1234.0));
2896 check(SV("-1234.00"), SV("{:#.6g}"), F(-1234.0));
2898 check(SV("+1234."), SV("{:+#}"), F(1234.0));
2899 check(SV("+1.348p+10"), SV("{:+#a}"), F(1234.0));
2900 check(SV("+1.234000e+03"), SV("{:+#e}"), F(1234.0));
2901 check(SV("+1234.000000"), SV("{:+#f}"), F(1234.0));
2902 check(SV("+1234.00"), SV("{:+#g}"), F(1234.0));
2904 check(SV("+1234."), SV("{:+#.6}"), F(1234.0)); // # does not restore zeros
2905 check(SV("+1.348000p+10"), SV("{:+#.6a}"), F(1234.0));
2906 check(SV("+1.234000e+03"), SV("{:+#.6e}"), F(1234.0));
2907 check(SV("+1234.000000"), SV("{:+#.6f}"), F(1234.0));
2908 check(SV("+1234.00"), SV("{:+#.6g}"), F(1234.0));
2911 template <class F
, class CharT
, class TestFunction
, class ExceptionTest
>
2912 void format_test_floating_point(TestFunction check
, ExceptionTest check_exception
) {
2913 format_test_floating_point_hex_lower_case
<F
, CharT
>(check
);
2914 format_test_floating_point_hex_upper_case
<F
, CharT
>(check
);
2915 format_test_floating_point_hex_lower_case_precision
<F
, CharT
>(check
);
2916 format_test_floating_point_hex_upper_case_precision
<F
, CharT
>(check
);
2918 format_test_floating_point_scientific_lower_case
<F
, CharT
>(check
);
2919 format_test_floating_point_scientific_upper_case
<F
, CharT
>(check
);
2921 format_test_floating_point_fixed_lower_case
<F
, CharT
>(check
);
2922 format_test_floating_point_fixed_upper_case
<F
, CharT
>(check
);
2924 format_test_floating_point_general_lower_case
<F
, CharT
>(check
);
2925 format_test_floating_point_general_upper_case
<F
, CharT
>(check
);
2927 format_test_floating_point_default
<F
, CharT
>(check
);
2928 format_test_floating_point_default_precision
<F
, CharT
>(check
);
2930 format_test_floating_point_PR58714
<F
, CharT
>(check
);
2933 for (const auto& fmt
: invalid_types
<CharT
>("aAeEfFgG"))
2934 check_exception("The type option contains an invalid value for a floating-point formatting argument", fmt
, F(1));
2937 template <class CharT
, class TestFunction
, class ExceptionTest
>
2938 void format_test_floating_point(TestFunction check
, ExceptionTest check_exception
) {
2939 format_test_floating_point
<float, CharT
>(check
, check_exception
);
2940 format_test_floating_point
<double, CharT
>(check
, check_exception
);
2941 format_test_floating_point
<long double, CharT
>(check
, check_exception
);
2944 template <class P
, class CharT
, class TestFunction
, class ExceptionTest
>
2945 void format_test_pointer(TestFunction check
, ExceptionTest check_exception
) {
2946 // *** align-fill & width ***
2947 check(SV("answer is ' 0x0'"), SV("answer is '{:6}'"), P(nullptr));
2948 check(SV("answer is ' 0x0'"), SV("answer is '{:>6}'"), P(nullptr));
2949 check(SV("answer is '0x0 '"), SV("answer is '{:<6}'"), P(nullptr));
2950 check(SV("answer is ' 0x0 '"), SV("answer is '{:^6}'"), P(nullptr));
2952 // The fill character ':' is allowed here (P0645) but not in ranges (P2286).
2953 check(SV("answer is ':::0x0'"), SV("answer is '{::>6}'"), P(nullptr));
2954 check(SV("answer is '0x0:::'"), SV("answer is '{::<6}'"), P(nullptr));
2955 check(SV("answer is ':0x0::'"), SV("answer is '{::^6}'"), P(nullptr));
2957 // Test whether zero padding is ignored
2958 check(SV("answer is ':::0x0'"), SV("answer is '{::>06}'"), P(nullptr));
2959 check(SV("answer is '0x0:::'"), SV("answer is '{::<06}'"), P(nullptr));
2960 check(SV("answer is ':0x0::'"), SV("answer is '{::^06}'"), P(nullptr));
2963 check_exception("The format specifier should consume the input or end with a '}'", SV("{:-}"), P(nullptr));
2964 check_exception("The format specifier should consume the input or end with a '}'", SV("{:+}"), P(nullptr));
2965 check_exception("The format specifier should consume the input or end with a '}'", SV("{: }"), P(nullptr));
2967 // *** alternate form ***
2968 check_exception("The format specifier should consume the input or end with a '}'", SV("{:#}"), P(nullptr));
2970 // *** zero-padding ***
2971 check(SV("answer is '0x0000'"), SV("answer is '{:06}'"), P(nullptr));
2972 check(SV("answer is '0x0000'"), SV("answer is '{:06p}'"), P(nullptr));
2973 check(SV("answer is '0X0000'"), SV("answer is '{:06P}'"), P(nullptr));
2975 // *** precision ***
2976 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.}"), nullptr);
2977 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.0}"), nullptr);
2978 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.42}"), nullptr);
2980 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.{}}"), nullptr);
2981 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.{}}"), nullptr, true);
2982 check_exception("The format specifier should consume the input or end with a '}'", SV("{:.{}}"), nullptr, 1.0);
2984 // *** locale-specific form ***
2985 check_exception("The format specifier should consume the input or end with a '}'", SV("{:L}"), P(nullptr));
2988 for (const auto& fmt
: invalid_types
<CharT
>("pP"))
2989 check_exception("The type option contains an invalid value for a pointer formatting argument", fmt
, P(nullptr));
2992 template <class CharT
, class TestFunction
, class ExceptionTest
>
2993 void format_test_handle(TestFunction check
, ExceptionTest check_exception
) {
2994 // *** Valid permutations ***
2995 check(SV("answer is '0xaaaa'"), SV("answer is '{}'"), status::foo
);
2996 check(SV("answer is '0xaaaa'"), SV("answer is '{:x}'"), status::foo
);
2997 check(SV("answer is '0XAAAA'"), SV("answer is '{:X}'"), status::foo
);
2998 check(SV("answer is 'foo'"), SV("answer is '{:s}'"), status::foo
);
3000 check(SV("answer is '0x5555'"), SV("answer is '{}'"), status::bar
);
3001 check(SV("answer is '0x5555'"), SV("answer is '{:x}'"), status::bar
);
3002 check(SV("answer is '0X5555'"), SV("answer is '{:X}'"), status::bar
);
3003 check(SV("answer is 'bar'"), SV("answer is '{:s}'"), status::bar
);
3005 check(SV("answer is '0xaa55'"), SV("answer is '{}'"), status::foobar
);
3006 check(SV("answer is '0xaa55'"), SV("answer is '{:x}'"), status::foobar
);
3007 check(SV("answer is '0XAA55'"), SV("answer is '{:X}'"), status::foobar
);
3008 check(SV("answer is 'foobar'"), SV("answer is '{:s}'"), status::foobar
);
3010 // P2418 Changed the argument from a const reference to a forwarding reference.
3011 // This mainly affects handle classes, however since we use an abstraction
3012 // layer here it's "tricky" to verify whether this test would do the "right"
3013 // thing. So these tests are done separately.
3016 for (const auto& fmt
: invalid_types
<CharT
>("xXs"))
3017 check_exception("The type option contains an invalid value for a status formatting argument", fmt
, status::foo
);
3020 template <class CharT
, class TestFunction
, class ExceptionTest
>
3021 void format_test_pointer(TestFunction check
, ExceptionTest check_exception
) {
3022 format_test_pointer
<std::nullptr_t
, CharT
>(check
, check_exception
);
3023 format_test_pointer
<void*, CharT
>(check
, check_exception
);
3024 format_test_pointer
<const void*, CharT
>(check
, check_exception
);
3027 /// Tests special buffer functions with a "large" input.
3029 /// This is a test specific for libc++, however the code should behave the same
3030 /// on all implementations.
3031 /// In \c __format::__output_buffer there are some special functions to optimize
3032 /// outputting multiple characters, \c __copy, \c __transform, \c __fill. This
3033 /// test validates whether the functions behave properly when the output size
3034 /// doesn't fit in its internal buffer.
3035 template <class CharT
, class TestFunction
>
3036 void format_test_buffer_optimizations(TestFunction check
) {
3037 #ifdef _LIBCPP_VERSION
3038 // Used to validate our test sets are the proper size.
3039 // To test the chunked operations it needs to be larger than the internal
3040 // buffer. Picked a nice looking number.
3041 constexpr int minimum
= 3 * std::__format::__internal_storage
<CharT
>::__buffer_size
;
3043 constexpr int minimum
= 1;
3047 std::basic_string
<CharT
> str
= STR(
3048 "The quick brown fox jumps over the lazy dog."
3049 "The quick brown fox jumps over the lazy dog."
3050 "The quick brown fox jumps over the lazy dog."
3051 "The quick brown fox jumps over the lazy dog."
3052 "The quick brown fox jumps over the lazy dog."
3053 "The quick brown fox jumps over the lazy dog."
3054 "The quick brown fox jumps over the lazy dog."
3055 "The quick brown fox jumps over the lazy dog."
3056 "The quick brown fox jumps over the lazy dog."
3057 "The quick brown fox jumps over the lazy dog."
3058 "The quick brown fox jumps over the lazy dog."
3059 "The quick brown fox jumps over the lazy dog."
3060 "The quick brown fox jumps over the lazy dog."
3061 "The quick brown fox jumps over the lazy dog."
3062 "The quick brown fox jumps over the lazy dog."
3063 "The quick brown fox jumps over the lazy dog."
3064 "The quick brown fox jumps over the lazy dog."
3065 "The quick brown fox jumps over the lazy dog."
3066 "The quick brown fox jumps over the lazy dog."
3067 "The quick brown fox jumps over the lazy dog."
3068 "The quick brown fox jumps over the lazy dog."
3069 "The quick brown fox jumps over the lazy dog."
3070 "The quick brown fox jumps over the lazy dog."
3071 "The quick brown fox jumps over the lazy dog."
3072 "The quick brown fox jumps over the lazy dog."
3073 "The quick brown fox jumps over the lazy dog."
3074 "The quick brown fox jumps over the lazy dog."
3075 "The quick brown fox jumps over the lazy dog."
3076 "The quick brown fox jumps over the lazy dog."
3077 "The quick brown fox jumps over the lazy dog.");
3078 assert(str
.size() > minimum
);
3079 check(std::basic_string_view
<CharT
>{str
}, SV("{}"), str
);
3082 std::basic_string
<CharT
> fill(minimum
, CharT('*'));
3083 check(std::basic_string_view
<CharT
>{str
+ fill
}, SV("{:*<{}}"), str
, str
.size() + minimum
);
3084 check(std::basic_string_view
<CharT
>{fill
+ str
+ fill
}, SV("{:*^{}}"), str
, minimum
+ str
.size() + minimum
);
3085 check(std::basic_string_view
<CharT
>{fill
+ str
}, SV("{:*>{}}"), str
, minimum
+ str
.size());
3088 template <class CharT
, execution_modus modus
, class TestFunction
, class ExceptionTest
>
3089 void format_tests(TestFunction check
, ExceptionTest check_exception
) {
3090 // *** Test escaping ***
3091 check(SV("{"), SV("{{"));
3092 check(SV("}"), SV("}}"));
3093 check(SV("{:^}"), SV("{{:^}}"));
3094 check(SV("{: ^}"), SV("{{:{}^}}"), CharT(' '));
3095 check(SV("{:{}^}"), SV("{{:{{}}^}}"));
3096 check(SV("{:{ }^}"), SV("{{:{{{}}}^}}"), CharT(' '));
3098 // *** Test argument ID ***
3099 check(SV("hello false true"), SV("hello {0:} {1:}"), false, true);
3100 check(SV("hello true false"), SV("hello {1:} {0:}"), false, true);
3102 // *** Test many arguments ***
3105 // An instance of basic_format_args provides access to formatting arguments.
3106 // Implementations should optimize the representation of basic_format_args
3107 // for a small number of formatting arguments.
3109 // These's no guidances what "a small number of formatting arguments" is.
3110 // - fmtlib uses a 15 elements
3111 // - libc++ uses 12 elements
3112 // - MSVC STL uses a different approach regardless of the number of arguments
3113 // - libstdc++ has no implementation yet
3114 // fmtlib and libc++ use a similar approach, this approach can support 16
3115 // elements (based on design choices both support less elements). This test
3116 // makes sure "the large number of formatting arguments" code path is tested.
3118 SV("1234567890\t1234567890"),
3119 SV("{}{}{}{}{}{}{}{}{}{}\t{}{}{}{}{}{}{}{}{}{}"),
3141 // *** Test buffer boundaries format strings ***
3142 if constexpr (modus
== execution_modus::full
) {
3143 format_test_buffer_copy
<CharT
>(check
);
3144 format_test_buffer_full
<CharT
>(check
);
3147 // *** Test invalid format strings ***
3148 check_exception("The format string terminates at a '{'", SV("{"));
3149 check_exception("The argument index value is too large for the number of arguments supplied", SV("{:"));
3150 check_exception("The replacement field misses a terminating '}'", SV("{:"), 42);
3152 check_exception("The argument index should end with a ':' or a '}'", SV("{0"));
3153 check_exception("The argument index value is too large for the number of arguments supplied", SV("{0:"));
3154 check_exception("The replacement field misses a terminating '}'", SV("{0:"), 42);
3156 check_exception("The format string contains an invalid escape sequence", SV("}"));
3157 check_exception("The format string contains an invalid escape sequence", SV("{:}-}"), 42);
3159 check_exception("The format string contains an invalid escape sequence", SV("} "));
3160 check_exception("The argument index starts with an invalid character", SV("{-"), 42);
3161 check_exception("The argument index value is too large for the number of arguments supplied", SV("hello {}"));
3162 check_exception("The argument index value is too large for the number of arguments supplied", SV("hello {0}"));
3163 check_exception("The argument index value is too large for the number of arguments supplied", SV("hello {1}"), 42);
3165 // *** Test char format argument ***
3166 // The `char` to `wchar_t` formatting is tested separately.
3167 check(SV("hello 09azAZ!"),
3168 SV("hello {}{}{}{}{}{}{}"),
3176 if constexpr (modus
== execution_modus::full
) {
3177 format_test_char
<CharT
>(check
, check_exception
);
3178 format_test_char_as_integer
<CharT
>(check
, check_exception
);
3181 // *** Test string format argument ***
3183 CharT buffer
[] = {CharT('0'), CharT('9'), CharT('a'), CharT('z'), CharT('A'), CharT('Z'), CharT('!'), 0};
3184 CharT
* data
= buffer
;
3185 check(SV("hello 09azAZ!"), SV("hello {}"), data
);
3188 CharT buffer
[] = {CharT('0'), CharT('9'), CharT('a'), CharT('z'), CharT('A'), CharT('Z'), CharT('!'), 0};
3189 const CharT
* data
= buffer
;
3190 check(SV("hello 09azAZ!"), SV("hello {}"), data
);
3193 std::basic_string
<CharT
> data
= STR("world");
3194 check(SV("hello world"), SV("hello {}"), data
);
3197 std::basic_string
<CharT
> buffer
= STR("world");
3198 std::basic_string_view
<CharT
> data
= buffer
;
3199 check(SV("hello world"), SV("hello {}"), data
);
3201 if constexpr (modus
== execution_modus::full
)
3202 format_string_tests
<CharT
>(check
, check_exception
);
3204 // *** Test Boolean format argument ***
3205 check(SV("hello false true"), SV("hello {} {}"), false, true);
3207 if constexpr (modus
== execution_modus::full
) {
3208 format_test_bool
<CharT
>(check
, check_exception
);
3209 format_test_bool_as_integer
<CharT
>(check
, check_exception
);
3211 // *** Test signed integral format argument ***
3212 check(SV("hello 42"), SV("hello {}"), static_cast<signed char>(42));
3213 check(SV("hello 42"), SV("hello {}"), static_cast<short>(42));
3214 check(SV("hello 42"), SV("hello {}"), static_cast<int>(42));
3215 check(SV("hello 42"), SV("hello {}"), static_cast<long>(42));
3216 check(SV("hello 42"), SV("hello {}"), static_cast<long long>(42));
3217 #ifndef TEST_HAS_NO_INT128
3218 check(SV("hello 42"), SV("hello {}"), static_cast<__int128_t
>(42));
3221 if constexpr (modus
== execution_modus::full
)
3222 format_test_signed_integer
<CharT
>(check
, check_exception
);
3224 // ** Test unsigned integral format argument ***
3225 check(SV("hello 42"), SV("hello {}"), static_cast<unsigned char>(42));
3226 check(SV("hello 42"), SV("hello {}"), static_cast<unsigned short>(42));
3227 check(SV("hello 42"), SV("hello {}"), static_cast<unsigned>(42));
3228 check(SV("hello 42"), SV("hello {}"), static_cast<unsigned long>(42));
3229 check(SV("hello 42"), SV("hello {}"), static_cast<unsigned long long>(42));
3230 #ifndef TEST_HAS_NO_INT128
3231 check(SV("hello 42"), SV("hello {}"), static_cast<__uint128_t
>(42));
3233 if constexpr (modus
== execution_modus::full
)
3234 format_test_unsigned_integer
<CharT
>(check
, check_exception
);
3236 // *** Test floating point format argument ***
3237 check(SV("hello 42"), SV("hello {}"), static_cast<float>(42));
3238 check(SV("hello 42"), SV("hello {}"), static_cast<double>(42));
3239 check(SV("hello 42"), SV("hello {}"), static_cast<long double>(42));
3240 if constexpr (modus
== execution_modus::full
)
3241 format_test_floating_point
<CharT
>(check
, check_exception
);
3243 // *** Test pointer formatter argument ***
3244 check(SV("hello 0x0"), SV("hello {}"), nullptr);
3245 check(SV("hello 0x42"), SV("hello {}"), reinterpret_cast<void*>(0x42));
3246 check(SV("hello 0x42"), SV("hello {}"), reinterpret_cast<const void*>(0x42));
3247 if constexpr (modus
== execution_modus::full
)
3248 format_test_pointer
<CharT
>(check
, check_exception
);
3250 // *** Test handle formatter argument ***
3251 format_test_handle
<CharT
>(check
, check_exception
);
3253 // *** Test the internal buffer optimizations ***
3254 if constexpr (modus
== execution_modus::full
)
3255 format_test_buffer_optimizations
<CharT
>(check
);
3258 #ifndef TEST_HAS_NO_WIDE_CHARACTERS
3259 template <class TestFunction
>
3260 void format_tests_char_to_wchar_t(TestFunction check
) {
3261 using CharT
= wchar_t;
3262 check(SV("hello 09azA"), SV("hello {}{}{}{}{}"), '0', '9', 'a', 'z', 'A');
3266 #endif // TEST_STD_UTILITIES_FORMAT_FORMAT_FUNCTIONS_FORMAT_TESTS_H