On Thu, Jun 5, 2025 at 5:19 PM Tomasz Kamiński <tkami...@redhat.com> wrote:

> We do not test with wchar_t currently, as operator<< (and format) are
> ill-formed in such case, because we do not widen abbrev member of
> local_info.
>
> Adding a tests for behavior of the ostream operator and the formatting
> with empty chrono-spec for the chrono types. The coverage is now
> complete:
>  * sys_info, local_info in this commit,
>  * time point, zoned_time and local_time_format in
> r16-1107-g3cfa53aa95a19c,
>  * duration and hh_mm_ss in r16-1099-gac0a04b7a254fb,
>  * calendar types in r16-1016-g28a17985dd34b7.
>
> Finally, the timeout for the test was increased again and preprocessor
> checks
> for zoned_time where changed to _GLIBCXX_USE_CXX11_ABI ||
> !_GLIBCXX_USE_DUAL_ABI
> to match ones from bits/chrono_io.h file.
>
> libstdc++-v3/ChangeLog:
>
>         * testsuite/std/time/format/empty_spec.cc: New tests and increased
>         timeout.
> ---
> v2 addes cxx11 abi checks for sys_info test, and updates zoned_info
> ones.
> OK for trunk?
>
The issue for sys_info/local_info is
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120565.

>
>  .../testsuite/std/time/format/empty_spec.cc   | 111 +++++++++++++++++-
>  1 file changed, 108 insertions(+), 3 deletions(-)
>
> diff --git a/libstdc++-v3/testsuite/std/time/format/empty_spec.cc
> b/libstdc++-v3/testsuite/std/time/format/empty_spec.cc
> index 48f61ee13e4..661712f1238 100644
> --- a/libstdc++-v3/testsuite/std/time/format/empty_spec.cc
> +++ b/libstdc++-v3/testsuite/std/time/format/empty_spec.cc
> @@ -1,6 +1,6 @@
>  // { dg-do run { target c++20 } }
>  // { dg-require-effective-target hosted }
> -// { dg-timeout-factor 2 }
> +// { dg-timeout-factor 4 }
>
>  #include <chrono>
>  #include <ranges>
> @@ -643,7 +643,7 @@ test_leap_second()
>           WIDEN("2012-06-30 23:59:60") );
>  }
>
> -#if _GLIBCXX_USE_CXX11_ABI
> +#if _GLIBCXX_USE_CXX11_ABI || !_GLIBCXX_USE_DUAL_ABI
>  template<typename Dur, typename Dur2>
>  auto
>  make_zoned(const sys_time<Dur2>& st, const time_zone* tz)
> @@ -723,7 +723,7 @@ test_time_points()
>    test_time_point<CharT, gps_clock>(true);
>    test_time_point<CharT, file_clock>(true);
>    test_leap_second<CharT>();
> -#if _GLIBCXX_USE_CXX11_ABI
> +#if _GLIBCXX_USE_CXX11_ABI || !_GLIBCXX_USE_DUAL_ABI
>    test_zoned_time<CharT>();
>  #endif
>    test_local_time_format<CharT>();
> @@ -732,6 +732,108 @@ test_time_points()
>    test_no_empty_spec<CharT, sys_time<duration<float>>>();
>  }
>
> +#if _GLIBCXX_USE_CXX11_ABI || !_GLIBCXX_USE_DUAL_ABI
> +template<typename _CharT>
> +void
> +test_sys_info()
> +{
> +  const sys_info si
> +  {
> +    sys_days(2024y/March/22) + 2h,
> +    sys_days(2025y/April/11) + 23h + 15min + 10s,
> +    2h + 13min + 4s,
> +    15min,
> +    "Zone"
> +  };
> +  const std::basic_string_view<_CharT> txt
> +    = WIDEN("[2024-03-22 02:00:00,2025-04-11
> 23:15:10,02:13:04,15min,Zone]");
> +
> +  verify( si, txt );
> +
> +  std::basic_string<_CharT> res;
> +  std::basic_string_view<_CharT> sv;
> +
> +  sv = res = std::format(WIDEN("{:65}"), si);
> +  VERIFY( sv.ends_with(WIDEN("    ")) );
> +  sv.remove_suffix(4);
> +  VERIFY( sv == txt );
> +
> +  sv = res = std::format(WIDEN("{:=^67}"), si);
> +  VERIFY( sv.starts_with(WIDEN("===")) );
> +  VERIFY( sv.ends_with(WIDEN("===")) );
> +  sv.remove_prefix(3);
> +  sv.remove_suffix(3);
> +  VERIFY( sv == txt );
> +}
> +
> +template<typename _CharT>
> +void test_local_info()
> +{
> +  using String = std::basic_string<_CharT>;
> +  using StringView = std::basic_string_view<_CharT>;
> +
> +  const sys_info s1
> +  {
> +    sys_days(2015y/September/11) + 2h,
> +    sys_days(2016y/March/13) + 2h,
> +    -5h,
> +    0h,
> +    "EET"
> +  };
> +  const sys_info s2
> +  {
> +    sys_days(2016y/March/13) + 2h,
> +    sys_days(2015y/September/15) + 2h,
> +    -4h,
> +    1h,
> +    "EDT"
> +  };
> +
> +  const StringView single
> +    = WIDEN("[2015-09-11 02:00:00,2016-03-13
> 02:00:00,-05:00:00,0min,EET]");
> +  const StringView both
> +    = WIDEN(" local time between "
> +           "[2015-09-11 02:00:00,2016-03-13 02:00:00,-05:00:00,0min,EET]"
> +           " and "
> +           "[2016-03-13 02:00:00,2015-09-15
> 02:00:00,-04:00:00,60min,EDT]");
> +
> +  const local_info l1{local_info::nonexistent, s1, s2};
> +  auto exp = WIDEN("[nonexistent") + String(both) + WIDEN("]");
> +  verify( l1, StringView(exp) );
> +
> +  const local_info l2{local_info::ambiguous, s1, s2};
> +  exp = WIDEN("[ambiguous") + String(both) + WIDEN("]");
> +  verify( l2, StringView(exp) );
> +
> +  const local_info l3{local_info::unique, s1, s1};
> +  exp = WIDEN("[") + String(single) + WIDEN("]");
> +  verify( l3, StringView(exp) );
> +
> +  String res;
> +  StringView sv;
> +
> +  sv = res = std::format(WIDEN("{:65}"), l3);
> +  VERIFY( sv.ends_with(WIDEN("   ")) );
> +  sv.remove_suffix(3);
> +  VERIFY( sv == exp );
> +
> +  sv = res = std::format(WIDEN("{:=^67}"), l3);
> +  VERIFY( sv.starts_with(WIDEN("==")) );
> +  VERIFY( sv.ends_with(WIDEN("===")) );
> +  sv.remove_prefix(2);
> +  sv.remove_suffix(3);
> +  VERIFY( sv == exp );
> +}
> +
> +template<typename CharT>
> +void
> +test_infos()
> +{
> +  test_sys_info<CharT>();
> +  test_local_info<CharT>();
> +}
> +#endif
> +
>  template<typename CharT>
>  void
>  test_all()
> @@ -745,6 +847,9 @@ test_all()
>  int main()
>  {
>    test_all<char>();
> +#if _GLIBCXX_USE_CXX11_ABI || !_GLIBCXX_USE_DUAL_ABI
> +  test_infos<char>();
> +#endif
>
>  #ifdef _GLIBCXX_USE_WCHAR_T
>    test_all<wchar_t>();
> --
> 2.49.0
>
>

Reply via email to