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