1173 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-localization11// UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME12 13// TODO FMT This test should not require std::to_chars(floating-point)14// XFAIL: availability-fp_to_chars-missing15 16// TODO FMT Investigate Windows issues.17// XFAIL: msvc18 19// REQUIRES: locale.fr_FR.UTF-820// REQUIRES: locale.ja_JP.UTF-821 22// <chrono>23 24// template<class charT> struct formatter<chrono::year_month_day, 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 macros38#include "string_literal.h"39#include "test_macros.h"40 41template <class CharT>42static void test_no_chrono_specs() {43 // Valid year, valid month, valid day44 check(SV("1970-01-31"),45 SV("{}"),46 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{1}, std::chrono::day{31}});47 check(SV("*1970-01-31*"),48 SV("{:*^12}"),49 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{1}, std::chrono::day{31}});50 check(SV("*1970-01-31"),51 SV("{:*>11}"),52 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{1}, std::chrono::day{31}});53 54 // Valid year, valid month, invalid day55 check(SV("1970-02-31 is not a valid date"),56 SV("{}"),57 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{2}, std::chrono::day{31}});58 check(SV("*1970-02-31 is not a valid date*"),59 SV("{:*^32}"),60 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{2}, std::chrono::day{31}});61 check(SV("*1970-02-31 is not a valid date"),62 SV("{:*>31}"),63 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{2}, std::chrono::day{31}});64 65 // Valid year, invalid month, valid day66 check(SV("1970-00-31 is not a valid date"),67 SV("{}"),68 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{0}, std::chrono::day{31}});69 check(SV("*1970-00-31 is not a valid date*"),70 SV("{:*^32}"),71 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{0}, std::chrono::day{31}});72 check(SV("*1970-00-31 is not a valid date"),73 SV("{:*>31}"),74 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{0}, std::chrono::day{31}});75 76 // Valid year, invalid month, invalid day77 check(SV("1970-00-32 is not a valid date"),78 SV("{}"),79 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{0}, std::chrono::day{32}});80 check(SV("*1970-00-32 is not a valid date*"),81 SV("{:*^32}"),82 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{0}, std::chrono::day{32}});83 check(SV("*1970-00-32 is not a valid date"),84 SV("{:*>31}"),85 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{0}, std::chrono::day{32}});86 87 // Invalid year, valid month, valid day88 check(SV("-32768-01-31 is not a valid date"),89 SV("{}"),90 std::chrono::year_month_day{std::chrono::year{-32768}, std::chrono::month{1}, std::chrono::day{31}});91 check(SV("*-32768-01-31 is not a valid date*"),92 SV("{:*^34}"),93 std::chrono::year_month_day{std::chrono::year{-32768}, std::chrono::month{1}, std::chrono::day{31}});94 check(SV("*-32768-01-31 is not a valid date"),95 SV("{:*>33}"),96 std::chrono::year_month_day{std::chrono::year{-32768}, std::chrono::month{1}, std::chrono::day{31}});97 98 // Invalid year, valid month, invalid day99 check(SV("-32768-01-32 is not a valid date"),100 SV("{}"),101 std::chrono::year_month_day{std::chrono::year{-32768}, std::chrono::month{1}, std::chrono::day{32}});102 check(SV("*-32768-01-32 is not a valid date*"),103 SV("{:*^34}"),104 std::chrono::year_month_day{std::chrono::year{-32768}, std::chrono::month{1}, std::chrono::day{32}});105 check(SV("*-32768-01-32 is not a valid date"),106 SV("{:*>33}"),107 std::chrono::year_month_day{std::chrono::year{-32768}, std::chrono::month{1}, std::chrono::day{32}});108 109 // Invalid year, invalid month, valid day110 check(SV("-32768-00-31 is not a valid date"),111 SV("{}"),112 std::chrono::year_month_day{std::chrono::year{-32768}, std::chrono::month{0}, std::chrono::day{31}});113 check(SV("*-32768-00-31 is not a valid date*"),114 SV("{:*^34}"),115 std::chrono::year_month_day{std::chrono::year{-32768}, std::chrono::month{0}, std::chrono::day{31}});116 check(SV("*-32768-00-31 is not a valid date"),117 SV("{:*>33}"),118 std::chrono::year_month_day{std::chrono::year{-32768}, std::chrono::month{0}, std::chrono::day{31}});119 120 // Invalid year, invalid month, invalid day121 check(SV("-32768-00-32 is not a valid date"),122 SV("{}"),123 std::chrono::year_month_day{std::chrono::year{-32768}, std::chrono::month{0}, std::chrono::day{32}});124 check(SV("*-32768-00-32 is not a valid date*"),125 SV("{:*^34}"),126 std::chrono::year_month_day{std::chrono::year{-32768}, std::chrono::month{0}, std::chrono::day{32}});127 check(SV("*-32768-00-32 is not a valid date"),128 SV("{:*>33}"),129 std::chrono::year_month_day{std::chrono::year{-32768}, std::chrono::month{0}, std::chrono::day{32}});130}131 132// TODO FMT Should x throw?133template <class CharT>134static void test_invalid_values() {135 // Test that %a, %A, %b, %B, %h, %j, %u, %U, %V, %w, %W, %Ou, %OU, %OV, %Ow, and %OW throw an exception.136 check_exception("Formatting a weekday name needs a valid weekday",137 SV("{:%A}"),138 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{1}, std::chrono::day{0}});139 check_exception("Formatting a weekday name needs a valid weekday",140 SV("{:%A}"),141 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{1}, std::chrono::day{32}});142 check_exception("Formatting a weekday name needs a valid weekday",143 SV("{:%A}"),144 std::chrono::year_month_day{145 std::chrono::year{1970}, std::chrono::month{2}, std::chrono::day{29}}); // not a leap year146 check_exception("Formatting a weekday name needs a valid weekday",147 SV("{:%A}"),148 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{0}, std::chrono::day{31}});149 check_exception("Formatting a weekday name needs a valid weekday",150 SV("{:%A}"),151 std::chrono::year_month_day{std::chrono::year{-32768}, std::chrono::month{1}, std::chrono::day{31}});152 153 check_exception("Formatting a weekday name needs a valid weekday",154 SV("{:%a}"),155 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{1}, std::chrono::day{0}});156 check_exception("Formatting a weekday name needs a valid weekday",157 SV("{:%a}"),158 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{1}, std::chrono::day{32}});159 check_exception("Formatting a weekday name needs a valid weekday",160 SV("{:%a}"),161 std::chrono::year_month_day{162 std::chrono::year{1970}, std::chrono::month{2}, std::chrono::day{29}}); // not a leap year163 check_exception("Formatting a weekday name needs a valid weekday",164 SV("{:%a}"),165 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{0}, std::chrono::day{31}});166 check_exception("Formatting a weekday name needs a valid weekday",167 SV("{:%a}"),168 std::chrono::year_month_day{std::chrono::year{-32768}, std::chrono::month{1}, std::chrono::day{31}});169 170 check_exception("Formatting a month name from an invalid month number",171 SV("{:%B}"),172 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{0}, std::chrono::day{31}});173 check_exception("Formatting a month name from an invalid month number",174 SV("{:%B}"),175 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{13}, std::chrono::day{31}});176 check_exception("Formatting a month name from an invalid month number",177 SV("{:%B}"),178 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{255}, std::chrono::day{31}});179 180 check_exception("Formatting a month name from an invalid month number",181 SV("{:%b}"),182 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{200}, std::chrono::day{31}});183 check_exception("Formatting a month name from an invalid month number",184 SV("{:%b}"),185 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{13}, std::chrono::day{31}});186 check_exception("Formatting a month name from an invalid month number",187 SV("{:%b}"),188 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{255}, std::chrono::day{31}});189 190 check_exception("Formatting a month name from an invalid month number",191 SV("{:%h}"),192 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{0}, std::chrono::day{31}});193 check_exception("Formatting a month name from an invalid month number",194 SV("{:%h}"),195 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{13}, std::chrono::day{31}});196 check_exception("Formatting a month name from an invalid month number",197 SV("{:%h}"),198 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{255}, std::chrono::day{31}});199 200 check_exception("Formatting a day of year needs a valid date",201 SV("{:%j}"),202 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{1}, std::chrono::day{0}});203 check_exception("Formatting a day of year needs a valid date",204 SV("{:%j}"),205 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{1}, std::chrono::day{32}});206 check_exception("Formatting a day of year needs a valid date",207 SV("{:%j}"),208 std::chrono::year_month_day{209 std::chrono::year{1970}, std::chrono::month{2}, std::chrono::day{29}}); // not a leap year210 check_exception("Formatting a day of year needs a valid date",211 SV("{:%j}"),212 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{0}, std::chrono::day{31}});213 check_exception("Formatting a day of year needs a valid date",214 SV("{:%j}"),215 std::chrono::year_month_day{std::chrono::year{-32768}, std::chrono::month{1}, std::chrono::day{31}});216 217 check_exception("Formatting a weekday needs a valid weekday",218 SV("{:%u}"),219 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{1}, std::chrono::day{0}});220 check_exception("Formatting a weekday needs a valid weekday",221 SV("{:%u}"),222 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{1}, std::chrono::day{32}});223 check_exception("Formatting a weekday needs a valid weekday",224 SV("{:%u}"),225 std::chrono::year_month_day{226 std::chrono::year{1970}, std::chrono::month{2}, std::chrono::day{29}}); // not a leap year227 check_exception("Formatting a weekday needs a valid weekday",228 SV("{:%u}"),229 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{0}, std::chrono::day{31}});230 check_exception("Formatting a weekday needs a valid weekday",231 SV("{:%u}"),232 std::chrono::year_month_day{std::chrono::year{-32768}, std::chrono::month{1}, std::chrono::day{31}});233 234 check_exception("Formatting a week of year needs a valid date",235 SV("{:%U}"),236 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{1}, std::chrono::day{0}});237 check_exception("Formatting a week of year needs a valid date",238 SV("{:%U}"),239 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{1}, std::chrono::day{32}});240 check_exception("Formatting a week of year needs a valid date",241 SV("{:%U}"),242 std::chrono::year_month_day{243 std::chrono::year{1970}, std::chrono::month{2}, std::chrono::day{29}}); // not a leap year244 check_exception("Formatting a week of year needs a valid date",245 SV("{:%U}"),246 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{0}, std::chrono::day{31}});247 check_exception("Formatting a week of year needs a valid date",248 SV("{:%U}"),249 std::chrono::year_month_day{std::chrono::year{-32768}, std::chrono::month{1}, std::chrono::day{31}});250 251 check_exception("Formatting a week of year needs a valid date",252 SV("{:%V}"),253 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{1}, std::chrono::day{0}});254 check_exception("Formatting a week of year needs a valid date",255 SV("{:%V}"),256 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{1}, std::chrono::day{32}});257 check_exception("Formatting a week of year needs a valid date",258 SV("{:%V}"),259 std::chrono::year_month_day{260 std::chrono::year{1970}, std::chrono::month{2}, std::chrono::day{29}}); // not a leap year261 check_exception("Formatting a week of year needs a valid date",262 SV("{:%V}"),263 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{0}, std::chrono::day{31}});264 check_exception("Formatting a week of year needs a valid date",265 SV("{:%V}"),266 std::chrono::year_month_day{std::chrono::year{-32768}, std::chrono::month{1}, std::chrono::day{31}});267 268 check_exception("Formatting a weekday needs a valid weekday",269 SV("{:%w}"),270 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{1}, std::chrono::day{0}});271 check_exception("Formatting a weekday needs a valid weekday",272 SV("{:%w}"),273 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{1}, std::chrono::day{32}});274 check_exception("Formatting a weekday needs a valid weekday",275 SV("{:%w}"),276 std::chrono::year_month_day{277 std::chrono::year{1970}, std::chrono::month{2}, std::chrono::day{29}}); // not a leap year278 check_exception("Formatting a weekday needs a valid weekday",279 SV("{:%w}"),280 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{0}, std::chrono::day{31}});281 check_exception("Formatting a weekday needs a valid weekday",282 SV("{:%w}"),283 std::chrono::year_month_day{std::chrono::year{-32768}, std::chrono::month{1}, std::chrono::day{31}});284 285 check_exception("Formatting a week of year needs a valid date",286 SV("{:%W}"),287 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{1}, std::chrono::day{0}});288 check_exception("Formatting a week of year needs a valid date",289 SV("{:%W}"),290 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{1}, std::chrono::day{32}});291 check_exception("Formatting a week of year needs a valid date",292 SV("{:%W}"),293 std::chrono::year_month_day{294 std::chrono::year{1970}, std::chrono::month{2}, std::chrono::day{29}}); // not a leap year295 check_exception("Formatting a week of year needs a valid date",296 SV("{:%W}"),297 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{0}, std::chrono::day{31}});298 check_exception("Formatting a week of year needs a valid date",299 SV("{:%W}"),300 std::chrono::year_month_day{std::chrono::year{-32768}, std::chrono::month{1}, std::chrono::day{31}});301 302 check_exception("Formatting a weekday needs a valid weekday",303 SV("{:%Ou}"),304 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{1}, std::chrono::day{0}});305 check_exception("Formatting a weekday needs a valid weekday",306 SV("{:%Ou}"),307 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{1}, std::chrono::day{32}});308 check_exception("Formatting a weekday needs a valid weekday",309 SV("{:%Ou}"),310 std::chrono::year_month_day{311 std::chrono::year{1970}, std::chrono::month{2}, std::chrono::day{29}}); // not a leap year312 check_exception("Formatting a weekday needs a valid weekday",313 SV("{:%Ou}"),314 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{0}, std::chrono::day{31}});315 check_exception("Formatting a weekday needs a valid weekday",316 SV("{:%Ou}"),317 std::chrono::year_month_day{std::chrono::year{-32768}, std::chrono::month{1}, std::chrono::day{31}});318 319 check_exception("Formatting a week of year needs a valid date",320 SV("{:%OU}"),321 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{1}, std::chrono::day{0}});322 check_exception("Formatting a week of year needs a valid date",323 SV("{:%OU}"),324 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{1}, std::chrono::day{32}});325 check_exception("Formatting a week of year needs a valid date",326 SV("{:%OU}"),327 std::chrono::year_month_day{328 std::chrono::year{1970}, std::chrono::month{2}, std::chrono::day{29}}); // not a leap year329 check_exception("Formatting a week of year needs a valid date",330 SV("{:%OU}"),331 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{0}, std::chrono::day{31}});332 check_exception("Formatting a week of year needs a valid date",333 SV("{:%OU}"),334 std::chrono::year_month_day{std::chrono::year{-32768}, std::chrono::month{1}, std::chrono::day{31}});335 336 check_exception("Formatting a week of year needs a valid date",337 SV("{:%OV}"),338 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{1}, std::chrono::day{0}});339 check_exception("Formatting a week of year needs a valid date",340 SV("{:%OV}"),341 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{1}, std::chrono::day{32}});342 check_exception("Formatting a week of year needs a valid date",343 SV("{:%OV}"),344 std::chrono::year_month_day{345 std::chrono::year{1970}, std::chrono::month{2}, std::chrono::day{29}}); // not a leap year346 check_exception("Formatting a week of year needs a valid date",347 SV("{:%OV}"),348 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{0}, std::chrono::day{31}});349 check_exception("Formatting a week of year needs a valid date",350 SV("{:%OV}"),351 std::chrono::year_month_day{std::chrono::year{-32768}, std::chrono::month{1}, std::chrono::day{31}});352 353 check_exception("Formatting a weekday needs a valid weekday",354 SV("{:%Ow}"),355 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{1}, std::chrono::day{0}});356 check_exception("Formatting a weekday needs a valid weekday",357 SV("{:%Ow}"),358 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{1}, std::chrono::day{32}});359 check_exception("Formatting a weekday needs a valid weekday",360 SV("{:%Ow}"),361 std::chrono::year_month_day{362 std::chrono::year{1970}, std::chrono::month{2}, std::chrono::day{29}}); // not a leap year363 check_exception("Formatting a weekday needs a valid weekday",364 SV("{:%Ow}"),365 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{0}, std::chrono::day{31}});366 check_exception("Formatting a weekday needs a valid weekday",367 SV("{:%Ow}"),368 std::chrono::year_month_day{std::chrono::year{-32768}, std::chrono::month{1}, std::chrono::day{31}});369 370 check_exception("Formatting a week of year needs a valid date",371 SV("{:%OW}"),372 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{1}, std::chrono::day{0}});373 check_exception("Formatting a week of year needs a valid date",374 SV("{:%OW}"),375 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{1}, std::chrono::day{32}});376 check_exception("Formatting a week of year needs a valid date",377 SV("{:%OW}"),378 std::chrono::year_month_day{379 std::chrono::year{1970}, std::chrono::month{2}, std::chrono::day{29}}); // not a leap year380 check_exception("Formatting a week of year needs a valid date",381 SV("{:%OW}"),382 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::month{0}, std::chrono::day{31}});383 check_exception("Formatting a week of year needs a valid date",384 SV("{:%OW}"),385 std::chrono::year_month_day{std::chrono::year{-32768}, std::chrono::month{1}, std::chrono::day{31}});386}387 388template <class CharT>389static void test_valid_md_values() {390 constexpr std::basic_string_view<CharT> fmt =391 SV("{:%%b='%b'%t%%B='%B'%t%%h='%h'%t%%m='%m'%t%%Om='%Om'%t%%d='%d'%t%%e='%e'%t%%Od='%Od'%t%%Oe='%Oe'%n}");392 constexpr std::basic_string_view<CharT> lfmt =393 SV("{:L%%b='%b'%t%%B='%B'%t%%h='%h'%t%%m='%m'%t%%Om='%Om'%t%%d='%d'%t%%e='%e'%t%%Od='%Od'%t%%Oe='%Oe'%n}");394 395 const std::locale loc(LOCALE_ja_JP_UTF_8);396 std::locale::global(std::locale(LOCALE_fr_FR_UTF_8));397 398 // Non localized output using C-locale399#ifdef _WIN32400 check(SV("%b='Jan'\t%B='January'\t%h='Jan'\t%m='01'\t%Om='01'\t%d=''\t%e=''\t%Od=''\t%Oe=''\n"),401 fmt,402 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::January, std::chrono::day{0}});403#else404 check(SV("%b='Jan'\t%B='January'\t%h='Jan'\t%m='01'\t%Om='01'\t%d='00'\t%e=' 0'\t%Od='00'\t%Oe=' 0'\n"),405 fmt,406 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::January, std::chrono::day{0}});407#endif408 check(SV("%b='Feb'\t%B='February'\t%h='Feb'\t%m='02'\t%Om='02'\t%d='01'\t%e=' 1'\t%Od='01'\t%Oe=' 1'\n"),409 fmt,410 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::February, std::chrono::day{1}});411 check(SV("%b='Mar'\t%B='March'\t%h='Mar'\t%m='03'\t%Om='03'\t%d='09'\t%e=' 9'\t%Od='09'\t%Oe=' 9'\n"),412 fmt,413 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::March, std::chrono::day{9}});414 check(SV("%b='Apr'\t%B='April'\t%h='Apr'\t%m='04'\t%Om='04'\t%d='10'\t%e='10'\t%Od='10'\t%Oe='10'\n"),415 fmt,416 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::April, std::chrono::day{10}});417 check(SV("%b='May'\t%B='May'\t%h='May'\t%m='05'\t%Om='05'\t%d='28'\t%e='28'\t%Od='28'\t%Oe='28'\n"),418 fmt,419 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::May, std::chrono::day{28}});420 check(SV("%b='Jun'\t%B='June'\t%h='Jun'\t%m='06'\t%Om='06'\t%d='29'\t%e='29'\t%Od='29'\t%Oe='29'\n"),421 fmt,422 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::June, std::chrono::day{29}});423 check(SV("%b='Jul'\t%B='July'\t%h='Jul'\t%m='07'\t%Om='07'\t%d='30'\t%e='30'\t%Od='30'\t%Oe='30'\n"),424 fmt,425 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::July, std::chrono::day{30}});426 check(SV("%b='Aug'\t%B='August'\t%h='Aug'\t%m='08'\t%Om='08'\t%d='31'\t%e='31'\t%Od='31'\t%Oe='31'\n"),427 fmt,428 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::August, std::chrono::day{31}});429#ifdef _WIN32430 check(SV("%b='Sep'\t%B='September'\t%h='Sep'\t%m='09'\t%Om='09'\t%d=''\t%e=''\t%Od=''\t%Oe=''\n"),431 fmt,432 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::September, std::chrono::day{32}});433 check(SV("%b='Oct'\t%B='October'\t%h='Oct'\t%m='10'\t%Om='10'\t%d=''\t%e=''\t%Od=''\t%Oe=''\n"),434 fmt,435 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::October, std::chrono::day{99}});436 check(SV("%b='Nov'\t%B='November'\t%h='Nov'\t%m='11'\t%Om='11'\t%d=''\t%e=''\t%Od=''\t%Oe=''\n"),437 fmt,438 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::November, std::chrono::day{100}});439 check(SV("%b='Dec'\t%B='December'\t%h='Dec'\t%m='12'\t%Om='12'\t%d=''\t%e=''\t%Od=''\t%Oe=''\n"),440 fmt,441 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::December, std::chrono::day{255}});442#else // _WIN32443 check(SV("%b='Sep'\t%B='September'\t%h='Sep'\t%m='09'\t%Om='09'\t%d='32'\t%e='32'\t%Od='32'\t%Oe='32'\n"),444 fmt,445 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::September, std::chrono::day{32}});446 check(SV("%b='Oct'\t%B='October'\t%h='Oct'\t%m='10'\t%Om='10'\t%d='99'\t%e='99'\t%Od='99'\t%Oe='99'\n"),447 fmt,448 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::October, std::chrono::day{99}});449# if defined(_AIX)450 check(SV("%b='Nov'\t%B='November'\t%h='Nov'\t%m='11'\t%Om='11'\t%d='00'\t%e=' 0'\t%Od='00'\t%Oe=' 0'\n"),451 fmt,452 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::November, std::chrono::day{100}});453 check(SV("%b='Dec'\t%B='December'\t%h='Dec'\t%m='12'\t%Om='12'\t%d='55'\t%e='55'\t%Od='55'\t%Oe='55'\n"),454 fmt,455 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::December, std::chrono::day{255}});456# else // defined(_AIX)457 check(SV("%b='Nov'\t%B='November'\t%h='Nov'\t%m='11'\t%Om='11'\t%d='100'\t%e='100'\t%Od='100'\t%Oe='100'\n"),458 fmt,459 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::November, std::chrono::day{100}});460 check(SV("%b='Dec'\t%B='December'\t%h='Dec'\t%m='12'\t%Om='12'\t%d='255'\t%e='255'\t%Od='255'\t%Oe='255'\n"),461 fmt,462 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::December, std::chrono::day{255}});463# endif // defined(_AIX)464#endif // _WIN32465 466 // Use the global locale (fr_FR)467#if defined(__APPLE__)468 check(SV("%b='jan'\t%B='janvier'\t%h='jan'\t%m='01'\t%Om='01'\t%d='00'\t%e=' 0'\t%Od='00'\t%Oe=' 0'\n"),469 lfmt,470 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::January, std::chrono::day{0}});471 check(SV("%b='fév'\t%B='février'\t%h='fév'\t%m='02'\t%Om='02'\t%d='01'\t%e=' 1'\t%Od='01'\t%Oe=' 1'\n"),472 lfmt,473 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::February, std::chrono::day{1}});474 check(SV("%b='mar'\t%B='mars'\t%h='mar'\t%m='03'\t%Om='03'\t%d='09'\t%e=' 9'\t%Od='09'\t%Oe=' 9'\n"),475 lfmt,476 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::March, std::chrono::day{9}});477 check(SV("%b='avr'\t%B='avril'\t%h='avr'\t%m='04'\t%Om='04'\t%d='10'\t%e='10'\t%Od='10'\t%Oe='10'\n"),478 lfmt,479 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::April, std::chrono::day{10}});480 check(SV("%b='mai'\t%B='mai'\t%h='mai'\t%m='05'\t%Om='05'\t%d='28'\t%e='28'\t%Od='28'\t%Oe='28'\n"),481 lfmt,482 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::May, std::chrono::day{28}});483 check(SV("%b='jui'\t%B='juin'\t%h='jui'\t%m='06'\t%Om='06'\t%d='29'\t%e='29'\t%Od='29'\t%Oe='29'\n"),484 lfmt,485 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::June, std::chrono::day{29}});486 check(SV("%b='jul'\t%B='juillet'\t%h='jul'\t%m='07'\t%Om='07'\t%d='30'\t%e='30'\t%Od='30'\t%Oe='30'\n"),487 lfmt,488 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::July, std::chrono::day{30}});489 check(SV("%b='aoû'\t%B='août'\t%h='aoû'\t%m='08'\t%Om='08'\t%d='31'\t%e='31'\t%Od='31'\t%Oe='31'\n"),490 lfmt,491 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::August, std::chrono::day{31}});492 check(SV("%b='sep'\t%B='septembre'\t%h='sep'\t%m='09'\t%Om='09'\t%d='32'\t%e='32'\t%Od='32'\t%Oe='32'\n"),493 lfmt,494 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::September, std::chrono::day{32}});495 check(SV("%b='oct'\t%B='octobre'\t%h='oct'\t%m='10'\t%Om='10'\t%d='99'\t%e='99'\t%Od='99'\t%Oe='99'\n"),496 lfmt,497 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::October, std::chrono::day{99}});498 check(SV("%b='nov'\t%B='novembre'\t%h='nov'\t%m='11'\t%Om='11'\t%d='100'\t%e='100'\t%Od='100'\t%Oe='100'\n"),499 lfmt,500 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::November, std::chrono::day{100}});501 check(SV("%b='déc'\t%B='décembre'\t%h='déc'\t%m='12'\t%Om='12'\t%d='255'\t%e='255'\t%Od='255'\t%Oe='255'\n"),502 lfmt,503 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::December, std::chrono::day{255}});504#else // defined(__APPLE__)505# ifdef _WIN32506 check(SV("%b='janv.'\t%B='janvier'\t%h='janv.'\t%m='01'\t%Om='01'\t%d=''\t%e=''\t%Od=''\t%Oe=''\n"),507 lfmt,508 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::January, std::chrono::day{0}});509# else510 check(SV("%b='janv.'\t%B='janvier'\t%h='janv.'\t%m='01'\t%Om='01'\t%d='00'\t%e=' 0'\t%Od='00'\t%Oe=' 0'\n"),511 lfmt,512 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::January, std::chrono::day{0}});513# endif514 check(SV("%b='févr.'\t%B='février'\t%h='févr.'\t%m='02'\t%Om='02'\t%d='01'\t%e=' 1'\t%Od='01'\t%Oe=' 1'\n"),515 lfmt,516 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::February, std::chrono::day{1}});517 check(SV("%b='mars'\t%B='mars'\t%h='mars'\t%m='03'\t%Om='03'\t%d='09'\t%e=' 9'\t%Od='09'\t%Oe=' 9'\n"),518 lfmt,519 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::March, std::chrono::day{9}});520 check(521# if defined(_WIN32) || defined(_AIX) || defined(__FreeBSD__)522 SV("%b='avr.'\t%B='avril'\t%h='avr.'\t%m='04'\t%Om='04'\t%d='10'\t%e='10'\t%Od='10'\t%Oe='10'\n"),523# else // defined(_WIN32) || defined(_AIX) || defined(__FreeBSD__)524 SV("%b='avril'\t%B='avril'\t%h='avril'\t%m='04'\t%Om='04'\t%d='10'\t%e='10'\t%Od='10'\t%Oe='10'\n"),525# endif // defined(_WIN32) || defined(_AIX) || defined(__FreeBSD__)526 lfmt,527 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::April, std::chrono::day{10}});528 check(SV("%b='mai'\t%B='mai'\t%h='mai'\t%m='05'\t%Om='05'\t%d='28'\t%e='28'\t%Od='28'\t%Oe='28'\n"),529 lfmt,530 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::May, std::chrono::day{28}});531 check(SV("%b='juin'\t%B='juin'\t%h='juin'\t%m='06'\t%Om='06'\t%d='29'\t%e='29'\t%Od='29'\t%Oe='29'\n"),532 lfmt,533 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::June, std::chrono::day{29}});534 check(SV("%b='juil.'\t%B='juillet'\t%h='juil.'\t%m='07'\t%Om='07'\t%d='30'\t%e='30'\t%Od='30'\t%Oe='30'\n"),535 lfmt,536 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::July, std::chrono::day{30}});537 check(SV("%b='août'\t%B='août'\t%h='août'\t%m='08'\t%Om='08'\t%d='31'\t%e='31'\t%Od='31'\t%Oe='31'\n"),538 lfmt,539 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::August, std::chrono::day{31}});540# ifdef _WIN32541 check(SV("%b='sept.'\t%B='septembre'\t%h='sept.'\t%m='09'\t%Om='09'\t%d=''\t%e=''\t%Od=''\t%Oe=''\n"),542 lfmt,543 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::September, std::chrono::day{32}});544 check(SV("%b='oct.'\t%B='octobre'\t%h='oct.'\t%m='10'\t%Om='10'\t%d=''\t%e=''\t%Od=''\t%Oe=''\n"),545 lfmt,546 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::October, std::chrono::day{99}});547 check(SV("%b='nov.'\t%B='novembre'\t%h='nov.'\t%m='11'\t%Om='11'\t%d=''\t%e=''\t%Od=''\t%Oe=''\n"),548 lfmt,549 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::November, std::chrono::day{100}});550 check(SV("%b='déc.'\t%B='décembre'\t%h='déc.'\t%m='12'\t%Om='12'\t%d=''\t%e=''\t%Od=''\t%Oe=''\n"),551 lfmt,552 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::December, std::chrono::day{255}});553# else // _WIN32554 check(SV("%b='sept.'\t%B='septembre'\t%h='sept.'\t%m='09'\t%Om='09'\t%d='32'\t%e='32'\t%Od='32'\t%Oe='32'\n"),555 lfmt,556 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::September, std::chrono::day{32}});557 check(SV("%b='oct.'\t%B='octobre'\t%h='oct.'\t%m='10'\t%Om='10'\t%d='99'\t%e='99'\t%Od='99'\t%Oe='99'\n"),558 lfmt,559 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::October, std::chrono::day{99}});560# if defined(_AIX)561 check(SV("%b='nov.'\t%B='novembre'\t%h='nov.'\t%m='11'\t%Om='11'\t%d='00'\t%e=' 0'\t%Od='00'\t%Oe=' 0'\n"),562 lfmt,563 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::November, std::chrono::day{100}});564 check(SV("%b='déc.'\t%B='décembre'\t%h='déc.'\t%m='12'\t%Om='12'\t%d='55'\t%e='55'\t%Od='55'\t%Oe='55'\n"),565 lfmt,566 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::December, std::chrono::day{255}});567# else // defined(_AIX)568 check(SV("%b='nov.'\t%B='novembre'\t%h='nov.'\t%m='11'\t%Om='11'\t%d='100'\t%e='100'\t%Od='100'\t%Oe='100'\n"),569 lfmt,570 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::November, std::chrono::day{100}});571 check(SV("%b='déc.'\t%B='décembre'\t%h='déc.'\t%m='12'\t%Om='12'\t%d='255'\t%e='255'\t%Od='255'\t%Oe='255'\n"),572 lfmt,573 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::December, std::chrono::day{255}});574# endif // defined(_AIX)575# endif // _WIN32576#endif // defined(__APPLE__)577 578 // Use supplied locale (ja_JP)579#if defined(_WIN32)580 check(loc,581 SV("%b='1'\t%B='1月'\t%h='1'\t%m='01'\t%Om='01'\t%d=''\t%e=''\t%Od=''\t%Oe=''\n"),582 lfmt,583 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::January, std::chrono::day{0}});584 check(loc,585 SV("%b='2'\t%B='2月'\t%h='2'\t%m='02'\t%Om='02'\t%d='01'\t%e=' 1'\t%Od='01'\t%Oe=' 1'\n"),586 lfmt,587 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::February, std::chrono::day{1}});588 check(loc,589 SV("%b='3'\t%B='3月'\t%h='3'\t%m='03'\t%Om='03'\t%d='09'\t%e=' 9'\t%Od='09'\t%Oe=' 9'\n"),590 lfmt,591 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::March, std::chrono::day{9}});592 check(loc,593 SV("%b='4'\t%B='4月'\t%h='4'\t%m='04'\t%Om='04'\t%d='10'\t%e='10'\t%Od='10'\t%Oe='10'\n"),594 lfmt,595 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::April, std::chrono::day{10}});596 check(loc,597 SV("%b='5'\t%B='5月'\t%h='5'\t%m='05'\t%Om='05'\t%d='28'\t%e='28'\t%Od='28'\t%Oe='28'\n"),598 lfmt,599 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::May, std::chrono::day{28}});600 check(loc,601 SV("%b='6'\t%B='6月'\t%h='6'\t%m='06'\t%Om='06'\t%d='29'\t%e='29'\t%Od='29'\t%Oe='29'\n"),602 lfmt,603 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::June, std::chrono::day{29}});604 check(loc,605 SV("%b='7'\t%B='7月'\t%h='7'\t%m='07'\t%Om='07'\t%d='30'\t%e='30'\t%Od='30'\t%Oe='30'\n"),606 lfmt,607 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::July, std::chrono::day{30}});608 check(loc,609 SV("%b='8'\t%B='8月'\t%h='8'\t%m='08'\t%Om='08'\t%d='31'\t%e='31'\t%Od='31'\t%Oe='31'\n"),610 lfmt,611 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::August, std::chrono::day{31}});612 check(loc,613 SV("%b='9'\t%B='9月'\t%h='9'\t%m='09'\t%Om='09'\t%d=''\t%e=''\t%Od=''\t%Oe=''\n"),614 lfmt,615 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::September, std::chrono::day{32}});616 check(loc,617 SV("%b='10'\t%B='10月'\t%h='10'\t%m='10'\t%Om='10'\t%d=''\t%e=''\t%Od=''\t%Oe=''\n"),618 lfmt,619 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::October, std::chrono::day{99}});620 check(loc,621 SV("%b='11'\t%B='11月'\t%h='11'\t%m='11'\t%Om='11'\t%d=''\t%e=''\t%Od=''\t%Oe=''\n"),622 lfmt,623 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::November, std::chrono::day{100}});624 check(loc,625 SV("%b='12'\t%B='12月'\t%h='12'\t%m='12'\t%Om='12'\t%d=''\t%e=''\t%Od=''\t%Oe=''\n"),626 lfmt,627 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::December, std::chrono::day{255}});628#elif defined(_AIX) // defined(_WIN32)629 check(loc,630 SV("%b='1月'\t%B='1月'\t%h='1月'\t%m='01'\t%Om='01'\t%d='00'\t%e=' 0'\t%Od='00'\t%Oe=' 0'\n"),631 lfmt,632 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::January, std::chrono::day{0}});633 check(loc,634 SV("%b='2月'\t%B='2月'\t%h='2月'\t%m='02'\t%Om='02'\t%d='01'\t%e=' 1'\t%Od='01'\t%Oe=' 1'\n"),635 lfmt,636 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::February, std::chrono::day{1}});637 check(loc,638 SV("%b='3月'\t%B='3月'\t%h='3月'\t%m='03'\t%Om='03'\t%d='09'\t%e=' 9'\t%Od='09'\t%Oe=' 9'\n"),639 lfmt,640 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::March, std::chrono::day{9}});641 check(loc,642 SV("%b='4月'\t%B='4月'\t%h='4月'\t%m='04'\t%Om='04'\t%d='10'\t%e='10'\t%Od='10'\t%Oe='10'\n"),643 lfmt,644 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::April, std::chrono::day{10}});645 check(loc,646 SV("%b='5月'\t%B='5月'\t%h='5月'\t%m='05'\t%Om='05'\t%d='28'\t%e='28'\t%Od='28'\t%Oe='28'\n"),647 lfmt,648 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::May, std::chrono::day{28}});649 check(loc,650 SV("%b='6月'\t%B='6月'\t%h='6月'\t%m='06'\t%Om='06'\t%d='29'\t%e='29'\t%Od='29'\t%Oe='29'\n"),651 lfmt,652 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::June, std::chrono::day{29}});653 check(loc,654 SV("%b='7月'\t%B='7月'\t%h='7月'\t%m='07'\t%Om='07'\t%d='30'\t%e='30'\t%Od='30'\t%Oe='30'\n"),655 lfmt,656 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::July, std::chrono::day{30}});657 check(loc,658 SV("%b='8月'\t%B='8月'\t%h='8月'\t%m='08'\t%Om='08'\t%d='31'\t%e='31'\t%Od='31'\t%Oe='31'\n"),659 lfmt,660 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::August, std::chrono::day{31}});661 check(loc,662 SV("%b='9月'\t%B='9月'\t%h='9月'\t%m='09'\t%Om='09'\t%d='32'\t%e='32'\t%Od='32'\t%Oe='32'\n"),663 lfmt,664 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::September, std::chrono::day{32}});665 check(loc,666 SV("%b='10月'\t%B='10月'\t%h='10月'\t%m='10'\t%Om='10'\t%d='99'\t%e='99'\t%Od='99'\t%Oe='99'\n"),667 lfmt,668 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::October, std::chrono::day{99}});669 check(loc,670 SV("%b='11月'\t%B='11月'\t%h='11月'\t%m='11'\t%Om='11'\t%d='00'\t%e=' 0'\t%Od='00'\t%Oe=' 0'\n"),671 lfmt,672 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::November, std::chrono::day{100}});673 check(loc,674 SV("%b='12月'\t%B='12月'\t%h='12月'\t%m='12'\t%Om='12'\t%d='55'\t%e='55'\t%Od='55'\t%Oe='55'\n"),675 lfmt,676 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::December, std::chrono::day{255}});677#elif defined(__FreeBSD__) // defined(_WIN32)678 check(loc,679 SV("%b=' 1月'\t%B='1月'\t%h=' 1月'\t%m='01'\t%Om='01'\t%d='00'\t%e=' 0'\t%Od='00'\t%Oe=' 0'\n"),680 lfmt,681 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::January, std::chrono::day{0}});682 check(loc,683 SV("%b=' 2月'\t%B='2月'\t%h=' 2月'\t%m='02'\t%Om='02'\t%d='01'\t%e=' 1'\t%Od='01'\t%Oe=' 1'\n"),684 lfmt,685 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::February, std::chrono::day{1}});686 check(loc,687 SV("%b=' 3月'\t%B='3月'\t%h=' 3月'\t%m='03'\t%Om='03'\t%d='09'\t%e=' 9'\t%Od='09'\t%Oe=' 9'\n"),688 lfmt,689 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::March, std::chrono::day{9}});690 check(loc,691 SV("%b=' 4月'\t%B='4月'\t%h=' 4月'\t%m='04'\t%Om='04'\t%d='10'\t%e='10'\t%Od='10'\t%Oe='10'\n"),692 lfmt,693 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::April, std::chrono::day{10}});694 check(loc,695 SV("%b=' 5月'\t%B='5月'\t%h=' 5月'\t%m='05'\t%Om='05'\t%d='28'\t%e='28'\t%Od='28'\t%Oe='28'\n"),696 lfmt,697 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::May, std::chrono::day{28}});698 check(loc,699 SV("%b=' 6月'\t%B='6月'\t%h=' 6月'\t%m='06'\t%Om='06'\t%d='29'\t%e='29'\t%Od='29'\t%Oe='29'\n"),700 lfmt,701 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::June, std::chrono::day{29}});702 check(loc,703 SV("%b=' 7月'\t%B='7月'\t%h=' 7月'\t%m='07'\t%Om='07'\t%d='30'\t%e='30'\t%Od='30'\t%Oe='30'\n"),704 lfmt,705 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::July, std::chrono::day{30}});706 check(loc,707 SV("%b=' 8月'\t%B='8月'\t%h=' 8月'\t%m='08'\t%Om='08'\t%d='31'\t%e='31'\t%Od='31'\t%Oe='31'\n"),708 lfmt,709 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::August, std::chrono::day{31}});710 check(loc,711 SV("%b=' 9月'\t%B='9月'\t%h=' 9月'\t%m='09'\t%Om='09'\t%d='32'\t%e='32'\t%Od='32'\t%Oe='32'\n"),712 lfmt,713 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::September, std::chrono::day{32}});714 check(loc,715 SV("%b='10月'\t%B='10月'\t%h='10月'\t%m='10'\t%Om='10'\t%d='99'\t%e='99'\t%Od='99'\t%Oe='99'\n"),716 lfmt,717 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::October, std::chrono::day{99}});718 check(loc,719 SV("%b='11月'\t%B='11月'\t%h='11月'\t%m='11'\t%Om='11'\t%d='100'\t%e='100'\t%Od='100'\t%Oe='100'\n"),720 lfmt,721 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::November, std::chrono::day{100}});722 check(loc,723 SV("%b='12月'\t%B='12月'\t%h='12月'\t%m='12'\t%Om='12'\t%d='255'\t%e='255'\t%Od='255'\t%Oe='255'\n"),724 lfmt,725 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::December, std::chrono::day{255}});726#elif defined(__APPLE__) // defined(_WIN32)727 check(loc,728 SV("%b=' 1'\t%B='1月'\t%h=' 1'\t%m='01'\t%Om='01'\t%d='00'\t%e=' 0'\t%Od='00'\t%Oe=' 0'\n"),729 lfmt,730 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::January, std::chrono::day{0}});731 check(loc,732 SV("%b=' 2'\t%B='2月'\t%h=' 2'\t%m='02'\t%Om='02'\t%d='01'\t%e=' 1'\t%Od='01'\t%Oe=' 1'\n"),733 lfmt,734 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::February, std::chrono::day{1}});735 check(loc,736 SV("%b=' 3'\t%B='3月'\t%h=' 3'\t%m='03'\t%Om='03'\t%d='09'\t%e=' 9'\t%Od='09'\t%Oe=' 9'\n"),737 lfmt,738 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::March, std::chrono::day{9}});739 check(loc,740 SV("%b=' 4'\t%B='4月'\t%h=' 4'\t%m='04'\t%Om='04'\t%d='10'\t%e='10'\t%Od='10'\t%Oe='10'\n"),741 lfmt,742 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::April, std::chrono::day{10}});743 check(loc,744 SV("%b=' 5'\t%B='5月'\t%h=' 5'\t%m='05'\t%Om='05'\t%d='28'\t%e='28'\t%Od='28'\t%Oe='28'\n"),745 lfmt,746 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::May, std::chrono::day{28}});747 check(loc,748 SV("%b=' 6'\t%B='6月'\t%h=' 6'\t%m='06'\t%Om='06'\t%d='29'\t%e='29'\t%Od='29'\t%Oe='29'\n"),749 lfmt,750 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::June, std::chrono::day{29}});751 check(loc,752 SV("%b=' 7'\t%B='7月'\t%h=' 7'\t%m='07'\t%Om='07'\t%d='30'\t%e='30'\t%Od='30'\t%Oe='30'\n"),753 lfmt,754 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::July, std::chrono::day{30}});755 check(loc,756 SV("%b=' 8'\t%B='8月'\t%h=' 8'\t%m='08'\t%Om='08'\t%d='31'\t%e='31'\t%Od='31'\t%Oe='31'\n"),757 lfmt,758 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::August, std::chrono::day{31}});759 check(loc,760 SV("%b=' 9'\t%B='9月'\t%h=' 9'\t%m='09'\t%Om='09'\t%d='32'\t%e='32'\t%Od='32'\t%Oe='32'\n"),761 lfmt,762 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::September, std::chrono::day{32}});763 check(loc,764 SV("%b='10'\t%B='10月'\t%h='10'\t%m='10'\t%Om='10'\t%d='99'\t%e='99'\t%Od='99'\t%Oe='99'\n"),765 lfmt,766 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::October, std::chrono::day{99}});767 check(loc,768 SV("%b='11'\t%B='11月'\t%h='11'\t%m='11'\t%Om='11'\t%d='100'\t%e='100'\t%Od='100'\t%Oe='100'\n"),769 lfmt,770 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::November, std::chrono::day{100}});771 check(loc,772 SV("%b='12'\t%B='12月'\t%h='12'\t%m='12'\t%Om='12'\t%d='255'\t%e='255'\t%Od='255'\t%Oe='255'\n"),773 lfmt,774 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::December, std::chrono::day{255}});775#else // defined(_WIN32)776 check(loc,777 SV("%b=' 1月'\t%B='1月'\t%h=' 1月'\t%m='01'\t%Om='一'\t%d='00'\t%e=' 0'\t%Od='〇'\t%Oe='〇'\n"),778 lfmt,779 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::January, std::chrono::day{0}});780 check(loc,781 SV("%b=' 2月'\t%B='2月'\t%h=' 2月'\t%m='02'\t%Om='二'\t%d='01'\t%e=' 1'\t%Od='一'\t%Oe='一'\n"),782 lfmt,783 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::February, std::chrono::day{1}});784 check(loc,785 SV("%b=' 3月'\t%B='3月'\t%h=' 3月'\t%m='03'\t%Om='三'\t%d='09'\t%e=' 9'\t%Od='九'\t%Oe='九'\n"),786 lfmt,787 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::March, std::chrono::day{9}});788 check(loc,789 SV("%b=' 4月'\t%B='4月'\t%h=' 4月'\t%m='04'\t%Om='四'\t%d='10'\t%e='10'\t%Od='十'\t%Oe='十'\n"),790 lfmt,791 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::April, std::chrono::day{10}});792 check(loc,793 SV("%b=' 5月'\t%B='5月'\t%h=' 5月'\t%m='05'\t%Om='五'\t%d='28'\t%e='28'\t%Od='二十八'\t%Oe='二十八'\n"),794 lfmt,795 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::May, std::chrono::day{28}});796 check(loc,797 SV("%b=' 6月'\t%B='6月'\t%h=' 6月'\t%m='06'\t%Om='六'\t%d='29'\t%e='29'\t%Od='二十九'\t%Oe='二十九'\n"),798 lfmt,799 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::June, std::chrono::day{29}});800 check(loc,801 SV("%b=' 7月'\t%B='7月'\t%h=' 7月'\t%m='07'\t%Om='七'\t%d='30'\t%e='30'\t%Od='三十'\t%Oe='三十'\n"),802 lfmt,803 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::July, std::chrono::day{30}});804 check(loc,805 SV("%b=' 8月'\t%B='8月'\t%h=' 8月'\t%m='08'\t%Om='八'\t%d='31'\t%e='31'\t%Od='三十一'\t%Oe='三十一'\n"),806 lfmt,807 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::August, std::chrono::day{31}});808 check(loc,809 SV("%b=' 9月'\t%B='9月'\t%h=' 9月'\t%m='09'\t%Om='九'\t%d='32'\t%e='32'\t%Od='三十二'\t%Oe='三十二'\n"),810 lfmt,811 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::September, std::chrono::day{32}});812 check(loc,813 SV("%b='10月'\t%B='10月'\t%h='10月'\t%m='10'\t%Om='十'\t%d='99'\t%e='99'\t%Od='九十九'\t%Oe='九十九'\n"),814 lfmt,815 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::October, std::chrono::day{99}});816 check(loc,817 SV("%b='11月'\t%B='11月'\t%h='11月'\t%m='11'\t%Om='十一'\t%d='100'\t%e='100'\t%Od='100'\t%Oe='100'\n"),818 lfmt,819 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::November, std::chrono::day{100}});820 check(loc,821 SV("%b='12月'\t%B='12月'\t%h='12月'\t%m='12'\t%Om='十二'\t%d='255'\t%e='255'\t%Od='255'\t%Oe='255'\n"),822 lfmt,823 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::December, std::chrono::day{255}});824#endif // defined(_WIN32)825 826 std::locale::global(std::locale::classic());827}828 829template <class CharT>830static void test_valid_ymd_values() {831 constexpr std::basic_string_view<CharT> fmt = SV(832 "{:"833 "%%C='%C'%t"834 "%%D='%D'%t"835 "%%F='%F'%t"836 "%%j='%j'%t"837 "%%g='%g'%t"838 "%%G='%G'%t"839 "%%u='%u'%t"840 "%%U='%U'%t"841 "%%V='%V'%t"842 "%%w='%w'%t"843 "%%W='%W'%t"844 "%%x='%x'%t"845 "%%y='%y'%t"846 "%%Y='%Y'%t"847 "%%Ex='%Ex'%t"848 "%%EC='%EC'%t"849 "%%Ey='%Ey'%t"850 "%%EY='%EY'%t"851 "%%Ou='%Ou'%t"852 "%%OU='%OU'%t"853 "%%OV='%OV'%t"854 "%%Ow='%Ow'%t"855 "%%OW='%OW'%t"856 "%%Oy='%Oy'%t"857 "%n}");858 859 constexpr std::basic_string_view<CharT> lfmt = SV(860 "{:L"861 "%%C='%C'%t"862 "%%D='%D'%t"863 "%%F='%F'%t"864 "%%j='%j'%t"865 "%%g='%g'%t"866 "%%G='%G'%t"867 "%%u='%u'%t"868 "%%U='%U'%t"869 "%%V='%V'%t"870 "%%w='%w'%t"871 "%%W='%W'%t"872 "%%x='%x'%t"873 "%%y='%y'%t"874 "%%Y='%Y'%t"875 "%%Ex='%Ex'%t"876 "%%EC='%EC'%t"877 "%%Ey='%Ey'%t"878 "%%EY='%EY'%t"879 "%%Ou='%Ou'%t"880 "%%OU='%OU'%t"881 "%%OV='%OV'%t"882 "%%Ow='%Ow'%t"883 "%%OW='%OW'%t"884 "%%Oy='%Oy'%t"885 "%n}");886 887 const std::locale loc(LOCALE_ja_JP_UTF_8);888 std::locale::global(std::locale(LOCALE_fr_FR_UTF_8));889 890 // Non localized output using C-locale891 check(892 SV("%C='19'\t"893 "%D='01/01/70'\t"894 "%F='1970-01-01'\t"895 "%j='001'\t"896 "%g='70'\t"897 "%G='1970'\t"898 "%u='4'\t"899 "%U='00'\t"900 "%V='01'\t"901 "%w='4'\t"902 "%W='00'\t"903 "%x='01/01/70'\t"904 "%y='70'\t"905 "%Y='1970'\t"906 "%Ex='01/01/70'\t"907 "%EC='19'\t"908 "%Ey='70'\t"909 "%EY='1970'\t"910 "%Ou='4'\t"911 "%OU='00'\t"912 "%OV='01'\t"913 "%Ow='4'\t"914 "%OW='00'\t"915 "%Oy='70'\t"916 "\n"),917 fmt,918 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::January, std::chrono::day{1}});919 920 check(921 SV("%C='20'\t"922 "%D='05/29/04'\t"923 "%F='2004-05-29'\t"924 "%j='150'\t"925 "%g='04'\t"926 "%G='2004'\t"927 "%u='6'\t"928 "%U='21'\t"929 "%V='22'\t"930 "%w='6'\t"931 "%W='21'\t"932 "%x='05/29/04'\t"933 "%y='04'\t"934 "%Y='2004'\t"935 "%Ex='05/29/04'\t"936 "%EC='20'\t"937 "%Ey='04'\t"938 "%EY='2004'\t"939 "%Ou='6'\t"940 "%OU='21'\t"941 "%OV='22'\t"942 "%Ow='6'\t"943 "%OW='21'\t"944 "%Oy='04'\t"945 "\n"),946 fmt,947 std::chrono::year_month_day{std::chrono::year{2004}, std::chrono::May, std::chrono::day{29}});948 949 // Use the global locale (fr_FR)950 check(951 SV("%C='19'\t"952 "%D='01/01/70'\t"953 "%F='1970-01-01'\t"954 "%j='001'\t"955 "%g='70'\t"956 "%G='1970'\t"957 "%u='4'\t"958 "%U='00'\t"959 "%V='01'\t"960 "%w='4'\t"961 "%W='00'\t"962#if defined(__APPLE__) || defined(__FreeBSD__)963 "%x='01.01.1970'\t"964#else965 "%x='01/01/1970'\t"966#endif967 "%y='70'\t"968 "%Y='1970'\t"969#if defined(__APPLE__) || defined(__FreeBSD__)970 "%Ex='01.01.1970'\t"971#else972 "%Ex='01/01/1970'\t"973#endif974 "%EC='19'\t"975 "%Ey='70'\t"976 "%EY='1970'\t"977 "%Ou='4'\t"978 "%OU='00'\t"979 "%OV='01'\t"980 "%Ow='4'\t"981 "%OW='00'\t"982 "%Oy='70'\t"983 "\n"),984 lfmt,985 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::January, std::chrono::day{1}});986 987 check(988 SV("%C='20'\t"989 "%D='05/29/04'\t"990 "%F='2004-05-29'\t"991 "%j='150'\t"992 "%g='04'\t"993 "%G='2004'\t"994 "%u='6'\t"995 "%U='21'\t"996 "%V='22'\t"997 "%w='6'\t"998 "%W='21'\t"999#if defined(__APPLE__) || defined(__FreeBSD__)1000 "%x='29.05.2004'\t"1001#else1002 "%x='29/05/2004'\t"1003#endif1004 "%y='04'\t"1005 "%Y='2004'\t"1006#if defined(__APPLE__) || defined(__FreeBSD__)1007 "%Ex='29.05.2004'\t"1008#else1009 "%Ex='29/05/2004'\t"1010#endif1011 "%EC='20'\t"1012 "%Ey='04'\t"1013 "%EY='2004'\t"1014 "%Ou='6'\t"1015 "%OU='21'\t"1016 "%OV='22'\t"1017 "%Ow='6'\t"1018 "%OW='21'\t"1019 "%Oy='04'\t"1020 "\n"),1021 lfmt,1022 std::chrono::year_month_day{std::chrono::year{2004}, std::chrono::May, std::chrono::day{29}});1023 1024 // Use supplied locale (ja_JP)1025 check(1026 loc,1027 SV("%C='19'\t"1028 "%D='01/01/70'\t"1029 "%F='1970-01-01'\t"1030 "%j='001'\t"1031 "%g='70'\t"1032 "%G='1970'\t"1033 "%u='4'\t"1034 "%U='00'\t"1035 "%V='01'\t"1036 "%w='4'\t"1037 "%W='00'\t"1038#if defined(__APPLE__) || defined(_AIX) || defined(_WIN32) || defined(__FreeBSD__)1039 "%x='1970/01/01'\t"1040#else // defined(__APPLE__) || defined(_AIX) || defined(_WIN32) || defined(__FreeBSD__)1041 "%x='1970年01月01日'\t"1042#endif // defined(__APPLE__) || defined(_AIX) || defined(_WIN32) || defined(__FreeBSD__)1043 "%y='70'\t"1044 "%Y='1970'\t"1045#if defined(__APPLE__) || defined(_AIX) || defined(_WIN32) || defined(__FreeBSD__)1046 "%Ex='1970/01/01'\t"1047 "%EC='19'\t"1048 "%Ey='70'\t"1049 "%EY='1970'\t"1050 "%Ou='4'\t"1051 "%OU='00'\t"1052 "%OV='01'\t"1053 "%Ow='4'\t"1054 "%OW='00'\t"1055 "%Oy='70'\t"1056#else // defined(__APPLE__) || defined(_AIX) || defined(_WIN32) || defined(__FreeBSD__)1057 "%Ex='昭和45年01月01日'\t"1058 "%EC='昭和'\t"1059 "%Ey='45'\t"1060 "%EY='昭和45年'\t"1061 "%Ou='四'\t"1062 "%OU='〇'\t"1063 "%OV='一'\t"1064 "%Ow='四'\t"1065 "%OW='〇'\t"1066 "%Oy='七十'\t"1067#endif // defined(__APPLE__) || defined(_AIX) || defined(_WIN32) || defined(__FreeBSD__)1068 "\n"),1069 lfmt,1070 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::January, std::chrono::day{1}});1071 1072 check(1073 loc,1074 SV("%C='20'\t"1075 "%D='05/29/04'\t"1076 "%F='2004-05-29'\t"1077 "%j='150'\t"1078 "%g='04'\t"1079 "%G='2004'\t"1080 "%u='6'\t"1081 "%U='21'\t"1082 "%V='22'\t"1083 "%w='6'\t"1084 "%W='21'\t"1085#if defined(__APPLE__) || defined(_AIX) || defined(_WIN32) || defined(__FreeBSD__)1086 "%x='2004/05/29'\t"1087#else // defined(__APPLE__) || defined(_AIX) || defined(_WIN32) || defined(__FreeBSD__)1088 "%x='2004年05月29日'\t"1089#endif // defined(__APPLE__) || defined(_AIX) || defined(_WIN32) || defined(__FreeBSD__)1090 "%y='04'\t"1091 "%Y='2004'\t"1092#if defined(__APPLE__) || defined(_AIX) || defined(_WIN32) || defined(__FreeBSD__)1093 "%Ex='2004/05/29'\t"1094 "%EC='20'\t"1095 "%Ey='04'\t"1096 "%EY='2004'\t"1097 "%Ou='6'\t"1098 "%OU='21'\t"1099 "%OV='22'\t"1100 "%Ow='6'\t"1101 "%OW='21'\t"1102 "%Oy='04'\t"1103#else // defined(__APPLE__) || defined(_AIX) || defined(_WIN32) || defined(__FreeBSD__)1104 "%Ex='平成16年05月29日'\t"1105 "%EC='平成'\t"1106 "%Ey='16'\t"1107 "%EY='平成16年'\t"1108 "%Ou='六'\t"1109 "%OU='二十一'\t"1110 "%OV='二十二'\t"1111 "%Ow='六'\t"1112 "%OW='二十一'\t"1113 "%Oy='四'\t"1114#endif // defined(__APPLE__) || defined(_AIX) || defined(_WIN32) || defined(__FreeBSD__)1115 "\n"),1116 lfmt,1117 std::chrono::year_month_day{std::chrono::year{2004}, std::chrono::May, std::chrono::day{29}});1118 1119 std::locale::global(std::locale::classic());1120}1121 1122template <class CharT>1123static void test_valid_values() {1124 // Fields only using month and day.1125 test_valid_md_values<CharT>();1126 // Fields only using year, month, and day.1127 test_valid_ymd_values<CharT>();1128}1129 1130template <class CharT>1131static void test() {1132 test_no_chrono_specs<CharT>();1133 test_invalid_values<CharT>();1134 test_valid_values<CharT>();1135 check_invalid_types<CharT>(1136 {SV("a"), SV("A"), SV("b"), SV("B"), SV("C"), SV("d"), SV("D"), SV("e"), SV("EC"),1137 SV("Ex"), SV("Ey"), SV("EY"), SV("F"), SV("g"), SV("G"), SV("h"), SV("j"), SV("m"),1138 SV("Od"), SV("Oe"), SV("Om"), SV("Ou"), SV("OU"), SV("OV"), SV("Ow"), SV("OW"), SV("Oy"),1139 SV("u"), SV("U"), SV("V"), SV("w"), SV("W"), SV("x"), SV("y"), SV("Y")},1140 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::January, std::chrono::day{31}});1141 1142 check_exception("The format specifier expects a '%' or a '}'",1143 SV("{:A"),1144 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::January, std::chrono::day{31}});1145 check_exception("The chrono specifiers contain a '{'",1146 SV("{:%%{"),1147 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::January, std::chrono::day{31}});1148 check_exception("End of input while parsing a conversion specifier",1149 SV("{:%"),1150 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::January, std::chrono::day{31}});1151 check_exception("End of input while parsing the modifier E",1152 SV("{:%E"),1153 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::January, std::chrono::day{31}});1154 check_exception("End of input while parsing the modifier O",1155 SV("{:%O"),1156 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::January, std::chrono::day{31}});1157 1158 // Precision not allowed1159 check_exception("The format specifier expects a '%' or a '}'",1160 SV("{:.3}"),1161 std::chrono::year_month_day{std::chrono::year{1970}, std::chrono::January, std::chrono::day{31}});1162}1163 1164int main(int, char**) {1165 test<char>();1166 1167#ifndef TEST_HAS_NO_WIDE_CHARACTERS1168 test<wchar_t>();1169#endif1170 1171 return 0;1172}1173