brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.6 KiB · 6ec63a1 Raw
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