363 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// REQUIRES: locale.fr_FR.UTF-817// REQUIRES: locale.ja_JP.UTF-818 19// <chrono>20 21// class year_month_day_last;22 23// template<class charT, class traits>24// basic_ostream<charT, traits>&25// operator<<(basic_ostream<charT, traits>& os, const year_month_day_last& ymdl);26 27#include <chrono>28#include <cassert>29#include <sstream>30 31#include "make_string.h"32#include "platform_support.h" // locale name macros33#include "test_macros.h"34#include "assert_macros.h"35#include "concat_macros.h"36 37#define SV(S) MAKE_STRING_VIEW(CharT, S)38 39#define TEST_EQUAL(OUT, EXPECTED) \40 TEST_REQUIRE(OUT == EXPECTED, \41 TEST_WRITE_CONCATENATED( \42 "\nExpression ", #OUT, "\nExpected output ", EXPECTED, "\nActual output ", OUT, '\n'));43 44template <class CharT>45static std::basic_string<CharT> stream_c_locale(std::chrono::year_month_day_last ymdl) {46 std::basic_stringstream<CharT> sstr;47 sstr << ymdl;48 return sstr.str();49}50 51template <class CharT>52static std::basic_string<CharT> stream_fr_FR_locale(std::chrono::year_month_day_last ymdl) {53 std::basic_stringstream<CharT> sstr;54 const std::locale locale(LOCALE_fr_FR_UTF_8);55 sstr.imbue(locale);56 sstr << ymdl;57 return sstr.str();58}59 60template <class CharT>61static std::basic_string<CharT> stream_ja_JP_locale(std::chrono::year_month_day_last ymdl) {62 std::basic_stringstream<CharT> sstr;63 const std::locale locale(LOCALE_ja_JP_UTF_8);64 sstr.imbue(locale);65 sstr << ymdl;66 return sstr.str();67}68 69template <class CharT>70static void test() {71 TEST_EQUAL(stream_c_locale<CharT>(std::chrono::year_month_day_last{72 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{0}}}),73 SV("0000/0 is not a valid month/last"));74 TEST_EQUAL(stream_c_locale<CharT>(std::chrono::year_month_day_last{75 std::chrono::year{-32'768}, std::chrono::month_day_last{std::chrono::month{1}}}),76 SV("-32768 is not a valid year/Jan/last"));77 TEST_EQUAL(stream_c_locale<CharT>(std::chrono::year_month_day_last{78 std::chrono::year{-32'767}, std::chrono::month_day_last{std::chrono::month{2}}}),79 SV("-32767/Feb/last"));80 TEST_EQUAL(stream_c_locale<CharT>(std::chrono::year_month_day_last{81 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{3}}}),82 SV("0000/Mar/last"));83 TEST_EQUAL(stream_c_locale<CharT>(std::chrono::year_month_day_last{84 std::chrono::year{1970}, std::chrono::month_day_last{std::chrono::month{4}}}),85 SV("1970/Apr/last"));86 TEST_EQUAL(stream_c_locale<CharT>(std::chrono::year_month_day_last{87 std::chrono::year{32'767}, std::chrono::month_day_last{std::chrono::month{5}}}),88 SV("32767/May/last"));89 TEST_EQUAL(stream_c_locale<CharT>(std::chrono::year_month_day_last{90 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{6}}}),91 SV("0000/Jun/last"));92 TEST_EQUAL(stream_c_locale<CharT>(std::chrono::year_month_day_last{93 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{7}}}),94 SV("0000/Jul/last"));95 TEST_EQUAL(stream_c_locale<CharT>(std::chrono::year_month_day_last{96 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{8}}}),97 SV("0000/Aug/last"));98 TEST_EQUAL(stream_c_locale<CharT>(std::chrono::year_month_day_last{99 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{9}}}),100 SV("0000/Sep/last"));101 TEST_EQUAL(stream_c_locale<CharT>(std::chrono::year_month_day_last{102 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{10}}}),103 SV("0000/Oct/last"));104 TEST_EQUAL(stream_c_locale<CharT>(std::chrono::year_month_day_last{105 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{11}}}),106 SV("0000/Nov/last"));107 TEST_EQUAL(stream_c_locale<CharT>(std::chrono::year_month_day_last{108 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{12}}}),109 SV("0000/Dec/last"));110 TEST_EQUAL(stream_c_locale<CharT>(std::chrono::year_month_day_last{111 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{13}}}),112 SV("0000/13 is not a valid month/last"));113 TEST_EQUAL(stream_c_locale<CharT>(std::chrono::year_month_day_last{114 std::chrono::year{-32'768}, std::chrono::month_day_last{std::chrono::month{255}}}),115 SV("-32768 is not a valid year/255 is not a valid month/last"));116 117 TEST_EQUAL(stream_fr_FR_locale<CharT>(std::chrono::year_month_day_last{118 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{0}}}),119 SV("0000/0 is not a valid month/last"));120#if defined(__APPLE__)121 TEST_EQUAL(stream_fr_FR_locale<CharT>(std::chrono::year_month_day_last{122 std::chrono::year{-32'768}, std::chrono::month_day_last{std::chrono::month{1}}}),123 SV("-32768 is not a valid year/jan/last"));124 TEST_EQUAL(stream_fr_FR_locale<CharT>(std::chrono::year_month_day_last{125 std::chrono::year{-32'767}, std::chrono::month_day_last{std::chrono::month{2}}}),126 SV("-32767/fév/last"));127 TEST_EQUAL(stream_fr_FR_locale<CharT>(std::chrono::year_month_day_last{128 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{3}}}),129 SV("0000/mar/last"));130 TEST_EQUAL(stream_fr_FR_locale<CharT>(std::chrono::year_month_day_last{131 std::chrono::year{1970}, std::chrono::month_day_last{std::chrono::month{4}}}),132 SV("1970/avr/last"));133 TEST_EQUAL(stream_fr_FR_locale<CharT>(std::chrono::year_month_day_last{134 std::chrono::year{32'767}, std::chrono::month_day_last{std::chrono::month{5}}}),135 SV("32767/mai/last"));136 TEST_EQUAL(stream_fr_FR_locale<CharT>(std::chrono::year_month_day_last{137 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{6}}}),138 SV("0000/jui/last"));139 TEST_EQUAL(stream_fr_FR_locale<CharT>(std::chrono::year_month_day_last{140 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{7}}}),141 SV("0000/jul/last"));142 TEST_EQUAL(stream_fr_FR_locale<CharT>(std::chrono::year_month_day_last{143 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{8}}}),144 SV("0000/aoû/last"));145 TEST_EQUAL(stream_fr_FR_locale<CharT>(std::chrono::year_month_day_last{146 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{9}}}),147 SV("0000/sep/last"));148 TEST_EQUAL(stream_fr_FR_locale<CharT>(std::chrono::year_month_day_last{149 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{10}}}),150 SV("0000/oct/last"));151 TEST_EQUAL(stream_fr_FR_locale<CharT>(std::chrono::year_month_day_last{152 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{11}}}),153 SV("0000/nov/last"));154 TEST_EQUAL(stream_fr_FR_locale<CharT>(std::chrono::year_month_day_last{155 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{12}}}),156 SV("0000/déc/last"));157#else // defined(__APPLE__)158 TEST_EQUAL(stream_fr_FR_locale<CharT>(std::chrono::year_month_day_last{159 std::chrono::year{-32'768}, std::chrono::month_day_last{std::chrono::month{1}}}),160 SV("-32768 is not a valid year/janv./last"));161 TEST_EQUAL(stream_fr_FR_locale<CharT>(std::chrono::year_month_day_last{162 std::chrono::year{-32'767}, std::chrono::month_day_last{std::chrono::month{2}}}),163 SV("-32767/févr./last"));164 TEST_EQUAL(stream_fr_FR_locale<CharT>(std::chrono::year_month_day_last{165 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{3}}}),166 SV("0000/mars/last"));167# if defined(_WIN32) || defined(_AIX) || defined(__FreeBSD__)168 TEST_EQUAL(stream_fr_FR_locale<CharT>(std::chrono::year_month_day_last{169 std::chrono::year{1970}, std::chrono::month_day_last{std::chrono::month{4}}}),170 SV("1970/avr./last"));171# else // defined(_WIN32) || defined(_AIX) || defined(__FreeBSD__)172 TEST_EQUAL(stream_fr_FR_locale<CharT>(std::chrono::year_month_day_last{173 std::chrono::year{1970}, std::chrono::month_day_last{std::chrono::month{4}}}),174 SV("1970/avril/last"));175# endif // defined(_WIN32) || defined(_AIX) || defined(__FreeBSD__)176 TEST_EQUAL(stream_fr_FR_locale<CharT>(std::chrono::year_month_day_last{177 std::chrono::year{32'767}, std::chrono::month_day_last{std::chrono::month{5}}}),178 SV("32767/mai/last"));179 TEST_EQUAL(stream_fr_FR_locale<CharT>(std::chrono::year_month_day_last{180 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{6}}}),181 SV("0000/juin/last"));182 TEST_EQUAL(stream_fr_FR_locale<CharT>(std::chrono::year_month_day_last{183 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{7}}}),184 SV("0000/juil./last"));185 TEST_EQUAL(stream_fr_FR_locale<CharT>(std::chrono::year_month_day_last{186 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{8}}}),187 SV("0000/août/last"));188 TEST_EQUAL(stream_fr_FR_locale<CharT>(std::chrono::year_month_day_last{189 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{9}}}),190 SV("0000/sept./last"));191 TEST_EQUAL(stream_fr_FR_locale<CharT>(std::chrono::year_month_day_last{192 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{10}}}),193 SV("0000/oct./last"));194 TEST_EQUAL(stream_fr_FR_locale<CharT>(std::chrono::year_month_day_last{195 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{11}}}),196 SV("0000/nov./last"));197 TEST_EQUAL(stream_fr_FR_locale<CharT>(std::chrono::year_month_day_last{198 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{12}}}),199 SV("0000/déc./last"));200#endif // defined(__APPLE__)201 TEST_EQUAL(stream_fr_FR_locale<CharT>(std::chrono::year_month_day_last{202 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{13}}}),203 SV("0000/13 is not a valid month/last"));204 TEST_EQUAL(stream_fr_FR_locale<CharT>(std::chrono::year_month_day_last{205 std::chrono::year{-32'768}, std::chrono::month_day_last{std::chrono::month{255}}}),206 SV("-32768 is not a valid year/255 is not a valid month/last"));207 208 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{209 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{0}}}),210 SV("0000/0 is not a valid month/last"));211#if defined(__APPLE__) || defined(_WIN32)212# if defined(__APPLE__)213 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{214 std::chrono::year{-32'768}, std::chrono::month_day_last{std::chrono::month{1}}}),215 SV("-32768 is not a valid year/ 1/last"));216 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{217 std::chrono::year{-32'767}, std::chrono::month_day_last{std::chrono::month{2}}}),218 SV("-32767/ 2/last"));219 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{220 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{3}}}),221 SV("0000/ 3/last"));222 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{223 std::chrono::year{1970}, std::chrono::month_day_last{std::chrono::month{4}}}),224 SV("1970/ 4/last"));225 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{226 std::chrono::year{32'767}, std::chrono::month_day_last{std::chrono::month{5}}}),227 SV("32767/ 5/last"));228 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{229 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{6}}}),230 SV("0000/ 6/last"));231 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{232 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{7}}}),233 SV("0000/ 7/last"));234 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{235 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{8}}}),236 SV("0000/ 8/last"));237 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{238 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{9}}}),239 SV("0000/ 9/last"));240# else // defined(__APPLE__)241 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{242 std::chrono::year{-32'768}, std::chrono::month_day_last{std::chrono::month{1}}}),243 SV("-32768 is not a valid year/1/last"));244 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{245 std::chrono::year{-32'767}, std::chrono::month_day_last{std::chrono::month{2}}}),246 SV("-32767/2/last"));247 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{248 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{3}}}),249 SV("0000/3/last"));250 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{251 std::chrono::year{1970}, std::chrono::month_day_last{std::chrono::month{4}}}),252 SV("1970/4/last"));253 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{254 std::chrono::year{32'767}, std::chrono::month_day_last{std::chrono::month{5}}}),255 SV("32767/5/last"));256 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{257 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{6}}}),258 SV("0000/6/last"));259 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{260 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{7}}}),261 SV("0000/7/last"));262 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{263 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{8}}}),264 SV("0000/8/last"));265 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{266 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{9}}}),267 SV("0000/9/last"));268# endif // defined(__APPLE__)269 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{270 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{10}}}),271 SV("0000/10/last"));272 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{273 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{11}}}),274 SV("0000/11/last"));275 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{276 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{12}}}),277 SV("0000/12/last"));278#else // defined(__APPLE__) || defined(_WIN32)279# if defined(_AIX)280 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{281 std::chrono::year{-32'768}, std::chrono::month_day_last{std::chrono::month{1}}}),282 SV("-32768 is not a valid year/1月/last"));283 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{284 std::chrono::year{-32'767}, std::chrono::month_day_last{std::chrono::month{2}}}),285 SV("-32767/2月/last"));286 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{287 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{3}}}),288 SV("0000/3月/last"));289 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{290 std::chrono::year{1970}, std::chrono::month_day_last{std::chrono::month{4}}}),291 SV("1970/4月/last"));292 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{293 std::chrono::year{32'767}, std::chrono::month_day_last{std::chrono::month{5}}}),294 SV("32767/5月/last"));295 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{296 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{6}}}),297 SV("0000/6月/last"));298 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{299 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{7}}}),300 SV("0000/7月/last"));301 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{302 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{8}}}),303 SV("0000/8月/last"));304 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{305 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{9}}}),306 SV("0000/9月/last"));307# else // defined(_AIX)308 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{309 std::chrono::year{-32'768}, std::chrono::month_day_last{std::chrono::month{1}}}),310 SV("-32768 is not a valid year/ 1月/last"));311 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{312 std::chrono::year{-32'767}, std::chrono::month_day_last{std::chrono::month{2}}}),313 SV("-32767/ 2月/last"));314 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{315 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{3}}}),316 SV("0000/ 3月/last"));317 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{318 std::chrono::year{1970}, std::chrono::month_day_last{std::chrono::month{4}}}),319 SV("1970/ 4月/last"));320 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{321 std::chrono::year{32'767}, std::chrono::month_day_last{std::chrono::month{5}}}),322 SV("32767/ 5月/last"));323 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{324 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{6}}}),325 SV("0000/ 6月/last"));326 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{327 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{7}}}),328 SV("0000/ 7月/last"));329 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{330 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{8}}}),331 SV("0000/ 8月/last"));332 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{333 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{9}}}),334 SV("0000/ 9月/last"));335# endif // defined(_AIX)336 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{337 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{10}}}),338 SV("0000/10月/last"));339 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{340 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{11}}}),341 SV("0000/11月/last"));342 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{343 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{12}}}),344 SV("0000/12月/last"));345#endif // defined(__APPLE__) || defined(_WIN32)346 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{347 std::chrono::year{0}, std::chrono::month_day_last{std::chrono::month{13}}}),348 SV("0000/13 is not a valid month/last"));349 TEST_EQUAL(stream_ja_JP_locale<CharT>(std::chrono::year_month_day_last{350 std::chrono::year{-32'768}, std::chrono::month_day_last{std::chrono::month{255}}}),351 SV("-32768 is not a valid year/255 is not a valid month/last"));352}353 354int main(int, char**) {355 test<char>();356 357#ifndef TEST_HAS_NO_WIDE_CHARACTERS358 test<wchar_t>();359#endif360 361 return 0;362}363