brintos

brintos / llvm-project-archived public Read only

0
0
Text · 20.9 KiB · 2056b2a Raw
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