xref: /llvm-project/libcxx/test/std/time/time.hms/time.hms.nonmembers/ostream.pass.cpp (revision 520c7fbbd0356f135a19cc764ff70e7f52ba11a0)
17f5d130aSMark de Wever //===----------------------------------------------------------------------===//
27f5d130aSMark de Wever //
37f5d130aSMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47f5d130aSMark de Wever // See https://llvm.org/LICENSE.txt for license information.
57f5d130aSMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67f5d130aSMark de Wever //
77f5d130aSMark de Wever //===----------------------------------------------------------------------===//
87f5d130aSMark de Wever 
97f5d130aSMark de Wever // UNSUPPORTED: c++03, c++11, c++14, c++17
107f5d130aSMark de Wever // UNSUPPORTED: no-localization
11*520c7fbbSLouis Dionne // UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME
127f5d130aSMark de Wever 
13f0fc8c48SLouis Dionne // XFAIL: availability-fp_to_chars-missing
143d334df5SLouis Dionne 
157f5d130aSMark de Wever // REQUIRES: locale.fr_FR.UTF-8
167f5d130aSMark de Wever // REQUIRES: locale.ja_JP.UTF-8
177f5d130aSMark de Wever 
187f5d130aSMark de Wever // <chrono>
197f5d130aSMark de Wever 
207f5d130aSMark de Wever // class hh_mm_ss;
217f5d130aSMark de Wever 
227f5d130aSMark de Wever // template<class charT, class traits, class Duration>
237f5d130aSMark de Wever //   basic_ostream<charT, traits>&
247f5d130aSMark de Wever //     operator<<(basic_ostream<charT, traits>& os, const hh_mm_ss<Duration>& hms);
257f5d130aSMark de Wever 
267f5d130aSMark de Wever #include <cassert>
27e655d8a5SNikolas Klauser #include <chrono>
28e655d8a5SNikolas Klauser #include <ratio>
297f5d130aSMark de Wever #include <sstream>
307f5d130aSMark de Wever 
317f5d130aSMark de Wever #include "make_string.h"
327f5d130aSMark de Wever #include "platform_support.h" // locale name macros
337f5d130aSMark de Wever #include "test_macros.h"
347f5d130aSMark de Wever 
357f5d130aSMark de Wever #define SV(S) MAKE_STRING_VIEW(CharT, S)
367f5d130aSMark de Wever 
377f5d130aSMark de Wever template <class CharT, class Duration>
stream_c_locale(std::chrono::hh_mm_ss<Duration> hms)387f5d130aSMark de Wever static std::basic_string<CharT> stream_c_locale(std::chrono::hh_mm_ss<Duration> hms) {
397f5d130aSMark de Wever   std::basic_stringstream<CharT> sstr;
407f5d130aSMark de Wever   sstr << hms;
417f5d130aSMark de Wever   return sstr.str();
427f5d130aSMark de Wever }
437f5d130aSMark de Wever 
447f5d130aSMark de Wever template <class CharT, class Duration>
stream_fr_FR_locale(std::chrono::hh_mm_ss<Duration> hms)457f5d130aSMark de Wever static std::basic_string<CharT> stream_fr_FR_locale(std::chrono::hh_mm_ss<Duration> hms) {
467f5d130aSMark de Wever   std::basic_stringstream<CharT> sstr;
477f5d130aSMark de Wever   const std::locale locale(LOCALE_fr_FR_UTF_8);
487f5d130aSMark de Wever   sstr.imbue(locale);
497f5d130aSMark de Wever   sstr << hms;
507f5d130aSMark de Wever   return sstr.str();
517f5d130aSMark de Wever }
527f5d130aSMark de Wever 
537f5d130aSMark de Wever template <class CharT, class Duration>
stream_ja_JP_locale(std::chrono::hh_mm_ss<Duration> hms)547f5d130aSMark de Wever static std::basic_string<CharT> stream_ja_JP_locale(std::chrono::hh_mm_ss<Duration> hms) {
557f5d130aSMark de Wever   std::basic_stringstream<CharT> sstr;
567f5d130aSMark de Wever   const std::locale locale(LOCALE_ja_JP_UTF_8);
577f5d130aSMark de Wever   sstr.imbue(locale);
587f5d130aSMark de Wever   sstr << hms;
597f5d130aSMark de Wever   return sstr.str();
607f5d130aSMark de Wever }
617f5d130aSMark de Wever 
627f5d130aSMark de Wever template <class CharT>
test()637f5d130aSMark de Wever static void test() {
647f5d130aSMark de Wever   // Note std::atto can't be tested since the ratio conversion from std::atto
657f5d130aSMark de Wever   // std::chrono::seconds to std::chrono::hours overflows when intmax_t is a
667f5d130aSMark de Wever   // 64-bit type. This is a limitiation in the constructor of
677f5d130aSMark de Wever   // std::chrono::hh_mm_ss.
687f5d130aSMark de Wever 
697f5d130aSMark de Wever   // C locale - integral power of 10 ratios
7092fc93e1SMark de Wever   assert(stream_c_locale<CharT>(std::chrono::hh_mm_ss{std::chrono::duration<std::intmax_t, std::femto>{1'234'567'890}}) ==
717f5d130aSMark de Wever          SV("00:00:00.000001234567890"));
7292fc93e1SMark de Wever   assert(stream_c_locale<CharT>(std::chrono::hh_mm_ss{std::chrono::duration<std::intmax_t, std::pico>{1'234'567'890}}) ==
737f5d130aSMark de Wever          SV("00:00:00.001234567890"));
7492fc93e1SMark de Wever   assert(stream_c_locale<CharT>(std::chrono::hh_mm_ss{std::chrono::duration<std::intmax_t, std::nano>{1'234'567'890}}) ==
757f5d130aSMark de Wever          SV("00:00:01.234567890"));
7692fc93e1SMark de Wever   assert(stream_c_locale<CharT>(std::chrono::hh_mm_ss{std::chrono::duration<std::intmax_t, std::micro>{1'234'567}}) ==
777f5d130aSMark de Wever          SV("00:00:01.234567"));
7892fc93e1SMark de Wever   assert(stream_c_locale<CharT>(std::chrono::hh_mm_ss{std::chrono::duration<std::intmax_t, std::milli>{123'456}}) ==
797f5d130aSMark de Wever          SV("00:02:03.456"));
8092fc93e1SMark de Wever   assert(stream_c_locale<CharT>(std::chrono::hh_mm_ss{std::chrono::duration<std::intmax_t, std::centi>{12'345}}) ==
817f5d130aSMark de Wever          SV("00:02:03.45"));
8292fc93e1SMark de Wever   assert(stream_c_locale<CharT>(std::chrono::hh_mm_ss{std::chrono::duration<std::intmax_t, std::deci>{1'234}}) ==
837f5d130aSMark de Wever          SV("00:02:03.4"));
847f5d130aSMark de Wever 
8592fc93e1SMark de Wever   assert(stream_c_locale<CharT>(std::chrono::hh_mm_ss{std::chrono::duration<std::intmax_t>{123}}) == SV("00:02:03"));
867f5d130aSMark de Wever 
8792fc93e1SMark de Wever   assert(stream_c_locale<CharT>(std::chrono::hh_mm_ss{std::chrono::duration<std::intmax_t, std::deca>{-366}}) ==
887f5d130aSMark de Wever          SV("-01:01:00"));
8992fc93e1SMark de Wever   assert(stream_c_locale<CharT>(std::chrono::hh_mm_ss{std::chrono::duration<std::intmax_t, std::hecto>{-72}}) ==
907f5d130aSMark de Wever          SV("-02:00:00"));
9192fc93e1SMark de Wever   assert(stream_c_locale<CharT>(std::chrono::hh_mm_ss{std::chrono::duration<std::intmax_t, std::kilo>{-86}}) ==
927f5d130aSMark de Wever          SV("-23:53:20"));
937f5d130aSMark de Wever 
947f5d130aSMark de Wever   // Starting at mega it will pass one day
957f5d130aSMark de Wever 
967f5d130aSMark de Wever   // fr_FR locale - integral power of not 10 ratios
977f5d130aSMark de Wever   assert(stream_fr_FR_locale<CharT>(std::chrono::hh_mm_ss{
9892fc93e1SMark de Wever              std::chrono::duration<std::intmax_t, std::ratio<1, 5'000'000>>{5'000}}) == SV("00:00:00,0010000"));
9992fc93e1SMark de Wever   assert(stream_fr_FR_locale<CharT>(std::chrono::hh_mm_ss{std::chrono::duration<std::intmax_t, std::ratio<1, 8'000>>{3}}) ==
1007f5d130aSMark de Wever          SV("00:00:00,000375"));
10192fc93e1SMark de Wever   assert(stream_fr_FR_locale<CharT>(std::chrono::hh_mm_ss{std::chrono::duration<std::intmax_t, std::ratio<1, 4'000>>{1}}) ==
1027f5d130aSMark de Wever          SV("00:00:00,00025"));
10392fc93e1SMark de Wever   assert(stream_fr_FR_locale<CharT>(std::chrono::hh_mm_ss{std::chrono::duration<std::intmax_t, std::ratio<1, 5'000>>{5}}) ==
1047f5d130aSMark de Wever          SV("00:00:00,0010"));
10592fc93e1SMark de Wever   assert(stream_fr_FR_locale<CharT>(std::chrono::hh_mm_ss{std::chrono::duration<std::intmax_t, std::ratio<1, 8>>{-4}}) ==
1067f5d130aSMark de Wever          SV("-00:00:00,500"));
10792fc93e1SMark de Wever   assert(stream_fr_FR_locale<CharT>(std::chrono::hh_mm_ss{std::chrono::duration<std::intmax_t, std::ratio<1, 4>>{-8}}) ==
1087f5d130aSMark de Wever          SV("-00:00:02,00"));
10992fc93e1SMark de Wever   assert(stream_fr_FR_locale<CharT>(std::chrono::hh_mm_ss{std::chrono::duration<std::intmax_t, std::ratio<1, 5>>{-5}}) ==
1107f5d130aSMark de Wever          SV("-00:00:01,0"));
1117f5d130aSMark de Wever 
1127f5d130aSMark de Wever   // TODO FMT Note there's no wording on the rounding
11392fc93e1SMark de Wever   assert(stream_fr_FR_locale<CharT>(std::chrono::hh_mm_ss{std::chrono::duration<std::intmax_t, std::ratio<1, 9>>{5}}) ==
1147f5d130aSMark de Wever          SV("00:00:00,555555"));
11592fc93e1SMark de Wever   assert(stream_fr_FR_locale<CharT>(std::chrono::hh_mm_ss{std::chrono::duration<std::intmax_t, std::ratio<1, 7>>{7}}) ==
1167f5d130aSMark de Wever          SV("00:00:01,000000"));
11792fc93e1SMark de Wever   assert(stream_fr_FR_locale<CharT>(std::chrono::hh_mm_ss{std::chrono::duration<std::intmax_t, std::ratio<1, 6>>{1}}) ==
1187f5d130aSMark de Wever          SV("00:00:00,166666"));
11992fc93e1SMark de Wever   assert(stream_fr_FR_locale<CharT>(std::chrono::hh_mm_ss{std::chrono::duration<std::intmax_t, std::ratio<1, 3>>{2}}) ==
1207f5d130aSMark de Wever          SV("00:00:00,666666"));
1217f5d130aSMark de Wever 
1227f5d130aSMark de Wever   // ja_JP locale - floating points
123ffe9ebbfSMark de Wever   assert(stream_ja_JP_locale<CharT>(std::chrono::hh_mm_ss{
1247f5d130aSMark de Wever              std::chrono::duration<long double, std::femto>{1'234'567'890.123}}) == SV("00:00:00.000001234567890"));
125ffe9ebbfSMark de Wever   assert(stream_ja_JP_locale<CharT>(std::chrono::hh_mm_ss{
1267f5d130aSMark de Wever              std::chrono::duration<long double, std::pico>{1'234'567'890.123}}) == SV("00:00:00.001234567890"));
127ffe9ebbfSMark de Wever   assert(stream_ja_JP_locale<CharT>(std::chrono::hh_mm_ss{
1287f5d130aSMark de Wever              std::chrono::duration<long double, std::nano>{1'234'567'890.123}}) == SV("00:00:01.234567890"));
129ffe9ebbfSMark de Wever   assert(stream_ja_JP_locale<CharT>(std::chrono::hh_mm_ss{std::chrono::duration<double, std::micro>{1'234'567.123}}) ==
1307f5d130aSMark de Wever          SV("00:00:01.234567"));
131ffe9ebbfSMark de Wever   assert(stream_ja_JP_locale<CharT>(std::chrono::hh_mm_ss{std::chrono::duration<double, std::milli>{123'456.123}}) ==
1327f5d130aSMark de Wever          SV("00:02:03.456"));
133ffe9ebbfSMark de Wever   assert(stream_ja_JP_locale<CharT>(std::chrono::hh_mm_ss{std::chrono::duration<double, std::centi>{12'345.123}}) ==
1347f5d130aSMark de Wever          SV("00:02:03.45"));
135ffe9ebbfSMark de Wever   assert(stream_ja_JP_locale<CharT>(std::chrono::hh_mm_ss{std::chrono::duration<float, std::deci>{1'234.123}}) ==
1367f5d130aSMark de Wever          SV("00:02:03.4"));
1377f5d130aSMark de Wever 
138ffe9ebbfSMark de Wever   assert(stream_ja_JP_locale<CharT>(std::chrono::hh_mm_ss{std::chrono::duration<float>{123.123}}) == SV("00:02:03"));
1397f5d130aSMark de Wever 
140ffe9ebbfSMark de Wever   assert(stream_ja_JP_locale<CharT>(std::chrono::hh_mm_ss{std::chrono::duration<double, std::deca>{-366.5}}) ==
1417f5d130aSMark de Wever          SV("-01:01:05"));
142ffe9ebbfSMark de Wever   assert(stream_ja_JP_locale<CharT>(std::chrono::hh_mm_ss{std::chrono::duration<double, std::hecto>{-72.64}}) ==
1437f5d130aSMark de Wever          SV("-02:01:04"));
144ffe9ebbfSMark de Wever   assert(stream_ja_JP_locale<CharT>(std::chrono::hh_mm_ss{std::chrono::duration<double, std::kilo>{-86}}) ==
1457f5d130aSMark de Wever          SV("-23:53:20"));
1467f5d130aSMark de Wever }
1477f5d130aSMark de Wever 
main(int,char **)1487f5d130aSMark de Wever int main(int, char**) {
1497f5d130aSMark de Wever   test<char>();
1507f5d130aSMark de Wever 
1517f5d130aSMark de Wever #ifndef TEST_HAS_NO_WIDE_CHARACTERS
1527f5d130aSMark de Wever   test<wchar_t>();
1537f5d130aSMark de Wever #endif
1547f5d130aSMark de Wever 
1557f5d130aSMark de Wever   return 0;
1567f5d130aSMark de Wever }
157