xref: /llvm-project/libcxx/test/std/time/time.clock/time.clock.file/ostream.pass.cpp (revision 579d30109ae9526ea3ec89d2cadc846bd8cffae5)
196f30332SMark de Wever //===----------------------------------------------------------------------===//
296f30332SMark de Wever //
396f30332SMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
496f30332SMark de Wever // See https://llvm.org/LICENSE.txt for license information.
596f30332SMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
696f30332SMark de Wever //
796f30332SMark de Wever //===----------------------------------------------------------------------===//
896f30332SMark de Wever 
996f30332SMark de Wever // UNSUPPORTED: c++03, c++11, c++14, c++17
1096f30332SMark de Wever // UNSUPPORTED: no-localization
11520c7fbbSLouis Dionne // UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME
1296f30332SMark de Wever 
1396f30332SMark de Wever // TODO FMT This test should not require std::to_chars(floating-point)
1496f30332SMark de Wever // XFAIL: availability-fp_to_chars-missing
1596f30332SMark de Wever 
1696f30332SMark de Wever // REQUIRES: locale.fr_FR.UTF-8
1796f30332SMark de Wever // REQUIRES: locale.ja_JP.UTF-8
1896f30332SMark de Wever 
1996f30332SMark de Wever // <chrono>
2096f30332SMark de Wever 
2196f30332SMark de Wever // class system_clock;
2296f30332SMark de Wever 
2396f30332SMark de Wever // template<class charT, class traits, class Duration>
2496f30332SMark de Wever //   basic_ostream<charT, traits>&
2596f30332SMark de Wever //     operator<<(basic_ostream<charT, traits>& os, const sys_time<Duration>& tp);
2696f30332SMark de Wever 
2796f30332SMark de Wever #include <chrono>
2896f30332SMark de Wever #include <cassert>
2996f30332SMark de Wever #include <ratio>
3096f30332SMark de Wever #include <sstream>
3196f30332SMark de Wever 
3296f30332SMark de Wever #include "make_string.h"
3396f30332SMark de Wever #include "platform_support.h" // locale name macros
3496f30332SMark de Wever #include "test_macros.h"
3596f30332SMark de Wever 
3696f30332SMark de Wever #define SV(S) MAKE_STRING_VIEW(CharT, S)
3796f30332SMark de Wever 
3896f30332SMark de Wever // Modeled after the system clock's usings, this make adapating the
3996f30332SMark de Wever // tests easier.
4096f30332SMark de Wever template <class Duration>
4196f30332SMark de Wever using file_time    = std::chrono::time_point<std::chrono::file_clock, Duration>;
4296f30332SMark de Wever using file_seconds = file_time<std::chrono::seconds>;
4396f30332SMark de Wever using file_days    = file_time<std::chrono::days>;
4496f30332SMark de Wever 
4596f30332SMark de Wever template <class CharT, class Duration>
stream_c_locale(file_time<Duration> time_point)4696f30332SMark de Wever static std::basic_string<CharT> stream_c_locale(file_time<Duration> time_point) {
4796f30332SMark de Wever   std::basic_stringstream<CharT> sstr;
4896f30332SMark de Wever   sstr << std::fixed << time_point;
4996f30332SMark de Wever   return sstr.str();
5096f30332SMark de Wever }
5196f30332SMark de Wever 
5296f30332SMark de Wever template <class CharT, class Duration>
stream_fr_FR_locale(file_time<Duration> time_point)5396f30332SMark de Wever static std::basic_string<CharT> stream_fr_FR_locale(file_time<Duration> time_point) {
5496f30332SMark de Wever   std::basic_stringstream<CharT> sstr;
5596f30332SMark de Wever   const std::locale locale(LOCALE_fr_FR_UTF_8);
5696f30332SMark de Wever   sstr.imbue(locale);
5796f30332SMark de Wever   sstr << std::fixed << time_point;
5896f30332SMark de Wever   return sstr.str();
5996f30332SMark de Wever }
6096f30332SMark de Wever 
6196f30332SMark de Wever template <class CharT, class Duration>
stream_ja_JP_locale(file_time<Duration> time_point)6296f30332SMark de Wever static std::basic_string<CharT> stream_ja_JP_locale(file_time<Duration> time_point) {
6396f30332SMark de Wever   std::basic_stringstream<CharT> sstr;
6496f30332SMark de Wever   const std::locale locale(LOCALE_ja_JP_UTF_8);
6596f30332SMark de Wever   sstr.imbue(locale);
6696f30332SMark de Wever   sstr << std::fixed << time_point;
6796f30332SMark de Wever   return sstr.str();
6896f30332SMark de Wever }
6996f30332SMark de Wever 
7096f30332SMark de Wever template <class CharT>
test_c()7196f30332SMark de Wever static void test_c() {
7296f30332SMark de Wever   using namespace std::literals::chrono_literals;
7396f30332SMark de Wever 
74*579d3010SMark de Wever   assert(stream_c_locale<CharT>(std::chrono::file_time<std::chrono::nanoseconds>{-946'688'523'123'456'789ns}) ==
75*579d3010SMark de Wever          SV("1940-01-01 22:57:56.876543211"));
76*579d3010SMark de Wever 
77*579d3010SMark de Wever   assert(stream_c_locale<CharT>(std::chrono::file_time<std::chrono::microseconds>{-946'688'523'123'456us}) ==
78*579d3010SMark de Wever          SV("1940-01-01 22:57:56.876544"));
79*579d3010SMark de Wever 
80*579d3010SMark de Wever   assert(stream_c_locale<CharT>(std::chrono::file_time<std::chrono::milliseconds>{-946'688'523'123ms}) ==
81*579d3010SMark de Wever          SV("1940-01-01 22:57:56.877"));
82*579d3010SMark de Wever 
83*579d3010SMark de Wever   assert(stream_c_locale<CharT>(std::chrono::file_time<std::chrono::nanoseconds>{-1000000000ns}) ==
84*579d3010SMark de Wever          SV("1969-12-31 23:59:59.000000000"));
85*579d3010SMark de Wever 
86*579d3010SMark de Wever   assert(stream_c_locale<CharT>(std::chrono::file_time<std::chrono::microseconds>{-1000000us}) ==
87*579d3010SMark de Wever          SV("1969-12-31 23:59:59.000000"));
88*579d3010SMark de Wever 
89*579d3010SMark de Wever   assert(stream_c_locale<CharT>(std::chrono::file_time<std::chrono::milliseconds>{-1000ms}) ==
90*579d3010SMark de Wever          SV("1969-12-31 23:59:59.000"));
91*579d3010SMark de Wever 
92*579d3010SMark de Wever   assert(stream_c_locale<CharT>(std::chrono::file_time<std::chrono::nanoseconds>{-1ns}) ==
93*579d3010SMark de Wever          SV("1969-12-31 23:59:59.999999999"));
94*579d3010SMark de Wever 
95*579d3010SMark de Wever   assert(stream_c_locale<CharT>(std::chrono::file_time<std::chrono::nanoseconds>{0ns}) ==
96*579d3010SMark de Wever          SV("1970-01-01 00:00:00.000000000"));
97*579d3010SMark de Wever 
98*579d3010SMark de Wever   assert(stream_c_locale<CharT>(std::chrono::file_time<std::chrono::nanoseconds>{1ns}) ==
99*579d3010SMark de Wever          SV("1970-01-01 00:00:00.000000001"));
100*579d3010SMark de Wever 
101*579d3010SMark de Wever   assert(stream_c_locale<CharT>(std::chrono::file_time<std::chrono::nanoseconds>{1000000000ns}) ==
102*579d3010SMark de Wever          SV("1970-01-01 00:00:01.000000000"));
103*579d3010SMark de Wever 
104*579d3010SMark de Wever   assert(stream_c_locale<CharT>(std::chrono::file_time<std::chrono::microseconds>{1000000us}) ==
105*579d3010SMark de Wever          SV("1970-01-01 00:00:01.000000"));
106*579d3010SMark de Wever 
107*579d3010SMark de Wever   assert(stream_c_locale<CharT>(std::chrono::file_time<std::chrono::milliseconds>{1000ms}) ==
108*579d3010SMark de Wever          SV("1970-01-01 00:00:01.000"));
109*579d3010SMark de Wever 
11096f30332SMark de Wever   assert(stream_c_locale<CharT>(file_time<std::chrono::nanoseconds>{946'688'523'123'456'789ns}) ==
11196f30332SMark de Wever          SV("2000-01-01 01:02:03.123456789"));
112*579d3010SMark de Wever 
11396f30332SMark de Wever   assert(stream_c_locale<CharT>(file_time<std::chrono::microseconds>{946'688'523'123'456us}) ==
11496f30332SMark de Wever          SV("2000-01-01 01:02:03.123456"));
11596f30332SMark de Wever 
11696f30332SMark de Wever   assert(stream_c_locale<CharT>(file_time<std::chrono::milliseconds>{946'684'800'123ms}) ==
11796f30332SMark de Wever          SV("2000-01-01 00:00:00.123"));
11896f30332SMark de Wever   assert(stream_c_locale<CharT>(file_seconds{1'234'567'890s}) == SV("2009-02-13 23:31:30"));
11996f30332SMark de Wever   assert(stream_c_locale<CharT>(file_time<std::chrono::minutes>{20'576'131min}) == SV("2009-02-13 23:31:00"));
12096f30332SMark de Wever   assert(stream_c_locale<CharT>(file_time<std::chrono::hours>{342'935h}) == SV("2009-02-13 23:00:00"));
12196f30332SMark de Wever   assert(stream_c_locale<CharT>(file_days{std::chrono::days{14'288}}) == SV("2009-02-13 00:00:00"));
12296f30332SMark de Wever   assert(stream_c_locale<CharT>(file_time<std::chrono::weeks>{std::chrono::weeks{2041}}) == SV("2009-02-12 00:00:00"));
12396f30332SMark de Wever 
12496f30332SMark de Wever   assert(stream_c_locale<CharT>(file_time<std::chrono::duration<signed char, std::ratio<2, 1>>>{
12596f30332SMark de Wever              std::chrono::duration<signed char, std::ratio<2, 1>>{60}}) == SV("1970-01-01 00:02:00"));
12696f30332SMark de Wever   assert(stream_c_locale<CharT>(file_time<std::chrono::duration<short, std::ratio<1, 2>>>{
12796f30332SMark de Wever              std::chrono::duration<short, std::ratio<1, 2>>{3600}}) == SV("1970-01-01 00:30:00.0"));
12896f30332SMark de Wever   assert(stream_c_locale<CharT>(file_time<std::chrono::duration<int, std::ratio<1, 4>>>{
12996f30332SMark de Wever              std::chrono::duration<int, std::ratio<1, 4>>{3600}}) == SV("1970-01-01 00:15:00.00"));
13096f30332SMark de Wever   assert(stream_c_locale<CharT>(file_time<std::chrono::duration<long, std::ratio<1, 10>>>{
13196f30332SMark de Wever              std::chrono::duration<long, std::ratio<1, 10>>{36611}}) == SV("1970-01-01 01:01:01.1"));
13296f30332SMark de Wever   assert(stream_c_locale<CharT>(file_time<std::chrono::duration<long long, std::ratio<1, 100>>>{
13396f30332SMark de Wever              std::chrono::duration<long long, std::ratio<1, 100>>{12'345'678'9010}}) == SV("2009-02-13 23:31:30.10"));
13496f30332SMark de Wever 
13596f30332SMark de Wever   assert(stream_c_locale<CharT>(file_time<std::chrono::duration<float, std::ratio<1, 1>>>{
13696f30332SMark de Wever              std::chrono::duration<float, std::ratio<1, 1>>{123.456}}) == SV("1970-01-01 00:02:03"));
13796f30332SMark de Wever   assert(stream_c_locale<CharT>(file_time<std::chrono::duration<double, std::ratio<1, 10>>>{
13896f30332SMark de Wever              std::chrono::duration<double, std::ratio<1, 10>>{123.456}}) == SV("1970-01-01 00:00:12.3"));
13996f30332SMark de Wever   assert(stream_c_locale<CharT>(file_time<std::chrono::duration<long double, std::ratio<1, 100>>>{
14096f30332SMark de Wever              std::chrono::duration<long double, std::ratio<1, 100>>{123.456}}) == SV("1970-01-01 00:00:01.23"));
14196f30332SMark de Wever }
14296f30332SMark de Wever 
14396f30332SMark de Wever template <class CharT>
test_fr_FR()14496f30332SMark de Wever static void test_fr_FR() {
14596f30332SMark de Wever   using namespace std::literals::chrono_literals;
14696f30332SMark de Wever 
147*579d3010SMark de Wever   assert(stream_fr_FR_locale<CharT>(std::chrono::file_time<std::chrono::nanoseconds>{-946'688'523'123'456'789ns}) ==
148*579d3010SMark de Wever          SV("1940-01-01 22:57:56,876543211"));
149*579d3010SMark de Wever 
150*579d3010SMark de Wever   assert(stream_fr_FR_locale<CharT>(std::chrono::file_time<std::chrono::microseconds>{-946'688'523'123'456us}) ==
151*579d3010SMark de Wever          SV("1940-01-01 22:57:56,876544"));
152*579d3010SMark de Wever 
153*579d3010SMark de Wever   assert(stream_fr_FR_locale<CharT>(std::chrono::file_time<std::chrono::milliseconds>{-946'688'523'123ms}) ==
154*579d3010SMark de Wever          SV("1940-01-01 22:57:56,877"));
155*579d3010SMark de Wever 
156*579d3010SMark de Wever   assert(stream_fr_FR_locale<CharT>(std::chrono::file_time<std::chrono::nanoseconds>{-1000000000ns}) ==
157*579d3010SMark de Wever          SV("1969-12-31 23:59:59,000000000"));
158*579d3010SMark de Wever 
159*579d3010SMark de Wever   assert(stream_fr_FR_locale<CharT>(std::chrono::file_time<std::chrono::microseconds>{-1000000us}) ==
160*579d3010SMark de Wever          SV("1969-12-31 23:59:59,000000"));
161*579d3010SMark de Wever 
162*579d3010SMark de Wever   assert(stream_fr_FR_locale<CharT>(std::chrono::file_time<std::chrono::milliseconds>{-1000ms}) ==
163*579d3010SMark de Wever          SV("1969-12-31 23:59:59,000"));
164*579d3010SMark de Wever 
165*579d3010SMark de Wever   assert(stream_fr_FR_locale<CharT>(std::chrono::file_time<std::chrono::nanoseconds>{-1ns}) ==
166*579d3010SMark de Wever          SV("1969-12-31 23:59:59,999999999"));
167*579d3010SMark de Wever 
168*579d3010SMark de Wever   assert(stream_fr_FR_locale<CharT>(std::chrono::file_time<std::chrono::nanoseconds>{0ns}) ==
169*579d3010SMark de Wever          SV("1970-01-01 00:00:00,000000000"));
170*579d3010SMark de Wever 
171*579d3010SMark de Wever   assert(stream_fr_FR_locale<CharT>(std::chrono::file_time<std::chrono::nanoseconds>{1ns}) ==
172*579d3010SMark de Wever          SV("1970-01-01 00:00:00,000000001"));
173*579d3010SMark de Wever 
174*579d3010SMark de Wever   assert(stream_fr_FR_locale<CharT>(std::chrono::file_time<std::chrono::nanoseconds>{1000000000ns}) ==
175*579d3010SMark de Wever          SV("1970-01-01 00:00:01,000000000"));
176*579d3010SMark de Wever 
177*579d3010SMark de Wever   assert(stream_fr_FR_locale<CharT>(std::chrono::file_time<std::chrono::microseconds>{1000000us}) ==
178*579d3010SMark de Wever          SV("1970-01-01 00:00:01,000000"));
179*579d3010SMark de Wever 
180*579d3010SMark de Wever   assert(stream_fr_FR_locale<CharT>(std::chrono::file_time<std::chrono::milliseconds>{1000ms}) ==
181*579d3010SMark de Wever          SV("1970-01-01 00:00:01,000"));
182*579d3010SMark de Wever 
18396f30332SMark de Wever   assert(stream_fr_FR_locale<CharT>(file_time<std::chrono::nanoseconds>{946'688'523'123'456'789ns}) ==
18496f30332SMark de Wever          SV("2000-01-01 01:02:03,123456789"));
18596f30332SMark de Wever   assert(stream_fr_FR_locale<CharT>(file_time<std::chrono::microseconds>{946'688'523'123'456us}) ==
18696f30332SMark de Wever          SV("2000-01-01 01:02:03,123456"));
18796f30332SMark de Wever 
18896f30332SMark de Wever   assert(stream_fr_FR_locale<CharT>(file_time<std::chrono::milliseconds>{946'684'800'123ms}) ==
18996f30332SMark de Wever          SV("2000-01-01 00:00:00,123"));
19096f30332SMark de Wever   assert(stream_fr_FR_locale<CharT>(file_seconds{1'234'567'890s}) == SV("2009-02-13 23:31:30"));
19196f30332SMark de Wever   assert(stream_fr_FR_locale<CharT>(file_time<std::chrono::minutes>{20'576'131min}) == SV("2009-02-13 23:31:00"));
19296f30332SMark de Wever   assert(stream_fr_FR_locale<CharT>(file_time<std::chrono::hours>{342'935h}) == SV("2009-02-13 23:00:00"));
19396f30332SMark de Wever   assert(stream_fr_FR_locale<CharT>(file_days{std::chrono::days{14'288}}) == SV("2009-02-13 00:00:00"));
19496f30332SMark de Wever   assert(stream_fr_FR_locale<CharT>(file_time<std::chrono::weeks>{std::chrono::weeks{2041}}) ==
19596f30332SMark de Wever          SV("2009-02-12 00:00:00"));
19696f30332SMark de Wever 
19796f30332SMark de Wever   assert(stream_fr_FR_locale<CharT>(file_time<std::chrono::duration<signed char, std::ratio<2, 1>>>{
19896f30332SMark de Wever              std::chrono::duration<signed char, std::ratio<2, 1>>{60}}) == SV("1970-01-01 00:02:00"));
19996f30332SMark de Wever   assert(stream_fr_FR_locale<CharT>(file_time<std::chrono::duration<short, std::ratio<1, 2>>>{
20096f30332SMark de Wever              std::chrono::duration<short, std::ratio<1, 2>>{3600}}) == SV("1970-01-01 00:30:00,0"));
20196f30332SMark de Wever   assert(stream_fr_FR_locale<CharT>(file_time<std::chrono::duration<int, std::ratio<1, 4>>>{
20296f30332SMark de Wever              std::chrono::duration<int, std::ratio<1, 4>>{3600}}) == SV("1970-01-01 00:15:00,00"));
20396f30332SMark de Wever   assert(stream_fr_FR_locale<CharT>(file_time<std::chrono::duration<long, std::ratio<1, 10>>>{
20496f30332SMark de Wever              std::chrono::duration<long, std::ratio<1, 10>>{36611}}) == SV("1970-01-01 01:01:01,1"));
20596f30332SMark de Wever   assert(stream_fr_FR_locale<CharT>(file_time<std::chrono::duration<long long, std::ratio<1, 100>>>{
20696f30332SMark de Wever              std::chrono::duration<long long, std::ratio<1, 100>>{12'345'678'9010}}) == SV("2009-02-13 23:31:30,10"));
20796f30332SMark de Wever 
20896f30332SMark de Wever   assert(stream_fr_FR_locale<CharT>(file_time<std::chrono::duration<float, std::ratio<1, 1>>>{
20996f30332SMark de Wever              std::chrono::duration<float, std::ratio<1, 1>>{123.456}}) == SV("1970-01-01 00:02:03"));
21096f30332SMark de Wever   assert(stream_fr_FR_locale<CharT>(file_time<std::chrono::duration<double, std::ratio<1, 10>>>{
21196f30332SMark de Wever              std::chrono::duration<double, std::ratio<1, 10>>{123.456}}) == SV("1970-01-01 00:00:12,3"));
21296f30332SMark de Wever   assert(stream_fr_FR_locale<CharT>(file_time<std::chrono::duration<long double, std::ratio<1, 100>>>{
21396f30332SMark de Wever              std::chrono::duration<long double, std::ratio<1, 100>>{123.456}}) == SV("1970-01-01 00:00:01,23"));
21496f30332SMark de Wever }
21596f30332SMark de Wever 
21696f30332SMark de Wever template <class CharT>
test_ja_JP()21796f30332SMark de Wever static void test_ja_JP() {
21896f30332SMark de Wever   using namespace std::literals::chrono_literals;
21996f30332SMark de Wever 
220*579d3010SMark de Wever   assert(stream_ja_JP_locale<CharT>(std::chrono::file_time<std::chrono::nanoseconds>{-946'688'523'123'456'789ns}) ==
221*579d3010SMark de Wever          SV("1940-01-01 22:57:56.876543211"));
222*579d3010SMark de Wever 
223*579d3010SMark de Wever   assert(stream_ja_JP_locale<CharT>(std::chrono::file_time<std::chrono::microseconds>{-946'688'523'123'456us}) ==
224*579d3010SMark de Wever          SV("1940-01-01 22:57:56.876544"));
225*579d3010SMark de Wever 
226*579d3010SMark de Wever   assert(stream_ja_JP_locale<CharT>(std::chrono::file_time<std::chrono::milliseconds>{-946'688'523'123ms}) ==
227*579d3010SMark de Wever          SV("1940-01-01 22:57:56.877"));
228*579d3010SMark de Wever 
229*579d3010SMark de Wever   assert(stream_ja_JP_locale<CharT>(std::chrono::file_time<std::chrono::nanoseconds>{-1000000000ns}) ==
230*579d3010SMark de Wever          SV("1969-12-31 23:59:59.000000000"));
231*579d3010SMark de Wever 
232*579d3010SMark de Wever   assert(stream_ja_JP_locale<CharT>(std::chrono::file_time<std::chrono::microseconds>{-1000000us}) ==
233*579d3010SMark de Wever          SV("1969-12-31 23:59:59.000000"));
234*579d3010SMark de Wever 
235*579d3010SMark de Wever   assert(stream_ja_JP_locale<CharT>(std::chrono::file_time<std::chrono::milliseconds>{-1000ms}) ==
236*579d3010SMark de Wever          SV("1969-12-31 23:59:59.000"));
237*579d3010SMark de Wever 
238*579d3010SMark de Wever   assert(stream_ja_JP_locale<CharT>(std::chrono::file_time<std::chrono::nanoseconds>{-1ns}) ==
239*579d3010SMark de Wever          SV("1969-12-31 23:59:59.999999999"));
240*579d3010SMark de Wever 
241*579d3010SMark de Wever   assert(stream_ja_JP_locale<CharT>(std::chrono::file_time<std::chrono::nanoseconds>{0ns}) ==
242*579d3010SMark de Wever          SV("1970-01-01 00:00:00.000000000"));
243*579d3010SMark de Wever 
244*579d3010SMark de Wever   assert(stream_ja_JP_locale<CharT>(std::chrono::file_time<std::chrono::nanoseconds>{1ns}) ==
245*579d3010SMark de Wever          SV("1970-01-01 00:00:00.000000001"));
246*579d3010SMark de Wever 
247*579d3010SMark de Wever   assert(stream_ja_JP_locale<CharT>(std::chrono::file_time<std::chrono::nanoseconds>{1000000000ns}) ==
248*579d3010SMark de Wever          SV("1970-01-01 00:00:01.000000000"));
249*579d3010SMark de Wever 
250*579d3010SMark de Wever   assert(stream_ja_JP_locale<CharT>(std::chrono::file_time<std::chrono::microseconds>{1000000us}) ==
251*579d3010SMark de Wever          SV("1970-01-01 00:00:01.000000"));
252*579d3010SMark de Wever 
253*579d3010SMark de Wever   assert(stream_ja_JP_locale<CharT>(std::chrono::file_time<std::chrono::milliseconds>{1000ms}) ==
254*579d3010SMark de Wever          SV("1970-01-01 00:00:01.000"));
255*579d3010SMark de Wever 
25696f30332SMark de Wever   assert(stream_ja_JP_locale<CharT>(file_time<std::chrono::nanoseconds>{946'688'523'123'456'789ns}) ==
25796f30332SMark de Wever          SV("2000-01-01 01:02:03.123456789"));
25896f30332SMark de Wever   assert(stream_ja_JP_locale<CharT>(file_time<std::chrono::microseconds>{946'688'523'123'456us}) ==
25996f30332SMark de Wever          SV("2000-01-01 01:02:03.123456"));
26096f30332SMark de Wever 
26196f30332SMark de Wever   assert(stream_ja_JP_locale<CharT>(file_time<std::chrono::milliseconds>{946'684'800'123ms}) ==
26296f30332SMark de Wever          SV("2000-01-01 00:00:00.123"));
26396f30332SMark de Wever   assert(stream_ja_JP_locale<CharT>(file_seconds{1'234'567'890s}) == SV("2009-02-13 23:31:30"));
26496f30332SMark de Wever   assert(stream_ja_JP_locale<CharT>(file_time<std::chrono::minutes>{20'576'131min}) == SV("2009-02-13 23:31:00"));
26596f30332SMark de Wever   assert(stream_ja_JP_locale<CharT>(file_time<std::chrono::hours>{342'935h}) == SV("2009-02-13 23:00:00"));
26696f30332SMark de Wever   assert(stream_ja_JP_locale<CharT>(file_days{std::chrono::days{14'288}}) == SV("2009-02-13 00:00:00"));
26796f30332SMark de Wever   assert(stream_ja_JP_locale<CharT>(file_time<std::chrono::weeks>{std::chrono::weeks{2041}}) ==
26896f30332SMark de Wever          SV("2009-02-12 00:00:00"));
26996f30332SMark de Wever 
27096f30332SMark de Wever   assert(stream_ja_JP_locale<CharT>(file_time<std::chrono::duration<signed char, std::ratio<2, 1>>>{
27196f30332SMark de Wever              std::chrono::duration<signed char, std::ratio<2, 1>>{60}}) == SV("1970-01-01 00:02:00"));
27296f30332SMark de Wever   assert(stream_ja_JP_locale<CharT>(file_time<std::chrono::duration<short, std::ratio<1, 2>>>{
27396f30332SMark de Wever              std::chrono::duration<short, std::ratio<1, 2>>{3600}}) == SV("1970-01-01 00:30:00.0"));
27496f30332SMark de Wever   assert(stream_ja_JP_locale<CharT>(file_time<std::chrono::duration<int, std::ratio<1, 4>>>{
27596f30332SMark de Wever              std::chrono::duration<int, std::ratio<1, 4>>{3600}}) == SV("1970-01-01 00:15:00.00"));
27696f30332SMark de Wever   assert(stream_ja_JP_locale<CharT>(file_time<std::chrono::duration<long, std::ratio<1, 10>>>{
27796f30332SMark de Wever              std::chrono::duration<long, std::ratio<1, 10>>{36611}}) == SV("1970-01-01 01:01:01.1"));
27896f30332SMark de Wever   assert(stream_ja_JP_locale<CharT>(file_time<std::chrono::duration<long long, std::ratio<1, 100>>>{
27996f30332SMark de Wever              std::chrono::duration<long long, std::ratio<1, 100>>{12'345'678'9010}}) == SV("2009-02-13 23:31:30.10"));
28096f30332SMark de Wever 
28196f30332SMark de Wever   assert(stream_ja_JP_locale<CharT>(file_time<std::chrono::duration<float, std::ratio<1, 1>>>{
28296f30332SMark de Wever              std::chrono::duration<float, std::ratio<1, 1>>{123.456}}) == SV("1970-01-01 00:02:03"));
28396f30332SMark de Wever   assert(stream_ja_JP_locale<CharT>(file_time<std::chrono::duration<double, std::ratio<1, 10>>>{
28496f30332SMark de Wever              std::chrono::duration<double, std::ratio<1, 10>>{123.456}}) == SV("1970-01-01 00:00:12.3"));
28596f30332SMark de Wever   assert(stream_ja_JP_locale<CharT>(file_time<std::chrono::duration<long double, std::ratio<1, 100>>>{
28696f30332SMark de Wever              std::chrono::duration<long double, std::ratio<1, 100>>{123.456}}) == SV("1970-01-01 00:00:01.23"));
28796f30332SMark de Wever }
28896f30332SMark de Wever 
28996f30332SMark de Wever template <class CharT>
test()29096f30332SMark de Wever static void test() {
29196f30332SMark de Wever   test_c<CharT>();
29296f30332SMark de Wever   test_fr_FR<CharT>();
29396f30332SMark de Wever   test_ja_JP<CharT>();
29496f30332SMark de Wever }
29596f30332SMark de Wever 
main(int,char **)29696f30332SMark de Wever int main(int, char**) {
29796f30332SMark de Wever   test<char>();
29896f30332SMark de Wever 
29996f30332SMark de Wever #ifndef TEST_HAS_NO_WIDE_CHARACTERS
30096f30332SMark de Wever   test<wchar_t>();
30196f30332SMark de Wever #endif
30296f30332SMark de Wever 
30396f30332SMark de Wever   return 0;
30496f30332SMark de Wever }
305