234 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++14, c++1710// UNSUPPORTED: no-localization11// UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME12 13// TODO FMT This test should not require std::to_chars(floating-point)14// XFAIL: availability-fp_to_chars-missing15 16// REQUIRES: locale.fr_FR.UTF-817// REQUIRES: locale.ja_JP.UTF-818 19// <chrono>20 21// class local_t;22 23// template<class charT, class traits, class Duration>24// basic_ostream<charT, traits>&25// operator<<(basic_ostream<charT, traits>& os, const local_time<Duration>& tp);26 27#include <chrono>28#include <cassert>29#include <ratio>30#include <sstream>31 32#include "make_string.h"33#include "platform_support.h" // locale name macros34#include "test_macros.h"35 36#define SV(S) MAKE_STRING_VIEW(CharT, S)37 38template <class CharT, class Duration>39static std::basic_string<CharT> stream_c_locale(std::chrono::local_time<Duration> time_point) {40 std::basic_stringstream<CharT> sstr;41 sstr << std::fixed << time_point;42 return sstr.str();43}44 45template <class CharT, class Duration>46static std::basic_string<CharT> stream_fr_FR_locale(std::chrono::local_time<Duration> time_point) {47 std::basic_stringstream<CharT> sstr;48 const std::locale locale(LOCALE_fr_FR_UTF_8);49 sstr.imbue(locale);50 sstr << std::fixed << time_point;51 return sstr.str();52}53 54template <class CharT, class Duration>55static std::basic_string<CharT> stream_ja_JP_locale(std::chrono::local_time<Duration> time_point) {56 std::basic_stringstream<CharT> sstr;57 const std::locale locale(LOCALE_ja_JP_UTF_8);58 sstr.imbue(locale);59 sstr << std::fixed << time_point;60 return sstr.str();61}62 63template <class CharT>64static void test_c() {65 using namespace std::literals::chrono_literals;66 67 assert(stream_c_locale<CharT>(std::chrono::local_time<std::chrono::nanoseconds>{-946'688'523'123'456'789ns}) ==68 SV("1940-01-01 22:57:56.876543211"));69 70 assert(stream_c_locale<CharT>(std::chrono::local_time<std::chrono::microseconds>{-946'688'523'123'456us}) ==71 SV("1940-01-01 22:57:56.876544"));72 73 assert(stream_c_locale<CharT>(std::chrono::local_time<std::chrono::milliseconds>{-946'688'523'123ms}) ==74 SV("1940-01-01 22:57:56.877"));75 76 assert(stream_c_locale<CharT>(std::chrono::local_time<std::chrono::nanoseconds>{-1ns}) ==77 SV("1969-12-31 23:59:59.999999999"));78 79 assert(stream_c_locale<CharT>(std::chrono::local_time<std::chrono::nanoseconds>{0ns}) ==80 SV("1970-01-01 00:00:00.000000000"));81 82 assert(stream_c_locale<CharT>(std::chrono::local_time<std::chrono::nanoseconds>{1ns}) ==83 SV("1970-01-01 00:00:00.000000001"));84 85 assert(stream_c_locale<CharT>(std::chrono::local_time<std::chrono::nanoseconds>{946'688'523'123'456'789ns}) ==86 SV("2000-01-01 01:02:03.123456789"));87 assert(stream_c_locale<CharT>(std::chrono::local_time<std::chrono::microseconds>{946'688'523'123'456us}) ==88 SV("2000-01-01 01:02:03.123456"));89 90 assert(stream_c_locale<CharT>(std::chrono::local_time<std::chrono::milliseconds>{946'684'800'123ms}) ==91 SV("2000-01-01 00:00:00.123"));92 assert(stream_c_locale<CharT>(std::chrono::local_seconds{1'234'567'890s}) == SV("2009-02-13 23:31:30"));93 assert(stream_c_locale<CharT>(std::chrono::local_time<std::chrono::minutes>{20'576'131min}) ==94 SV("2009-02-13 23:31:00"));95 assert(stream_c_locale<CharT>(std::chrono::local_time<std::chrono::hours>{342'935h}) == SV("2009-02-13 23:00:00"));96 97 // These switch to sys_day formatter, which omits the time.98 assert(stream_c_locale<CharT>(std::chrono::local_days{std::chrono::days{14'288}}) == SV("2009-02-13"));99 assert(stream_c_locale<CharT>(std::chrono::local_time<std::chrono::weeks>{std::chrono::weeks{2041}}) ==100 SV("2009-02-12"));101 102 assert(stream_c_locale<CharT>(std::chrono::local_time<std::chrono::duration<signed char, std::ratio<2, 1>>>{103 std::chrono::duration<signed char, std::ratio<2, 1>>{60}}) == SV("1970-01-01 00:02:00"));104 assert(stream_c_locale<CharT>(std::chrono::local_time<std::chrono::duration<short, std::ratio<1, 2>>>{105 std::chrono::duration<short, std::ratio<1, 2>>{3600}}) == SV("1970-01-01 00:30:00.0"));106 assert(stream_c_locale<CharT>(std::chrono::local_time<std::chrono::duration<int, std::ratio<1, 4>>>{107 std::chrono::duration<int, std::ratio<1, 4>>{3600}}) == SV("1970-01-01 00:15:00.00"));108 assert(stream_c_locale<CharT>(std::chrono::local_time<std::chrono::duration<long, std::ratio<1, 10>>>{109 std::chrono::duration<long, std::ratio<1, 10>>{36611}}) == SV("1970-01-01 01:01:01.1"));110 assert(stream_c_locale<CharT>(std::chrono::local_time<std::chrono::duration<long long, std::ratio<1, 100>>>{111 std::chrono::duration<long long, std::ratio<1, 100>>{12'345'678'9010}}) == SV("2009-02-13 23:31:30.10"));112}113 114template <class CharT>115static void test_fr_FR() {116 using namespace std::literals::chrono_literals;117 118 assert(stream_fr_FR_locale<CharT>(std::chrono::local_time<std::chrono::nanoseconds>{-946'688'523'123'456'789ns}) ==119 SV("1940-01-01 22:57:56,876543211"));120 121 assert(stream_fr_FR_locale<CharT>(std::chrono::local_time<std::chrono::microseconds>{-946'688'523'123'456us}) ==122 SV("1940-01-01 22:57:56,876544"));123 124 assert(stream_fr_FR_locale<CharT>(std::chrono::local_time<std::chrono::milliseconds>{-946'688'523'123ms}) ==125 SV("1940-01-01 22:57:56,877"));126 127 assert(stream_fr_FR_locale<CharT>(std::chrono::local_time<std::chrono::nanoseconds>{-1ns}) ==128 SV("1969-12-31 23:59:59,999999999"));129 130 assert(stream_fr_FR_locale<CharT>(std::chrono::local_time<std::chrono::nanoseconds>{0ns}) ==131 SV("1970-01-01 00:00:00,000000000"));132 133 assert(stream_fr_FR_locale<CharT>(std::chrono::local_time<std::chrono::nanoseconds>{1ns}) ==134 SV("1970-01-01 00:00:00,000000001"));135 136 assert(stream_fr_FR_locale<CharT>(std::chrono::local_time<std::chrono::nanoseconds>{946'688'523'123'456'789ns}) ==137 SV("2000-01-01 01:02:03,123456789"));138 assert(stream_fr_FR_locale<CharT>(std::chrono::local_time<std::chrono::microseconds>{946'688'523'123'456us}) ==139 SV("2000-01-01 01:02:03,123456"));140 141 assert(stream_fr_FR_locale<CharT>(std::chrono::local_time<std::chrono::milliseconds>{946'684'800'123ms}) ==142 SV("2000-01-01 00:00:00,123"));143 assert(stream_fr_FR_locale<CharT>(std::chrono::local_seconds{1'234'567'890s}) == SV("2009-02-13 23:31:30"));144 assert(stream_fr_FR_locale<CharT>(std::chrono::local_time<std::chrono::minutes>{20'576'131min}) ==145 SV("2009-02-13 23:31:00"));146 assert(stream_fr_FR_locale<CharT>(std::chrono::local_time<std::chrono::hours>{342'935h}) ==147 SV("2009-02-13 23:00:00"));148 149 // These switch to sys_day formatter, which omits the time.150 assert(stream_fr_FR_locale<CharT>(std::chrono::local_days{std::chrono::days{14'288}}) == SV("2009-02-13"));151 assert(stream_fr_FR_locale<CharT>(std::chrono::local_time<std::chrono::weeks>{std::chrono::weeks{2041}}) ==152 SV("2009-02-12"));153 154 assert(stream_fr_FR_locale<CharT>(std::chrono::local_time<std::chrono::duration<signed char, std::ratio<2, 1>>>{155 std::chrono::duration<signed char, std::ratio<2, 1>>{60}}) == SV("1970-01-01 00:02:00"));156 assert(stream_fr_FR_locale<CharT>(std::chrono::local_time<std::chrono::duration<short, std::ratio<1, 2>>>{157 std::chrono::duration<short, std::ratio<1, 2>>{3600}}) == SV("1970-01-01 00:30:00,0"));158 assert(stream_fr_FR_locale<CharT>(std::chrono::local_time<std::chrono::duration<int, std::ratio<1, 4>>>{159 std::chrono::duration<int, std::ratio<1, 4>>{3600}}) == SV("1970-01-01 00:15:00,00"));160 assert(stream_fr_FR_locale<CharT>(std::chrono::local_time<std::chrono::duration<long, std::ratio<1, 10>>>{161 std::chrono::duration<long, std::ratio<1, 10>>{36611}}) == SV("1970-01-01 01:01:01,1"));162 assert(stream_fr_FR_locale<CharT>(std::chrono::local_time<std::chrono::duration<long long, std::ratio<1, 100>>>{163 std::chrono::duration<long long, std::ratio<1, 100>>{12'345'678'9010}}) == SV("2009-02-13 23:31:30,10"));164}165 166template <class CharT>167static void test_ja_JP() {168 using namespace std::literals::chrono_literals;169 170 assert(stream_ja_JP_locale<CharT>(std::chrono::local_time<std::chrono::nanoseconds>{-946'688'523'123'456'789ns}) ==171 SV("1940-01-01 22:57:56.876543211"));172 173 assert(stream_ja_JP_locale<CharT>(std::chrono::local_time<std::chrono::microseconds>{-946'688'523'123'456us}) ==174 SV("1940-01-01 22:57:56.876544"));175 176 assert(stream_ja_JP_locale<CharT>(std::chrono::local_time<std::chrono::milliseconds>{-946'688'523'123ms}) ==177 SV("1940-01-01 22:57:56.877"));178 179 assert(stream_ja_JP_locale<CharT>(std::chrono::local_time<std::chrono::nanoseconds>{-1ns}) ==180 SV("1969-12-31 23:59:59.999999999"));181 182 assert(stream_ja_JP_locale<CharT>(std::chrono::local_time<std::chrono::nanoseconds>{0ns}) ==183 SV("1970-01-01 00:00:00.000000000"));184 185 assert(stream_ja_JP_locale<CharT>(std::chrono::local_time<std::chrono::nanoseconds>{1ns}) ==186 SV("1970-01-01 00:00:00.000000001"));187 188 assert(stream_ja_JP_locale<CharT>(std::chrono::local_time<std::chrono::nanoseconds>{946'688'523'123'456'789ns}) ==189 SV("2000-01-01 01:02:03.123456789"));190 assert(stream_ja_JP_locale<CharT>(std::chrono::local_time<std::chrono::microseconds>{946'688'523'123'456us}) ==191 SV("2000-01-01 01:02:03.123456"));192 193 assert(stream_ja_JP_locale<CharT>(std::chrono::local_time<std::chrono::milliseconds>{946'684'800'123ms}) ==194 SV("2000-01-01 00:00:00.123"));195 assert(stream_ja_JP_locale<CharT>(std::chrono::local_seconds{1'234'567'890s}) == SV("2009-02-13 23:31:30"));196 assert(stream_ja_JP_locale<CharT>(std::chrono::local_time<std::chrono::minutes>{20'576'131min}) ==197 SV("2009-02-13 23:31:00"));198 assert(stream_ja_JP_locale<CharT>(std::chrono::local_time<std::chrono::hours>{342'935h}) ==199 SV("2009-02-13 23:00:00"));200 201 // These switch to sys_day formatter, which omits the time.202 assert(stream_ja_JP_locale<CharT>(std::chrono::local_days{std::chrono::days{14'288}}) == SV("2009-02-13"));203 assert(stream_ja_JP_locale<CharT>(std::chrono::local_time<std::chrono::weeks>{std::chrono::weeks{2041}}) ==204 SV("2009-02-12"));205 206 assert(stream_ja_JP_locale<CharT>(std::chrono::local_time<std::chrono::duration<signed char, std::ratio<2, 1>>>{207 std::chrono::duration<signed char, std::ratio<2, 1>>{60}}) == SV("1970-01-01 00:02:00"));208 assert(stream_ja_JP_locale<CharT>(std::chrono::local_time<std::chrono::duration<short, std::ratio<1, 2>>>{209 std::chrono::duration<short, std::ratio<1, 2>>{3600}}) == SV("1970-01-01 00:30:00.0"));210 assert(stream_ja_JP_locale<CharT>(std::chrono::local_time<std::chrono::duration<int, std::ratio<1, 4>>>{211 std::chrono::duration<int, std::ratio<1, 4>>{3600}}) == SV("1970-01-01 00:15:00.00"));212 assert(stream_ja_JP_locale<CharT>(std::chrono::local_time<std::chrono::duration<long, std::ratio<1, 10>>>{213 std::chrono::duration<long, std::ratio<1, 10>>{36611}}) == SV("1970-01-01 01:01:01.1"));214 assert(stream_ja_JP_locale<CharT>(std::chrono::local_time<std::chrono::duration<long long, std::ratio<1, 100>>>{215 std::chrono::duration<long long, std::ratio<1, 100>>{12'345'678'9010}}) == SV("2009-02-13 23:31:30.10"));216}217 218template <class CharT>219static void test() {220 test_c<CharT>();221 test_fr_FR<CharT>();222 test_ja_JP<CharT>();223}224 225int main(int, char**) {226 test<char>();227 228#ifndef TEST_HAS_NO_WIDE_CHARACTERS229 test<wchar_t>();230#endif231 232 return 0;233}234