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