1//===----------------------------------------------------------------------===//
2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
3// See https://llvm.org/LICENSE.txt for license information.
4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
5//
6//===----------------------------------------------------------------------===//
7
8// REQUIRES: std-at-least-c++20
9// UNSUPPORTED: no-filesystem, no-localization, no-tzdb
10// UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME
11
12// TODO FMT This test should not require std::to_chars(floating-point)
13// XFAIL: availability-fp_to_chars-missing
14
15// XFAIL: libcpp-has-no-experimental-tzdb
16// XFAIL: availability-tzdb-missing
17
18// REQUIRES: locale.fr_FR.UTF-8
19// REQUIRES: locale.ja_JP.UTF-8
20
21// <chrono>
22
23// template<class Duration, class charT>
24// struct formatter<chrono::gps_time<Duration>, charT>;
25
26#include <chrono>
27#include <format>
28
29#include <cassert>
30#include <concepts>
31#include <locale>
32#include <iostream>
33#include <type_traits>
34
35#include "formatter_tests.h"
36#include "make_string.h"
37#include "platform_support.h" // locale name macros
38#include "test_macros.h"
39
40template <class CharT>
41static void test_no_chrono_specs() {
42 using namespace std::literals::chrono_literals;
43 namespace cr = std::chrono;
44
45 std::locale::global(std::locale(LOCALE_fr_FR_UTF_8));
46
47 // Non localized output
48
49 // [time.syn]
50 // using nanoseconds = duration<signed integer type of at least 64 bits, nano>;
51 // using microseconds = duration<signed integer type of at least 55 bits, micro>;
52 // using milliseconds = duration<signed integer type of at least 45 bits, milli>;
53 // using seconds = duration<signed integer type of at least 35 bits>;
54 // using minutes = duration<signed integer type of at least 29 bits, ratio< 60>>;
55 // using hours = duration<signed integer type of at least 23 bits, ratio<3600>>;
56 check(SV("1435-08-09 22:07:05"), SV("{}"), cr::gps_seconds(-17'179'869'184s)); // Minimum value for 35 bits.
57 check(SV("1911-12-18 20:46:01"), SV("{}"), cr::gps_seconds(-2'147'483'648s));
58
59 check(SV("1980-01-05 00:00:00"), SV("{}"), cr::gps_seconds(-24h));
60 check(SV("1980-01-05 06:00:00"), SV("{}"), cr::gps_seconds(-18h));
61 check(SV("1980-01-05 12:00:00"), SV("{}"), cr::gps_seconds(-12h));
62 check(SV("1980-01-05 18:00:00"), SV("{}"), cr::gps_seconds(-6h));
63 check(SV("1980-01-05 23:59:59"), SV("{}"), cr::gps_seconds(-1s));
64
65 check(SV("1980-01-06 00:00:00"), SV("{}"), cr::gps_seconds(0s));
66 check(SV("2010-01-04 23:59:45"), SV("{}"), cr::gps_seconds(946'684'800s));
67 check(SV("2010-01-05 01:01:48"), SV("{}"), cr::gps_seconds(946'688'523s));
68
69 check(SV("2048-01-24 03:13:49"), SV("{}"), cr::gps_seconds(2'147'483'647s));
70 check(SV("2524-06-03 01:52:45"), SV("{}"), cr::gps_seconds(17'179'869'183s)); // Maximum value for 35 bits.
71
72 check(SV("2010-01-05 01:01:48.123"), SV("{}"), cr::gps_time<cr::milliseconds>(946'688'523'123ms));
73
74 std::locale::global(loc: std::locale::classic());
75}
76
77template <class CharT>
78static void test_valid_values_year() {
79 using namespace std::literals::chrono_literals;
80 namespace cr = std::chrono;
81
82 constexpr std::basic_string_view<CharT> fmt =
83 SV("{:%%C='%C'%t%%EC='%EC'%t%%y='%y'%t%%Oy='%Oy'%t%%Ey='%Ey'%t%%Y='%Y'%t%%EY='%EY'%n}");
84 constexpr std::basic_string_view<CharT> lfmt =
85 SV("{:L%%C='%C'%t%%EC='%EC'%t%%y='%y'%t%%Oy='%Oy'%t%%Ey='%Ey'%t%%Y='%Y'%t%%EY='%EY'%n}");
86
87 const std::locale loc(LOCALE_ja_JP_UTF_8);
88 std::locale::global(std::locale(LOCALE_fr_FR_UTF_8));
89
90 // Non localized output using C-locale
91 check(SV("%C='19'\t%EC='19'\t%y='80'\t%Oy='80'\t%Ey='80'\t%Y='1980'\t%EY='1980'\n"),
92 fmt,
93 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
94
95 check(SV("%C='20'\t%EC='20'\t%y='09'\t%Oy='09'\t%Ey='09'\t%Y='2009'\t%EY='2009'\n"),
96 fmt,
97 cr::gps_seconds(918'603'105s)); // 23:31:30 GPS Friday, 13 February 2009
98
99 // Use the global locale (fr_FR)
100 check(SV("%C='19'\t%EC='19'\t%y='80'\t%Oy='80'\t%Ey='80'\t%Y='1980'\t%EY='1980'\n"),
101 lfmt,
102 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
103
104 check(SV("%C='20'\t%EC='20'\t%y='09'\t%Oy='09'\t%Ey='09'\t%Y='2009'\t%EY='2009'\n"),
105 lfmt,
106 cr::gps_seconds(918'603'105s)); // 23:31:30 GPS Friday, 13 February 2009
107
108 // Use supplied locale (ja_JP). This locale has a different alternate.
109#if defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)
110 check(loc,
111 SV("%C='19'\t%EC='19'\t%y='80'\t%Oy='80'\t%Ey='80'\t%Y='1980'\t%EY='1980'\n"),
112 lfmt,
113 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
114
115 check(loc,
116 SV("%C='20'\t%EC='20'\t%y='09'\t%Oy='09'\t%Ey='09'\t%Y='2009'\t%EY='2009'\n"),
117 lfmt,
118 cr::gps_seconds(918'603'105s)); // 23:31:30 GPS Friday, 13 February 2009
119#else // defined(_WIN32) || defined(__APPLE__) || defined(_AIX)||defined(__FreeBSD__)
120 check(loc,
121 SV("%C='19'\t%EC='昭和'\t%y='80'\t%Oy='八十'\t%Ey='55'\t%Y='1980'\t%EY='昭和55年'\n"),
122 lfmt,
123 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
124
125 check(loc,
126 SV("%C='20'\t%EC='平成'\t%y='09'\t%Oy='九'\t%Ey='21'\t%Y='2009'\t%EY='平成21年'\n"),
127 lfmt,
128 cr::gps_seconds(918'603'105s)); // 23:31:30 GPS Friday, 13 February 2009
129#endif // defined(_WIN32) || defined(__APPLE__) || defined(_AIX)||defined(__FreeBSD__)
130
131 std::locale::global(loc: std::locale::classic());
132}
133
134template <class CharT>
135static void test_valid_values_month() {
136 using namespace std::literals::chrono_literals;
137 namespace cr = std::chrono;
138
139 constexpr std::basic_string_view<CharT> fmt = SV("{:%%b='%b'%t%%h='%h'%t%%B='%B'%t%%m='%m'%t%%Om='%Om'%n}");
140 constexpr std::basic_string_view<CharT> lfmt = SV("{:L%%b='%b'%t%%h='%h'%t%%B='%B'%t%%m='%m'%t%%Om='%Om'%n}");
141
142 const std::locale loc(LOCALE_ja_JP_UTF_8);
143 std::locale::global(std::locale(LOCALE_fr_FR_UTF_8));
144
145 // Non localized output using C-locale
146 check(SV("%b='Jan'\t%h='Jan'\t%B='January'\t%m='01'\t%Om='01'\n"),
147 fmt,
148 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
149
150 check(SV("%b='May'\t%h='May'\t%B='May'\t%m='05'\t%Om='05'\n"),
151 fmt,
152 cr::gps_seconds(1'684'035'218s)); // 03:33:20 GPS on Wednesday, 18 May 2033
153
154 // Use the global locale (fr_FR)
155#if defined(__APPLE__)
156 check(SV("%b='jan'\t%h='jan'\t%B='janvier'\t%m='01'\t%Om='01'\n"),
157 lfmt,
158 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
159#else
160 check(SV("%b='janv.'\t%h='janv.'\t%B='janvier'\t%m='01'\t%Om='01'\n"),
161 lfmt,
162 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
163#endif
164
165 check(SV("%b='mai'\t%h='mai'\t%B='mai'\t%m='05'\t%Om='05'\n"),
166 lfmt,
167 cr::gps_seconds(1'684'035'218s)); // 03:33:20 GPS on Wednesday, 18 May 2033
168
169 // Use supplied locale (ja_JP). This locale has a different alternate.
170#ifdef _WIN32
171 check(loc,
172 SV("%b='1'\t%h='1'\t%B='1月'\t%m='01'\t%Om='01'\n"),
173 lfmt,
174 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
175
176 check(loc,
177 SV("%b='5'\t%h='5'\t%B='5月'\t%m='05'\t%Om='05'\n"),
178 lfmt,
179 cr::gps_seconds(1'684'035'218s)); // 03:33:20 GPS Wednesday, 18 May 2033
180#elif defined(_AIX) // _WIN32
181 check(loc,
182 SV("%b='1月'\t%h='1月'\t%B='1月'\t%m='01'\t%Om='01'\n"),
183 lfmt,
184 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
185
186 check(loc,
187 SV("%b='5月'\t%h='5月'\t%B='5月'\t%m='05'\t%Om='05'\n"),
188 lfmt,
189 cr::gps_seconds(1'684'035'218s)); // 03:33:20 GPS Wednesday, 18 May 2033
190#elif defined(__APPLE__) // _WIN32
191 check(loc,
192 SV("%b=' 1'\t%h=' 1'\t%B='1月'\t%m='01'\t%Om='01'\n"),
193 lfmt,
194 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
195
196 check(loc,
197 SV("%b=' 5'\t%h=' 5'\t%B='5月'\t%m='05'\t%Om='05'\n"),
198 lfmt,
199 cr::gps_seconds(1'684'035'218s)); // 03:33:20 GPS Wednesday, 18 May 2033
200#elif defined(__FreeBSD__) // _WIN32
201 check(loc,
202 SV("%b=' 1月'\t%h=' 1月'\t%B='1月'\t%m='01'\t%Om='01'\n"),
203 lfmt,
204 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
205
206 check(loc,
207 SV("%b=' 5月'\t%h=' 5月'\t%B='5月'\t%m='05'\t%Om='05'\n"),
208 lfmt,
209 cr::gps_seconds(1'684'035'218s)); // 03:33:20 GPS Wednesday, 18 May 2033
210#else // _WIN32
211 check(loc,
212 SV("%b=' 1月'\t%h=' 1月'\t%B='1月'\t%m='01'\t%Om='一'\n"),
213 lfmt,
214 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
215
216 check(loc,
217 SV("%b=' 5月'\t%h=' 5月'\t%B='5月'\t%m='05'\t%Om='五'\n"),
218 lfmt,
219 cr::gps_seconds(1'684'035'218s)); // 03:33:20 GPS Wednesday, 18 May 2033
220#endif // _WIN32
221
222 std::locale::global(loc: std::locale::classic());
223}
224
225template <class CharT>
226static void test_valid_values_day() {
227 using namespace std::literals::chrono_literals;
228 namespace cr = std::chrono;
229
230 constexpr std::basic_string_view<CharT> fmt = SV("{:%%d='%d'%t%%Od='%Od'%t%%e='%e'%t%%Oe='%Oe'%n}");
231 constexpr std::basic_string_view<CharT> lfmt = SV("{:L%%d='%d'%t%%Od='%Od'%t%%e='%e'%t%%Oe='%Oe'%n}");
232
233 const std::locale loc(LOCALE_ja_JP_UTF_8);
234 std::locale::global(std::locale(LOCALE_fr_FR_UTF_8));
235
236 // Non localized output using C-locale
237 check(SV("%d='06'\t%Od='06'\t%e=' 6'\t%Oe=' 6'\n"), fmt,
238 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
239
240 check(SV("%d='13'\t%Od='13'\t%e='13'\t%Oe='13'\n"),
241 fmt,
242 cr::gps_seconds(918'603'105s)); // 23:31:30 GPS Friday, 13 February 2009
243
244 // Use the global locale (fr_FR)
245 check(SV("%d='06'\t%Od='06'\t%e=' 6'\t%Oe=' 6'\n"), lfmt,
246 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
247
248 check(SV("%d='13'\t%Od='13'\t%e='13'\t%Oe='13'\n"),
249 lfmt,
250 cr::gps_seconds(918'603'105s)); // 23:31:30 GPS Friday, 13 February 2009
251
252 // Use the global locale (fr_FR)
253 check(SV("%d='06'\t%Od='06'\t%e=' 6'\t%Oe=' 6'\n"), lfmt,
254 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
255
256 // Use supplied locale (ja_JP). This locale has a different alternate.
257#if defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)
258 check(loc,
259 SV("%d='06'\t%Od='06'\t%e=' 6'\t%Oe=' 6'\n"),
260 lfmt,
261 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
262
263 check(loc,
264 SV("%d='13'\t%Od='13'\t%e='13'\t%Oe='13'\n"),
265 lfmt,
266 cr::gps_seconds(918'603'105s)); // 23:31:30 GPS Friday, 13 February 2009
267
268#else // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)
269 check(loc,
270 SV("%d='06'\t%Od='六'\t%e=' 6'\t%Oe='六'\n"),
271 lfmt,
272 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
273
274 check(loc,
275 SV("%d='13'\t%Od='十三'\t%e='13'\t%Oe='十三'\n"),
276 lfmt,
277 cr::gps_seconds(918'603'105s)); // 23:31:30 GPS Friday, 13 February 2009
278
279#endif // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)
280
281 std::locale::global(loc: std::locale::classic());
282}
283
284template <class CharT>
285static void test_valid_values_weekday() {
286 using namespace std::literals::chrono_literals;
287 namespace cr = std::chrono;
288
289 constexpr std::basic_string_view<CharT> fmt =
290 SV("{:%%a='%a'%t%%A='%A'%t%%u='%u'%t%%Ou='%Ou'%t%%w='%w'%t%%Ow='%Ow'%n}");
291 constexpr std::basic_string_view<CharT> lfmt =
292 SV("{:L%%a='%a'%t%%A='%A'%t%%u='%u'%t%%Ou='%Ou'%t%%w='%w'%t%%Ow='%Ow'%n}");
293
294 const std::locale loc(LOCALE_ja_JP_UTF_8);
295 std::locale::global(std::locale(LOCALE_fr_FR_UTF_8));
296
297 // Non localized output using C-locale
298 check(SV("%a='Sun'\t%A='Sunday'\t%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\n"),
299 fmt,
300 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
301
302 check(SV("%a='Sun'\t%A='Sunday'\t%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\n"),
303 fmt,
304 cr::gps_seconds(3'979'002'513s)); // 06:28:15 GPS on Sunday, 7 February 2106
305
306 // Use the global locale (fr_FR)
307#if defined(__APPLE__)
308 check(SV("%a='Dim'\t%A='Dimanche'\t%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\n"),
309 lfmt,
310 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
311
312 check(SV("%a='Dim'\t%A='Dimanche'\t%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\n"),
313 lfmt,
314 cr::gps_seconds(3'979'002'513s)); // 06:28:15 GPS on Sunday, 7 February 2106
315#else
316 check(SV("%a='dim.'\t%A='dimanche'\t%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\n"),
317 lfmt,
318 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
319
320 check(SV("%a='dim.'\t%A='dimanche'\t%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\n"),
321 lfmt,
322 cr::gps_seconds(3'979'002'513s)); // 06:28:15 GPS on Sunday, 7 February 2106
323#endif
324
325 // Use supplied locale (ja_JP).
326 // This locale has a different alternate, but not on all platforms
327#if defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)
328 check(loc,
329 SV("%a='日'\t%A='日曜日'\t%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\n"),
330 lfmt,
331 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
332
333 check(loc,
334 SV("%a='日'\t%A='日曜日'\t%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\n"),
335 lfmt,
336 cr::gps_seconds(3'979'002'513s)); // 06:28:15 GPS on Sunday, 7 February 2106
337#else // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)
338 check(loc,
339 SV("%a='日'\t%A='日曜日'\t%u='7'\t%Ou='七'\t%w='0'\t%Ow='〇'\n"),
340 lfmt,
341 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
342
343 check(loc,
344 SV("%a='日'\t%A='日曜日'\t%u='7'\t%Ou='七'\t%w='0'\t%Ow='〇'\n"),
345 lfmt,
346 cr::gps_seconds(3'979'002'513s)); // 06:28:15 GPS on Sunday, 7 February 2106
347#endif // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)
348
349 std::locale::global(loc: std::locale::classic());
350}
351
352template <class CharT>
353static void test_valid_values_day_of_year() {
354 using namespace std::literals::chrono_literals;
355 namespace cr = std::chrono;
356
357 constexpr std::basic_string_view<CharT> fmt = SV("{:%%j='%j'%n}");
358 constexpr std::basic_string_view<CharT> lfmt = SV("{:L%%j='%j'%n}");
359
360 const std::locale loc(LOCALE_ja_JP_UTF_8);
361 std::locale::global(std::locale(LOCALE_fr_FR_UTF_8));
362
363 // Non localized output using C-locale
364 check(SV("%j='006'\n"), fmt, cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
365 check(SV("%j='138'\n"), fmt, cr::gps_seconds(1'684'035'218s)); // 03:33:20 GPS Wednesday, 18 May 2033
366
367 // Use the global locale (fr_FR)
368 check(SV("%j='006'\n"), lfmt, cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
369 check(SV("%j='138'\n"), lfmt, cr::gps_seconds(1'684'035'218s)); // 03:33:20 GPS Wednesday, 18 May 2033
370
371 // Use supplied locale (ja_JP). This locale has a different alternate.
372 check(loc, SV("%j='006'\n"), lfmt, cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
373 check(loc, SV("%j='138'\n"), lfmt, cr::gps_seconds(1'684'035'218s)); // 03:33:20 GPS Wednesday, 18 May 2033
374
375 std::locale::global(loc: std::locale::classic());
376}
377
378template <class CharT>
379static void test_valid_values_week() {
380 using namespace std::literals::chrono_literals;
381 namespace cr = std::chrono;
382
383 constexpr std::basic_string_view<CharT> fmt = SV("{:%%U='%U'%t%%OU='%OU'%t%%W='%W'%t%%OW='%OW'%n}");
384 constexpr std::basic_string_view<CharT> lfmt = SV("{:L%%U='%U'%t%%OU='%OU'%t%%W='%W'%t%%OW='%OW'%n}");
385
386 const std::locale loc(LOCALE_ja_JP_UTF_8);
387 std::locale::global(std::locale(LOCALE_fr_FR_UTF_8));
388
389 // Non localized output using C-locale
390 check(SV("%U='01'\t%OU='01'\t%W='00'\t%OW='00'\n"), fmt,
391 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
392
393 check(SV("%U='20'\t%OU='20'\t%W='20'\t%OW='20'\n"),
394 fmt,
395 cr::gps_seconds(1'684'035'218s)); // 03:33:20 GPS Wednesday, 18 May 2033
396
397 // Use the global locale (fr_FR)
398 check(SV("%U='01'\t%OU='01'\t%W='00'\t%OW='00'\n"), lfmt,
399 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
400
401 check(SV("%U='20'\t%OU='20'\t%W='20'\t%OW='20'\n"),
402 lfmt,
403 cr::gps_seconds(1'684'035'218s)); // 03:33:20 GPS Wednesday, 18 May 2033
404
405 // Use supplied locale (ja_JP). This locale has a different alternate.
406#if defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)
407 check(loc,
408 SV("%U='01'\t%OU='001\t%W='00'\t%OW='00'\n"),
409 lfmt,
410 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
411
412 check(loc,
413 SV("%U='20'\t%OU='20'\t%W='20'\t%OW='20'\n"),
414 lfmt,
415 cr::gps_seconds(1'684'035'218s)); // 03:33:20 GPS Wednesday, 18 May 2033
416#else // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)
417 check(loc,
418 SV("%U='01'\t%OU='一'\t%W='00'\t%OW='〇'\n"),
419 lfmt,
420 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
421
422 check(loc,
423 SV("%U='20'\t%OU='二十'\t%W='20'\t%OW='二十'\n"),
424 lfmt,
425 cr::gps_seconds(1'684'035'218s)); // 03:33:20 GPS Wednesday, 18 May 2033
426#endif // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)
427 std::locale::global(loc: std::locale::classic());
428}
429
430template <class CharT>
431static void test_valid_values_iso_8601_week() {
432 using namespace std::literals::chrono_literals;
433 namespace cr = std::chrono;
434
435 constexpr std::basic_string_view<CharT> fmt = SV("{:%%g='%g'%t%%G='%G'%t%%V='%V'%t%%OV='%OV'%n}");
436 constexpr std::basic_string_view<CharT> lfmt = SV("{:L%%g='%g'%t%%G='%G'%t%%V='%V'%t%%OV='%OV'%n}");
437
438 const std::locale loc(LOCALE_ja_JP_UTF_8);
439 std::locale::global(std::locale(LOCALE_fr_FR_UTF_8));
440
441 // Non localized output using C-locale
442 check(SV("%g='80'\t%G='1980'\t%V='01'\t%OV='01'\n"), fmt,
443 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
444
445 check(SV("%g='09'\t%G='2009'\t%V='07'\t%OV='07'\n"),
446 fmt,
447 cr::gps_seconds(918'603'105s)); // 23:31:30 GPS Friday, 13 February 2009
448
449 // Use the global locale (fr_FR)
450 check(SV("%g='80'\t%G='1980'\t%V='01'\t%OV='01'\n"),
451 lfmt,
452 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
453
454 check(SV("%g='09'\t%G='2009'\t%V='07'\t%OV='07'\n"),
455 lfmt,
456 cr::gps_seconds(918'603'105s)); // 23:31:30 GPS Friday, 13 February 2009
457
458 // Use supplied locale (ja_JP). This locale has a different alternate.
459#if defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)
460 check(loc,
461 SV("%g='80'\t%G='1980'\t%V='01'\t%OV='01'\n"),
462 lfmt,
463 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
464
465 check(loc,
466 SV("%g='09'\t%G='2009'\t%V='07'\t%OV='07'\n"),
467 lfmt,
468 cr::gps_seconds(918'603'105s)); // 23:31:30 GPS Friday, 13 February 2009
469#else // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)
470 check(loc,
471 SV("%g='80'\t%G='1980'\t%V='01'\t%OV='一'\n"),
472 lfmt,
473 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
474
475 check(loc,
476 SV("%g='09'\t%G='2009'\t%V='07'\t%OV='七'\n"),
477 lfmt,
478 cr::gps_seconds(918'603'105s)); // 23:31:30 GPS Friday, 13 February 2009
479#endif // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)
480
481 std::locale::global(loc: std::locale::classic());
482}
483
484template <class CharT>
485static void test_valid_values_date() {
486 using namespace std::literals::chrono_literals;
487 namespace cr = std::chrono;
488
489 constexpr std::basic_string_view<CharT> fmt = SV("{:%%D='%D'%t%%F='%F'%t%%x='%x'%t%%Ex='%Ex'%n}");
490 constexpr std::basic_string_view<CharT> lfmt = SV("{:L%%D='%D'%t%%F='%F'%t%%x='%x'%t%%Ex='%Ex'%n}");
491
492 const std::locale loc(LOCALE_ja_JP_UTF_8);
493 std::locale::global(std::locale(LOCALE_fr_FR_UTF_8));
494
495 // Non localized output using C-locale
496 check(SV("%D='01/06/80'\t%F='1980-01-06'\t%x='01/06/80'\t%Ex='01/06/80'\n"),
497 fmt,
498 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
499
500 check(SV("%D='02/13/09'\t%F='2009-02-13'\t%x='02/13/09'\t%Ex='02/13/09'\n"),
501 fmt,
502 cr::gps_seconds(918'603'105s)); // 23:31:30 GPS Friday, 13 February 2009
503
504 // Use the global locale (fr_FR)
505#if defined(__APPLE__) || defined(__FreeBSD__)
506 check(SV("%D='01/06/80'\t%F='1980-01-01'\t%x='06.01.1980'\t%Ex='06.01.1980'\n"),
507 lfmt,
508 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
509
510 check(SV("%D='02/13/09'\t%F='2009-02-13'\t%x='13.02.2009'\t%Ex='13.02.2009'\n"),
511 lfmt,
512 cr::gps_seconds(918'603'105s)); // 23:31:30 GPS Friday, 13 February 2009
513#else
514 check(SV("%D='01/06/80'\t%F='1980-01-06'\t%x='06/01/1980'\t%Ex='06/01/1980'\n"),
515 lfmt,
516 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
517
518 check(SV("%D='02/13/09'\t%F='2009-02-13'\t%x='13/02/2009'\t%Ex='13/02/2009'\n"),
519 lfmt,
520 cr::gps_seconds(918'603'105s)); // 23:31:30 GPS Friday, 13 February 2009
521#endif
522
523 // Use supplied locale (ja_JP). This locale has a different alternate.
524#if defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)
525 check(loc,
526 SV("%D='01/06/80'\t%F='1980-01-06'\t%x='1980/01/06'\t%Ex='1980/01/06'\n"),
527 lfmt,
528 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
529
530 check(loc,
531 SV("%D='02/13/09'\t%F='2009-02-13'\t%x='2009/02/13'\t%Ex='2009/02/13'\n"),
532 lfmt,
533 cr::gps_seconds(918'603'105s)); // 23:31:30 GPS Friday, 13 February 2009
534#else // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)
535 check(loc,
536 SV("%D='01/06/80'\t%F='1980-01-06'\t%x='1980年01月06日'\t%Ex='昭和55年01月06日'\n"),
537 lfmt,
538 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
539
540 check(loc,
541 SV("%D='02/13/09'\t%F='2009-02-13'\t%x='2009年02月13日'\t%Ex='平成21年02月13日'\n"),
542 lfmt,
543 cr::gps_seconds(918'603'105s)); // 23:31:30 GPS Friday, 13 February 2009
544#endif // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)
545
546 std::locale::global(loc: std::locale::classic());
547}
548
549template <class CharT>
550static void test_valid_values_time() {
551 using namespace std::literals::chrono_literals;
552 namespace cr = std::chrono;
553
554 constexpr std::basic_string_view<CharT> fmt = SV(
555 "{:"
556 "%%H='%H'%t"
557 "%%OH='%OH'%t"
558 "%%I='%I'%t"
559 "%%OI='%OI'%t"
560 "%%M='%M'%t"
561 "%%OM='%OM'%t"
562 "%%S='%S'%t"
563 "%%OS='%OS'%t"
564 "%%p='%p'%t"
565 "%%R='%R'%t"
566 "%%T='%T'%t"
567 "%%r='%r'%t"
568 "%%X='%X'%t"
569 "%%EX='%EX'%t"
570 "%n}");
571 constexpr std::basic_string_view<CharT> lfmt = SV(
572 "{:L"
573 "%%H='%H'%t"
574 "%%OH='%OH'%t"
575 "%%I='%I'%t"
576 "%%OI='%OI'%t"
577 "%%M='%M'%t"
578 "%%OM='%OM'%t"
579 "%%S='%S'%t"
580 "%%OS='%OS'%t"
581 "%%p='%p'%t"
582 "%%R='%R'%t"
583 "%%T='%T'%t"
584 "%%r='%r'%t"
585 "%%X='%X'%t"
586 "%%EX='%EX'%t"
587 "%n}");
588
589 const std::locale loc(LOCALE_ja_JP_UTF_8);
590 std::locale::global(std::locale(LOCALE_fr_FR_UTF_8));
591
592 // Non localized output using C-locale
593 check(SV("%H='00'\t"
594 "%OH='00'\t"
595 "%I='12'\t"
596 "%OI='12'\t"
597 "%M='00'\t"
598 "%OM='00'\t"
599 "%S='00'\t"
600 "%OS='00'\t"
601 "%p='AM'\t"
602 "%R='00:00'\t"
603 "%T='00:00:00'\t"
604 "%r='12:00:00 AM'\t"
605 "%X='00:00:00'\t"
606 "%EX='00:00:00'\t"
607 "\n"),
608 fmt,
609 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
610
611 check(SV("%H='23'\t"
612 "%OH='23'\t"
613 "%I='11'\t"
614 "%OI='11'\t"
615 "%M='31'\t"
616 "%OM='31'\t"
617 "%S='30.123'\t"
618 "%OS='30.123'\t"
619 "%p='PM'\t"
620 "%R='23:31'\t"
621 "%T='23:31:30.123'\t"
622 "%r='11:31:30 PM'\t"
623 "%X='23:31:30'\t"
624 "%EX='23:31:30'\t"
625 "\n"),
626 fmt,
627 cr::gps_time<cr::milliseconds>(918'603'105'123ms)); // 23:31:30 GPS Friday, 13 February 2009
628
629 // Use the global locale (fr_FR)
630 check(SV("%H='00'\t"
631 "%OH='00'\t"
632 "%I='12'\t"
633 "%OI='12'\t"
634 "%M='00'\t"
635 "%OM='00'\t"
636 "%S='00'\t"
637 "%OS='00'\t"
638#if defined(_AIX)
639 "%p='AM'\t"
640#else
641 "%p=''\t"
642#endif
643 "%R='00:00'\t"
644 "%T='00:00:00'\t"
645#ifdef _WIN32
646 "%r='00:00:00'\t"
647#elif defined(_AIX)
648 "%r='12:00:00 AM'\t"
649#elif defined(__APPLE__) || defined(__FreeBSD__)
650 "%r=''\t"
651#else
652 "%r='12:00:00 '\t"
653#endif
654 "%X='00:00:00'\t"
655 "%EX='00:00:00'\t"
656 "\n"),
657 lfmt,
658 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
659
660 check(SV("%H='23'\t"
661 "%OH='23'\t"
662 "%I='11'\t"
663 "%OI='11'\t"
664 "%M='31'\t"
665 "%OM='31'\t"
666 "%S='30,123'\t"
667 "%OS='30,123'\t"
668#if defined(_AIX)
669 "%p='PM'\t"
670#else
671 "%p=''\t"
672#endif
673 "%R='23:31'\t"
674 "%T='23:31:30,123'\t"
675#ifdef _WIN32
676 "%r='23:31:30'\t"
677#elif defined(_AIX)
678 "%r='11:31:30 PM'\t"
679#elif defined(__APPLE__) || defined(__FreeBSD__)
680 "%r=''\t"
681#else
682 "%r='11:31:30 '\t"
683#endif
684 "%X='23:31:30'\t"
685 "%EX='23:31:30'\t"
686 "\n"),
687 lfmt,
688 cr::gps_time<cr::milliseconds>(918'603'105'123ms)); // 23:31:30 GPS Friday, 13 February 2009
689
690 // Use supplied locale (ja_JP). This locale has a different alternate.
691#if defined(__APPLE__) || defined(_AIX) || defined(_WIN32) || defined(__FreeBSD__)
692 check(loc,
693 SV("%H='00'\t"
694 "%OH='00'\t"
695 "%I='12'\t"
696 "%OI='12'\t"
697 "%M='00'\t"
698 "%OM='00'\t"
699 "%S='00'\t"
700 "%OS='00'\t"
701# if defined(__APPLE__)
702 "%p='AM'\t"
703# else
704 "%p='午前'\t"
705# endif
706 "%R='00:00'\t"
707 "%T='00:00:00'\t"
708# if defined(__APPLE__) || defined(__FreeBSD__)
709# if defined(__APPLE__)
710 "%r='12:00:00 AM'\t"
711# else
712 "%r='12:00:00 午前'\t"
713# endif
714 "%X='00時00分00秒'\t"
715 "%EX='00時00分00秒'\t"
716# elif defined(_WIN32)
717 "%r='0:00:00'\t"
718 "%X='0:00:00'\t"
719 "%EX='0:00:00'\t"
720# else
721 "%r='午前12:00:00'\t"
722 "%X='00:00:00'\t"
723 "%EX='00:00:00'\t"
724# endif
725 "\n"),
726 lfmt,
727 cr::hh_mm_ss(0s));
728
729 check(loc,
730 SV("%H='23'\t"
731 "%OH='23'\t"
732 "%I='11'\t"
733 "%OI='11'\t"
734 "%M='31'\t"
735 "%OM='31'\t"
736 "%S='30.123'\t"
737 "%OS='30.123'\t"
738# if defined(__APPLE__)
739 "%p='PM'\t"
740# else
741 "%p='午後'\t"
742# endif
743 "%R='23:31'\t"
744 "%T='23:31:30.123'\t"
745# if defined(__APPLE__) || defined(__FreeBSD__)
746# if defined(__APPLE__)
747 "%r='11:31:30 PM'\t"
748# else
749 "%r='11:31:30 午後'\t"
750# endif
751 "%X='23時31分30秒'\t"
752 "%EX='23時31分30秒'\t"
753# elif defined(_WIN32)
754 "%r='23:31:30'\t"
755 "%X='23:31:30'\t"
756 "%EX='23:31:30'\t"
757# else
758 "%r='午後11:31:30'\t"
759 "%X='23:31:30'\t"
760 "%EX='23:31:30'\t"
761# endif
762 "\n"),
763 lfmt,
764 cr::hh_mm_ss(23h + 31min + 30s + 123ms));
765#else // defined(__APPLE__) || defined(_AIX) || defined(_WIN32) || defined(__FreeBSD__)
766 check(loc,
767 SV("%H='00'\t"
768 "%OH='〇'\t"
769 "%I='12'\t"
770 "%OI='十二'\t"
771 "%M='00'\t"
772 "%OM='〇'\t"
773 "%S='00'\t"
774 "%OS='〇'\t"
775 "%p='午前'\t"
776 "%R='00:00'\t"
777 "%T='00:00:00'\t"
778 "%r='午前12時00分00秒'\t"
779 "%X='00時00分00秒'\t"
780 "%EX='00時00分00秒'\t"
781 "\n"),
782 lfmt,
783 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
784
785 check(loc,
786 SV("%H='23'\t"
787 "%OH='二十三'\t"
788 "%I='11'\t"
789 "%OI='十一'\t"
790 "%M='31'\t"
791 "%OM='三十一'\t"
792 "%S='30.123'\t"
793 "%OS='三十.123'\t"
794 "%p='午後'\t"
795 "%R='23:31'\t"
796 "%T='23:31:30.123'\t"
797 "%r='午後11時31分30秒'\t"
798 "%X='23時31分30秒'\t"
799 "%EX='23時31分30秒'\t"
800 "\n"),
801 lfmt,
802 cr::gps_time<cr::milliseconds>(918'603'105'123ms)); // 23:31:30 GPS Friday, 13 February 2009
803#endif // defined(__APPLE__) || defined(_AIX) || defined(_WIN32) || defined(__FreeBSD__)
804
805 std::locale::global(loc: std::locale::classic());
806}
807
808template <class CharT>
809static void test_valid_values_date_time() {
810 using namespace std::literals::chrono_literals;
811 namespace cr = std::chrono;
812
813 constexpr std::basic_string_view<CharT> fmt = SV("{:%%c='%c'%t%%Ec='%Ec'%n}");
814 constexpr std::basic_string_view<CharT> lfmt = SV("{:L%%c='%c'%t%%Ec='%Ec'%n}");
815
816 const std::locale loc(LOCALE_ja_JP_UTF_8);
817 std::locale::global(std::locale(LOCALE_fr_FR_UTF_8));
818
819 // Non localized output using C-locale
820 check(SV("%c='Sun Jan 6 00:00:00 1980'\t%Ec='Sun Jan 6 00:00:00 1980'\n"),
821 fmt,
822 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
823
824 check(SV("%c='Fri Feb 13 23:31:30 2009'\t%Ec='Fri Feb 13 23:31:30 2009'\n"),
825 fmt,
826 cr::gps_seconds(918'603'105s)); // 23:31:30 GPS Friday, 13 February 2009
827
828 // Use the global locale (fr_FR)
829 check(
830// https://sourceware.org/bugzilla/show_bug.cgi?id=24054
831#if defined(__powerpc__) && defined(__linux__)
832 SV("%c='dim. 06 janv. 1980 00:00:00 GPS'\t%Ec='dim. 06 janv. 1958 00:00:00 GPS'\n"),
833#elif defined(__GLIBC__) && __GLIBC__ <= 2 && __GLIBC_MINOR__ < 29
834 SV("%c='dim. 06 janv. 1980 00:00:00 GMT'\t%Ec='dim. 06 janv. 1980 00:00:00 GMT'\n"),
835#elif defined(_AIX)
836 SV("%c=' 1 janvier 1980 à 00:00:00 GPS'\t%Ec=' 6 janvier 1980 à 00:00:00 GPS'\n"),
837#elif defined(__APPLE__)
838 SV("%c='Dim 6 jan 00:00:00 1980'\t%Ec='Dim 6 jan 00:00:00 1980'\n"),
839#elif defined(_WIN32)
840 SV("%c='06/01/1980 00:00:00'\t%Ec='06/01/1980 00:00:00'\n"),
841#elif defined(__FreeBSD__)
842 SV("%c='dim. 6 janv. 00:00:00 1980'\t%Ec='dim. 6 janv. 00:00:00 1980'\n"),
843#else
844 SV("%c='dim. 06 janv. 1980 00:00:00'\t%Ec='dim. 06 janv. 1980 00:00:00'\n"),
845#endif
846 lfmt,
847 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
848
849 check(
850// https://sourceware.org/bugzilla/show_bug.cgi?id=24054
851#if defined(__powerpc__) && defined(__linux__)
852 SV("%c='ven. 13 févr. 2009 23:31:30 GPS'\t%Ec='ven. 13 févr. 2009 23:31:30 GPS'\n"),
853#elif defined(__GLIBC__) && __GLIBC__ <= 2 && __GLIBC_MINOR__ < 29
854 SV("%c='ven. 13 févr. 2009 23:31:30 GMT'\t%Ec='ven. 13 févr. 2009 23:31:30 GMT'\n"),
855#elif defined(_AIX)
856 SV("%c='13 février 2009 à 23:31:30 GPS'\t%Ec='13 février 2009 à 23:31:30 GPS'\n"),
857#elif defined(__APPLE__)
858 SV("%c='Ven 13 fév 23:31:30 2009'\t%Ec='Ven 13 fév 23:31:30 2009'\n"),
859#elif defined(_WIN32)
860 SV("%c='13/02/2009 23:31:30'\t%Ec='13/02/2009 23:31:30'\n"),
861#elif defined(__FreeBSD__)
862 SV("%c='ven. 13 févr. 23:31:30 2009'\t%Ec='ven. 13 févr. 23:31:30 2009'\n"),
863#else
864 SV("%c='ven. 13 févr. 2009 23:31:30'\t%Ec='ven. 13 févr. 2009 23:31:30'\n"),
865#endif
866 lfmt,
867 cr::gps_seconds(918'603'105s)); // 23:31:30 GPS Friday, 13 February 2009
868
869 // Use supplied locale (ja_JP). This locale has a different alternate.a
870#if defined(__APPLE__) || defined(__FreeBSD__)
871 check(loc,
872 SV("%c='水 1/ 6 00:00:00 1980'\t%Ec='水 1/ 6 00:00:00 1980'\n"),
873 lfmt,
874 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
875 check(loc,
876 SV("%c='金 2/13 23:31:30 2009'\t%Ec='金 2/13 23:31:30 2009'\n"),
877 lfmt,
878 cr::gps_seconds(918'603'105s)); // 23:31:30 GPS Friday, 13 February 2009
879#elif defined(_AIX) // defined(__APPLE__)|| defined(__FreeBSD__)
880 check(loc,
881 SV("%c='1980年01月 6日 00:00:00 GPS'\t%Ec='1980年01月 6日 00:00:00 GPS'\n"),
882 lfmt,
883 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
884 check(loc,
885 SV("%c='2009年02月13日 23:31:30 GPS'\t%Ec='2009年02月13日 23:31:30 GPS'\n"),
886 lfmt,
887 cr::gps_seconds(918'603'105s)); // 23:31:30 GPS Friday, 13 February 2009
888#elif defined(_WIN32) // defined(__APPLE__)|| defined(__FreeBSD__)
889 check(loc,
890 SV("%c='1980/01/06 0:00:00'\t%Ec='1980/01/06 0:00:00'\n"),
891 lfmt,
892 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
893 check(loc,
894 SV("%c='2009/02/13 23:31:30'\t%Ec='2009/02/13 23:31:30'\n"),
895 lfmt,
896 cr::gps_seconds(918'603'105s)); // 23:31:30 GPS Friday, 13 February 2009
897#else // defined(__APPLE__)|| defined(__FreeBSD__)
898 check(loc,
899 SV("%c='1980年01月06日 00時00分00秒'\t%Ec='昭和55年01月06日 00時00分00秒'\n"),
900 lfmt,
901 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
902
903 check(loc,
904 SV("%c='2009年02月13日 23時31分30秒'\t%Ec='平成21年02月13日 23時31分30秒'\n"),
905 lfmt,
906 cr::gps_seconds(918'603'105s)); // 23:31:30 GPS Friday, 13 February 2009
907#endif // defined(__APPLE__)|| defined(__FreeBSD__)
908
909 std::locale::global(loc: std::locale::classic());
910}
911
912template <class CharT>
913static void test_valid_values_time_zone() {
914 using namespace std::literals::chrono_literals;
915 namespace cr = std::chrono;
916
917 constexpr std::basic_string_view<CharT> fmt = SV("{:%%z='%z'%t%%Ez='%Ez'%t%%Oz='%Oz'%t%%Z='%Z'%n}");
918 constexpr std::basic_string_view<CharT> lfmt = SV("{:L%%z='%z'%t%%Ez='%Ez'%t%%Oz='%Oz'%t%%Z='%Z'%n}");
919
920 const std::locale loc(LOCALE_ja_JP_UTF_8);
921 std::locale::global(std::locale(LOCALE_fr_FR_UTF_8));
922
923 // Non localized output using C-locale
924 check(SV("%z='+0000'\t%Ez='+00:00'\t%Oz='+00:00'\t%Z='GPS'\n"),
925 fmt,
926 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
927
928 // Use the global locale (fr_FR)
929 check(SV("%z='+0000'\t%Ez='+00:00'\t%Oz='+00:00'\t%Z='GPS'\n"),
930 lfmt,
931 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
932
933 // Use supplied locale (ja_JP).
934 check(loc,
935 SV("%z='+0000'\t%Ez='+00:00'\t%Oz='+00:00'\t%Z='GPS'\n"),
936 lfmt,
937 cr::gps_seconds(0s)); // 00:00:00 GPS Sunday, 6 January 1980
938
939 std::locale::global(loc: std::locale::classic());
940}
941
942template <class CharT>
943static void test_valid_values() {
944 test_valid_values_year<CharT>();
945 test_valid_values_month<CharT>();
946 test_valid_values_day<CharT>();
947 test_valid_values_weekday<CharT>();
948 test_valid_values_day_of_year<CharT>();
949 test_valid_values_week<CharT>();
950 test_valid_values_iso_8601_week<CharT>();
951 test_valid_values_date<CharT>();
952 test_valid_values_time<CharT>();
953 test_valid_values_date_time<CharT>();
954 test_valid_values_time_zone<CharT>();
955}
956
957template <class CharT>
958static void test() {
959 using namespace std::literals::chrono_literals;
960 namespace cr = std::chrono;
961
962 test_no_chrono_specs<CharT>();
963 test_valid_values<CharT>();
964 check_invalid_types<CharT>(
965 {SV("a"), SV("A"), SV("b"), SV("B"), SV("c"), SV("C"), SV("d"), SV("D"), SV("e"), SV("F"), SV("g"),
966 SV("G"), SV("h"), SV("H"), SV("I"), SV("j"), SV("m"), SV("M"), SV("p"), SV("r"), SV("R"), SV("S"),
967 SV("T"), SV("u"), SV("U"), SV("V"), SV("w"), SV("W"), SV("x"), SV("X"), SV("y"), SV("Y"), SV("z"),
968 SV("Z"), SV("Ec"), SV("EC"), SV("Ex"), SV("EX"), SV("Ey"), SV("EY"), SV("Ez"), SV("Od"), SV("Oe"), SV("OH"),
969 SV("OI"), SV("Om"), SV("OM"), SV("OS"), SV("Ou"), SV("OU"), SV("OV"), SV("Ow"), SV("OW"), SV("Oy"), SV("Oz")},
970 cr::gps_seconds(0s));
971
972 check_exception("The format specifier expects a '%' or a '}'", SV("{:A"), cr::gps_seconds(0s));
973 check_exception("The chrono specifiers contain a '{'", SV("{:%%{"), cr::gps_seconds(0s));
974 check_exception("End of input while parsing a conversion specifier", SV("{:%"), cr::gps_seconds(0s));
975 check_exception("End of input while parsing the modifier E", SV("{:%E"), cr::gps_seconds(0s));
976 check_exception("End of input while parsing the modifier O", SV("{:%O"), cr::gps_seconds(0s));
977
978 // Precision not allowed
979 check_exception("The format specifier expects a '%' or a '}'", SV("{:.3}"), cr::gps_seconds(0s));
980}
981
982int main(int, char**) {
983 test<char>();
984
985#ifndef TEST_HAS_NO_WIDE_CHARACTERS
986 test<wchar_t>();
987#endif
988
989 return 0;
990}
991

source code of libcxx/test/std/time/time.syn/formatter.gps_time.pass.cpp