//===----------------------------------------------------------------------===// // // 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 // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14, c++17 // UNSUPPORTED: no-localization // UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME // TODO FMT This test should not require std::to_chars(floating-point) // XFAIL: availability-fp_to_chars-missing // REQUIRES: locale.fr_FR.UTF-8 // REQUIRES: locale.ja_JP.UTF-8 // // class system_clock; // template // basic_ostream& // operator<<(basic_ostream& os, const sys_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) // Modeled after the system clock's usings, this make adapating the // tests easier. template using file_time = std::chrono::time_point; using file_seconds = file_time; using file_days = file_time; template static std::basic_string stream_c_locale(file_time time_point) { std::basic_stringstream sstr; sstr << std::fixed << time_point; return sstr.str(); } template static std::basic_string stream_fr_FR_locale(file_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(file_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; assert(stream_c_locale(std::chrono::file_time{-946'688'523'123'456'789ns}) == SV("1940-01-01 22:57:56.876543211")); assert(stream_c_locale(std::chrono::file_time{-946'688'523'123'456us}) == SV("1940-01-01 22:57:56.876544")); assert(stream_c_locale(std::chrono::file_time{-946'688'523'123ms}) == SV("1940-01-01 22:57:56.877")); assert(stream_c_locale(std::chrono::file_time{-1000000000ns}) == SV("1969-12-31 23:59:59.000000000")); assert(stream_c_locale(std::chrono::file_time{-1000000us}) == SV("1969-12-31 23:59:59.000000")); assert(stream_c_locale(std::chrono::file_time{-1000ms}) == SV("1969-12-31 23:59:59.000")); assert(stream_c_locale(std::chrono::file_time{-1ns}) == SV("1969-12-31 23:59:59.999999999")); assert(stream_c_locale(std::chrono::file_time{0ns}) == SV("1970-01-01 00:00:00.000000000")); assert(stream_c_locale(std::chrono::file_time{1ns}) == SV("1970-01-01 00:00:00.000000001")); assert(stream_c_locale(std::chrono::file_time{1000000000ns}) == SV("1970-01-01 00:00:01.000000000")); assert(stream_c_locale(std::chrono::file_time{1000000us}) == SV("1970-01-01 00:00:01.000000")); assert(stream_c_locale(std::chrono::file_time{1000ms}) == SV("1970-01-01 00:00:01.000")); assert(stream_c_locale(file_time{946'688'523'123'456'789ns}) == SV("2000-01-01 01:02:03.123456789")); assert(stream_c_locale(file_time{946'688'523'123'456us}) == SV("2000-01-01 01:02:03.123456")); assert(stream_c_locale(file_time{946'684'800'123ms}) == SV("2000-01-01 00:00:00.123")); assert(stream_c_locale(file_seconds{1'234'567'890s}) == SV("2009-02-13 23:31:30")); assert(stream_c_locale(file_time{20'576'131min}) == SV("2009-02-13 23:31:00")); assert(stream_c_locale(file_time{342'935h}) == SV("2009-02-13 23:00:00")); assert(stream_c_locale(file_days{std::chrono::days{14'288}}) == SV("2009-02-13 00:00:00")); assert(stream_c_locale(file_time{std::chrono::weeks{2041}}) == SV("2009-02-12 00:00:00")); assert(stream_c_locale(file_time>>{ std::chrono::duration>{60}}) == SV("1970-01-01 00:02:00")); assert(stream_c_locale(file_time>>{ std::chrono::duration>{3600}}) == SV("1970-01-01 00:30:00.0")); assert(stream_c_locale(file_time>>{ std::chrono::duration>{3600}}) == SV("1970-01-01 00:15:00.00")); assert(stream_c_locale(file_time>>{ std::chrono::duration>{36611}}) == SV("1970-01-01 01:01:01.1")); assert(stream_c_locale(file_time>>{ std::chrono::duration>{12'345'678'9010}}) == SV("2009-02-13 23:31:30.10")); assert(stream_c_locale(file_time>>{ std::chrono::duration>{123.456}}) == SV("1970-01-01 00:02:03")); assert(stream_c_locale(file_time>>{ std::chrono::duration>{123.456}}) == SV("1970-01-01 00:00:12.3")); assert(stream_c_locale(file_time>>{ std::chrono::duration>{123.456}}) == SV("1970-01-01 00:00:01.23")); } template static void test_fr_FR() { using namespace std::literals::chrono_literals; assert(stream_fr_FR_locale(std::chrono::file_time{-946'688'523'123'456'789ns}) == SV("1940-01-01 22:57:56,876543211")); assert(stream_fr_FR_locale(std::chrono::file_time{-946'688'523'123'456us}) == SV("1940-01-01 22:57:56,876544")); assert(stream_fr_FR_locale(std::chrono::file_time{-946'688'523'123ms}) == SV("1940-01-01 22:57:56,877")); assert(stream_fr_FR_locale(std::chrono::file_time{-1000000000ns}) == SV("1969-12-31 23:59:59,000000000")); assert(stream_fr_FR_locale(std::chrono::file_time{-1000000us}) == SV("1969-12-31 23:59:59,000000")); assert(stream_fr_FR_locale(std::chrono::file_time{-1000ms}) == SV("1969-12-31 23:59:59,000")); assert(stream_fr_FR_locale(std::chrono::file_time{-1ns}) == SV("1969-12-31 23:59:59,999999999")); assert(stream_fr_FR_locale(std::chrono::file_time{0ns}) == SV("1970-01-01 00:00:00,000000000")); assert(stream_fr_FR_locale(std::chrono::file_time{1ns}) == SV("1970-01-01 00:00:00,000000001")); assert(stream_fr_FR_locale(std::chrono::file_time{1000000000ns}) == SV("1970-01-01 00:00:01,000000000")); assert(stream_fr_FR_locale(std::chrono::file_time{1000000us}) == SV("1970-01-01 00:00:01,000000")); assert(stream_fr_FR_locale(std::chrono::file_time{1000ms}) == SV("1970-01-01 00:00:01,000")); assert(stream_fr_FR_locale(file_time{946'688'523'123'456'789ns}) == SV("2000-01-01 01:02:03,123456789")); assert(stream_fr_FR_locale(file_time{946'688'523'123'456us}) == SV("2000-01-01 01:02:03,123456")); assert(stream_fr_FR_locale(file_time{946'684'800'123ms}) == SV("2000-01-01 00:00:00,123")); assert(stream_fr_FR_locale(file_seconds{1'234'567'890s}) == SV("2009-02-13 23:31:30")); assert(stream_fr_FR_locale(file_time{20'576'131min}) == SV("2009-02-13 23:31:00")); assert(stream_fr_FR_locale(file_time{342'935h}) == SV("2009-02-13 23:00:00")); assert(stream_fr_FR_locale(file_days{std::chrono::days{14'288}}) == SV("2009-02-13 00:00:00")); assert(stream_fr_FR_locale(file_time{std::chrono::weeks{2041}}) == SV("2009-02-12 00:00:00")); assert(stream_fr_FR_locale(file_time>>{ std::chrono::duration>{60}}) == SV("1970-01-01 00:02:00")); assert(stream_fr_FR_locale(file_time>>{ std::chrono::duration>{3600}}) == SV("1970-01-01 00:30:00,0")); assert(stream_fr_FR_locale(file_time>>{ std::chrono::duration>{3600}}) == SV("1970-01-01 00:15:00,00")); assert(stream_fr_FR_locale(file_time>>{ std::chrono::duration>{36611}}) == SV("1970-01-01 01:01:01,1")); assert(stream_fr_FR_locale(file_time>>{ std::chrono::duration>{12'345'678'9010}}) == SV("2009-02-13 23:31:30,10")); assert(stream_fr_FR_locale(file_time>>{ std::chrono::duration>{123.456}}) == SV("1970-01-01 00:02:03")); assert(stream_fr_FR_locale(file_time>>{ std::chrono::duration>{123.456}}) == SV("1970-01-01 00:00:12,3")); assert(stream_fr_FR_locale(file_time>>{ std::chrono::duration>{123.456}}) == SV("1970-01-01 00:00:01,23")); } template static void test_ja_JP() { using namespace std::literals::chrono_literals; assert(stream_ja_JP_locale(std::chrono::file_time{-946'688'523'123'456'789ns}) == SV("1940-01-01 22:57:56.876543211")); assert(stream_ja_JP_locale(std::chrono::file_time{-946'688'523'123'456us}) == SV("1940-01-01 22:57:56.876544")); assert(stream_ja_JP_locale(std::chrono::file_time{-946'688'523'123ms}) == SV("1940-01-01 22:57:56.877")); assert(stream_ja_JP_locale(std::chrono::file_time{-1000000000ns}) == SV("1969-12-31 23:59:59.000000000")); assert(stream_ja_JP_locale(std::chrono::file_time{-1000000us}) == SV("1969-12-31 23:59:59.000000")); assert(stream_ja_JP_locale(std::chrono::file_time{-1000ms}) == SV("1969-12-31 23:59:59.000")); assert(stream_ja_JP_locale(std::chrono::file_time{-1ns}) == SV("1969-12-31 23:59:59.999999999")); assert(stream_ja_JP_locale(std::chrono::file_time{0ns}) == SV("1970-01-01 00:00:00.000000000")); assert(stream_ja_JP_locale(std::chrono::file_time{1ns}) == SV("1970-01-01 00:00:00.000000001")); assert(stream_ja_JP_locale(std::chrono::file_time{1000000000ns}) == SV("1970-01-01 00:00:01.000000000")); assert(stream_ja_JP_locale(std::chrono::file_time{1000000us}) == SV("1970-01-01 00:00:01.000000")); assert(stream_ja_JP_locale(std::chrono::file_time{1000ms}) == SV("1970-01-01 00:00:01.000")); assert(stream_ja_JP_locale(file_time{946'688'523'123'456'789ns}) == SV("2000-01-01 01:02:03.123456789")); assert(stream_ja_JP_locale(file_time{946'688'523'123'456us}) == SV("2000-01-01 01:02:03.123456")); assert(stream_ja_JP_locale(file_time{946'684'800'123ms}) == SV("2000-01-01 00:00:00.123")); assert(stream_ja_JP_locale(file_seconds{1'234'567'890s}) == SV("2009-02-13 23:31:30")); assert(stream_ja_JP_locale(file_time{20'576'131min}) == SV("2009-02-13 23:31:00")); assert(stream_ja_JP_locale(file_time{342'935h}) == SV("2009-02-13 23:00:00")); assert(stream_ja_JP_locale(file_days{std::chrono::days{14'288}}) == SV("2009-02-13 00:00:00")); assert(stream_ja_JP_locale(file_time{std::chrono::weeks{2041}}) == SV("2009-02-12 00:00:00")); assert(stream_ja_JP_locale(file_time>>{ std::chrono::duration>{60}}) == SV("1970-01-01 00:02:00")); assert(stream_ja_JP_locale(file_time>>{ std::chrono::duration>{3600}}) == SV("1970-01-01 00:30:00.0")); assert(stream_ja_JP_locale(file_time>>{ std::chrono::duration>{3600}}) == SV("1970-01-01 00:15:00.00")); assert(stream_ja_JP_locale(file_time>>{ std::chrono::duration>{36611}}) == SV("1970-01-01 01:01:01.1")); assert(stream_ja_JP_locale(file_time>>{ std::chrono::duration>{12'345'678'9010}}) == SV("2009-02-13 23:31:30.10")); assert(stream_ja_JP_locale(file_time>>{ std::chrono::duration>{123.456}}) == SV("1970-01-01 00:02:03")); assert(stream_ja_JP_locale(file_time>>{ std::chrono::duration>{123.456}}) == SV("1970-01-01 00:00:12.3")); assert(stream_ja_JP_locale(file_time>>{ std::chrono::duration>{123.456}}) == SV("1970-01-01 00:00:01.23")); } 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; }