196f30332SMark de Wever //===----------------------------------------------------------------------===// 2*6a54dfbfSLouis Dionne // 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 // template<class charT> struct formatter<chrono::file_time, charT>; 2296f30332SMark de Wever 2396f30332SMark de Wever #include <chrono> 2496f30332SMark de Wever #include <format> 2596f30332SMark de Wever 2696f30332SMark de Wever #include <cassert> 2796f30332SMark de Wever #include <concepts> 2896f30332SMark de Wever #include <locale> 2996f30332SMark de Wever #include <iostream> 3096f30332SMark de Wever #include <type_traits> 3196f30332SMark de Wever 3296f30332SMark de Wever #include "formatter_tests.h" 3396f30332SMark de Wever #include "make_string.h" 3496f30332SMark de Wever #include "platform_support.h" // locale name macros 3596f30332SMark de Wever #include "test_macros.h" 3696f30332SMark de Wever 3796f30332SMark de Wever // Modeled after the system clock's usings, this make adapting the 3896f30332SMark de Wever // tests easier. 3996f30332SMark de Wever template <class Duration> 4096f30332SMark de Wever using file_time = std::chrono::time_point<std::chrono::file_clock, Duration>; 4196f30332SMark de Wever using file_seconds = file_time<std::chrono::seconds>; 4296f30332SMark de Wever using file_days = file_time<std::chrono::days>; 4396f30332SMark de Wever 4496f30332SMark de Wever template <class CharT> 4596f30332SMark de Wever static void test_no_chrono_specs() { 4696f30332SMark de Wever using namespace std::literals::chrono_literals; 4796f30332SMark de Wever 4896f30332SMark de Wever std::locale::global(std::locale(LOCALE_fr_FR_UTF_8)); 4996f30332SMark de Wever 5096f30332SMark de Wever // Non localized output 51b9f3d241SMark de Wever 52b9f3d241SMark de Wever // [time.syn] 53b9f3d241SMark de Wever // using nanoseconds = duration<signed integer type of at least 64 bits, nano>; 54b9f3d241SMark de Wever // using microseconds = duration<signed integer type of at least 55 bits, micro>; 55b9f3d241SMark de Wever // using milliseconds = duration<signed integer type of at least 45 bits, milli>; 56b9f3d241SMark de Wever // using seconds = duration<signed integer type of at least 35 bits>; 57b9f3d241SMark de Wever // using minutes = duration<signed integer type of at least 29 bits, ratio< 60>>; 58b9f3d241SMark de Wever // using hours = duration<signed integer type of at least 23 bits, ratio<3600>>; 59b9f3d241SMark de Wever check(SV("1425-08-04 22:06:56"), SV("{}"), file_seconds(-17'179'869'184s)); // Minimum value for 35 bits. 60b9f3d241SMark de Wever check(SV("1901-12-13 20:45:52"), SV("{}"), file_seconds(-2'147'483'648s)); 61b9f3d241SMark de Wever 62b9f3d241SMark de Wever check(SV("1969-12-31 00:00:00"), SV("{}"), file_seconds(-24h)); 63b9f3d241SMark de Wever check(SV("1969-12-31 06:00:00"), SV("{}"), file_seconds(-18h)); 64b9f3d241SMark de Wever check(SV("1969-12-31 12:00:00"), SV("{}"), file_seconds(-12h)); 65b9f3d241SMark de Wever check(SV("1969-12-31 18:00:00"), SV("{}"), file_seconds(-6h)); 66b9f3d241SMark de Wever check(SV("1969-12-31 23:59:59"), SV("{}"), file_seconds(-1s)); 67b9f3d241SMark de Wever 6896f30332SMark de Wever check(SV("1970-01-01 00:00:00"), SV("{}"), file_seconds(0s)); 6996f30332SMark de Wever check(SV("2000-01-01 00:00:00"), SV("{}"), file_seconds(946'684'800s)); 7096f30332SMark de Wever check(SV("2000-01-01 01:02:03"), SV("{}"), file_seconds(946'688'523s)); 7196f30332SMark de Wever 72b9f3d241SMark de Wever check(SV("2038-01-19 03:14:07"), SV("{}"), file_seconds(2'147'483'647s)); 73b9f3d241SMark de Wever check(SV("2514-05-30 01:53:03"), SV("{}"), file_seconds(17'179'869'183s)); // Maximum value for 35 bits. 74b9f3d241SMark de Wever 7596f30332SMark de Wever check(SV("2000-01-01 01:02:03.123"), SV("{}"), file_time<std::chrono::milliseconds>(946'688'523'123ms)); 7696f30332SMark de Wever 7796f30332SMark de Wever std::locale::global(std::locale::classic()); 7896f30332SMark de Wever } 7996f30332SMark de Wever 8096f30332SMark de Wever template <class CharT> 8196f30332SMark de Wever static void test_valid_values_year() { 8296f30332SMark de Wever using namespace std::literals::chrono_literals; 8396f30332SMark de Wever 8496f30332SMark de Wever constexpr std::basic_string_view<CharT> fmt = 8596f30332SMark de Wever SV("{:%%C='%C'%t%%EC='%EC'%t%%y='%y'%t%%Oy='%Oy'%t%%Ey='%Ey'%t%%Y='%Y'%t%%EY='%EY'%n}"); 8696f30332SMark de Wever constexpr std::basic_string_view<CharT> lfmt = 8796f30332SMark de Wever SV("{:L%%C='%C'%t%%EC='%EC'%t%%y='%y'%t%%Oy='%Oy'%t%%Ey='%Ey'%t%%Y='%Y'%t%%EY='%EY'%n}"); 8896f30332SMark de Wever 8996f30332SMark de Wever const std::locale loc(LOCALE_ja_JP_UTF_8); 9096f30332SMark de Wever std::locale::global(std::locale(LOCALE_fr_FR_UTF_8)); 9196f30332SMark de Wever 9296f30332SMark de Wever // Non localized output using C-locale 9396f30332SMark de Wever check(SV("%C='19'\t%EC='19'\t%y='70'\t%Oy='70'\t%Ey='70'\t%Y='1970'\t%EY='1970'\n"), 9496f30332SMark de Wever fmt, 9596f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 9696f30332SMark de Wever 9796f30332SMark de Wever check(SV("%C='20'\t%EC='20'\t%y='09'\t%Oy='09'\t%Ey='09'\t%Y='2009'\t%EY='2009'\n"), 9896f30332SMark de Wever fmt, 9996f30332SMark de Wever file_seconds(1'234'567'890s)); // 23:31:30 UTC on Friday, 13 February 2009 10096f30332SMark de Wever 10196f30332SMark de Wever // Use the global locale (fr_FR) 10296f30332SMark de Wever check(SV("%C='19'\t%EC='19'\t%y='70'\t%Oy='70'\t%Ey='70'\t%Y='1970'\t%EY='1970'\n"), 10396f30332SMark de Wever lfmt, 10496f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 10596f30332SMark de Wever 10696f30332SMark de Wever check(SV("%C='20'\t%EC='20'\t%y='09'\t%Oy='09'\t%Ey='09'\t%Y='2009'\t%EY='2009'\n"), 10796f30332SMark de Wever lfmt, 10896f30332SMark de Wever file_seconds(1'234'567'890s)); // 23:31:30 UTC on Friday, 13 February 2009 10996f30332SMark de Wever 11096f30332SMark de Wever // Use supplied locale (ja_JP). This locale has a different alternate. 1118f01029bSMark de Wever #if defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__) 1128f01029bSMark de Wever 11396f30332SMark de Wever check(loc, 11496f30332SMark de Wever SV("%C='19'\t%EC='19'\t%y='70'\t%Oy='70'\t%Ey='70'\t%Y='1970'\t%EY='1970'\n"), 11596f30332SMark de Wever lfmt, 11696f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 11796f30332SMark de Wever 11896f30332SMark de Wever check(loc, 11996f30332SMark de Wever SV("%C='20'\t%EC='20'\t%y='09'\t%Oy='09'\t%Ey='09'\t%Y='2009'\t%EY='2009'\n"), 12096f30332SMark de Wever lfmt, 12196f30332SMark de Wever file_seconds(1'234'567'890s)); // 23:31:30 UTC on Friday, 13 February 2009 1228f01029bSMark de Wever #else // defined(_WIN32) || defined(__APPLE__) || defined(_AIX)|| defined(__FreeBSD__) 1238f01029bSMark de Wever 12496f30332SMark de Wever check(loc, 12596f30332SMark de Wever SV("%C='19'\t%EC='昭和'\t%y='70'\t%Oy='七十'\t%Ey='45'\t%Y='1970'\t%EY='昭和45年'\n"), 12696f30332SMark de Wever lfmt, 12796f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 12896f30332SMark de Wever 12996f30332SMark de Wever check(loc, 13096f30332SMark de Wever SV("%C='20'\t%EC='平成'\t%y='09'\t%Oy='九'\t%Ey='21'\t%Y='2009'\t%EY='平成21年'\n"), 13196f30332SMark de Wever lfmt, 13296f30332SMark de Wever file_seconds(1'234'567'890s)); // 23:31:30 UTC on Friday, 13 February 2009 1338f01029bSMark de Wever #endif // defined(_WIN32) || defined(__APPLE__) || defined(_AIX)|| defined(__FreeBSD__) 13496f30332SMark de Wever 13596f30332SMark de Wever std::locale::global(std::locale::classic()); 13696f30332SMark de Wever } 13796f30332SMark de Wever 13896f30332SMark de Wever template <class CharT> 13996f30332SMark de Wever static void test_valid_values_month() { 14096f30332SMark de Wever using namespace std::literals::chrono_literals; 14196f30332SMark de Wever 14296f30332SMark de Wever constexpr std::basic_string_view<CharT> fmt = SV("{:%%b='%b'%t%%h='%h'%t%%B='%B'%t%%m='%m'%t%%Om='%Om'%n}"); 14396f30332SMark de Wever constexpr std::basic_string_view<CharT> lfmt = SV("{:L%%b='%b'%t%%h='%h'%t%%B='%B'%t%%m='%m'%t%%Om='%Om'%n}"); 14496f30332SMark de Wever 14596f30332SMark de Wever const std::locale loc(LOCALE_ja_JP_UTF_8); 14696f30332SMark de Wever std::locale::global(std::locale(LOCALE_fr_FR_UTF_8)); 14796f30332SMark de Wever 14896f30332SMark de Wever // Non localized output using C-locale 14996f30332SMark de Wever check(SV("%b='Jan'\t%h='Jan'\t%B='January'\t%m='01'\t%Om='01'\n"), 15096f30332SMark de Wever fmt, 15196f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 15296f30332SMark de Wever 15396f30332SMark de Wever check(SV("%b='May'\t%h='May'\t%B='May'\t%m='05'\t%Om='05'\n"), 15496f30332SMark de Wever fmt, 15596f30332SMark de Wever file_seconds(2'000'000'000s)); // 03:33:20 UTC on Wednesday, 18 May 2033 15696f30332SMark de Wever 15796f30332SMark de Wever // Use the global locale (fr_FR) 15896f30332SMark de Wever #if defined(__APPLE__) 15996f30332SMark de Wever check(SV("%b='jan'\t%h='jan'\t%B='janvier'\t%m='01'\t%Om='01'\n"), 16096f30332SMark de Wever lfmt, 16196f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 16296f30332SMark de Wever #else 16396f30332SMark de Wever check(SV("%b='janv.'\t%h='janv.'\t%B='janvier'\t%m='01'\t%Om='01'\n"), 16496f30332SMark de Wever lfmt, 16596f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 16696f30332SMark de Wever #endif 16796f30332SMark de Wever 16896f30332SMark de Wever check(SV("%b='mai'\t%h='mai'\t%B='mai'\t%m='05'\t%Om='05'\n"), 16996f30332SMark de Wever lfmt, 17096f30332SMark de Wever file_seconds(2'000'000'000s)); // 03:33:20 UTC on Wednesday, 18 May 2033 17196f30332SMark de Wever 17296f30332SMark de Wever // Use supplied locale (ja_JP). This locale has a different alternate. 17396f30332SMark de Wever #ifdef _WIN32 17496f30332SMark de Wever check(loc, 17596f30332SMark de Wever SV("%b='1'\t%h='1'\t%B='1月'\t%m='01'\t%Om='01'\n"), 17696f30332SMark de Wever lfmt, 17796f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 17896f30332SMark de Wever 17996f30332SMark de Wever check(loc, 18096f30332SMark de Wever SV("%b='5'\t%h='5'\t%B='5月'\t%m='05'\t%Om='05'\n"), 18196f30332SMark de Wever lfmt, 18296f30332SMark de Wever file_seconds(2'000'000'000s)); // 03:33:20 UTC on Wednesday, 18 May 2033 18396f30332SMark de Wever #elif defined(_AIX) // _WIN32 18496f30332SMark de Wever check(loc, 18596f30332SMark de Wever SV("%b='1月'\t%h='1月'\t%B='1月'\t%m='01'\t%Om='01'\n"), 18696f30332SMark de Wever lfmt, 18796f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 18896f30332SMark de Wever 18996f30332SMark de Wever check(loc, 19096f30332SMark de Wever SV("%b='5月'\t%h='5月'\t%B='5月'\t%m='05'\t%Om='05'\n"), 19196f30332SMark de Wever lfmt, 19296f30332SMark de Wever file_seconds(2'000'000'000s)); // 03:33:20 UTC on Wednesday, 18 May 2033 19396f30332SMark de Wever #elif defined(__APPLE__) // _WIN32 19496f30332SMark de Wever check(loc, 19596f30332SMark de Wever SV("%b=' 1'\t%h=' 1'\t%B='1月'\t%m='01'\t%Om='01'\n"), 19696f30332SMark de Wever lfmt, 19796f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 19896f30332SMark de Wever 19996f30332SMark de Wever check(loc, 20096f30332SMark de Wever SV("%b=' 5'\t%h=' 5'\t%B='5月'\t%m='05'\t%Om='05'\n"), 20196f30332SMark de Wever lfmt, 20296f30332SMark de Wever file_seconds(2'000'000'000s)); // 03:33:20 UTC on Wednesday, 18 May 2033 2038f01029bSMark de Wever #elif defined(__FreeBSD__) // _WIN32 2048f01029bSMark de Wever check(loc, 2058f01029bSMark de Wever SV("%b=' 1月'\t%h=' 1月'\t%B='1月'\t%m='01'\t%Om='01'\n"), 2068f01029bSMark de Wever lfmt, 2078f01029bSMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 2088f01029bSMark de Wever 2098f01029bSMark de Wever check(loc, 2108f01029bSMark de Wever SV("%b=' 5月'\t%h=' 5月'\t%B='5月'\t%m='05'\t%Om='05'\n"), 2118f01029bSMark de Wever lfmt, 2128f01029bSMark de Wever file_seconds(2'000'000'000s)); // 03:33:20 UTC on Wednesday, 18 May 2033 21396f30332SMark de Wever #else // _WIN32 21496f30332SMark de Wever check(loc, 21596f30332SMark de Wever SV("%b=' 1月'\t%h=' 1月'\t%B='1月'\t%m='01'\t%Om='一'\n"), 21696f30332SMark de Wever lfmt, 21796f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 21896f30332SMark de Wever 21996f30332SMark de Wever check(loc, 22096f30332SMark de Wever SV("%b=' 5月'\t%h=' 5月'\t%B='5月'\t%m='05'\t%Om='五'\n"), 22196f30332SMark de Wever lfmt, 22296f30332SMark de Wever file_seconds(2'000'000'000s)); // 03:33:20 UTC on Wednesday, 18 May 2033 22396f30332SMark de Wever #endif // _WIN32 22496f30332SMark de Wever 22596f30332SMark de Wever std::locale::global(std::locale::classic()); 22696f30332SMark de Wever } 22796f30332SMark de Wever 22896f30332SMark de Wever template <class CharT> 22996f30332SMark de Wever static void test_valid_values_day() { 23096f30332SMark de Wever using namespace std::literals::chrono_literals; 23196f30332SMark de Wever 23296f30332SMark de Wever constexpr std::basic_string_view<CharT> fmt = SV("{:%%d='%d'%t%%Od='%Od'%t%%e='%e'%t%%Oe='%Oe'%n}"); 23396f30332SMark de Wever constexpr std::basic_string_view<CharT> lfmt = SV("{:L%%d='%d'%t%%Od='%Od'%t%%e='%e'%t%%Oe='%Oe'%n}"); 23496f30332SMark de Wever 23596f30332SMark de Wever const std::locale loc(LOCALE_ja_JP_UTF_8); 23696f30332SMark de Wever std::locale::global(std::locale(LOCALE_fr_FR_UTF_8)); 23796f30332SMark de Wever 23896f30332SMark de Wever // Non localized output using C-locale 23996f30332SMark de Wever check(SV("%d='01'\t%Od='01'\t%e=' 1'\t%Oe=' 1'\n"), fmt, 24096f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 24196f30332SMark de Wever 24296f30332SMark de Wever check(SV("%d='13'\t%Od='13'\t%e='13'\t%Oe='13'\n"), 24396f30332SMark de Wever fmt, 24496f30332SMark de Wever file_seconds(1'234'567'890s)); // 23:31:30 UTC on Friday, 13 February 2009 24596f30332SMark de Wever 24696f30332SMark de Wever // Use the global locale (fr_FR) 24796f30332SMark de Wever check(SV("%d='01'\t%Od='01'\t%e=' 1'\t%Oe=' 1'\n"), lfmt, 24896f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 24996f30332SMark de Wever 25096f30332SMark de Wever check(SV("%d='13'\t%Od='13'\t%e='13'\t%Oe='13'\n"), 25196f30332SMark de Wever lfmt, 25296f30332SMark de Wever file_seconds(1'234'567'890s)); // 23:31:30 UTC on Friday, 13 February 2009 25396f30332SMark de Wever 25496f30332SMark de Wever // Use supplied locale (ja_JP). This locale has a different alternate. 2558f01029bSMark de Wever #if defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__) 25696f30332SMark de Wever check(loc, 25796f30332SMark de Wever SV("%d='01'\t%Od='01'\t%e=' 1'\t%Oe=' 1'\n"), 25896f30332SMark de Wever lfmt, 25996f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 26096f30332SMark de Wever 26196f30332SMark de Wever check(loc, 26296f30332SMark de Wever SV("%d='13'\t%Od='13'\t%e='13'\t%Oe='13'\n"), 26396f30332SMark de Wever lfmt, 26496f30332SMark de Wever file_seconds(1'234'567'890s)); // 23:31:30 UTC on Friday, 13 February 2009 2658f01029bSMark de Wever #else // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__) 26696f30332SMark de Wever check(loc, 26796f30332SMark de Wever SV("%d='01'\t%Od='一'\t%e=' 1'\t%Oe='一'\n"), 26896f30332SMark de Wever lfmt, 26996f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 27096f30332SMark de Wever 27196f30332SMark de Wever check(loc, 27296f30332SMark de Wever SV("%d='13'\t%Od='十三'\t%e='13'\t%Oe='十三'\n"), 27396f30332SMark de Wever lfmt, 27496f30332SMark de Wever file_seconds(1'234'567'890s)); // 23:31:30 UTC on Friday, 13 February 2009 27596f30332SMark de Wever 2768f01029bSMark de Wever #endif // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__) 27796f30332SMark de Wever 27896f30332SMark de Wever std::locale::global(std::locale::classic()); 27996f30332SMark de Wever } 28096f30332SMark de Wever 28196f30332SMark de Wever template <class CharT> 28296f30332SMark de Wever static void test_valid_values_weekday() { 28396f30332SMark de Wever using namespace std::literals::chrono_literals; 28496f30332SMark de Wever 28596f30332SMark de Wever constexpr std::basic_string_view<CharT> fmt = 28696f30332SMark de Wever SV("{:%%a='%a'%t%%A='%A'%t%%u='%u'%t%%Ou='%Ou'%t%%w='%w'%t%%Ow='%Ow'%n}"); 28796f30332SMark de Wever constexpr std::basic_string_view<CharT> lfmt = 28896f30332SMark de Wever SV("{:L%%a='%a'%t%%A='%A'%t%%u='%u'%t%%Ou='%Ou'%t%%w='%w'%t%%Ow='%Ow'%n}"); 28996f30332SMark de Wever 29096f30332SMark de Wever const std::locale loc(LOCALE_ja_JP_UTF_8); 29196f30332SMark de Wever std::locale::global(std::locale(LOCALE_fr_FR_UTF_8)); 29296f30332SMark de Wever 29396f30332SMark de Wever // Non localized output using C-locale 29496f30332SMark de Wever check(SV("%a='Thu'\t%A='Thursday'\t%u='4'\t%Ou='4'\t%w='4'\t%Ow='4'\n"), 29596f30332SMark de Wever fmt, 29696f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 29796f30332SMark de Wever 29896f30332SMark de Wever check(SV("%a='Sun'\t%A='Sunday'\t%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\n"), 29996f30332SMark de Wever fmt, 30096f30332SMark de Wever file_seconds(4'294'967'295s)); // 06:28:15 UTC on Sunday, 7 February 2106 30196f30332SMark de Wever 30296f30332SMark de Wever // Use the global locale (fr_FR) 30396f30332SMark de Wever #if defined(__APPLE__) 30496f30332SMark de Wever check(SV("%a='Jeu'\t%A='Jeudi'\t%u='4'\t%Ou='4'\t%w='4'\t%Ow='4'\n"), 30596f30332SMark de Wever lfmt, 30696f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 30796f30332SMark de Wever 30896f30332SMark de Wever check(SV("%a='Dim'\t%A='Dimanche'\t%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\n"), 30996f30332SMark de Wever lfmt, 31096f30332SMark de Wever file_seconds(4'294'967'295s)); // 06:28:15 UTC on Sunday, 7 February 2106 31196f30332SMark de Wever #else 31296f30332SMark de Wever check(SV("%a='jeu.'\t%A='jeudi'\t%u='4'\t%Ou='4'\t%w='4'\t%Ow='4'\n"), 31396f30332SMark de Wever lfmt, 31496f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 31596f30332SMark de Wever 31696f30332SMark de Wever check(SV("%a='dim.'\t%A='dimanche'\t%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\n"), 31796f30332SMark de Wever lfmt, 31896f30332SMark de Wever file_seconds(4'294'967'295s)); // 06:28:15 UTC on Sunday, 7 February 2106 31996f30332SMark de Wever #endif 32096f30332SMark de Wever 32196f30332SMark de Wever // Use supplied locale (ja_JP). 32296f30332SMark de Wever // This locale has a different alternate, but not on all platforms 3238f01029bSMark de Wever #if defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__) 32496f30332SMark de Wever check(loc, 32596f30332SMark de Wever SV("%a='木'\t%A='木曜日'\t%u='4'\t%Ou='4'\t%w='4'\t%Ow='4'\n"), 32696f30332SMark de Wever lfmt, 32796f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 32896f30332SMark de Wever 32996f30332SMark de Wever check(loc, 33096f30332SMark de Wever SV("%a='日'\t%A='日曜日'\t%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\n"), 33196f30332SMark de Wever lfmt, 33296f30332SMark de Wever file_seconds(4'294'967'295s)); // 06:28:15 UTC on Sunday, 7 February 2106 3338f01029bSMark de Wever #else // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__) 33496f30332SMark de Wever check(loc, 33596f30332SMark de Wever SV("%a='木'\t%A='木曜日'\t%u='4'\t%Ou='四'\t%w='4'\t%Ow='四'\n"), 33696f30332SMark de Wever lfmt, 33796f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 33896f30332SMark de Wever 33996f30332SMark de Wever check(loc, 34096f30332SMark de Wever SV("%a='日'\t%A='日曜日'\t%u='7'\t%Ou='七'\t%w='0'\t%Ow='〇'\n"), 34196f30332SMark de Wever lfmt, 34296f30332SMark de Wever file_seconds(4'294'967'295s)); // 06:28:15 UTC on Sunday, 7 February 2106 3438f01029bSMark de Wever #endif // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__) 34496f30332SMark de Wever 34596f30332SMark de Wever std::locale::global(std::locale::classic()); 34696f30332SMark de Wever } 34796f30332SMark de Wever 34896f30332SMark de Wever template <class CharT> 34996f30332SMark de Wever static void test_valid_values_day_of_year() { 35096f30332SMark de Wever using namespace std::literals::chrono_literals; 35196f30332SMark de Wever 35296f30332SMark de Wever constexpr std::basic_string_view<CharT> fmt = SV("{:%%j='%j'%n}"); 35396f30332SMark de Wever constexpr std::basic_string_view<CharT> lfmt = SV("{:L%%j='%j'%n}"); 35496f30332SMark de Wever 35596f30332SMark de Wever const std::locale loc(LOCALE_ja_JP_UTF_8); 35696f30332SMark de Wever std::locale::global(std::locale(LOCALE_fr_FR_UTF_8)); 35796f30332SMark de Wever 35896f30332SMark de Wever // Non localized output using C-locale 35996f30332SMark de Wever check(SV("%j='001'\n"), fmt, file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 36096f30332SMark de Wever check(SV("%j='138'\n"), fmt, file_seconds(2'000'000'000s)); // 03:33:20 UTC on Wednesday, 18 May 2033 36196f30332SMark de Wever 36296f30332SMark de Wever // Use the global locale (fr_FR) 36396f30332SMark de Wever check(SV("%j='001'\n"), lfmt, file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 36496f30332SMark de Wever check(SV("%j='138'\n"), lfmt, file_seconds(2'000'000'000s)); // 03:33:20 UTC on Wednesday, 18 May 2033 36596f30332SMark de Wever 36696f30332SMark de Wever // Use supplied locale (ja_JP). This locale has a different alternate. 36796f30332SMark de Wever check(loc, SV("%j='001'\n"), lfmt, file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 36896f30332SMark de Wever 36996f30332SMark de Wever check(loc, SV("%j='138'\n"), lfmt, file_seconds(2'000'000'000s)); // 03:33:20 UTC on Wednesday, 18 May 2033 37096f30332SMark de Wever 37196f30332SMark de Wever std::locale::global(std::locale::classic()); 37296f30332SMark de Wever } 37396f30332SMark de Wever 37496f30332SMark de Wever template <class CharT> 37596f30332SMark de Wever static void test_valid_values_week() { 37696f30332SMark de Wever using namespace std::literals::chrono_literals; 37796f30332SMark de Wever 37896f30332SMark de Wever constexpr std::basic_string_view<CharT> fmt = SV("{:%%U='%U'%t%%OU='%OU'%t%%W='%W'%t%%OW='%OW'%n}"); 37996f30332SMark de Wever constexpr std::basic_string_view<CharT> lfmt = SV("{:L%%U='%U'%t%%OU='%OU'%t%%W='%W'%t%%OW='%OW'%n}"); 38096f30332SMark de Wever 38196f30332SMark de Wever const std::locale loc(LOCALE_ja_JP_UTF_8); 38296f30332SMark de Wever std::locale::global(std::locale(LOCALE_fr_FR_UTF_8)); 38396f30332SMark de Wever 38496f30332SMark de Wever // Non localized output using C-locale 38596f30332SMark de Wever check(SV("%U='00'\t%OU='00'\t%W='00'\t%OW='00'\n"), fmt, 38696f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 38796f30332SMark de Wever 38896f30332SMark de Wever check(SV("%U='20'\t%OU='20'\t%W='20'\t%OW='20'\n"), 38996f30332SMark de Wever fmt, 39096f30332SMark de Wever file_seconds(2'000'000'000s)); // 03:33:20 UTC on Wednesday, 18 May 2033 39196f30332SMark de Wever 39296f30332SMark de Wever // Use the global locale (fr_FR) 39396f30332SMark de Wever check(SV("%U='00'\t%OU='00'\t%W='00'\t%OW='00'\n"), lfmt, 39496f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 39596f30332SMark de Wever 39696f30332SMark de Wever check(SV("%U='20'\t%OU='20'\t%W='20'\t%OW='20'\n"), 39796f30332SMark de Wever lfmt, 39896f30332SMark de Wever file_seconds(2'000'000'000s)); // 03:33:20 UTC on Wednesday, 18 May 2033 39996f30332SMark de Wever 40096f30332SMark de Wever // Use supplied locale (ja_JP). This locale has a different alternate. 4018f01029bSMark de Wever #if defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__) 40296f30332SMark de Wever check(loc, 40396f30332SMark de Wever SV("%U='00'\t%OU='00'\t%W='00'\t%OW='00'\n"), 40496f30332SMark de Wever lfmt, 40596f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 40696f30332SMark de Wever 40796f30332SMark de Wever check(loc, 40896f30332SMark de Wever SV("%U='20'\t%OU='20'\t%W='20'\t%OW='20'\n"), 40996f30332SMark de Wever lfmt, 41096f30332SMark de Wever file_seconds(2'000'000'000s)); // 03:33:20 UTC on Wednesday, 18 May 2033 4118f01029bSMark de Wever #else // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__) 41296f30332SMark de Wever check(loc, 41396f30332SMark de Wever SV("%U='00'\t%OU='〇'\t%W='00'\t%OW='〇'\n"), 41496f30332SMark de Wever lfmt, 41596f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 41696f30332SMark de Wever 41796f30332SMark de Wever check(loc, 41896f30332SMark de Wever SV("%U='20'\t%OU='二十'\t%W='20'\t%OW='二十'\n"), 41996f30332SMark de Wever lfmt, 42096f30332SMark de Wever file_seconds(2'000'000'000s)); // 03:33:20 UTC on Wednesday, 18 May 2033 4218f01029bSMark de Wever #endif // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__) 42296f30332SMark de Wever std::locale::global(std::locale::classic()); 42396f30332SMark de Wever } 42496f30332SMark de Wever 42596f30332SMark de Wever template <class CharT> 42696f30332SMark de Wever static void test_valid_values_iso_8601_week() { 42796f30332SMark de Wever using namespace std::literals::chrono_literals; 42896f30332SMark de Wever 42996f30332SMark de Wever constexpr std::basic_string_view<CharT> fmt = SV("{:%%g='%g'%t%%G='%G'%t%%V='%V'%t%%OV='%OV'%n}"); 43096f30332SMark de Wever constexpr std::basic_string_view<CharT> lfmt = SV("{:L%%g='%g'%t%%G='%G'%t%%V='%V'%t%%OV='%OV'%n}"); 43196f30332SMark de Wever 43296f30332SMark de Wever const std::locale loc(LOCALE_ja_JP_UTF_8); 43396f30332SMark de Wever std::locale::global(std::locale(LOCALE_fr_FR_UTF_8)); 43496f30332SMark de Wever 43596f30332SMark de Wever // Non localized output using C-locale 43696f30332SMark de Wever check(SV("%g='70'\t%G='1970'\t%V='01'\t%OV='01'\n"), fmt, 43796f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 43896f30332SMark de Wever 43996f30332SMark de Wever check(SV("%g='09'\t%G='2009'\t%V='07'\t%OV='07'\n"), 44096f30332SMark de Wever fmt, 44196f30332SMark de Wever file_seconds(1'234'567'890s)); // 23:31:30 UTC on Friday, 13 February 2009 44296f30332SMark de Wever 44396f30332SMark de Wever // Use the global locale (fr_FR) 44496f30332SMark de Wever check(SV("%g='70'\t%G='1970'\t%V='01'\t%OV='01'\n"), lfmt, 44596f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 44696f30332SMark de Wever 44796f30332SMark de Wever check(SV("%g='09'\t%G='2009'\t%V='07'\t%OV='07'\n"), 44896f30332SMark de Wever lfmt, 44996f30332SMark de Wever file_seconds(1'234'567'890s)); // 23:31:30 UTC on Friday, 13 February 2009 45096f30332SMark de Wever 45196f30332SMark de Wever // Use supplied locale (ja_JP). This locale has a different alternate. 4528f01029bSMark de Wever #if defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__) 45396f30332SMark de Wever check(loc, 45496f30332SMark de Wever SV("%g='70'\t%G='1970'\t%V='01'\t%OV='01'\n"), 45596f30332SMark de Wever lfmt, 45696f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 45796f30332SMark de Wever 45896f30332SMark de Wever check(loc, 45996f30332SMark de Wever SV("%g='09'\t%G='2009'\t%V='07'\t%OV='07'\n"), 46096f30332SMark de Wever lfmt, 46196f30332SMark de Wever file_seconds(1'234'567'890s)); // 23:31:30 UTC on Friday, 13 February 2009 4628f01029bSMark de Wever #else // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__) 46396f30332SMark de Wever check(loc, 46496f30332SMark de Wever SV("%g='70'\t%G='1970'\t%V='01'\t%OV='一'\n"), 46596f30332SMark de Wever lfmt, 46696f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 46796f30332SMark de Wever 46896f30332SMark de Wever check(loc, 46996f30332SMark de Wever SV("%g='09'\t%G='2009'\t%V='07'\t%OV='七'\n"), 47096f30332SMark de Wever lfmt, 47196f30332SMark de Wever file_seconds(1'234'567'890s)); // 23:31:30 UTC on Friday, 13 February 2009 4728f01029bSMark de Wever #endif // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__) 47396f30332SMark de Wever 47496f30332SMark de Wever std::locale::global(std::locale::classic()); 47596f30332SMark de Wever } 47696f30332SMark de Wever 47796f30332SMark de Wever template <class CharT> 47896f30332SMark de Wever static void test_valid_values_date() { 47996f30332SMark de Wever using namespace std::literals::chrono_literals; 48096f30332SMark de Wever 48196f30332SMark de Wever constexpr std::basic_string_view<CharT> fmt = SV("{:%%D='%D'%t%%F='%F'%t%%x='%x'%t%%Ex='%Ex'%n}"); 48296f30332SMark de Wever constexpr std::basic_string_view<CharT> lfmt = SV("{:L%%D='%D'%t%%F='%F'%t%%x='%x'%t%%Ex='%Ex'%n}"); 48396f30332SMark de Wever 48496f30332SMark de Wever const std::locale loc(LOCALE_ja_JP_UTF_8); 48596f30332SMark de Wever std::locale::global(std::locale(LOCALE_fr_FR_UTF_8)); 48696f30332SMark de Wever 48796f30332SMark de Wever // Non localized output using C-locale 48896f30332SMark de Wever check(SV("%D='01/01/70'\t%F='1970-01-01'\t%x='01/01/70'\t%Ex='01/01/70'\n"), 48996f30332SMark de Wever fmt, 49096f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 49196f30332SMark de Wever 49296f30332SMark de Wever check(SV("%D='02/13/09'\t%F='2009-02-13'\t%x='02/13/09'\t%Ex='02/13/09'\n"), 49396f30332SMark de Wever fmt, 49496f30332SMark de Wever file_seconds(1'234'567'890s)); // 23:31:30 UTC on Friday, 13 February 2009 49596f30332SMark de Wever 49696f30332SMark de Wever // Use the global locale (fr_FR) 4978f01029bSMark de Wever #if defined(__APPLE__) || defined(__FreeBSD__) 49896f30332SMark de Wever check(SV("%D='01/01/70'\t%F='1970-01-01'\t%x='01.01.1970'\t%Ex='01.01.1970'\n"), 49996f30332SMark de Wever lfmt, 50096f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 50196f30332SMark de Wever 50296f30332SMark de Wever check(SV("%D='02/13/09'\t%F='2009-02-13'\t%x='13.02.2009'\t%Ex='13.02.2009'\n"), 50396f30332SMark de Wever lfmt, 50496f30332SMark de Wever file_seconds(1'234'567'890s)); // 23:31:30 UTC on Friday, 13 February 2009 50596f30332SMark de Wever #else 50696f30332SMark de Wever check(SV("%D='01/01/70'\t%F='1970-01-01'\t%x='01/01/1970'\t%Ex='01/01/1970'\n"), 50796f30332SMark de Wever lfmt, 50896f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 50996f30332SMark de Wever 51096f30332SMark de Wever check(SV("%D='02/13/09'\t%F='2009-02-13'\t%x='13/02/2009'\t%Ex='13/02/2009'\n"), 51196f30332SMark de Wever lfmt, 51296f30332SMark de Wever file_seconds(1'234'567'890s)); // 23:31:30 UTC on Friday, 13 February 2009 51396f30332SMark de Wever #endif 51496f30332SMark de Wever 51596f30332SMark de Wever // Use supplied locale (ja_JP). This locale has a different alternate. 5168f01029bSMark de Wever #if defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__) 51796f30332SMark de Wever check(loc, 51896f30332SMark de Wever SV("%D='01/01/70'\t%F='1970-01-01'\t%x='1970/01/01'\t%Ex='1970/01/01'\n"), 51996f30332SMark de Wever lfmt, 52096f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 52196f30332SMark de Wever 52296f30332SMark de Wever check(loc, 52396f30332SMark de Wever SV("%D='02/13/09'\t%F='2009-02-13'\t%x='2009/02/13'\t%Ex='2009/02/13'\n"), 52496f30332SMark de Wever lfmt, 52596f30332SMark de Wever file_seconds(1'234'567'890s)); // 23:31:30 UTC on Friday, 13 February 2009 5268f01029bSMark de Wever #else // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__) 52796f30332SMark de Wever check(loc, 52896f30332SMark de Wever SV("%D='01/01/70'\t%F='1970-01-01'\t%x='1970年01月01日'\t%Ex='昭和45年01月01日'\n"), 52996f30332SMark de Wever lfmt, 53096f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 53196f30332SMark de Wever 53296f30332SMark de Wever check(loc, 53396f30332SMark de Wever SV("%D='02/13/09'\t%F='2009-02-13'\t%x='2009年02月13日'\t%Ex='平成21年02月13日'\n"), 53496f30332SMark de Wever lfmt, 53596f30332SMark de Wever file_seconds(1'234'567'890s)); // 23:31:30 UTC on Friday, 13 February 2009 5368f01029bSMark de Wever #endif // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__) 53796f30332SMark de Wever 53896f30332SMark de Wever std::locale::global(std::locale::classic()); 53996f30332SMark de Wever } 54096f30332SMark de Wever 54196f30332SMark de Wever template <class CharT> 54296f30332SMark de Wever static void test_valid_values_time() { 54396f30332SMark de Wever using namespace std::literals::chrono_literals; 54496f30332SMark de Wever 54596f30332SMark de Wever constexpr std::basic_string_view<CharT> fmt = SV( 54696f30332SMark de Wever "{:" 54796f30332SMark de Wever "%%H='%H'%t" 54896f30332SMark de Wever "%%OH='%OH'%t" 54996f30332SMark de Wever "%%I='%I'%t" 55096f30332SMark de Wever "%%OI='%OI'%t" 55196f30332SMark de Wever "%%M='%M'%t" 55296f30332SMark de Wever "%%OM='%OM'%t" 55396f30332SMark de Wever "%%S='%S'%t" 55496f30332SMark de Wever "%%OS='%OS'%t" 55596f30332SMark de Wever "%%p='%p'%t" 55696f30332SMark de Wever "%%R='%R'%t" 55796f30332SMark de Wever "%%T='%T'%t" 55896f30332SMark de Wever "%%r='%r'%t" 55996f30332SMark de Wever "%%X='%X'%t" 56096f30332SMark de Wever "%%EX='%EX'%t" 56196f30332SMark de Wever "%n}"); 56296f30332SMark de Wever constexpr std::basic_string_view<CharT> lfmt = SV( 56396f30332SMark de Wever "{:L" 56496f30332SMark de Wever "%%H='%H'%t" 56596f30332SMark de Wever "%%OH='%OH'%t" 56696f30332SMark de Wever "%%I='%I'%t" 56796f30332SMark de Wever "%%OI='%OI'%t" 56896f30332SMark de Wever "%%M='%M'%t" 56996f30332SMark de Wever "%%OM='%OM'%t" 57096f30332SMark de Wever "%%S='%S'%t" 57196f30332SMark de Wever "%%OS='%OS'%t" 57296f30332SMark de Wever "%%p='%p'%t" 57396f30332SMark de Wever "%%R='%R'%t" 57496f30332SMark de Wever "%%T='%T'%t" 57596f30332SMark de Wever "%%r='%r'%t" 57696f30332SMark de Wever "%%X='%X'%t" 57796f30332SMark de Wever "%%EX='%EX'%t" 57896f30332SMark de Wever "%n}"); 57996f30332SMark de Wever 58096f30332SMark de Wever const std::locale loc(LOCALE_ja_JP_UTF_8); 58196f30332SMark de Wever std::locale::global(std::locale(LOCALE_fr_FR_UTF_8)); 58296f30332SMark de Wever 58396f30332SMark de Wever // Non localized output using C-locale 58496f30332SMark de Wever check(SV("%H='00'\t" 58596f30332SMark de Wever "%OH='00'\t" 58696f30332SMark de Wever "%I='12'\t" 58796f30332SMark de Wever "%OI='12'\t" 58896f30332SMark de Wever "%M='00'\t" 58996f30332SMark de Wever "%OM='00'\t" 59096f30332SMark de Wever "%S='00'\t" 59196f30332SMark de Wever "%OS='00'\t" 59296f30332SMark de Wever "%p='AM'\t" 59396f30332SMark de Wever "%R='00:00'\t" 59496f30332SMark de Wever "%T='00:00:00'\t" 59596f30332SMark de Wever "%r='12:00:00 AM'\t" 59696f30332SMark de Wever "%X='00:00:00'\t" 59796f30332SMark de Wever "%EX='00:00:00'\t" 59896f30332SMark de Wever "\n"), 59996f30332SMark de Wever fmt, 60096f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 60196f30332SMark de Wever 60296f30332SMark de Wever check(SV("%H='23'\t" 60396f30332SMark de Wever "%OH='23'\t" 60496f30332SMark de Wever "%I='11'\t" 60596f30332SMark de Wever "%OI='11'\t" 60696f30332SMark de Wever "%M='31'\t" 60796f30332SMark de Wever "%OM='31'\t" 60896f30332SMark de Wever "%S='30.123'\t" 60996f30332SMark de Wever "%OS='30.123'\t" 61096f30332SMark de Wever "%p='PM'\t" 61196f30332SMark de Wever "%R='23:31'\t" 61296f30332SMark de Wever "%T='23:31:30.123'\t" 61396f30332SMark de Wever "%r='11:31:30 PM'\t" 61496f30332SMark de Wever "%X='23:31:30'\t" 61596f30332SMark de Wever "%EX='23:31:30'\t" 61696f30332SMark de Wever "\n"), 61796f30332SMark de Wever fmt, 61896f30332SMark de Wever std::chrono::sys_time<std::chrono::milliseconds>( 61996f30332SMark de Wever 1'234'567'890'123ms)); // 23:31:30 UTC on Friday, 13 February 2009 62096f30332SMark de Wever // Use the global locale (fr_FR) 62196f30332SMark de Wever check(SV("%H='00'\t" 62296f30332SMark de Wever "%OH='00'\t" 62396f30332SMark de Wever "%I='12'\t" 62496f30332SMark de Wever "%OI='12'\t" 62596f30332SMark de Wever "%M='00'\t" 62696f30332SMark de Wever "%OM='00'\t" 62796f30332SMark de Wever "%S='00'\t" 62896f30332SMark de Wever "%OS='00'\t" 62996f30332SMark de Wever #if defined(_AIX) 63096f30332SMark de Wever "%p='AM'\t" 63196f30332SMark de Wever #else 63296f30332SMark de Wever "%p=''\t" 63396f30332SMark de Wever #endif 63496f30332SMark de Wever "%R='00:00'\t" 63596f30332SMark de Wever "%T='00:00:00'\t" 63696f30332SMark de Wever #ifdef _WIN32 63796f30332SMark de Wever "%r='00:00:00'\t" 63896f30332SMark de Wever #elif defined(_AIX) 63996f30332SMark de Wever "%r='12:00:00 AM'\t" 6408f01029bSMark de Wever #elif defined(__APPLE__) || defined(__FreeBSD__) 64196f30332SMark de Wever "%r=''\t" 64296f30332SMark de Wever #else 64396f30332SMark de Wever "%r='12:00:00 '\t" 64496f30332SMark de Wever #endif 64596f30332SMark de Wever "%X='00:00:00'\t" 64696f30332SMark de Wever "%EX='00:00:00'\t" 64796f30332SMark de Wever "\n"), 64896f30332SMark de Wever lfmt, 64996f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 65096f30332SMark de Wever 65196f30332SMark de Wever check(SV("%H='23'\t" 65296f30332SMark de Wever "%OH='23'\t" 65396f30332SMark de Wever "%I='11'\t" 65496f30332SMark de Wever "%OI='11'\t" 65596f30332SMark de Wever "%M='31'\t" 65696f30332SMark de Wever "%OM='31'\t" 65796f30332SMark de Wever "%S='30,123'\t" 65896f30332SMark de Wever "%OS='30,123'\t" 65996f30332SMark de Wever #if defined(_AIX) 66096f30332SMark de Wever "%p='PM'\t" 66196f30332SMark de Wever #else 66296f30332SMark de Wever "%p=''\t" 66396f30332SMark de Wever #endif 66496f30332SMark de Wever "%R='23:31'\t" 66596f30332SMark de Wever "%T='23:31:30,123'\t" 66696f30332SMark de Wever #ifdef _WIN32 66796f30332SMark de Wever "%r='23:31:30'\t" 66896f30332SMark de Wever #elif defined(_AIX) 66996f30332SMark de Wever "%r='11:31:30 PM'\t" 6708f01029bSMark de Wever #elif defined(__APPLE__) || defined(__FreeBSD__) 67196f30332SMark de Wever "%r=''\t" 6721403080aSMark de Wever #elif defined(_WIN32) 6731403080aSMark de Wever "%r='23:31:30 '\t" 67496f30332SMark de Wever #else 67596f30332SMark de Wever "%r='11:31:30 '\t" 67696f30332SMark de Wever #endif 67796f30332SMark de Wever "%X='23:31:30'\t" 67896f30332SMark de Wever "%EX='23:31:30'\t" 67996f30332SMark de Wever "\n"), 68096f30332SMark de Wever lfmt, 68196f30332SMark de Wever std::chrono::sys_time<std::chrono::milliseconds>( 68296f30332SMark de Wever 1'234'567'890'123ms)); // 23:31:30 UTC on Friday, 13 February 2009 68396f30332SMark de Wever 68496f30332SMark de Wever // Use supplied locale (ja_JP). This locale has a different alternate.a 6858f01029bSMark de Wever #if defined(__APPLE__) || defined(_AIX) || defined(_WIN32) || defined(__FreeBSD__) 68696f30332SMark de Wever check(loc, 68796f30332SMark de Wever SV("%H='00'\t" 68896f30332SMark de Wever "%OH='00'\t" 68996f30332SMark de Wever "%I='12'\t" 69096f30332SMark de Wever "%OI='12'\t" 69196f30332SMark de Wever "%M='00'\t" 69296f30332SMark de Wever "%OM='00'\t" 69396f30332SMark de Wever "%S='00'\t" 69496f30332SMark de Wever "%OS='00'\t" 69596f30332SMark de Wever # if defined(__APPLE__) 69696f30332SMark de Wever "%p='AM'\t" 69796f30332SMark de Wever # else 69896f30332SMark de Wever "%p='午前'\t" 69996f30332SMark de Wever # endif 70096f30332SMark de Wever "%R='00:00'\t" 70196f30332SMark de Wever "%T='00:00:00'\t" 7028f01029bSMark de Wever # if defined(__APPLE__) || defined(__FreeBSD__) 70396f30332SMark de Wever # if defined(__APPLE__) 70496f30332SMark de Wever "%r='12:00:00 AM'\t" 7058f01029bSMark de Wever # else 7068f01029bSMark de Wever "%r='12:00:00 午前'\t" 7078f01029bSMark de Wever # endif 70896f30332SMark de Wever "%X='00時00分00秒'\t" 70996f30332SMark de Wever "%EX='00時00分00秒'\t" 7101403080aSMark de Wever # elif defined(_WIN32) 7111403080aSMark de Wever "%r='0:00:00'\t" 7121403080aSMark de Wever "%X='0:00:00'\t" 7131403080aSMark de Wever "%EX='0:00:00'\t" 71496f30332SMark de Wever # else 71596f30332SMark de Wever "%r='午前12:00:00'\t" 71696f30332SMark de Wever "%X='00:00:00'\t" 71796f30332SMark de Wever "%EX='00:00:00'\t" 71896f30332SMark de Wever # endif 71996f30332SMark de Wever "\n"), 72096f30332SMark de Wever lfmt, 72196f30332SMark de Wever std::chrono::hh_mm_ss(0s)); 72296f30332SMark de Wever 72396f30332SMark de Wever check(loc, 72496f30332SMark de Wever SV("%H='23'\t" 72596f30332SMark de Wever "%OH='23'\t" 72696f30332SMark de Wever "%I='11'\t" 72796f30332SMark de Wever "%OI='11'\t" 72896f30332SMark de Wever "%M='31'\t" 72996f30332SMark de Wever "%OM='31'\t" 73096f30332SMark de Wever "%S='30.123'\t" 73196f30332SMark de Wever "%OS='30.123'\t" 73296f30332SMark de Wever # if defined(__APPLE__) 73396f30332SMark de Wever "%p='PM'\t" 73496f30332SMark de Wever # else 73596f30332SMark de Wever "%p='午後'\t" 73696f30332SMark de Wever # endif 73796f30332SMark de Wever "%R='23:31'\t" 73896f30332SMark de Wever "%T='23:31:30.123'\t" 7398f01029bSMark de Wever # if defined(__APPLE__) || defined(__FreeBSD__) 74096f30332SMark de Wever # if defined(__APPLE__) 74196f30332SMark de Wever "%r='11:31:30 PM'\t" 7428f01029bSMark de Wever # else 7438f01029bSMark de Wever "%r='11:31:30 午後'\t" 7448f01029bSMark de Wever # endif 74596f30332SMark de Wever "%X='23時31分30秒'\t" 74696f30332SMark de Wever "%EX='23時31分30秒'\t" 7471403080aSMark de Wever # elif defined(_WIN32) 7481403080aSMark de Wever "%r='23:31:30'\t" 7491403080aSMark de Wever "%X='23:31:30'\t" 7501403080aSMark de Wever "%EX='23:31:30'\t" 75196f30332SMark de Wever # else 75296f30332SMark de Wever "%r='午後11:31:30'\t" 75396f30332SMark de Wever "%X='23:31:30'\t" 75496f30332SMark de Wever "%EX='23:31:30'\t" 75596f30332SMark de Wever # endif 75696f30332SMark de Wever "\n"), 75796f30332SMark de Wever lfmt, 75896f30332SMark de Wever std::chrono::hh_mm_ss(23h + 31min + 30s + 123ms)); 7598f01029bSMark de Wever #else // defined(__APPLE__) || defined(_AIX) || defined(_WIN32) || defined(__FreeBSD__) 76096f30332SMark de Wever check(loc, 76196f30332SMark de Wever SV("%H='00'\t" 76296f30332SMark de Wever "%OH='〇'\t" 76396f30332SMark de Wever "%I='12'\t" 76496f30332SMark de Wever "%OI='十二'\t" 76596f30332SMark de Wever "%M='00'\t" 76696f30332SMark de Wever "%OM='〇'\t" 76796f30332SMark de Wever "%S='00'\t" 76896f30332SMark de Wever "%OS='〇'\t" 76996f30332SMark de Wever "%p='午前'\t" 77096f30332SMark de Wever "%R='00:00'\t" 77196f30332SMark de Wever "%T='00:00:00'\t" 77296f30332SMark de Wever "%r='午前12時00分00秒'\t" 77396f30332SMark de Wever "%X='00時00分00秒'\t" 77496f30332SMark de Wever "%EX='00時00分00秒'\t" 77596f30332SMark de Wever "\n"), 77696f30332SMark de Wever lfmt, 77796f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 77896f30332SMark de Wever 77996f30332SMark de Wever check(loc, 78096f30332SMark de Wever SV("%H='23'\t" 78196f30332SMark de Wever "%OH='二十三'\t" 78296f30332SMark de Wever "%I='11'\t" 78396f30332SMark de Wever "%OI='十一'\t" 78496f30332SMark de Wever "%M='31'\t" 78596f30332SMark de Wever "%OM='三十一'\t" 78696f30332SMark de Wever "%S='30.123'\t" 78796f30332SMark de Wever "%OS='三十.123'\t" 78896f30332SMark de Wever "%p='午後'\t" 78996f30332SMark de Wever "%R='23:31'\t" 79096f30332SMark de Wever "%T='23:31:30.123'\t" 79196f30332SMark de Wever "%r='午後11時31分30秒'\t" 79296f30332SMark de Wever "%X='23時31分30秒'\t" 79396f30332SMark de Wever "%EX='23時31分30秒'\t" 79496f30332SMark de Wever "\n"), 79596f30332SMark de Wever lfmt, 79696f30332SMark de Wever std::chrono::sys_time<std::chrono::milliseconds>( 79796f30332SMark de Wever 1'234'567'890'123ms)); // 23:31:30 UTC on Friday, 13 February 2009 7988f01029bSMark de Wever #endif // defined(__APPLE__) || defined(_AIX) || defined(_WIN32) || defined(__FreeBSD__) 79996f30332SMark de Wever 80096f30332SMark de Wever std::locale::global(std::locale::classic()); 80196f30332SMark de Wever } 80296f30332SMark de Wever 80396f30332SMark de Wever template <class CharT> 80496f30332SMark de Wever static void test_valid_values_date_time() { 80596f30332SMark de Wever using namespace std::literals::chrono_literals; 80696f30332SMark de Wever 80796f30332SMark de Wever constexpr std::basic_string_view<CharT> fmt = SV("{:%%c='%c'%t%%Ec='%Ec'%n}"); 80896f30332SMark de Wever constexpr std::basic_string_view<CharT> lfmt = SV("{:L%%c='%c'%t%%Ec='%Ec'%n}"); 80996f30332SMark de Wever 81096f30332SMark de Wever const std::locale loc(LOCALE_ja_JP_UTF_8); 81196f30332SMark de Wever std::locale::global(std::locale(LOCALE_fr_FR_UTF_8)); 81296f30332SMark de Wever 81396f30332SMark de Wever // Non localized output using C-locale 81496f30332SMark de Wever check(SV("%c='Thu Jan 1 00:00:00 1970'\t%Ec='Thu Jan 1 00:00:00 1970'\n"), 81596f30332SMark de Wever fmt, 81696f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 81796f30332SMark de Wever 81896f30332SMark de Wever check(SV("%c='Fri Feb 13 23:31:30 2009'\t%Ec='Fri Feb 13 23:31:30 2009'\n"), 81996f30332SMark de Wever fmt, 82096f30332SMark de Wever file_seconds(1'234'567'890s)); // 23:31:30 UTC on Friday, 13 February 2009 82196f30332SMark de Wever 82296f30332SMark de Wever // Use the global locale (fr_FR) 82396f30332SMark de Wever check( 82496f30332SMark de Wever // https://sourceware.org/bugzilla/show_bug.cgi?id=24054 825e4d4cfa5SLei Huang #if defined(__powerpc__) && defined(__linux__) 826e4d4cfa5SLei Huang SV("%c='jeu. 01 janv. 1970 00:00:00 UTC'\t%Ec='jeu. 01 janv. 1970 00:00:00 UTC'\n"), 827e4d4cfa5SLei Huang #elif defined(__GLIBC__) && __GLIBC__ <= 2 && __GLIBC_MINOR__ < 29 82896f30332SMark de Wever SV("%c='jeu. 01 janv. 1970 00:00:00 GMT'\t%Ec='jeu. 01 janv. 1970 00:00:00 GMT'\n"), 82996f30332SMark de Wever #elif defined(_AIX) 83096f30332SMark de Wever SV("%c=' 1 janvier 1970 à 00:00:00 UTC'\t%Ec=' 1 janvier 1970 à 00:00:00 UTC'\n"), 83196f30332SMark de Wever #elif defined(__APPLE__) 83296f30332SMark de Wever SV("%c='Jeu 1 jan 00:00:00 1970'\t%Ec='Jeu 1 jan 00:00:00 1970'\n"), 8331403080aSMark de Wever #elif defined(_WIN32) 8341403080aSMark de Wever SV("%c='01/01/1970 00:00:00'\t%Ec='01/01/1970 00:00:00'\n"), 8358f01029bSMark de Wever #elif defined(__FreeBSD__) 8368f01029bSMark de Wever SV("%c='jeu. 1 janv. 00:00:00 1970'\t%Ec='jeu. 1 janv. 00:00:00 1970'\n"), 83796f30332SMark de Wever #else 83896f30332SMark de Wever SV("%c='jeu. 01 janv. 1970 00:00:00'\t%Ec='jeu. 01 janv. 1970 00:00:00'\n"), 83996f30332SMark de Wever #endif 84096f30332SMark de Wever lfmt, 84196f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 84296f30332SMark de Wever 84396f30332SMark de Wever check( 84496f30332SMark de Wever // https://sourceware.org/bugzilla/show_bug.cgi?id=24054 845e4d4cfa5SLei Huang #if defined(__powerpc__) && defined(__linux__) 846e4d4cfa5SLei Huang SV("%c='ven. 13 févr. 2009 23:31:30 UTC'\t%Ec='ven. 13 févr. 2009 23:31:30 UTC'\n"), 847e4d4cfa5SLei Huang #elif defined(__GLIBC__) && __GLIBC__ <= 2 && __GLIBC_MINOR__ < 29 84896f30332SMark de Wever SV("%c='ven. 13 févr. 2009 23:31:30 GMT'\t%Ec='ven. 13 févr. 2009 23:31:30 GMT'\n"), 84996f30332SMark de Wever #elif defined(_AIX) 85096f30332SMark de Wever SV("%c='13 février 2009 à 23:31:30 UTC'\t%Ec='13 février 2009 à 23:31:30 UTC'\n"), 85196f30332SMark de Wever #elif defined(__APPLE__) 85296f30332SMark de Wever SV("%c='Ven 13 fév 23:31:30 2009'\t%Ec='Ven 13 fév 23:31:30 2009'\n"), 8531403080aSMark de Wever #elif defined(_WIN32) 8541403080aSMark de Wever SV("%c='13/02/2009 23:31:30'\t%Ec='13/02/2009 23:31:30'\n"), 8558f01029bSMark de Wever #elif defined(__FreeBSD__) 8568f01029bSMark de Wever SV("%c='ven. 13 févr. 23:31:30 2009'\t%Ec='ven. 13 févr. 23:31:30 2009'\n"), 85796f30332SMark de Wever #else 85896f30332SMark de Wever SV("%c='ven. 13 févr. 2009 23:31:30'\t%Ec='ven. 13 févr. 2009 23:31:30'\n"), 85996f30332SMark de Wever #endif 86096f30332SMark de Wever lfmt, 86196f30332SMark de Wever file_seconds(1'234'567'890s)); // 23:31:30 UTC on Friday, 13 February 2009 86296f30332SMark de Wever 86396f30332SMark de Wever // Use supplied locale (ja_JP). This locale has a different alternate.a 8648f01029bSMark de Wever #if defined(__APPLE__) || defined(__FreeBSD__) 86596f30332SMark de Wever check(loc, 86696f30332SMark de Wever SV("%c='木 1/ 1 00:00:00 1970'\t%Ec='木 1/ 1 00:00:00 1970'\n"), 86796f30332SMark de Wever lfmt, 86896f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 86996f30332SMark de Wever check(loc, 87096f30332SMark de Wever SV("%c='金 2/13 23:31:30 2009'\t%Ec='金 2/13 23:31:30 2009'\n"), 87196f30332SMark de Wever lfmt, 87296f30332SMark de Wever file_seconds(1'234'567'890s)); // 23:31:30 UTC on Friday, 13 February 2009 8738f01029bSMark de Wever #elif defined(_AIX) // defined(__APPLE__)|| defined(__FreeBSD__) 87496f30332SMark de Wever check(loc, 87596f30332SMark de Wever SV("%c='1970年01月 1日 00:00:00 UTC'\t%Ec='1970年01月 1日 00:00:00 UTC'\n"), 87696f30332SMark de Wever lfmt, 87796f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 87896f30332SMark de Wever check(loc, 87996f30332SMark de Wever SV("%c='2009年02月13日 23:31:30 UTC'\t%Ec='2009年02月13日 23:31:30 UTC'\n"), 88096f30332SMark de Wever lfmt, 88196f30332SMark de Wever file_seconds(1'234'567'890s)); // 23:31:30 UTC on Friday, 13 February 2009 8828f01029bSMark de Wever #elif defined(_WIN32) // defined(__APPLE__)|| defined(__FreeBSD__) 8831403080aSMark de Wever check(loc, 8841403080aSMark de Wever SV("%c='1970/01/01 0:00:00'\t%Ec='1970/01/01 0:00:00'\n"), 8851403080aSMark de Wever lfmt, 8861403080aSMark de Wever std::chrono::sys_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 8871403080aSMark de Wever check(loc, 8881403080aSMark de Wever SV("%c='2009/02/13 23:31:30'\t%Ec='2009/02/13 23:31:30'\n"), 8891403080aSMark de Wever lfmt, 8901403080aSMark de Wever std::chrono::sys_seconds(1'234'567'890s)); // 23:31:30 UTC on Friday, 13 February 2009 8918f01029bSMark de Wever #else // defined(__APPLE__)|| defined(__FreeBSD__) 89296f30332SMark de Wever check(loc, 89396f30332SMark de Wever SV("%c='1970年01月01日 00時00分00秒'\t%Ec='昭和45年01月01日 00時00分00秒'\n"), 89496f30332SMark de Wever lfmt, 89596f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 89696f30332SMark de Wever 89796f30332SMark de Wever check(loc, 89896f30332SMark de Wever SV("%c='2009年02月13日 23時31分30秒'\t%Ec='平成21年02月13日 23時31分30秒'\n"), 89996f30332SMark de Wever lfmt, 90096f30332SMark de Wever file_seconds(1'234'567'890s)); // 23:31:30 UTC on Friday, 13 February 2009 9018f01029bSMark de Wever #endif // defined(__APPLE__)|| defined(__FreeBSD__) 90296f30332SMark de Wever 90396f30332SMark de Wever std::locale::global(std::locale::classic()); 90496f30332SMark de Wever } 90596f30332SMark de Wever 90696f30332SMark de Wever template <class CharT> 90796f30332SMark de Wever static void test_valid_values_time_zone() { 90896f30332SMark de Wever using namespace std::literals::chrono_literals; 90996f30332SMark de Wever 91096f30332SMark de Wever constexpr std::basic_string_view<CharT> fmt = SV("{:%%z='%z'%t%%Ez='%Ez'%t%%Oz='%Oz'%t%%Z='%Z'%n}"); 91196f30332SMark de Wever constexpr std::basic_string_view<CharT> lfmt = SV("{:L%%z='%z'%t%%Ez='%Ez'%t%%Oz='%Oz'%t%%Z='%Z'%n}"); 91296f30332SMark de Wever 91396f30332SMark de Wever const std::locale loc(LOCALE_ja_JP_UTF_8); 91496f30332SMark de Wever std::locale::global(std::locale(LOCALE_fr_FR_UTF_8)); 91596f30332SMark de Wever 91696f30332SMark de Wever // Non localized output using C-locale 917a6fcbcceSMark de Wever check(SV("%z='+0000'\t%Ez='+00:00'\t%Oz='+00:00'\t%Z='UTC'\n"), 91896f30332SMark de Wever fmt, 91996f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 92096f30332SMark de Wever 92196f30332SMark de Wever // Use the global locale (fr_FR) 922a6fcbcceSMark de Wever check(SV("%z='+0000'\t%Ez='+00:00'\t%Oz='+00:00'\t%Z='UTC'\n"), 92396f30332SMark de Wever lfmt, 92496f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 92596f30332SMark de Wever 926a6fcbcceSMark de Wever // Use supplied locale (ja_JP). 92796f30332SMark de Wever check(loc, 928a6fcbcceSMark de Wever SV("%z='+0000'\t%Ez='+00:00'\t%Oz='+00:00'\t%Z='UTC'\n"), 92996f30332SMark de Wever lfmt, 93096f30332SMark de Wever file_seconds(0s)); // 00:00:00 UTC Thursday, 1 January 1970 93196f30332SMark de Wever 93296f30332SMark de Wever std::locale::global(std::locale::classic()); 93396f30332SMark de Wever } 93496f30332SMark de Wever 93596f30332SMark de Wever template <class CharT> 93696f30332SMark de Wever static void test_valid_values() { 93796f30332SMark de Wever test_valid_values_year<CharT>(); 93896f30332SMark de Wever test_valid_values_month<CharT>(); 93996f30332SMark de Wever test_valid_values_day<CharT>(); 94096f30332SMark de Wever test_valid_values_weekday<CharT>(); 94196f30332SMark de Wever test_valid_values_day_of_year<CharT>(); 94296f30332SMark de Wever test_valid_values_week<CharT>(); 94396f30332SMark de Wever test_valid_values_iso_8601_week<CharT>(); 94496f30332SMark de Wever test_valid_values_date<CharT>(); 94596f30332SMark de Wever test_valid_values_time<CharT>(); 94696f30332SMark de Wever test_valid_values_date_time<CharT>(); 94796f30332SMark de Wever test_valid_values_time_zone<CharT>(); 94896f30332SMark de Wever } 94996f30332SMark de Wever 95096f30332SMark de Wever template <class CharT> 95196f30332SMark de Wever static void test() { 95296f30332SMark de Wever using namespace std::literals::chrono_literals; 95396f30332SMark de Wever 95496f30332SMark de Wever test_no_chrono_specs<CharT>(); 95596f30332SMark de Wever test_valid_values<CharT>(); 95696f30332SMark de Wever 95796f30332SMark de Wever check_invalid_types<CharT>( 95896f30332SMark de Wever {SV("a"), SV("A"), SV("b"), SV("B"), SV("c"), SV("C"), SV("d"), SV("D"), SV("e"), SV("F"), SV("g"), 95996f30332SMark de Wever SV("G"), SV("h"), SV("H"), SV("I"), SV("j"), SV("m"), SV("M"), SV("p"), SV("r"), SV("R"), SV("S"), 96096f30332SMark de Wever SV("T"), SV("u"), SV("U"), SV("V"), SV("w"), SV("W"), SV("x"), SV("X"), SV("y"), SV("Y"), SV("z"), 96196f30332SMark de Wever SV("Z"), SV("Ec"), SV("EC"), SV("Ex"), SV("EX"), SV("Ey"), SV("EY"), SV("Ez"), SV("Od"), SV("Oe"), SV("OH"), 96296f30332SMark de Wever SV("OI"), SV("Om"), SV("OM"), SV("OS"), SV("Ou"), SV("OU"), SV("OV"), SV("Ow"), SV("OW"), SV("Oy"), SV("Oz")}, 96396f30332SMark de Wever file_seconds(0s)); 96496f30332SMark de Wever 965402eb2efSMark de Wever check_exception("The format specifier expects a '%' or a '}'", SV("{:A"), file_seconds(0s)); 966402eb2efSMark de Wever check_exception("The chrono specifiers contain a '{'", SV("{:%%{"), file_seconds(0s)); 967402eb2efSMark de Wever check_exception("End of input while parsing a conversion specifier", SV("{:%"), file_seconds(0s)); 96896f30332SMark de Wever check_exception("End of input while parsing the modifier E", SV("{:%E"), file_seconds(0s)); 96996f30332SMark de Wever check_exception("End of input while parsing the modifier O", SV("{:%O"), file_seconds(0s)); 97096f30332SMark de Wever 97196f30332SMark de Wever // Precision not allowed 972402eb2efSMark de Wever check_exception("The format specifier expects a '%' or a '}'", SV("{:.3}"), file_seconds(0s)); 97396f30332SMark de Wever } 97496f30332SMark de Wever 97596f30332SMark de Wever int main(int, char**) { 97696f30332SMark de Wever test<char>(); 97796f30332SMark de Wever 97896f30332SMark de Wever #ifndef TEST_HAS_NO_WIDE_CHARACTERS 97996f30332SMark de Wever test<wchar_t>(); 98096f30332SMark de Wever #endif 98196f30332SMark de Wever 98296f30332SMark de Wever return 0; 98396f30332SMark de Wever } 984