18a21d59fSMark de Wever //===----------------------------------------------------------------------===// 2*6a54dfbfSLouis Dionne // 38a21d59fSMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 48a21d59fSMark de Wever // See https://llvm.org/LICENSE.txt for license information. 58a21d59fSMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 68a21d59fSMark de Wever // 78a21d59fSMark de Wever //===----------------------------------------------------------------------===// 88a21d59fSMark de Wever 98a21d59fSMark de Wever // UNSUPPORTED: c++03, c++11, c++14, c++17 108a21d59fSMark de Wever // UNSUPPORTED: no-localization 118a21d59fSMark de Wever // UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME 128a21d59fSMark de Wever 138a21d59fSMark de Wever // TODO FMT This test should not require std::to_chars(floating-point) 148a21d59fSMark de Wever // XFAIL: availability-fp_to_chars-missing 158a21d59fSMark de Wever 16a4422a51SMark de Wever // XFAIL: libcpp-has-no-experimental-tzdb 178a21d59fSMark de Wever 188a21d59fSMark de Wever // REQUIRES: locale.fr_FR.UTF-8 198a21d59fSMark de Wever 208a21d59fSMark de Wever // <chrono> 218a21d59fSMark de Wever // 228a21d59fSMark de Wever // template<class charT> struct formatter<chrono::local_info, charT>; 238a21d59fSMark de Wever 248a21d59fSMark de Wever #include <chrono> 258a21d59fSMark de Wever #include <format> 268a21d59fSMark de Wever 278a21d59fSMark de Wever #include <cassert> 288a21d59fSMark de Wever #include <concepts> 298a21d59fSMark de Wever #include <locale> 308a21d59fSMark de Wever #include <iostream> 318a21d59fSMark de Wever #include <type_traits> 328a21d59fSMark de Wever 338a21d59fSMark de Wever #include "formatter_tests.h" 348a21d59fSMark de Wever #include "make_string.h" 358a21d59fSMark de Wever #include "platform_support.h" // locale name macros 368a21d59fSMark de Wever #include "test_macros.h" 378a21d59fSMark de Wever 388a21d59fSMark de Wever template <class CharT> 398a21d59fSMark de Wever static void test_no_chrono_specs() { 408a21d59fSMark de Wever // This test libc++ specific due to 418a21d59fSMark de Wever // [time.zone.info.local]/3 428a21d59fSMark de Wever // Effects: Streams out the local_info object r in an unspecified format. 438a21d59fSMark de Wever #ifdef _LIBCPP_VERSION 448a21d59fSMark de Wever using namespace std::literals::chrono_literals; 458a21d59fSMark de Wever namespace tz = std::chrono; 468a21d59fSMark de Wever 478a21d59fSMark de Wever std::locale::global(std::locale(LOCALE_fr_FR_UTF_8)); 488a21d59fSMark de Wever 498a21d59fSMark de Wever // Non localized output 508a21d59fSMark de Wever 518a21d59fSMark de Wever // result values matching the "known" results 528a21d59fSMark de Wever check(SV("unique: " 538a21d59fSMark de Wever "{[-10484-10-16 15:30:08, 14423-03-17 15:30:07) 00:00:00 0min \"TZ\", " 548a21d59fSMark de Wever "[1970-01-01 00:00:00, 1970-01-01 00:00:00) 00:00:00 0min \"\"}"), 558a21d59fSMark de Wever SV("{}"), 568a21d59fSMark de Wever tz::local_info{tz::local_info::unique, 578a21d59fSMark de Wever tz::sys_info{tz::sys_seconds::min(), tz::sys_seconds::max(), 0s, 0min, "TZ"}, 588a21d59fSMark de Wever tz::sys_info{}}); 598a21d59fSMark de Wever 608a21d59fSMark de Wever check(SV("non-existent: " 618a21d59fSMark de Wever "{[1970-01-01 00:00:00, 2038-12-31 00:00:00) 12:23:45 -67min \"NEG\", " 628a21d59fSMark de Wever "[1970-01-01 00:00:00, 2038-12-31 00:00:00) -12:23:45 67min \"POS\"}"), 638a21d59fSMark de Wever SV("{}"), 648a21d59fSMark de Wever tz::local_info{ 658a21d59fSMark de Wever tz::local_info::nonexistent, 668a21d59fSMark de Wever tz::sys_info{static_cast<tz::sys_days>(tz::year_month_day{1970y, tz::January, 1d}), 678a21d59fSMark de Wever static_cast<tz::sys_days>(tz::year_month_day{2038y, tz::December, 31d}), 688a21d59fSMark de Wever 12h + 23min + 45s, 698a21d59fSMark de Wever -67min, 708a21d59fSMark de Wever "NEG"}, 718a21d59fSMark de Wever tz::sys_info{static_cast<tz::sys_days>(tz::year_month_day{1970y, tz::January, 1d}), 728a21d59fSMark de Wever static_cast<tz::sys_days>(tz::year_month_day{2038y, tz::December, 31d}), 738a21d59fSMark de Wever -(12h + 23min + 45s), 748a21d59fSMark de Wever 67min, 758a21d59fSMark de Wever "POS"}}); 768a21d59fSMark de Wever 778a21d59fSMark de Wever check(SV("ambiguous: " 788a21d59fSMark de Wever "{[1970-01-01 00:00:00, 2038-12-31 00:00:00) 12:23:45 -67min \"NEG\", " 798a21d59fSMark de Wever "[1970-01-01 00:00:00, 2038-12-31 00:00:00) -12:23:45 67min \"POS\"}"), 808a21d59fSMark de Wever SV("{}"), 818a21d59fSMark de Wever tz::local_info{ 828a21d59fSMark de Wever tz::local_info::ambiguous, 838a21d59fSMark de Wever tz::sys_info{static_cast<tz::sys_days>(tz::year_month_day{1970y, tz::January, 1d}), 848a21d59fSMark de Wever static_cast<tz::sys_days>(tz::year_month_day{2038y, tz::December, 31d}), 858a21d59fSMark de Wever 12h + 23min + 45s, 868a21d59fSMark de Wever -67min, 878a21d59fSMark de Wever "NEG"}, 888a21d59fSMark de Wever tz::sys_info{static_cast<tz::sys_days>(tz::year_month_day{1970y, tz::January, 1d}), 898a21d59fSMark de Wever static_cast<tz::sys_days>(tz::year_month_day{2038y, tz::December, 31d}), 908a21d59fSMark de Wever -(12h + 23min + 45s), 918a21d59fSMark de Wever 67min, 928a21d59fSMark de Wever "POS"}}); 938a21d59fSMark de Wever 948a21d59fSMark de Wever // result values not matching the "known" results 958a21d59fSMark de Wever check( 968a21d59fSMark de Wever SV("unspecified result (-1): " 978a21d59fSMark de Wever "{[-10484-10-16 15:30:08, 14423-03-17 15:30:07) 00:00:00 0min \"TZ\", " 988a21d59fSMark de Wever "[1970-01-01 00:00:00, 1970-01-01 00:00:00) 00:00:00 0min \"\"}"), 998a21d59fSMark de Wever SV("{}"), 1008a21d59fSMark de Wever tz::local_info{-1, tz::sys_info{tz::sys_seconds::min(), tz::sys_seconds::max(), 0s, 0min, "TZ"}, tz::sys_info{}}); 1018a21d59fSMark de Wever check( 1028a21d59fSMark de Wever SV("unspecified result (3): " 1038a21d59fSMark de Wever "{[-10484-10-16 15:30:08, 14423-03-17 15:30:07) 00:00:00 0min \"TZ\", " 1048a21d59fSMark de Wever "[1970-01-01 00:00:00, 1970-01-01 00:00:00) 00:00:00 0min \"\"}"), 1058a21d59fSMark de Wever SV("{}"), 1068a21d59fSMark de Wever tz::local_info{3, tz::sys_info{tz::sys_seconds::min(), tz::sys_seconds::max(), 0s, 0min, "TZ"}, tz::sys_info{}}); 1078a21d59fSMark de Wever 1088a21d59fSMark de Wever std::locale::global(std::locale::classic()); 1098a21d59fSMark de Wever #endif // _LIBCPP_VERSION 1108a21d59fSMark de Wever } 1118a21d59fSMark de Wever 1128a21d59fSMark de Wever template <class CharT> 1138a21d59fSMark de Wever static void test() { 1148a21d59fSMark de Wever test_no_chrono_specs<CharT>(); 1158a21d59fSMark de Wever 1168a21d59fSMark de Wever check_invalid_types<CharT>({}, std::chrono::local_info{0, {}, {}}); 1178a21d59fSMark de Wever } 1188a21d59fSMark de Wever 1198a21d59fSMark de Wever int main(int, char**) { 1208a21d59fSMark de Wever test<char>(); 1218a21d59fSMark de Wever 1228a21d59fSMark de Wever #ifndef TEST_HAS_NO_WIDE_CHARACTERS 1238a21d59fSMark de Wever test<wchar_t>(); 1248a21d59fSMark de Wever #endif 1258a21d59fSMark de Wever 1268a21d59fSMark de Wever return 0; 1278a21d59fSMark de Wever } 128