//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // REQUIRES: std-at-least-c++20 // UNSUPPORTED: no-filesystem, no-localization, no-tzdb // UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME // TODO FMT This test should not require std::to_chars(floating-point) // XFAIL: availability-fp_to_chars-missing // XFAIL: libcpp-has-no-experimental-tzdb // XFAIL: availability-tzdb-missing // REQUIRES: locale.fr_FR.UTF-8 // REQUIRES: locale.ja_JP.UTF-8 // // class gps_clock; // template // basic_ostream& // operator<<(basic_ostream& os, const gps_time& tp); #include #include #include #include #include "make_string.h" #include "platform_support.h" // locale name macros #include "test_macros.h" #define SV(S) MAKE_STRING_VIEW(CharT, S) template static std::basic_string stream_c_locale(std::chrono::gps_time time_point) { std::basic_stringstream sstr; sstr << std::fixed << time_point; return sstr.str(); } template static std::basic_string stream_fr_FR_locale(std::chrono::gps_time time_point) { std::basic_stringstream sstr; const std::locale locale(LOCALE_fr_FR_UTF_8); sstr.imbue(locale); sstr << std::fixed << time_point; return sstr.str(); } template static std::basic_string stream_ja_JP_locale(std::chrono::gps_time time_point) { std::basic_stringstream sstr; const std::locale locale(LOCALE_ja_JP_UTF_8); sstr.imbue(locale); sstr << std::fixed << time_point; return sstr.str(); } template static void test_c() { using namespace std::literals::chrono_literals; namespace cr = std::chrono; assert(stream_c_locale(cr::gps_time{946'688'523'123'456'789ns}) == SV("2010-01-05 01:01:48.123456789")); assert(stream_c_locale(cr::gps_time{946'688'523'123'456us}) == SV("2010-01-05 01:01:48.123456")); assert(stream_c_locale(cr::gps_time{946'684'822'123ms}) == SV("2010-01-05 00:00:07.123")); assert(stream_c_locale(cr::gps_seconds{1'234'567'890s}) == SV("2019-02-18 23:31:12")); assert(stream_c_locale(cr::gps_time{20'576'131min}) == SV("2019-02-18 23:30:42")); assert(stream_c_locale(cr::gps_time{342'935h}) == SV("2019-02-18 22:59:42")); assert(stream_c_locale(cr::gps_time>>{ cr::duration>{60}}) == SV("1980-01-06 00:02:00")); assert(stream_c_locale(cr::gps_time>>{ cr::duration>{3600}}) == SV("1980-01-06 00:30:00.0")); assert(stream_c_locale(cr::gps_time>>{ cr::duration>{3600}}) == SV("1980-01-06 00:15:00.00")); assert(stream_c_locale(cr::gps_time>>{ cr::duration>{36611}}) == SV("1980-01-06 01:01:01.1")); assert(stream_c_locale(cr::gps_time>>{ cr::duration>{123'456'789'010}}) == SV("2019-02-18 23:31:12.10")); } template static void test_fr_FR() { using namespace std::literals::chrono_literals; namespace cr = std::chrono; assert(stream_fr_FR_locale(cr::gps_time{946'688'523'123'456'789ns}) == SV("2010-01-05 01:01:48,123456789")); assert(stream_fr_FR_locale(cr::gps_time{946'688'523'123'456us}) == SV("2010-01-05 01:01:48,123456")); assert(stream_fr_FR_locale(cr::gps_time{946'684'822'123ms}) == SV("2010-01-05 00:00:07,123")); assert(stream_fr_FR_locale(cr::gps_seconds{1'234'567'890s}) == SV("2019-02-18 23:31:12")); assert(stream_fr_FR_locale(cr::gps_time{20'576'131min}) == SV("2019-02-18 23:30:42")); assert(stream_fr_FR_locale(cr::gps_time{342'935h}) == SV("2019-02-18 22:59:42")); assert(stream_fr_FR_locale(cr::gps_time>>{ cr::duration>{60}}) == SV("1980-01-06 00:02:00")); assert(stream_fr_FR_locale(cr::gps_time>>{ cr::duration>{3600}}) == SV("1980-01-06 00:30:00,0")); assert(stream_fr_FR_locale(cr::gps_time>>{ cr::duration>{3600}}) == SV("1980-01-06 00:15:00,00")); assert(stream_fr_FR_locale(cr::gps_time>>{ cr::duration>{36611}}) == SV("1980-01-06 01:01:01,1")); assert(stream_fr_FR_locale(cr::gps_time>>{ cr::duration>{123'456'789'010}}) == SV("2019-02-18 23:31:12,10")); } template static void test_ja_JP() { using namespace std::literals::chrono_literals; namespace cr = std::chrono; assert(stream_ja_JP_locale(cr::gps_time{946'688'523'123'456'789ns}) == SV("2010-01-05 01:01:48.123456789")); assert(stream_ja_JP_locale(cr::gps_time{946'688'523'123'456us}) == SV("2010-01-05 01:01:48.123456")); assert(stream_ja_JP_locale(cr::gps_time{946'684'822'123ms}) == SV("2010-01-05 00:00:07.123")); assert(stream_ja_JP_locale(cr::gps_seconds{1'234'567'890s}) == SV("2019-02-18 23:31:12")); assert(stream_ja_JP_locale(cr::gps_time{20'576'131min}) == SV("2019-02-18 23:30:42")); assert(stream_ja_JP_locale(cr::gps_time{342'935h}) == SV("2019-02-18 22:59:42")); assert(stream_ja_JP_locale(cr::gps_time>>{ cr::duration>{60}}) == SV("1980-01-06 00:02:00")); assert(stream_ja_JP_locale(cr::gps_time>>{ cr::duration>{3600}}) == SV("1980-01-06 00:30:00.0")); assert(stream_ja_JP_locale(cr::gps_time>>{ cr::duration>{3600}}) == SV("1980-01-06 00:15:00.00")); assert(stream_ja_JP_locale(cr::gps_time>>{ cr::duration>{36611}}) == SV("1980-01-06 01:01:01.1")); assert(stream_ja_JP_locale(cr::gps_time>>{ cr::duration>{123'456'789'010}}) == SV("2019-02-18 23:31:12.10")); } template static void test() { test_c(); test_fr_FR(); test_ja_JP(); } int main(int, char**) { test(); #ifndef TEST_HAS_NO_WIDE_CHARACTERS test(); #endif return 0; }