xref: /llvm-project/libcxx/test/std/time/time.syn/formatter.local_info.pass.cpp (revision 6a54dfbfe534276d644d7f9c027f0deeb748dd53)
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