976 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++14, c++1710// UNSUPPORTED: no-filesystem, no-localization, no-tzdb11 12// TODO FMT This test should not require std::to_chars(floating-point)13// XFAIL: availability-fp_to_chars-missing14 15// XFAIL: libcpp-has-no-experimental-tzdb16 17// REQUIRES: locale.fr_FR.UTF-818// REQUIRES: locale.ja_JP.UTF-819 20// <chrono>21//22// template<class Duration, class TimeZonePtr, class charT>23// struct formatter<chrono::zoned_time<Duration, TimeZonePtr>, charT>24 25#include <chrono>26#include <format>27 28#include <cassert>29#include <concepts>30#include <locale>31#include <iostream>32#include <type_traits>33 34#include "formatter_tests.h"35#include "make_string.h"36#include "platform_support.h" // locale name macros37#include "test_macros.h"38 39template <class CharT>40static void test_no_chrono_specs() {41 using namespace std::literals::chrono_literals;42 43 check(SV("1970-01-01 01:00:00.000000042 +01"),44 SV("{}"),45 std::chrono::zoned_time("Etc/GMT-1", std::chrono::sys_time<std::chrono::nanoseconds>{42ns}));46 check(SV("1970-01-01 01:00:00.000042 +01"),47 SV("{}"),48 std::chrono::zoned_time("Etc/GMT-1", std::chrono::sys_time<std::chrono::microseconds>{42us}));49 check(SV("1970-01-01 01:00:00.042 +01"),50 SV("{}"),51 std::chrono::zoned_time("Etc/GMT-1", std::chrono::sys_time<std::chrono::milliseconds>{42ms}));52 check(SV("1970-01-01 01:00:42 +01"),53 SV("{}"),54 std::chrono::zoned_time("Etc/GMT-1", std::chrono::sys_time<std::chrono::seconds>{42s}));55 check(SV("1970-02-12 01:00:00 +01"),56 SV("{}"),57 std::chrono::zoned_time("Etc/GMT-1", std::chrono::sys_time<std::chrono::days>{std::chrono::days{42}}));58 check(SV("1970-10-22 01:00:00 +01"),59 SV("{}"),60 std::chrono::zoned_time("Etc/GMT-1", std::chrono::sys_time<std::chrono::weeks>{std::chrono::weeks{42}}));61}62 63template <class CharT>64static void test_valid_values_year() {65 using namespace std::literals::chrono_literals;66 67 constexpr std::basic_string_view<CharT> fmt =68 SV("{:%%C='%C'%t%%EC='%EC'%t%%y='%y'%t%%Oy='%Oy'%t%%Ey='%Ey'%t%%Y='%Y'%t%%EY='%EY'%n}");69 constexpr std::basic_string_view<CharT> lfmt =70 SV("{:L%%C='%C'%t%%EC='%EC'%t%%y='%y'%t%%Oy='%Oy'%t%%Ey='%Ey'%t%%Y='%Y'%t%%EY='%EY'%n}");71 72 const std::locale loc(LOCALE_ja_JP_UTF_8);73 std::locale::global(std::locale(LOCALE_fr_FR_UTF_8));74 75 // Non localized output using C-locale76 check(SV("%C='19'\t%EC='19'\t%y='70'\t%Oy='70'\t%Ey='70'\t%Y='1970'\t%EY='1970'\n"),77 fmt,78 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 197079 80 check(SV("%C='20'\t%EC='20'\t%y='09'\t%Oy='09'\t%Ey='09'\t%Y='2009'\t%EY='2009'\n"),81 fmt,82 std::chrono::zoned_time(std::chrono::sys_seconds{1'234'567'890s})); // 23:31:30 UTC on Friday, 13 February 200983 84 // Use the global locale (fr_FR)85 check(SV("%C='19'\t%EC='19'\t%y='70'\t%Oy='70'\t%Ey='70'\t%Y='1970'\t%EY='1970'\n"),86 lfmt,87 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 197088 89 check(SV("%C='20'\t%EC='20'\t%y='09'\t%Oy='09'\t%Ey='09'\t%Y='2009'\t%EY='2009'\n"),90 lfmt,91 std::chrono::zoned_time(std::chrono::sys_seconds{1'234'567'890s})); // 23:31:30 UTC on Friday, 13 February 200992 93 // Use supplied locale (ja_JP). This locale has a different alternate.94#if defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)95 96 check(loc,97 SV("%C='19'\t%EC='19'\t%y='70'\t%Oy='70'\t%Ey='70'\t%Y='1970'\t%EY='1970'\n"),98 lfmt,99 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970100 101 check(loc,102 SV("%C='20'\t%EC='20'\t%y='09'\t%Oy='09'\t%Ey='09'\t%Y='2009'\t%EY='2009'\n"),103 lfmt,104 std::chrono::zoned_time(std::chrono::sys_seconds{1'234'567'890s})); // 23:31:30 UTC on Friday, 13 February 2009105#else // defined(_WIN32) || defined(__APPLE__) || defined(_AIX)|| defined(__FreeBSD__)106 107 check(loc,108 SV("%C='19'\t%EC='昭和'\t%y='70'\t%Oy='七十'\t%Ey='45'\t%Y='1970'\t%EY='昭和45年'\n"),109 lfmt,110 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970111 112 check(loc,113 SV("%C='20'\t%EC='平成'\t%y='09'\t%Oy='九'\t%Ey='21'\t%Y='2009'\t%EY='平成21年'\n"),114 lfmt,115 std::chrono::zoned_time(std::chrono::sys_seconds{1'234'567'890s})); // 23:31:30 UTC on Friday, 13 February 2009116#endif // defined(_WIN32) || defined(__APPLE__) || defined(_AIX)|| defined(__FreeBSD__)117 118 std::locale::global(std::locale::classic());119}120 121template <class CharT>122static void test_valid_values_month() {123 using namespace std::literals::chrono_literals;124 125 constexpr std::basic_string_view<CharT> fmt = SV("{:%%b='%b'%t%%h='%h'%t%%B='%B'%t%%m='%m'%t%%Om='%Om'%n}");126 constexpr std::basic_string_view<CharT> lfmt = SV("{:L%%b='%b'%t%%h='%h'%t%%B='%B'%t%%m='%m'%t%%Om='%Om'%n}");127 128 const std::locale loc(LOCALE_ja_JP_UTF_8);129 std::locale::global(std::locale(LOCALE_fr_FR_UTF_8));130 131 // Non localized output using C-locale132 check(SV("%b='Jan'\t%h='Jan'\t%B='January'\t%m='01'\t%Om='01'\n"),133 fmt,134 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970135 136 check(SV("%b='May'\t%h='May'\t%B='May'\t%m='05'\t%Om='05'\n"),137 fmt,138 std::chrono::zoned_time(std::chrono::sys_seconds{2'000'000'000s})); // 03:33:20 UTC on Wednesday, 18 May 2033139 140 // Use the global locale (fr_FR)141#if defined(__APPLE__)142 check(SV("%b='jan'\t%h='jan'\t%B='janvier'\t%m='01'\t%Om='01'\n"),143 lfmt,144 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970145#else146 check(SV("%b='janv.'\t%h='janv.'\t%B='janvier'\t%m='01'\t%Om='01'\n"),147 lfmt,148 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970149#endif150 151 check(SV("%b='mai'\t%h='mai'\t%B='mai'\t%m='05'\t%Om='05'\n"),152 lfmt,153 std::chrono::zoned_time(std::chrono::sys_seconds{2'000'000'000s})); // 03:33:20 UTC on Wednesday, 18 May 2033154 155 // Use supplied locale (ja_JP). This locale has a different alternate.156#ifdef _WIN32157 check(loc,158 SV("%b='1'\t%h='1'\t%B='1月'\t%m='01'\t%Om='01'\n"),159 lfmt,160 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970161 162 check(loc,163 SV("%b='5'\t%h='5'\t%B='5月'\t%m='05'\t%Om='05'\n"),164 lfmt,165 std::chrono::zoned_time(std::chrono::sys_seconds{2'000'000'000s})); // 03:33:20 UTC on Wednesday, 18 May 2033166#elif defined(_AIX) // _WIN32167 check(loc,168 SV("%b='1月'\t%h='1月'\t%B='1月'\t%m='01'\t%Om='01'\n"),169 lfmt,170 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970171 172 check(loc,173 SV("%b='5月'\t%h='5月'\t%B='5月'\t%m='05'\t%Om='05'\n"),174 lfmt,175 std::chrono::zoned_time(std::chrono::sys_seconds{2'000'000'000s})); // 03:33:20 UTC on Wednesday, 18 May 2033176#elif defined(__APPLE__) // _WIN32177 check(loc,178 SV("%b=' 1'\t%h=' 1'\t%B='1月'\t%m='01'\t%Om='01'\n"),179 lfmt,180 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970181 182 check(loc,183 SV("%b=' 5'\t%h=' 5'\t%B='5月'\t%m='05'\t%Om='05'\n"),184 lfmt,185 std::chrono::zoned_time(std::chrono::sys_seconds{2'000'000'000s})); // 03:33:20 UTC on Wednesday, 18 May 2033186#elif defined(__FreeBSD__) // _WIN32187 check(loc,188 SV("%b=' 1月'\t%h=' 1月'\t%B='1月'\t%m='01'\t%Om='01'\n"),189 lfmt,190 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970191 192 check(loc,193 SV("%b=' 5月'\t%h=' 5月'\t%B='5月'\t%m='05'\t%Om='05'\n"),194 lfmt,195 std::chrono::zoned_time(std::chrono::sys_seconds{2'000'000'000s})); // 03:33:20 UTC on Wednesday, 18 May 2033196#else // _WIN32197 check(loc,198 SV("%b=' 1月'\t%h=' 1月'\t%B='1月'\t%m='01'\t%Om='一'\n"),199 lfmt,200 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970201 202 check(loc,203 SV("%b=' 5月'\t%h=' 5月'\t%B='5月'\t%m='05'\t%Om='五'\n"),204 lfmt,205 std::chrono::zoned_time(std::chrono::sys_seconds{2'000'000'000s})); // 03:33:20 UTC on Wednesday, 18 May 2033206#endif // _WIN32207 208 std::locale::global(std::locale::classic());209}210 211template <class CharT>212static void test_valid_values_day() {213 using namespace std::literals::chrono_literals;214 215 constexpr std::basic_string_view<CharT> fmt = SV("{:%%d='%d'%t%%Od='%Od'%t%%e='%e'%t%%Oe='%Oe'%n}");216 constexpr std::basic_string_view<CharT> lfmt = SV("{:L%%d='%d'%t%%Od='%Od'%t%%e='%e'%t%%Oe='%Oe'%n}");217 218 const std::locale loc(LOCALE_ja_JP_UTF_8);219 std::locale::global(std::locale(LOCALE_fr_FR_UTF_8));220 221 // Non localized output using C-locale222 check(SV("%d='01'\t%Od='01'\t%e=' 1'\t%Oe=' 1'\n"),223 fmt,224 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970225 226 check(SV("%d='13'\t%Od='13'\t%e='13'\t%Oe='13'\n"),227 fmt,228 std::chrono::zoned_time(std::chrono::sys_seconds{1'234'567'890s})); // 23:31:30 UTC on Friday, 13 February 2009229 230 // Use the global locale (fr_FR)231 check(SV("%d='01'\t%Od='01'\t%e=' 1'\t%Oe=' 1'\n"),232 lfmt,233 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970234 235 check(SV("%d='13'\t%Od='13'\t%e='13'\t%Oe='13'\n"),236 lfmt,237 std::chrono::zoned_time(std::chrono::sys_seconds{1'234'567'890s})); // 23:31:30 UTC on Friday, 13 February 2009238 239 // Use supplied locale (ja_JP). This locale has a different alternate.240#if defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)241 check(loc,242 SV("%d='01'\t%Od='01'\t%e=' 1'\t%Oe=' 1'\n"),243 lfmt,244 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970245 246 check(loc,247 SV("%d='13'\t%Od='13'\t%e='13'\t%Oe='13'\n"),248 lfmt,249 std::chrono::zoned_time(std::chrono::sys_seconds{1'234'567'890s})); // 23:31:30 UTC on Friday, 13 February 2009250#else // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)251 check(loc,252 SV("%d='01'\t%Od='一'\t%e=' 1'\t%Oe='一'\n"),253 lfmt,254 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970255 256 check(loc,257 SV("%d='13'\t%Od='十三'\t%e='13'\t%Oe='十三'\n"),258 lfmt,259 std::chrono::zoned_time(std::chrono::sys_seconds{1'234'567'890s})); // 23:31:30 UTC on Friday, 13 February 2009260 261#endif // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)262 263 std::locale::global(std::locale::classic());264}265 266template <class CharT>267static void test_valid_values_weekday() {268 using namespace std::literals::chrono_literals;269 270 constexpr std::basic_string_view<CharT> fmt =271 SV("{:%%a='%a'%t%%A='%A'%t%%u='%u'%t%%Ou='%Ou'%t%%w='%w'%t%%Ow='%Ow'%n}");272 constexpr std::basic_string_view<CharT> lfmt =273 SV("{:L%%a='%a'%t%%A='%A'%t%%u='%u'%t%%Ou='%Ou'%t%%w='%w'%t%%Ow='%Ow'%n}");274 275 const std::locale loc(LOCALE_ja_JP_UTF_8);276 std::locale::global(std::locale(LOCALE_fr_FR_UTF_8));277 278 // Non localized output using C-locale279 check(SV("%a='Thu'\t%A='Thursday'\t%u='4'\t%Ou='4'\t%w='4'\t%Ow='4'\n"),280 fmt,281 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970282 283 check(SV("%a='Sun'\t%A='Sunday'\t%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\n"),284 fmt,285 std::chrono::zoned_time(std::chrono::sys_seconds{4'294'967'295s})); // 06:28:15 UTC on Sunday, 7 February 2106286 287 // Use the global locale (fr_FR)288#if defined(__APPLE__)289 check(SV("%a='Jeu'\t%A='Jeudi'\t%u='4'\t%Ou='4'\t%w='4'\t%Ow='4'\n"),290 lfmt,291 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970292 293 check(SV("%a='Dim'\t%A='Dimanche'\t%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\n"),294 lfmt,295 std::chrono::zoned_time(std::chrono::sys_seconds{4'294'967'295s})); // 06:28:15 UTC on Sunday, 7 February 2106296#else297 check(SV("%a='jeu.'\t%A='jeudi'\t%u='4'\t%Ou='4'\t%w='4'\t%Ow='4'\n"),298 lfmt,299 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970300 301 check(SV("%a='dim.'\t%A='dimanche'\t%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\n"),302 lfmt,303 std::chrono::zoned_time(std::chrono::sys_seconds{4'294'967'295s})); // 06:28:15 UTC on Sunday, 7 February 2106304#endif305 306 // Use supplied locale (ja_JP).307 // This locale has a different alternate, but not on all platforms308#if defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)309 check(loc,310 SV("%a='木'\t%A='木曜日'\t%u='4'\t%Ou='4'\t%w='4'\t%Ow='4'\n"),311 lfmt,312 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970313 314 check(loc,315 SV("%a='日'\t%A='日曜日'\t%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\n"),316 lfmt,317 std::chrono::zoned_time(std::chrono::sys_seconds{4'294'967'295s})); // 06:28:15 UTC on Sunday, 7 February 2106318#else // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)319 check(loc,320 SV("%a='木'\t%A='木曜日'\t%u='4'\t%Ou='四'\t%w='4'\t%Ow='四'\n"),321 lfmt,322 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970323 324 check(loc,325 SV("%a='日'\t%A='日曜日'\t%u='7'\t%Ou='七'\t%w='0'\t%Ow='〇'\n"),326 lfmt,327 std::chrono::zoned_time(std::chrono::sys_seconds{4'294'967'295s})); // 06:28:15 UTC on Sunday, 7 February 2106328#endif // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)329 330 std::locale::global(std::locale::classic());331}332 333template <class CharT>334static void test_valid_values_day_of_year() {335 using namespace std::literals::chrono_literals;336 337 constexpr std::basic_string_view<CharT> fmt = SV("{:%%j='%j'%n}");338 constexpr std::basic_string_view<CharT> lfmt = SV("{:L%%j='%j'%n}");339 340 const std::locale loc(LOCALE_ja_JP_UTF_8);341 std::locale::global(std::locale(LOCALE_fr_FR_UTF_8));342 343 // Non localized output using C-locale344 check(SV("%j='001'\n"),345 fmt,346 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970347 check(SV("%j='138'\n"),348 fmt,349 std::chrono::zoned_time(std::chrono::sys_seconds{2'000'000'000s})); // 03:33:20 UTC on Wednesday, 18 May 2033350 351 // Use the global locale (fr_FR)352 check(SV("%j='001'\n"),353 lfmt,354 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970355 check(SV("%j='138'\n"),356 lfmt,357 std::chrono::zoned_time(std::chrono::sys_seconds{2'000'000'000s})); // 03:33:20 UTC on Wednesday, 18 May 2033358 359 // Use supplied locale (ja_JP). This locale has a different alternate.360 check(loc,361 SV("%j='001'\n"),362 lfmt,363 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970364 365 check(loc,366 SV("%j='138'\n"),367 lfmt,368 std::chrono::zoned_time(std::chrono::sys_seconds{2'000'000'000s})); // 03:33:20 UTC on Wednesday, 18 May 2033369 370 std::locale::global(std::locale::classic());371}372 373template <class CharT>374static void test_valid_values_week() {375 using namespace std::literals::chrono_literals;376 377 constexpr std::basic_string_view<CharT> fmt = SV("{:%%U='%U'%t%%OU='%OU'%t%%W='%W'%t%%OW='%OW'%n}");378 constexpr std::basic_string_view<CharT> lfmt = SV("{:L%%U='%U'%t%%OU='%OU'%t%%W='%W'%t%%OW='%OW'%n}");379 380 const std::locale loc(LOCALE_ja_JP_UTF_8);381 std::locale::global(std::locale(LOCALE_fr_FR_UTF_8));382 383 // Non localized output using C-locale384 check(SV("%U='00'\t%OU='00'\t%W='00'\t%OW='00'\n"),385 fmt,386 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970387 388 check(SV("%U='20'\t%OU='20'\t%W='20'\t%OW='20'\n"),389 fmt,390 std::chrono::zoned_time(std::chrono::sys_seconds{2'000'000'000s})); // 03:33:20 UTC on Wednesday, 18 May 2033391 392 // Use the global locale (fr_FR)393 check(SV("%U='00'\t%OU='00'\t%W='00'\t%OW='00'\n"),394 lfmt,395 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970396 397 check(SV("%U='20'\t%OU='20'\t%W='20'\t%OW='20'\n"),398 lfmt,399 std::chrono::zoned_time(std::chrono::sys_seconds{2'000'000'000s})); // 03:33:20 UTC on Wednesday, 18 May 2033400 401 // Use supplied locale (ja_JP). This locale has a different alternate.402#if defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)403 check(loc,404 SV("%U='00'\t%OU='00'\t%W='00'\t%OW='00'\n"),405 lfmt,406 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970407 408 check(loc,409 SV("%U='20'\t%OU='20'\t%W='20'\t%OW='20'\n"),410 lfmt,411 std::chrono::zoned_time(std::chrono::sys_seconds{2'000'000'000s})); // 03:33:20 UTC on Wednesday, 18 May 2033412#else // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)413 check(loc,414 SV("%U='00'\t%OU='〇'\t%W='00'\t%OW='〇'\n"),415 lfmt,416 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970417 418 check(loc,419 SV("%U='20'\t%OU='二十'\t%W='20'\t%OW='二十'\n"),420 lfmt,421 std::chrono::zoned_time(std::chrono::sys_seconds{2'000'000'000s})); // 03:33:20 UTC on Wednesday, 18 May 2033422#endif // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)423 std::locale::global(std::locale::classic());424}425 426template <class CharT>427static void test_valid_values_iso_8601_week() {428 using namespace std::literals::chrono_literals;429 430 constexpr std::basic_string_view<CharT> fmt = SV("{:%%g='%g'%t%%G='%G'%t%%V='%V'%t%%OV='%OV'%n}");431 constexpr std::basic_string_view<CharT> lfmt = SV("{:L%%g='%g'%t%%G='%G'%t%%V='%V'%t%%OV='%OV'%n}");432 433 const std::locale loc(LOCALE_ja_JP_UTF_8);434 std::locale::global(std::locale(LOCALE_fr_FR_UTF_8));435 436 // Non localized output using C-locale437 check(SV("%g='70'\t%G='1970'\t%V='01'\t%OV='01'\n"),438 fmt,439 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970440 441 check(SV("%g='09'\t%G='2009'\t%V='07'\t%OV='07'\n"),442 fmt,443 std::chrono::zoned_time(std::chrono::sys_seconds{1'234'567'890s})); // 23:31:30 UTC on Friday, 13 February 2009444 445 // Use the global locale (fr_FR)446 check(SV("%g='70'\t%G='1970'\t%V='01'\t%OV='01'\n"),447 lfmt,448 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970449 450 check(SV("%g='09'\t%G='2009'\t%V='07'\t%OV='07'\n"),451 lfmt,452 std::chrono::zoned_time(std::chrono::sys_seconds{1'234'567'890s})); // 23:31:30 UTC on Friday, 13 February 2009453 454 // Use supplied locale (ja_JP). This locale has a different alternate.455#if defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)456 check(loc,457 SV("%g='70'\t%G='1970'\t%V='01'\t%OV='01'\n"),458 lfmt,459 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970460 461 check(loc,462 SV("%g='09'\t%G='2009'\t%V='07'\t%OV='07'\n"),463 lfmt,464 std::chrono::zoned_time(std::chrono::sys_seconds{1'234'567'890s})); // 23:31:30 UTC on Friday, 13 February 2009465#else // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)466 check(loc,467 SV("%g='70'\t%G='1970'\t%V='01'\t%OV='一'\n"),468 lfmt,469 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970470 471 check(loc,472 SV("%g='09'\t%G='2009'\t%V='07'\t%OV='七'\n"),473 lfmt,474 std::chrono::zoned_time(std::chrono::sys_seconds{1'234'567'890s})); // 23:31:30 UTC on Friday, 13 February 2009475#endif // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)476 477 std::locale::global(std::locale::classic());478}479 480template <class CharT>481static void test_valid_values_date() {482 using namespace std::literals::chrono_literals;483 484 constexpr std::basic_string_view<CharT> fmt = SV("{:%%D='%D'%t%%F='%F'%t%%x='%x'%t%%Ex='%Ex'%n}");485 constexpr std::basic_string_view<CharT> lfmt = SV("{:L%%D='%D'%t%%F='%F'%t%%x='%x'%t%%Ex='%Ex'%n}");486 487 const std::locale loc(LOCALE_ja_JP_UTF_8);488 std::locale::global(std::locale(LOCALE_fr_FR_UTF_8));489 490 // Non localized output using C-locale491 check(SV("%D='01/01/70'\t%F='1970-01-01'\t%x='01/01/70'\t%Ex='01/01/70'\n"),492 fmt,493 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970494 495 check(SV("%D='02/13/09'\t%F='2009-02-13'\t%x='02/13/09'\t%Ex='02/13/09'\n"),496 fmt,497 std::chrono::zoned_time(std::chrono::sys_seconds{1'234'567'890s})); // 23:31:30 UTC on Friday, 13 February 2009498 499 // Use the global locale (fr_FR)500#if defined(__APPLE__) || defined(__FreeBSD__)501 check(SV("%D='01/01/70'\t%F='1970-01-01'\t%x='01.01.1970'\t%Ex='01.01.1970'\n"),502 lfmt,503 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970504 505 check(SV("%D='02/13/09'\t%F='2009-02-13'\t%x='13.02.2009'\t%Ex='13.02.2009'\n"),506 lfmt,507 std::chrono::zoned_time(std::chrono::sys_seconds{1'234'567'890s})); // 23:31:30 UTC on Friday, 13 February 2009508#else509 check(SV("%D='01/01/70'\t%F='1970-01-01'\t%x='01/01/1970'\t%Ex='01/01/1970'\n"),510 lfmt,511 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970512 513 check(SV("%D='02/13/09'\t%F='2009-02-13'\t%x='13/02/2009'\t%Ex='13/02/2009'\n"),514 lfmt,515 std::chrono::zoned_time(std::chrono::sys_seconds{1'234'567'890s})); // 23:31:30 UTC on Friday, 13 February 2009516#endif517 518 // Use supplied locale (ja_JP). This locale has a different alternate.519#if defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)520 check(loc,521 SV("%D='01/01/70'\t%F='1970-01-01'\t%x='1970/01/01'\t%Ex='1970/01/01'\n"),522 lfmt,523 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970524 525 check(loc,526 SV("%D='02/13/09'\t%F='2009-02-13'\t%x='2009/02/13'\t%Ex='2009/02/13'\n"),527 lfmt,528 std::chrono::zoned_time(std::chrono::sys_seconds{1'234'567'890s})); // 23:31:30 UTC on Friday, 13 February 2009529#else // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)530 check(loc,531 SV("%D='01/01/70'\t%F='1970-01-01'\t%x='1970年01月01日'\t%Ex='昭和45年01月01日'\n"),532 lfmt,533 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970534 535 check(loc,536 SV("%D='02/13/09'\t%F='2009-02-13'\t%x='2009年02月13日'\t%Ex='平成21年02月13日'\n"),537 lfmt,538 std::chrono::zoned_time(std::chrono::sys_seconds{1'234'567'890s})); // 23:31:30 UTC on Friday, 13 February 2009539#endif // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)540 541 std::locale::global(std::locale::classic());542}543 544template <class CharT>545static void test_valid_values_time() {546 using namespace std::literals::chrono_literals;547 548 constexpr std::basic_string_view<CharT> fmt = SV(549 "{:"550 "%%H='%H'%t"551 "%%OH='%OH'%t"552 "%%I='%I'%t"553 "%%OI='%OI'%t"554 "%%M='%M'%t"555 "%%OM='%OM'%t"556 "%%S='%S'%t"557 "%%OS='%OS'%t"558 "%%p='%p'%t"559 "%%R='%R'%t"560 "%%T='%T'%t"561 "%%r='%r'%t"562 "%%X='%X'%t"563 "%%EX='%EX'%t"564 "%n}");565 constexpr std::basic_string_view<CharT> lfmt = SV(566 "{:L"567 "%%H='%H'%t"568 "%%OH='%OH'%t"569 "%%I='%I'%t"570 "%%OI='%OI'%t"571 "%%M='%M'%t"572 "%%OM='%OM'%t"573 "%%S='%S'%t"574 "%%OS='%OS'%t"575 "%%p='%p'%t"576 "%%R='%R'%t"577 "%%T='%T'%t"578 "%%r='%r'%t"579 "%%X='%X'%t"580 "%%EX='%EX'%t"581 "%n}");582 583 const std::locale loc(LOCALE_ja_JP_UTF_8);584 std::locale::global(std::locale(LOCALE_fr_FR_UTF_8));585 586 // Non localized output using C-locale587 check(SV("%H='00'\t"588 "%OH='00'\t"589 "%I='12'\t"590 "%OI='12'\t"591 "%M='00'\t"592 "%OM='00'\t"593 "%S='00'\t"594 "%OS='00'\t"595 "%p='AM'\t"596 "%R='00:00'\t"597 "%T='00:00:00'\t"598 "%r='12:00:00 AM'\t"599 "%X='00:00:00'\t"600 "%EX='00:00:00'\t"601 "\n"),602 fmt,603 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970604 605 check(SV("%H='23'\t"606 "%OH='23'\t"607 "%I='11'\t"608 "%OI='11'\t"609 "%M='31'\t"610 "%OM='31'\t"611 "%S='30.123'\t"612 "%OS='30.123'\t"613 "%p='PM'\t"614 "%R='23:31'\t"615 "%T='23:31:30.123'\t"616 "%r='11:31:30 PM'\t"617 "%X='23:31:30'\t"618 "%EX='23:31:30'\t"619 "\n"),620 fmt,621 std::chrono::sys_time<std::chrono::milliseconds>(622 1'234'567'890'123ms)); // 23:31:30 UTC on Friday, 13 February 2009623 // Use the global locale (fr_FR)624 check(SV("%H='00'\t"625 "%OH='00'\t"626 "%I='12'\t"627 "%OI='12'\t"628 "%M='00'\t"629 "%OM='00'\t"630 "%S='00'\t"631 "%OS='00'\t"632#if defined(_AIX)633 "%p='AM'\t"634#else635 "%p=''\t"636#endif637 "%R='00:00'\t"638 "%T='00:00:00'\t"639#ifdef _WIN32640 "%r='00:00:00'\t"641#elif defined(_AIX)642 "%r='12:00:00 AM'\t"643#elif defined(__APPLE__) || defined(__FreeBSD__)644 "%r=''\t"645#else646 "%r='12:00:00 '\t"647#endif648 "%X='00:00:00'\t"649 "%EX='00:00:00'\t"650 "\n"),651 lfmt,652 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970653 654 check(SV("%H='23'\t"655 "%OH='23'\t"656 "%I='11'\t"657 "%OI='11'\t"658 "%M='31'\t"659 "%OM='31'\t"660 "%S='30,123'\t"661 "%OS='30,123'\t"662#if defined(_AIX)663 "%p='PM'\t"664#else665 "%p=''\t"666#endif667 "%R='23:31'\t"668 "%T='23:31:30,123'\t"669#ifdef _WIN32670 "%r='23:31:30'\t"671#elif defined(_AIX)672 "%r='11:31:30 PM'\t"673#elif defined(__APPLE__) || defined(__FreeBSD__)674 "%r=''\t"675#elif defined(_WIN32)676 "%r='23:31:30 '\t"677#else678 "%r='11:31:30 '\t"679#endif680 "%X='23:31:30'\t"681 "%EX='23:31:30'\t"682 "\n"),683 lfmt,684 std::chrono::sys_time<std::chrono::milliseconds>(685 1'234'567'890'123ms)); // 23:31:30 UTC on Friday, 13 February 2009686 687 // Use supplied locale (ja_JP). This locale has a different alternate.a688#if defined(__APPLE__) || defined(_AIX) || defined(_WIN32) || defined(__FreeBSD__)689 check(loc,690 SV("%H='00'\t"691 "%OH='00'\t"692 "%I='12'\t"693 "%OI='12'\t"694 "%M='00'\t"695 "%OM='00'\t"696 "%S='00'\t"697 "%OS='00'\t"698# if defined(__APPLE__)699 "%p='AM'\t"700# else701 "%p='午前'\t"702# endif703 "%R='00:00'\t"704 "%T='00:00:00'\t"705# if defined(__APPLE__) || defined(__FreeBSD__)706# if defined(__APPLE__)707 "%r='12:00:00 AM'\t"708# else709 "%r='12:00:00 午前'\t"710# endif711 "%X='00時00分00秒'\t"712 "%EX='00時00分00秒'\t"713# elif defined(_WIN32)714 "%r='0:00:00'\t"715 "%X='0:00:00'\t"716 "%EX='0:00:00'\t"717# else718 "%r='午前12:00:00'\t"719 "%X='00:00:00'\t"720 "%EX='00:00:00'\t"721# endif722 "\n"),723 lfmt,724 std::chrono::hh_mm_ss(0s));725 726 check(loc,727 SV("%H='23'\t"728 "%OH='23'\t"729 "%I='11'\t"730 "%OI='11'\t"731 "%M='31'\t"732 "%OM='31'\t"733 "%S='30.123'\t"734 "%OS='30.123'\t"735# if defined(__APPLE__)736 "%p='PM'\t"737# else738 "%p='午後'\t"739# endif740 "%R='23:31'\t"741 "%T='23:31:30.123'\t"742# if defined(__APPLE__) || defined(__FreeBSD__)743# if defined(__APPLE__)744 "%r='11:31:30 PM'\t"745# else746 "%r='11:31:30 午後'\t"747# endif748 "%X='23時31分30秒'\t"749 "%EX='23時31分30秒'\t"750# elif defined(_WIN32)751 "%r='23:31:30'\t"752 "%X='23:31:30'\t"753 "%EX='23:31:30'\t"754# else755 "%r='午後11:31:30'\t"756 "%X='23:31:30'\t"757 "%EX='23:31:30'\t"758# endif759 "\n"),760 lfmt,761 std::chrono::hh_mm_ss(23h + 31min + 30s + 123ms));762#else // defined(__APPLE__) || defined(_AIX) || defined(_WIN32) || defined(__FreeBSD__)763 check(loc,764 SV("%H='00'\t"765 "%OH='〇'\t"766 "%I='12'\t"767 "%OI='十二'\t"768 "%M='00'\t"769 "%OM='〇'\t"770 "%S='00'\t"771 "%OS='〇'\t"772 "%p='午前'\t"773 "%R='00:00'\t"774 "%T='00:00:00'\t"775 "%r='午前12時00分00秒'\t"776 "%X='00時00分00秒'\t"777 "%EX='00時00分00秒'\t"778 "\n"),779 lfmt,780 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970781 782 check(loc,783 SV("%H='23'\t"784 "%OH='二十三'\t"785 "%I='11'\t"786 "%OI='十一'\t"787 "%M='31'\t"788 "%OM='三十一'\t"789 "%S='30.123'\t"790 "%OS='三十.123'\t"791 "%p='午後'\t"792 "%R='23:31'\t"793 "%T='23:31:30.123'\t"794 "%r='午後11時31分30秒'\t"795 "%X='23時31分30秒'\t"796 "%EX='23時31分30秒'\t"797 "\n"),798 lfmt,799 std::chrono::sys_time<std::chrono::milliseconds>(800 1'234'567'890'123ms)); // 23:31:30 UTC on Friday, 13 February 2009801#endif // defined(__APPLE__) || defined(_AIX) || defined(_WIN32) || defined(__FreeBSD__)802 803 std::locale::global(std::locale::classic());804}805 806template <class CharT>807static void test_valid_values_date_time() {808 using namespace std::literals::chrono_literals;809 810 constexpr std::basic_string_view<CharT> fmt = SV("{:%%c='%c'%t%%Ec='%Ec'%n}");811 constexpr std::basic_string_view<CharT> lfmt = SV("{:L%%c='%c'%t%%Ec='%Ec'%n}");812 813 const std::locale loc(LOCALE_ja_JP_UTF_8);814 std::locale::global(std::locale(LOCALE_fr_FR_UTF_8));815 816 // Non localized output using C-locale817 check(SV("%c='Thu Jan 1 00:00:00 1970'\t%Ec='Thu Jan 1 00:00:00 1970'\n"),818 fmt,819 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970820 821 check(SV("%c='Fri Feb 13 23:31:30 2009'\t%Ec='Fri Feb 13 23:31:30 2009'\n"),822 fmt,823 std::chrono::zoned_time(std::chrono::sys_seconds{1'234'567'890s})); // 23:31:30 UTC on Friday, 13 February 2009824 825 // Use the global locale (fr_FR)826 check(827// https://sourceware.org/bugzilla/show_bug.cgi?id=24054828#if defined(__powerpc__) && defined(__linux__)829 SV("%c='jeu. 01 janv. 1970 00:00:00 UTC'\t%Ec='jeu. 01 janv. 1970 00:00:00 UTC'\n"),830#elif defined(__GLIBC__) && __GLIBC__ <= 2 && __GLIBC_MINOR__ < 29831 SV("%c='jeu. 01 janv. 1970 00:00:00 GMT'\t%Ec='jeu. 01 janv. 1970 00:00:00 GMT'\n"),832#elif defined(_AIX)833 SV("%c=' 1 janvier 1970 à 00:00:00 UTC'\t%Ec=' 1 janvier 1970 à 00:00:00 UTC'\n"),834#elif defined(__APPLE__)835 SV("%c='Jeu 1 jan 00:00:00 1970'\t%Ec='Jeu 1 jan 00:00:00 1970'\n"),836#elif defined(_WIN32)837 SV("%c='01/01/1970 00:00:00'\t%Ec='01/01/1970 00:00:00'\n"),838#elif defined(__FreeBSD__)839 SV("%c='jeu. 1 janv. 00:00:00 1970'\t%Ec='jeu. 1 janv. 00:00:00 1970'\n"),840#else841 SV("%c='jeu. 01 janv. 1970 00:00:00'\t%Ec='jeu. 01 janv. 1970 00:00:00'\n"),842#endif843 lfmt,844 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970845 846 check(847// https://sourceware.org/bugzilla/show_bug.cgi?id=24054848#if defined(__powerpc__) && defined(__linux__)849 SV("%c='ven. 13 févr. 2009 23:31:30 UTC'\t%Ec='ven. 13 févr. 2009 23:31:30 UTC'\n"),850#elif defined(__GLIBC__) && __GLIBC__ <= 2 && __GLIBC_MINOR__ < 29851 SV("%c='ven. 13 févr. 2009 23:31:30 GMT'\t%Ec='ven. 13 févr. 2009 23:31:30 GMT'\n"),852#elif defined(_AIX)853 SV("%c='13 février 2009 à 23:31:30 UTC'\t%Ec='13 février 2009 à 23:31:30 UTC'\n"),854#elif defined(__APPLE__)855 SV("%c='Ven 13 fév 23:31:30 2009'\t%Ec='Ven 13 fév 23:31:30 2009'\n"),856#elif defined(_WIN32)857 SV("%c='13/02/2009 23:31:30'\t%Ec='13/02/2009 23:31:30'\n"),858#elif defined(__FreeBSD__)859 SV("%c='ven. 13 févr. 23:31:30 2009'\t%Ec='ven. 13 févr. 23:31:30 2009'\n"),860#else861 SV("%c='ven. 13 févr. 2009 23:31:30'\t%Ec='ven. 13 févr. 2009 23:31:30'\n"),862#endif863 lfmt,864 std::chrono::zoned_time(std::chrono::sys_seconds{1'234'567'890s})); // 23:31:30 UTC on Friday, 13 February 2009865 866 // Use supplied locale (ja_JP). This locale has a different alternate.a867#if defined(__APPLE__) || defined(__FreeBSD__)868 check(loc,869 SV("%c='木 1/ 1 00:00:00 1970'\t%Ec='木 1/ 1 00:00:00 1970'\n"),870 lfmt,871 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970872 check(loc,873 SV("%c='金 2/13 23:31:30 2009'\t%Ec='金 2/13 23:31:30 2009'\n"),874 lfmt,875 std::chrono::zoned_time(std::chrono::sys_seconds{1'234'567'890s})); // 23:31:30 UTC on Friday, 13 February 2009876#elif defined(_AIX) // defined(__APPLE__)|| defined(__FreeBSD__)877 check(loc,878 SV("%c='1970年01月 1日 00:00:00 UTC'\t%Ec='1970年01月 1日 00:00:00 UTC'\n"),879 lfmt,880 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970881 check(loc,882 SV("%c='2009年02月13日 23:31:30 UTC'\t%Ec='2009年02月13日 23:31:30 UTC'\n"),883 lfmt,884 std::chrono::zoned_time(std::chrono::sys_seconds{1'234'567'890s})); // 23:31:30 UTC on Friday, 13 February 2009885#elif defined(_WIN32) // defined(__APPLE__)|| defined(__FreeBSD__)886 check(loc,887 SV("%c='1970/01/01 0:00:00'\t%Ec='1970/01/01 0:00:00'\n"),888 lfmt,889 std::chrono::sys_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970890 check(loc,891 SV("%c='2009/02/13 23:31:30'\t%Ec='2009/02/13 23:31:30'\n"),892 lfmt,893 std::chrono::sys_seconds(1'234'567'890s)); // 23:31:30 UTC on Friday, 13 February 2009894#else // defined(__APPLE__)|| defined(__FreeBSD__)895 check(loc,896 SV("%c='1970年01月01日 00時00分00秒'\t%Ec='昭和45年01月01日 00時00分00秒'\n"),897 lfmt,898 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970899 900 check(loc,901 SV("%c='2009年02月13日 23時31分30秒'\t%Ec='平成21年02月13日 23時31分30秒'\n"),902 lfmt,903 std::chrono::zoned_time(std::chrono::sys_seconds{1'234'567'890s})); // 23:31:30 UTC on Friday, 13 February 2009904#endif // defined(__APPLE__)|| defined(__FreeBSD__)905 906 std::locale::global(std::locale::classic());907}908 909template <class CharT>910static void test_valid_values_time_zone() {911 using namespace std::literals::chrono_literals;912 913 constexpr std::basic_string_view<CharT> fmt = SV("{:%%z='%z'%t%%Ez='%Ez'%t%%Oz='%Oz'%t%%Z='%Z'%n}");914 constexpr std::basic_string_view<CharT> lfmt = SV("{:L%%z='%z'%t%%Ez='%Ez'%t%%Oz='%Oz'%t%%Z='%Z'%n}");915 916 const std::locale loc(LOCALE_ja_JP_UTF_8);917 std::locale::global(std::locale(LOCALE_fr_FR_UTF_8));918 919 // Non localized output using C-locale920 check(SV("%z='+0000'\t%Ez='+00:00'\t%Oz='+00:00'\t%Z='UTC'\n"),921 fmt,922 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970923 924 // Use the global locale (fr_FR)925 check(SV("%z='+0000'\t%Ez='+00:00'\t%Oz='+00:00'\t%Z='UTC'\n"),926 lfmt,927 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970928 929 // Use supplied locale (ja_JP).930 check(loc,931 SV("%z='+0000'\t%Ez='+00:00'\t%Oz='+00:00'\t%Z='UTC'\n"),932 lfmt,933 std::chrono::zoned_time(std::chrono::sys_seconds{0s})); // 00:00:00 UTC Thursday, 1 January 1970934 935 std::locale::global(std::locale::classic());936}937 938template <class CharT>939static void test_valid_values() {940 test_valid_values_year<CharT>();941 test_valid_values_month<CharT>();942 test_valid_values_day<CharT>();943 test_valid_values_weekday<CharT>();944 test_valid_values_day_of_year<CharT>();945 test_valid_values_week<CharT>();946 test_valid_values_iso_8601_week<CharT>();947 test_valid_values_date<CharT>();948 test_valid_values_time<CharT>();949 test_valid_values_date_time<CharT>();950 test_valid_values_time_zone<CharT>();951}952 953template <class CharT>954static void test() {955 test_no_chrono_specs<CharT>();956 test_valid_values<CharT>();957 958 check_invalid_types<CharT>(959 {SV("a"), SV("A"), SV("b"), SV("B"), SV("c"), SV("C"), SV("d"), SV("D"), SV("e"), SV("F"), SV("g"),960 SV("G"), SV("h"), SV("H"), SV("I"), SV("j"), SV("m"), SV("M"), SV("p"), SV("r"), SV("R"), SV("S"),961 SV("T"), SV("u"), SV("U"), SV("V"), SV("w"), SV("W"), SV("x"), SV("X"), SV("y"), SV("Y"), SV("z"),962 SV("Z"), SV("Ec"), SV("EC"), SV("Ex"), SV("EX"), SV("Ey"), SV("EY"), SV("Ez"), SV("Od"), SV("Oe"), SV("OH"),963 SV("OI"), SV("Om"), SV("OM"), SV("OS"), SV("Ou"), SV("OU"), SV("OV"), SV("Ow"), SV("OW"), SV("Oy"), SV("Oz")},964 std::chrono::zoned_time{});965}966 967int main(int, char**) {968 test<char>();969 970#ifndef TEST_HAS_NO_WIDE_CHARACTERS971 test<wchar_t>();972#endif973 974 return 0;975}976