1105fef5dSMark de Wever //===----------------------------------------------------------------------===// 2*6a54dfbfSLouis Dionne // 3105fef5dSMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4105fef5dSMark de Wever // See https://llvm.org/LICENSE.txt for license information. 5105fef5dSMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6105fef5dSMark de Wever // 7105fef5dSMark de Wever //===----------------------------------------------------------------------===// 8105fef5dSMark de Wever 9105fef5dSMark de Wever // UNSUPPORTED: c++03, c++11, c++14, c++17 10105fef5dSMark de Wever // UNSUPPORTED: no-localization 11520c7fbbSLouis Dionne // UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME 12105fef5dSMark de Wever 133d334df5SLouis Dionne // TODO FMT This test should not require std::to_chars(floating-point) 14f0fc8c48SLouis Dionne // XFAIL: availability-fp_to_chars-missing 153d334df5SLouis Dionne 161403080aSMark de Wever // TODO FMT Investigate Windows issues. 171403080aSMark de Wever // XFAIL: msvc 181403080aSMark de Wever 19105fef5dSMark de Wever // REQUIRES: locale.fr_FR.UTF-8 20105fef5dSMark de Wever // REQUIRES: locale.ja_JP.UTF-8 21105fef5dSMark de Wever 22105fef5dSMark de Wever // <chrono> 23105fef5dSMark de Wever 24105fef5dSMark de Wever // template<class charT> struct formatter<chrono::weekday_last, charT>; 25105fef5dSMark de Wever 26105fef5dSMark de Wever #include <chrono> 27105fef5dSMark de Wever #include <format> 28105fef5dSMark de Wever 29105fef5dSMark de Wever #include <cassert> 30105fef5dSMark de Wever #include <concepts> 31105fef5dSMark de Wever #include <locale> 32105fef5dSMark de Wever #include <iostream> 33105fef5dSMark de Wever #include <type_traits> 34105fef5dSMark de Wever 35105fef5dSMark de Wever #include "formatter_tests.h" 36105fef5dSMark de Wever #include "make_string.h" 37105fef5dSMark de Wever #include "platform_support.h" // locale name macros 38105fef5dSMark de Wever #include "test_macros.h" 39105fef5dSMark de Wever 40105fef5dSMark de Wever template <class CharT> 41105fef5dSMark de Wever static void test_no_chrono_specs() { 42105fef5dSMark de Wever using namespace std::literals::chrono_literals; 43105fef5dSMark de Wever 44105fef5dSMark de Wever // Valid day 45105fef5dSMark de Wever check(SV("Sun[last]"), SV("{}"), std::chrono::weekday_last{std::chrono::weekday(0)}); 46105fef5dSMark de Wever 47105fef5dSMark de Wever // Invalid day 48105fef5dSMark de Wever check(SV("8 is not a valid weekday[last]"), SV("{}"), std::chrono::weekday_last{std::chrono::weekday(8)}); 49105fef5dSMark de Wever } 50105fef5dSMark de Wever 51105fef5dSMark de Wever template <class CharT> 52105fef5dSMark de Wever static void test_valid_values() { 53105fef5dSMark de Wever constexpr std::basic_string_view<CharT> fmt = 54105fef5dSMark de Wever SV("{:%%u='%u'%t%%Ou='%Ou'%t%%w='%w'%t%%Ow='%Ow'%t%%a='%a'%t%%A='%A'%n}"); 55105fef5dSMark de Wever constexpr std::basic_string_view<CharT> lfmt = 56105fef5dSMark de Wever SV("{:L%%u='%u'%t%%Ou='%Ou'%t%%w='%w'%t%%Ow='%Ow'%t%%a='%a'%t%%A='%A'%n}"); 57105fef5dSMark de Wever 58105fef5dSMark de Wever const std::locale loc(LOCALE_ja_JP_UTF_8); 59105fef5dSMark de Wever std::locale::global(std::locale(LOCALE_fr_FR_UTF_8)); 60105fef5dSMark de Wever 61105fef5dSMark de Wever // Non localized output using C-locale 62105fef5dSMark de Wever check(SV("%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\t%a='Sun'\t%A='Sunday'\n"), 63105fef5dSMark de Wever fmt, 64105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(0)}); 65105fef5dSMark de Wever check(SV("%u='1'\t%Ou='1'\t%w='1'\t%Ow='1'\t%a='Mon'\t%A='Monday'\n"), 66105fef5dSMark de Wever fmt, 67105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(1)}); 68105fef5dSMark de Wever check(SV("%u='2'\t%Ou='2'\t%w='2'\t%Ow='2'\t%a='Tue'\t%A='Tuesday'\n"), 69105fef5dSMark de Wever fmt, 70105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(2)}); 71105fef5dSMark de Wever check(SV("%u='3'\t%Ou='3'\t%w='3'\t%Ow='3'\t%a='Wed'\t%A='Wednesday'\n"), 72105fef5dSMark de Wever fmt, 73105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(3)}); 74105fef5dSMark de Wever check(SV("%u='4'\t%Ou='4'\t%w='4'\t%Ow='4'\t%a='Thu'\t%A='Thursday'\n"), 75105fef5dSMark de Wever fmt, 76105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(4)}); 77105fef5dSMark de Wever check(SV("%u='5'\t%Ou='5'\t%w='5'\t%Ow='5'\t%a='Fri'\t%A='Friday'\n"), 78105fef5dSMark de Wever fmt, 79105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(5)}); 80105fef5dSMark de Wever check(SV("%u='6'\t%Ou='6'\t%w='6'\t%Ow='6'\t%a='Sat'\t%A='Saturday'\n"), 81105fef5dSMark de Wever fmt, 82105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(6)}); 83105fef5dSMark de Wever check(SV("%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\t%a='Sun'\t%A='Sunday'\n"), 84105fef5dSMark de Wever fmt, 85105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(7)}); 86105fef5dSMark de Wever 87105fef5dSMark de Wever // Use the global locale (fr_FR) 88105fef5dSMark de Wever #if defined(__APPLE__) 89105fef5dSMark de Wever check(SV("%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\t%a='Dim'\t%A='Dimanche'\n"), 90105fef5dSMark de Wever lfmt, 91105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(0)}); 92105fef5dSMark de Wever check(SV("%u='1'\t%Ou='1'\t%w='1'\t%Ow='1'\t%a='Lun'\t%A='Lundi'\n"), 93105fef5dSMark de Wever lfmt, 94105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(1)}); 95105fef5dSMark de Wever check(SV("%u='2'\t%Ou='2'\t%w='2'\t%Ow='2'\t%a='Mar'\t%A='Mardi'\n"), 96105fef5dSMark de Wever lfmt, 97105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(2)}); 98105fef5dSMark de Wever check(SV("%u='3'\t%Ou='3'\t%w='3'\t%Ow='3'\t%a='Mer'\t%A='Mercredi'\n"), 99105fef5dSMark de Wever lfmt, 100105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(3)}); 101105fef5dSMark de Wever check(SV("%u='4'\t%Ou='4'\t%w='4'\t%Ow='4'\t%a='Jeu'\t%A='Jeudi'\n"), 102105fef5dSMark de Wever lfmt, 103105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(4)}); 104105fef5dSMark de Wever check(SV("%u='5'\t%Ou='5'\t%w='5'\t%Ow='5'\t%a='Ven'\t%A='Vendredi'\n"), 105105fef5dSMark de Wever lfmt, 106105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(5)}); 107105fef5dSMark de Wever check(SV("%u='6'\t%Ou='6'\t%w='6'\t%Ow='6'\t%a='Sam'\t%A='Samedi'\n"), 108105fef5dSMark de Wever lfmt, 109105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(6)}); 110105fef5dSMark de Wever check(SV("%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\t%a='Dim'\t%A='Dimanche'\n"), 111105fef5dSMark de Wever lfmt, 112105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(7)}); 113105fef5dSMark de Wever #else // defined(__APPLE__) 114105fef5dSMark de Wever check(SV("%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\t%a='dim.'\t%A='dimanche'\n"), 115105fef5dSMark de Wever lfmt, 116105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(0)}); 117105fef5dSMark de Wever check(SV("%u='1'\t%Ou='1'\t%w='1'\t%Ow='1'\t%a='lun.'\t%A='lundi'\n"), 118105fef5dSMark de Wever lfmt, 119105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(1)}); 120105fef5dSMark de Wever check(SV("%u='2'\t%Ou='2'\t%w='2'\t%Ow='2'\t%a='mar.'\t%A='mardi'\n"), 121105fef5dSMark de Wever lfmt, 122105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(2)}); 123105fef5dSMark de Wever check(SV("%u='3'\t%Ou='3'\t%w='3'\t%Ow='3'\t%a='mer.'\t%A='mercredi'\n"), 124105fef5dSMark de Wever lfmt, 125105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(3)}); 126105fef5dSMark de Wever check(SV("%u='4'\t%Ou='4'\t%w='4'\t%Ow='4'\t%a='jeu.'\t%A='jeudi'\n"), 127105fef5dSMark de Wever lfmt, 128105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(4)}); 129105fef5dSMark de Wever check(SV("%u='5'\t%Ou='5'\t%w='5'\t%Ow='5'\t%a='ven.'\t%A='vendredi'\n"), 130105fef5dSMark de Wever lfmt, 131105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(5)}); 132105fef5dSMark de Wever check(SV("%u='6'\t%Ou='6'\t%w='6'\t%Ow='6'\t%a='sam.'\t%A='samedi'\n"), 133105fef5dSMark de Wever lfmt, 134105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(6)}); 135105fef5dSMark de Wever check(SV("%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\t%a='dim.'\t%A='dimanche'\n"), 136105fef5dSMark de Wever lfmt, 137105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(7)}); 138105fef5dSMark de Wever #endif // defined(__APPLE__) 139105fef5dSMark de Wever 140105fef5dSMark de Wever // Use supplied locale (ja_JP). 141105fef5dSMark de Wever // This locale has a different alternate, but not on all platforms 1428f01029bSMark de Wever #if defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__) 143105fef5dSMark de Wever check(loc, 144105fef5dSMark de Wever SV("%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\t%a='日'\t%A='日曜日'\n"), 145105fef5dSMark de Wever lfmt, 146105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(0)}); 147105fef5dSMark de Wever check(loc, 148105fef5dSMark de Wever SV("%u='1'\t%Ou='1'\t%w='1'\t%Ow='1'\t%a='月'\t%A='月曜日'\n"), 149105fef5dSMark de Wever lfmt, 150105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(1)}); 151105fef5dSMark de Wever check(loc, 152105fef5dSMark de Wever SV("%u='2'\t%Ou='2'\t%w='2'\t%Ow='2'\t%a='火'\t%A='火曜日'\n"), 153105fef5dSMark de Wever lfmt, 154105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(2)}); 155105fef5dSMark de Wever check(loc, 156105fef5dSMark de Wever SV("%u='3'\t%Ou='3'\t%w='3'\t%Ow='3'\t%a='水'\t%A='水曜日'\n"), 157105fef5dSMark de Wever lfmt, 158105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(3)}); 159105fef5dSMark de Wever check(loc, 160105fef5dSMark de Wever SV("%u='4'\t%Ou='4'\t%w='4'\t%Ow='4'\t%a='木'\t%A='木曜日'\n"), 161105fef5dSMark de Wever lfmt, 162105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(4)}); 163105fef5dSMark de Wever check(loc, 164105fef5dSMark de Wever SV("%u='5'\t%Ou='5'\t%w='5'\t%Ow='5'\t%a='金'\t%A='金曜日'\n"), 165105fef5dSMark de Wever lfmt, 166105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(5)}); 167105fef5dSMark de Wever check(loc, 168105fef5dSMark de Wever SV("%u='6'\t%Ou='6'\t%w='6'\t%Ow='6'\t%a='土'\t%A='土曜日'\n"), 169105fef5dSMark de Wever lfmt, 170105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(6)}); 171105fef5dSMark de Wever check(loc, 172105fef5dSMark de Wever SV("%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\t%a='日'\t%A='日曜日'\n"), 173105fef5dSMark de Wever lfmt, 174105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(7)}); 1758f01029bSMark de Wever #else // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__) 176105fef5dSMark de Wever check(loc, 177105fef5dSMark de Wever SV("%u='7'\t%Ou='七'\t%w='0'\t%Ow='〇'\t%a='日'\t%A='日曜日'\n"), 178105fef5dSMark de Wever lfmt, 179105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(0)}); 180105fef5dSMark de Wever check(loc, 181105fef5dSMark de Wever SV("%u='1'\t%Ou='一'\t%w='1'\t%Ow='一'\t%a='月'\t%A='月曜日'\n"), 182105fef5dSMark de Wever lfmt, 183105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(1)}); 184105fef5dSMark de Wever check(loc, 185105fef5dSMark de Wever SV("%u='2'\t%Ou='二'\t%w='2'\t%Ow='二'\t%a='火'\t%A='火曜日'\n"), 186105fef5dSMark de Wever lfmt, 187105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(2)}); 188105fef5dSMark de Wever check(loc, 189105fef5dSMark de Wever SV("%u='3'\t%Ou='三'\t%w='3'\t%Ow='三'\t%a='水'\t%A='水曜日'\n"), 190105fef5dSMark de Wever lfmt, 191105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(3)}); 192105fef5dSMark de Wever check(loc, 193105fef5dSMark de Wever SV("%u='4'\t%Ou='四'\t%w='4'\t%Ow='四'\t%a='木'\t%A='木曜日'\n"), 194105fef5dSMark de Wever lfmt, 195105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(4)}); 196105fef5dSMark de Wever check(loc, 197105fef5dSMark de Wever SV("%u='5'\t%Ou='五'\t%w='5'\t%Ow='五'\t%a='金'\t%A='金曜日'\n"), 198105fef5dSMark de Wever lfmt, 199105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(5)}); 200105fef5dSMark de Wever check(loc, 201105fef5dSMark de Wever SV("%u='6'\t%Ou='六'\t%w='6'\t%Ow='六'\t%a='土'\t%A='土曜日'\n"), 202105fef5dSMark de Wever lfmt, 203105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(6)}); 204105fef5dSMark de Wever check(loc, 205105fef5dSMark de Wever SV("%u='7'\t%Ou='七'\t%w='0'\t%Ow='〇'\t%a='日'\t%A='日曜日'\n"), 206105fef5dSMark de Wever lfmt, 207105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(7)}); 2088f01029bSMark de Wever #endif // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__) 209105fef5dSMark de Wever 210105fef5dSMark de Wever std::locale::global(std::locale::classic()); 211105fef5dSMark de Wever } 212105fef5dSMark de Wever 213105fef5dSMark de Wever template <class CharT> 214105fef5dSMark de Wever static void test_invalid_values() { 215105fef5dSMark de Wever // Test that %a and %A throw an exception. 216402eb2efSMark de Wever check_exception("Formatting a weekday name needs a valid weekday", 217105fef5dSMark de Wever SV("{:%a}"), 218105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(8)}); 219402eb2efSMark de Wever check_exception("Formatting a weekday name needs a valid weekday", 220105fef5dSMark de Wever SV("{:%a}"), 221105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(255)}); 222402eb2efSMark de Wever check_exception("Formatting a weekday name needs a valid weekday", 223105fef5dSMark de Wever SV("{:%A}"), 224105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(8)}); 225402eb2efSMark de Wever check_exception("Formatting a weekday name needs a valid weekday", 226105fef5dSMark de Wever SV("{:%A}"), 227105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(255)}); 228105fef5dSMark de Wever 229105fef5dSMark de Wever constexpr std::basic_string_view<CharT> fmt = SV("{:%%u='%u'%t%%Ou='%Ou'%t%%w='%w'%t%%Ow='%Ow'%n}"); 230105fef5dSMark de Wever constexpr std::basic_string_view<CharT> lfmt = SV("{:L%%u='%u'%t%%Ou='%Ou'%t%%w='%w'%t%%Ow='%Ow'%n}"); 231105fef5dSMark de Wever 232105fef5dSMark de Wever const std::locale loc(LOCALE_ja_JP_UTF_8); 233105fef5dSMark de Wever std::locale::global(std::locale(LOCALE_fr_FR_UTF_8)); 234105fef5dSMark de Wever 2358f01029bSMark de Wever #if defined(__APPLE__) || defined(__FreeBSD__) 236105fef5dSMark de Wever // Non localized output using C-locale 237105fef5dSMark de Wever check(SV("%u='8'\t%Ou='8'\t%w='8'\t%Ow='8'\n"), fmt, std::chrono::weekday_last{std::chrono::weekday(8)}); 238105fef5dSMark de Wever check(SV("%u='255'\t%Ou='255'\t%w='255'\t%Ow='255'\n"), fmt, std::chrono::weekday_last{std::chrono::weekday(255)}); 239105fef5dSMark de Wever 240105fef5dSMark de Wever // Use the global locale (fr_FR) 241105fef5dSMark de Wever check(SV("%u='8'\t%Ou='8'\t%w='8'\t%Ow='8'\n"), lfmt, std::chrono::weekday_last{std::chrono::weekday(8)}); 242105fef5dSMark de Wever check(SV("%u='255'\t%Ou='255'\t%w='255'\t%Ow='255'\n"), lfmt, std::chrono::weekday_last{std::chrono::weekday(255)}); 243105fef5dSMark de Wever 244105fef5dSMark de Wever // Use supplied locale (ja_JP). This locale has a different alternate. 245105fef5dSMark de Wever check(loc, SV("%u='8'\t%Ou='8'\t%w='8'\t%Ow='8'\n"), lfmt, std::chrono::weekday_last{std::chrono::weekday(8)}); 246105fef5dSMark de Wever check(loc, 247105fef5dSMark de Wever SV("%u='255'\t%Ou='255'\t%w='255'\t%Ow='255'\n"), 248105fef5dSMark de Wever lfmt, 249105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(255)}); 2508f01029bSMark de Wever #elif defined(_WIN32) // defined(__APPLE__) || defined(__FreeBSD__) 2511403080aSMark de Wever // Non localized output using C-locale 2521403080aSMark de Wever check(SV("%u=''\t%Ou=''\t%w=''\t%Ow=''\n"), fmt, std::chrono::weekday_last{std::chrono::weekday(8)}); 2531403080aSMark de Wever check(SV("%u=''\t%Ou=''\t%w=''\t%Ow=''\n"), fmt, std::chrono::weekday_last{std::chrono::weekday(255)}); 2541403080aSMark de Wever 2551403080aSMark de Wever // Use the global locale (fr_FR) 2561403080aSMark de Wever check(SV("%u=''\t%Ou=''\t%w=''\t%Ow=''\n"), lfmt, std::chrono::weekday_last{std::chrono::weekday(8)}); 2571403080aSMark de Wever check(SV("%u=''\t%Ou=''\t%w=''\t%Ow=''\n"), lfmt, std::chrono::weekday_last{std::chrono::weekday(255)}); 2581403080aSMark de Wever 2591403080aSMark de Wever // Use supplied locale (ja_JP). This locale has a different alternate. 2601403080aSMark de Wever check(loc, SV("%u=''\t%Ou=''\t%w=''\t%Ow=''\n"), lfmt, std::chrono::weekday_last{std::chrono::weekday(8)}); 2611403080aSMark de Wever check(loc, SV("%u=''\t%Ou=''\t%w=''\t%Ow=''\n"), lfmt, std::chrono::weekday_last{std::chrono::weekday(255)}); 2628f01029bSMark de Wever #elif defined(_AIX) // defined(__APPLE__) || defined(__FreeBSD__) 263105fef5dSMark de Wever // Non localized output using C-locale 264105fef5dSMark de Wever check(SV("%u='8'\t%Ou='8'\t%w='8'\t%Ow='8'\n"), fmt, std::chrono::weekday_last{std::chrono::weekday(8)}); 265105fef5dSMark de Wever check(SV("%u='5'\t%Ou='5'\t%w='5'\t%Ow='5'\n"), fmt, std::chrono::weekday_last{std::chrono::weekday(255)}); 266105fef5dSMark de Wever 267105fef5dSMark de Wever // Use the global locale (fr_FR) 268105fef5dSMark de Wever check(SV("%u='8'\t%Ou='8'\t%w='8'\t%Ow='8'\n"), lfmt, std::chrono::weekday_last{std::chrono::weekday(8)}); 269105fef5dSMark de Wever check(SV("%u='5'\t%Ou='5'\t%w='5'\t%Ow='5'\n"), lfmt, std::chrono::weekday_last{std::chrono::weekday(255)}); 270105fef5dSMark de Wever 271105fef5dSMark de Wever // Use supplied locale (ja_JP). This locale has a different alternate. 272105fef5dSMark de Wever check(loc, SV("%u='8'\t%Ou='8'\t%w='8'\t%Ow='8'\n"), lfmt, std::chrono::weekday_last{std::chrono::weekday(8)}); 273105fef5dSMark de Wever check(loc, SV("%u='5'\t%Ou='5'\t%w='5'\t%Ow='5'\n"), lfmt, std::chrono::weekday_last{std::chrono::weekday(255)}); 2748f01029bSMark de Wever #else // defined(__APPLE__) || defined(__FreeBSD__) 275105fef5dSMark de Wever // Non localized output using C-locale 276105fef5dSMark de Wever check(SV("%u='1'\t%Ou='1'\t%w='8'\t%Ow='8'\n"), fmt, std::chrono::weekday_last{std::chrono::weekday(8)}); 277105fef5dSMark de Wever check(SV("%u='3'\t%Ou='3'\t%w='255'\t%Ow='255'\n"), fmt, std::chrono::weekday_last{std::chrono::weekday(255)}); 278105fef5dSMark de Wever 279105fef5dSMark de Wever // Use the global locale (fr_FR) 280105fef5dSMark de Wever check(SV("%u='1'\t%Ou='1'\t%w='8'\t%Ow='8'\n"), lfmt, std::chrono::weekday_last{std::chrono::weekday(8)}); 281105fef5dSMark de Wever check(SV("%u='3'\t%Ou='3'\t%w='255'\t%Ow='255'\n"), lfmt, std::chrono::weekday_last{std::chrono::weekday(255)}); 282105fef5dSMark de Wever 283105fef5dSMark de Wever // Use supplied locale (ja_JP). This locale has a different alternate. 284105fef5dSMark de Wever check(loc, SV("%u='1'\t%Ou='一'\t%w='8'\t%Ow='八'\n"), lfmt, std::chrono::weekday_last{std::chrono::weekday(8)}); 285105fef5dSMark de Wever check(loc, SV("%u='3'\t%Ou='三'\t%w='255'\t%Ow='255'\n"), lfmt, std::chrono::weekday_last{std::chrono::weekday(255)}); 2868f01029bSMark de Wever #endif // defined(__APPLE__) || defined(__FreeBSD__) 287105fef5dSMark de Wever 288105fef5dSMark de Wever std::locale::global(std::locale::classic()); 289105fef5dSMark de Wever } 290105fef5dSMark de Wever 291105fef5dSMark de Wever template <class CharT> 292105fef5dSMark de Wever static void test() { 293105fef5dSMark de Wever test_no_chrono_specs<CharT>(); 294105fef5dSMark de Wever test_valid_values<CharT>(); 295105fef5dSMark de Wever test_invalid_values<CharT>(); 296105fef5dSMark de Wever check_invalid_types<CharT>({SV("a"), SV("A"), SV("t"), SV("u"), SV("w"), SV("Ou"), SV("Ow")}, 297105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(0)}); 298105fef5dSMark de Wever 299105fef5dSMark de Wever check_exception( 300402eb2efSMark de Wever "The format specifier expects a '%' or a '}'", SV("{:A"), std::chrono::weekday_last{std::chrono::weekday(0)}); 301402eb2efSMark de Wever check_exception( 302402eb2efSMark de Wever "The chrono specifiers contain a '{'", SV("{:%%{"), std::chrono::weekday_last{std::chrono::weekday(0)}); 303402eb2efSMark de Wever check_exception("End of input while parsing a conversion specifier", 304105fef5dSMark de Wever SV("{:%"), 305105fef5dSMark de Wever std::chrono::weekday_last{std::chrono::weekday(0)}); 306105fef5dSMark de Wever check_exception( 307105fef5dSMark de Wever "End of input while parsing the modifier E", SV("{:%E"), std::chrono::weekday_last{std::chrono::weekday(0)}); 308105fef5dSMark de Wever check_exception( 309105fef5dSMark de Wever "End of input while parsing the modifier O", SV("{:%O"), std::chrono::weekday_last{std::chrono::weekday(0)}); 310105fef5dSMark de Wever 311105fef5dSMark de Wever // Precision not allowed 312402eb2efSMark de Wever check_exception( 313402eb2efSMark de Wever "The format specifier expects a '%' or a '}'", SV("{:.3}"), std::chrono::weekday_last{std::chrono::weekday(0)}); 314105fef5dSMark de Wever } 315105fef5dSMark de Wever 316105fef5dSMark de Wever int main(int, char**) { 317105fef5dSMark de Wever test<char>(); 318105fef5dSMark de Wever 319105fef5dSMark de Wever #ifndef TEST_HAS_NO_WIDE_CHARACTERS 320105fef5dSMark de Wever test<wchar_t>(); 321105fef5dSMark de Wever #endif 322105fef5dSMark de Wever 323105fef5dSMark de Wever return 0; 324105fef5dSMark de Wever } 325