xref: /llvm-project/libcxx/test/std/time/time.syn/formatter.weekday_last.pass.cpp (revision 6a54dfbfe534276d644d7f9c027f0deeb748dd53)
1105fef5dSMark de Wever //===----------------------------------------------------------------------===//
2*6a54dfbfSLouis Dionne //
3105fef5dSMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4105fef5dSMark de Wever // See https://llvm.org/LICENSE.txt for license information.
5105fef5dSMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6105fef5dSMark de Wever //
7105fef5dSMark de Wever //===----------------------------------------------------------------------===//
8105fef5dSMark de Wever 
9105fef5dSMark de Wever // UNSUPPORTED: c++03, c++11, c++14, c++17
10105fef5dSMark de Wever // UNSUPPORTED: no-localization
11520c7fbbSLouis Dionne // UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME
12105fef5dSMark de Wever 
133d334df5SLouis Dionne // TODO FMT This test should not require std::to_chars(floating-point)
14f0fc8c48SLouis Dionne // XFAIL: availability-fp_to_chars-missing
153d334df5SLouis Dionne 
161403080aSMark de Wever // TODO FMT Investigate Windows issues.
171403080aSMark de Wever // XFAIL: msvc
181403080aSMark de Wever 
19105fef5dSMark de Wever // REQUIRES: locale.fr_FR.UTF-8
20105fef5dSMark de Wever // REQUIRES: locale.ja_JP.UTF-8
21105fef5dSMark de Wever 
22105fef5dSMark de Wever // <chrono>
23105fef5dSMark de Wever 
24105fef5dSMark de Wever // template<class charT> struct formatter<chrono::weekday_last, charT>;
25105fef5dSMark de Wever 
26105fef5dSMark de Wever #include <chrono>
27105fef5dSMark de Wever #include <format>
28105fef5dSMark de Wever 
29105fef5dSMark de Wever #include <cassert>
30105fef5dSMark de Wever #include <concepts>
31105fef5dSMark de Wever #include <locale>
32105fef5dSMark de Wever #include <iostream>
33105fef5dSMark de Wever #include <type_traits>
34105fef5dSMark de Wever 
35105fef5dSMark de Wever #include "formatter_tests.h"
36105fef5dSMark de Wever #include "make_string.h"
37105fef5dSMark de Wever #include "platform_support.h" // locale name macros
38105fef5dSMark de Wever #include "test_macros.h"
39105fef5dSMark de Wever 
40105fef5dSMark de Wever template <class CharT>
41105fef5dSMark de Wever static void test_no_chrono_specs() {
42105fef5dSMark de Wever   using namespace std::literals::chrono_literals;
43105fef5dSMark de Wever 
44105fef5dSMark de Wever   // Valid day
45105fef5dSMark de Wever   check(SV("Sun[last]"), SV("{}"), std::chrono::weekday_last{std::chrono::weekday(0)});
46105fef5dSMark de Wever 
47105fef5dSMark de Wever   // Invalid day
48105fef5dSMark de Wever   check(SV("8 is not a valid weekday[last]"), SV("{}"), std::chrono::weekday_last{std::chrono::weekday(8)});
49105fef5dSMark de Wever }
50105fef5dSMark de Wever 
51105fef5dSMark de Wever template <class CharT>
52105fef5dSMark de Wever static void test_valid_values() {
53105fef5dSMark de Wever   constexpr std::basic_string_view<CharT> fmt =
54105fef5dSMark de Wever       SV("{:%%u='%u'%t%%Ou='%Ou'%t%%w='%w'%t%%Ow='%Ow'%t%%a='%a'%t%%A='%A'%n}");
55105fef5dSMark de Wever   constexpr std::basic_string_view<CharT> lfmt =
56105fef5dSMark de Wever       SV("{:L%%u='%u'%t%%Ou='%Ou'%t%%w='%w'%t%%Ow='%Ow'%t%%a='%a'%t%%A='%A'%n}");
57105fef5dSMark de Wever 
58105fef5dSMark de Wever   const std::locale loc(LOCALE_ja_JP_UTF_8);
59105fef5dSMark de Wever   std::locale::global(std::locale(LOCALE_fr_FR_UTF_8));
60105fef5dSMark de Wever 
61105fef5dSMark de Wever   // Non localized output using C-locale
62105fef5dSMark de Wever   check(SV("%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\t%a='Sun'\t%A='Sunday'\n"),
63105fef5dSMark de Wever         fmt,
64105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(0)});
65105fef5dSMark de Wever   check(SV("%u='1'\t%Ou='1'\t%w='1'\t%Ow='1'\t%a='Mon'\t%A='Monday'\n"),
66105fef5dSMark de Wever         fmt,
67105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(1)});
68105fef5dSMark de Wever   check(SV("%u='2'\t%Ou='2'\t%w='2'\t%Ow='2'\t%a='Tue'\t%A='Tuesday'\n"),
69105fef5dSMark de Wever         fmt,
70105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(2)});
71105fef5dSMark de Wever   check(SV("%u='3'\t%Ou='3'\t%w='3'\t%Ow='3'\t%a='Wed'\t%A='Wednesday'\n"),
72105fef5dSMark de Wever         fmt,
73105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(3)});
74105fef5dSMark de Wever   check(SV("%u='4'\t%Ou='4'\t%w='4'\t%Ow='4'\t%a='Thu'\t%A='Thursday'\n"),
75105fef5dSMark de Wever         fmt,
76105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(4)});
77105fef5dSMark de Wever   check(SV("%u='5'\t%Ou='5'\t%w='5'\t%Ow='5'\t%a='Fri'\t%A='Friday'\n"),
78105fef5dSMark de Wever         fmt,
79105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(5)});
80105fef5dSMark de Wever   check(SV("%u='6'\t%Ou='6'\t%w='6'\t%Ow='6'\t%a='Sat'\t%A='Saturday'\n"),
81105fef5dSMark de Wever         fmt,
82105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(6)});
83105fef5dSMark de Wever   check(SV("%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\t%a='Sun'\t%A='Sunday'\n"),
84105fef5dSMark de Wever         fmt,
85105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(7)});
86105fef5dSMark de Wever 
87105fef5dSMark de Wever   // Use the global locale (fr_FR)
88105fef5dSMark de Wever #if defined(__APPLE__)
89105fef5dSMark de Wever   check(SV("%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\t%a='Dim'\t%A='Dimanche'\n"),
90105fef5dSMark de Wever         lfmt,
91105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(0)});
92105fef5dSMark de Wever   check(SV("%u='1'\t%Ou='1'\t%w='1'\t%Ow='1'\t%a='Lun'\t%A='Lundi'\n"),
93105fef5dSMark de Wever         lfmt,
94105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(1)});
95105fef5dSMark de Wever   check(SV("%u='2'\t%Ou='2'\t%w='2'\t%Ow='2'\t%a='Mar'\t%A='Mardi'\n"),
96105fef5dSMark de Wever         lfmt,
97105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(2)});
98105fef5dSMark de Wever   check(SV("%u='3'\t%Ou='3'\t%w='3'\t%Ow='3'\t%a='Mer'\t%A='Mercredi'\n"),
99105fef5dSMark de Wever         lfmt,
100105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(3)});
101105fef5dSMark de Wever   check(SV("%u='4'\t%Ou='4'\t%w='4'\t%Ow='4'\t%a='Jeu'\t%A='Jeudi'\n"),
102105fef5dSMark de Wever         lfmt,
103105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(4)});
104105fef5dSMark de Wever   check(SV("%u='5'\t%Ou='5'\t%w='5'\t%Ow='5'\t%a='Ven'\t%A='Vendredi'\n"),
105105fef5dSMark de Wever         lfmt,
106105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(5)});
107105fef5dSMark de Wever   check(SV("%u='6'\t%Ou='6'\t%w='6'\t%Ow='6'\t%a='Sam'\t%A='Samedi'\n"),
108105fef5dSMark de Wever         lfmt,
109105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(6)});
110105fef5dSMark de Wever   check(SV("%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\t%a='Dim'\t%A='Dimanche'\n"),
111105fef5dSMark de Wever         lfmt,
112105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(7)});
113105fef5dSMark de Wever #else  // defined(__APPLE__)
114105fef5dSMark de Wever   check(SV("%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\t%a='dim.'\t%A='dimanche'\n"),
115105fef5dSMark de Wever         lfmt,
116105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(0)});
117105fef5dSMark de Wever   check(SV("%u='1'\t%Ou='1'\t%w='1'\t%Ow='1'\t%a='lun.'\t%A='lundi'\n"),
118105fef5dSMark de Wever         lfmt,
119105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(1)});
120105fef5dSMark de Wever   check(SV("%u='2'\t%Ou='2'\t%w='2'\t%Ow='2'\t%a='mar.'\t%A='mardi'\n"),
121105fef5dSMark de Wever         lfmt,
122105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(2)});
123105fef5dSMark de Wever   check(SV("%u='3'\t%Ou='3'\t%w='3'\t%Ow='3'\t%a='mer.'\t%A='mercredi'\n"),
124105fef5dSMark de Wever         lfmt,
125105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(3)});
126105fef5dSMark de Wever   check(SV("%u='4'\t%Ou='4'\t%w='4'\t%Ow='4'\t%a='jeu.'\t%A='jeudi'\n"),
127105fef5dSMark de Wever         lfmt,
128105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(4)});
129105fef5dSMark de Wever   check(SV("%u='5'\t%Ou='5'\t%w='5'\t%Ow='5'\t%a='ven.'\t%A='vendredi'\n"),
130105fef5dSMark de Wever         lfmt,
131105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(5)});
132105fef5dSMark de Wever   check(SV("%u='6'\t%Ou='6'\t%w='6'\t%Ow='6'\t%a='sam.'\t%A='samedi'\n"),
133105fef5dSMark de Wever         lfmt,
134105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(6)});
135105fef5dSMark de Wever   check(SV("%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\t%a='dim.'\t%A='dimanche'\n"),
136105fef5dSMark de Wever         lfmt,
137105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(7)});
138105fef5dSMark de Wever #endif // defined(__APPLE__)
139105fef5dSMark de Wever 
140105fef5dSMark de Wever   // Use supplied locale (ja_JP).
141105fef5dSMark de Wever   // This locale has a different alternate, but not on all platforms
1428f01029bSMark de Wever #if defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)
143105fef5dSMark de Wever   check(loc,
144105fef5dSMark de Wever         SV("%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\t%a='日'\t%A='日曜日'\n"),
145105fef5dSMark de Wever         lfmt,
146105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(0)});
147105fef5dSMark de Wever   check(loc,
148105fef5dSMark de Wever         SV("%u='1'\t%Ou='1'\t%w='1'\t%Ow='1'\t%a='月'\t%A='月曜日'\n"),
149105fef5dSMark de Wever         lfmt,
150105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(1)});
151105fef5dSMark de Wever   check(loc,
152105fef5dSMark de Wever         SV("%u='2'\t%Ou='2'\t%w='2'\t%Ow='2'\t%a='火'\t%A='火曜日'\n"),
153105fef5dSMark de Wever         lfmt,
154105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(2)});
155105fef5dSMark de Wever   check(loc,
156105fef5dSMark de Wever         SV("%u='3'\t%Ou='3'\t%w='3'\t%Ow='3'\t%a='水'\t%A='水曜日'\n"),
157105fef5dSMark de Wever         lfmt,
158105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(3)});
159105fef5dSMark de Wever   check(loc,
160105fef5dSMark de Wever         SV("%u='4'\t%Ou='4'\t%w='4'\t%Ow='4'\t%a='木'\t%A='木曜日'\n"),
161105fef5dSMark de Wever         lfmt,
162105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(4)});
163105fef5dSMark de Wever   check(loc,
164105fef5dSMark de Wever         SV("%u='5'\t%Ou='5'\t%w='5'\t%Ow='5'\t%a='金'\t%A='金曜日'\n"),
165105fef5dSMark de Wever         lfmt,
166105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(5)});
167105fef5dSMark de Wever   check(loc,
168105fef5dSMark de Wever         SV("%u='6'\t%Ou='6'\t%w='6'\t%Ow='6'\t%a='土'\t%A='土曜日'\n"),
169105fef5dSMark de Wever         lfmt,
170105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(6)});
171105fef5dSMark de Wever   check(loc,
172105fef5dSMark de Wever         SV("%u='7'\t%Ou='7'\t%w='0'\t%Ow='0'\t%a='日'\t%A='日曜日'\n"),
173105fef5dSMark de Wever         lfmt,
174105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(7)});
1758f01029bSMark de Wever #else  // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)
176105fef5dSMark de Wever   check(loc,
177105fef5dSMark de Wever         SV("%u='7'\t%Ou='七'\t%w='0'\t%Ow='〇'\t%a='日'\t%A='日曜日'\n"),
178105fef5dSMark de Wever         lfmt,
179105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(0)});
180105fef5dSMark de Wever   check(loc,
181105fef5dSMark de Wever         SV("%u='1'\t%Ou='一'\t%w='1'\t%Ow='一'\t%a='月'\t%A='月曜日'\n"),
182105fef5dSMark de Wever         lfmt,
183105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(1)});
184105fef5dSMark de Wever   check(loc,
185105fef5dSMark de Wever         SV("%u='2'\t%Ou='二'\t%w='2'\t%Ow='二'\t%a='火'\t%A='火曜日'\n"),
186105fef5dSMark de Wever         lfmt,
187105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(2)});
188105fef5dSMark de Wever   check(loc,
189105fef5dSMark de Wever         SV("%u='3'\t%Ou='三'\t%w='3'\t%Ow='三'\t%a='水'\t%A='水曜日'\n"),
190105fef5dSMark de Wever         lfmt,
191105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(3)});
192105fef5dSMark de Wever   check(loc,
193105fef5dSMark de Wever         SV("%u='4'\t%Ou='四'\t%w='4'\t%Ow='四'\t%a='木'\t%A='木曜日'\n"),
194105fef5dSMark de Wever         lfmt,
195105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(4)});
196105fef5dSMark de Wever   check(loc,
197105fef5dSMark de Wever         SV("%u='5'\t%Ou='五'\t%w='5'\t%Ow='五'\t%a='金'\t%A='金曜日'\n"),
198105fef5dSMark de Wever         lfmt,
199105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(5)});
200105fef5dSMark de Wever   check(loc,
201105fef5dSMark de Wever         SV("%u='6'\t%Ou='六'\t%w='6'\t%Ow='六'\t%a='土'\t%A='土曜日'\n"),
202105fef5dSMark de Wever         lfmt,
203105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(6)});
204105fef5dSMark de Wever   check(loc,
205105fef5dSMark de Wever         SV("%u='7'\t%Ou='七'\t%w='0'\t%Ow='〇'\t%a='日'\t%A='日曜日'\n"),
206105fef5dSMark de Wever         lfmt,
207105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(7)});
2088f01029bSMark de Wever #endif // defined(_WIN32) || defined(__APPLE__) || defined(_AIX) || defined(__FreeBSD__)
209105fef5dSMark de Wever 
210105fef5dSMark de Wever   std::locale::global(std::locale::classic());
211105fef5dSMark de Wever }
212105fef5dSMark de Wever 
213105fef5dSMark de Wever template <class CharT>
214105fef5dSMark de Wever static void test_invalid_values() {
215105fef5dSMark de Wever   // Test that %a and %A throw an exception.
216402eb2efSMark de Wever   check_exception("Formatting a weekday name needs a valid weekday",
217105fef5dSMark de Wever                   SV("{:%a}"),
218105fef5dSMark de Wever                   std::chrono::weekday_last{std::chrono::weekday(8)});
219402eb2efSMark de Wever   check_exception("Formatting a weekday name needs a valid weekday",
220105fef5dSMark de Wever                   SV("{:%a}"),
221105fef5dSMark de Wever                   std::chrono::weekday_last{std::chrono::weekday(255)});
222402eb2efSMark de Wever   check_exception("Formatting a weekday name needs a valid weekday",
223105fef5dSMark de Wever                   SV("{:%A}"),
224105fef5dSMark de Wever                   std::chrono::weekday_last{std::chrono::weekday(8)});
225402eb2efSMark de Wever   check_exception("Formatting a weekday name needs a valid weekday",
226105fef5dSMark de Wever                   SV("{:%A}"),
227105fef5dSMark de Wever                   std::chrono::weekday_last{std::chrono::weekday(255)});
228105fef5dSMark de Wever 
229105fef5dSMark de Wever   constexpr std::basic_string_view<CharT> fmt  = SV("{:%%u='%u'%t%%Ou='%Ou'%t%%w='%w'%t%%Ow='%Ow'%n}");
230105fef5dSMark de Wever   constexpr std::basic_string_view<CharT> lfmt = SV("{:L%%u='%u'%t%%Ou='%Ou'%t%%w='%w'%t%%Ow='%Ow'%n}");
231105fef5dSMark de Wever 
232105fef5dSMark de Wever   const std::locale loc(LOCALE_ja_JP_UTF_8);
233105fef5dSMark de Wever   std::locale::global(std::locale(LOCALE_fr_FR_UTF_8));
234105fef5dSMark de Wever 
2358f01029bSMark de Wever #if defined(__APPLE__) || defined(__FreeBSD__)
236105fef5dSMark de Wever   // Non localized output using C-locale
237105fef5dSMark de Wever   check(SV("%u='8'\t%Ou='8'\t%w='8'\t%Ow='8'\n"), fmt, std::chrono::weekday_last{std::chrono::weekday(8)});
238105fef5dSMark de Wever   check(SV("%u='255'\t%Ou='255'\t%w='255'\t%Ow='255'\n"), fmt, std::chrono::weekday_last{std::chrono::weekday(255)});
239105fef5dSMark de Wever 
240105fef5dSMark de Wever   // Use the global locale (fr_FR)
241105fef5dSMark de Wever   check(SV("%u='8'\t%Ou='8'\t%w='8'\t%Ow='8'\n"), lfmt, std::chrono::weekday_last{std::chrono::weekday(8)});
242105fef5dSMark de Wever   check(SV("%u='255'\t%Ou='255'\t%w='255'\t%Ow='255'\n"), lfmt, std::chrono::weekday_last{std::chrono::weekday(255)});
243105fef5dSMark de Wever 
244105fef5dSMark de Wever   // Use supplied locale (ja_JP). This locale has a different alternate.
245105fef5dSMark de Wever   check(loc, SV("%u='8'\t%Ou='8'\t%w='8'\t%Ow='8'\n"), lfmt, std::chrono::weekday_last{std::chrono::weekday(8)});
246105fef5dSMark de Wever   check(loc,
247105fef5dSMark de Wever         SV("%u='255'\t%Ou='255'\t%w='255'\t%Ow='255'\n"),
248105fef5dSMark de Wever         lfmt,
249105fef5dSMark de Wever         std::chrono::weekday_last{std::chrono::weekday(255)});
2508f01029bSMark de Wever #elif defined(_WIN32) // defined(__APPLE__) || defined(__FreeBSD__)
2511403080aSMark de Wever   // Non localized output using C-locale
2521403080aSMark de Wever   check(SV("%u=''\t%Ou=''\t%w=''\t%Ow=''\n"), fmt, std::chrono::weekday_last{std::chrono::weekday(8)});
2531403080aSMark de Wever   check(SV("%u=''\t%Ou=''\t%w=''\t%Ow=''\n"), fmt, std::chrono::weekday_last{std::chrono::weekday(255)});
2541403080aSMark de Wever 
2551403080aSMark de Wever   // Use the global locale (fr_FR)
2561403080aSMark de Wever   check(SV("%u=''\t%Ou=''\t%w=''\t%Ow=''\n"), lfmt, std::chrono::weekday_last{std::chrono::weekday(8)});
2571403080aSMark de Wever   check(SV("%u=''\t%Ou=''\t%w=''\t%Ow=''\n"), lfmt, std::chrono::weekday_last{std::chrono::weekday(255)});
2581403080aSMark de Wever 
2591403080aSMark de Wever   // Use supplied locale (ja_JP). This locale has a different alternate.
2601403080aSMark de Wever   check(loc, SV("%u=''\t%Ou=''\t%w=''\t%Ow=''\n"), lfmt, std::chrono::weekday_last{std::chrono::weekday(8)});
2611403080aSMark de Wever   check(loc, SV("%u=''\t%Ou=''\t%w=''\t%Ow=''\n"), lfmt, std::chrono::weekday_last{std::chrono::weekday(255)});
2628f01029bSMark de Wever #elif defined(_AIX)   // defined(__APPLE__) || defined(__FreeBSD__)
263105fef5dSMark de Wever   // Non localized output using C-locale
264105fef5dSMark de Wever   check(SV("%u='8'\t%Ou='8'\t%w='8'\t%Ow='8'\n"), fmt, std::chrono::weekday_last{std::chrono::weekday(8)});
265105fef5dSMark de Wever   check(SV("%u='5'\t%Ou='5'\t%w='5'\t%Ow='5'\n"), fmt, std::chrono::weekday_last{std::chrono::weekday(255)});
266105fef5dSMark de Wever 
267105fef5dSMark de Wever   // Use the global locale (fr_FR)
268105fef5dSMark de Wever   check(SV("%u='8'\t%Ou='8'\t%w='8'\t%Ow='8'\n"), lfmt, std::chrono::weekday_last{std::chrono::weekday(8)});
269105fef5dSMark de Wever   check(SV("%u='5'\t%Ou='5'\t%w='5'\t%Ow='5'\n"), lfmt, std::chrono::weekday_last{std::chrono::weekday(255)});
270105fef5dSMark de Wever 
271105fef5dSMark de Wever   // Use supplied locale (ja_JP). This locale has a different alternate.
272105fef5dSMark de Wever   check(loc, SV("%u='8'\t%Ou='8'\t%w='8'\t%Ow='8'\n"), lfmt, std::chrono::weekday_last{std::chrono::weekday(8)});
273105fef5dSMark de Wever   check(loc, SV("%u='5'\t%Ou='5'\t%w='5'\t%Ow='5'\n"), lfmt, std::chrono::weekday_last{std::chrono::weekday(255)});
2748f01029bSMark de Wever #else                 //  defined(__APPLE__) || defined(__FreeBSD__)
275105fef5dSMark de Wever   // Non localized output using C-locale
276105fef5dSMark de Wever   check(SV("%u='1'\t%Ou='1'\t%w='8'\t%Ow='8'\n"), fmt, std::chrono::weekday_last{std::chrono::weekday(8)});
277105fef5dSMark de Wever   check(SV("%u='3'\t%Ou='3'\t%w='255'\t%Ow='255'\n"), fmt, std::chrono::weekday_last{std::chrono::weekday(255)});
278105fef5dSMark de Wever 
279105fef5dSMark de Wever   // Use the global locale (fr_FR)
280105fef5dSMark de Wever   check(SV("%u='1'\t%Ou='1'\t%w='8'\t%Ow='8'\n"), lfmt, std::chrono::weekday_last{std::chrono::weekday(8)});
281105fef5dSMark de Wever   check(SV("%u='3'\t%Ou='3'\t%w='255'\t%Ow='255'\n"), lfmt, std::chrono::weekday_last{std::chrono::weekday(255)});
282105fef5dSMark de Wever 
283105fef5dSMark de Wever   // Use supplied locale (ja_JP). This locale has a different alternate.
284105fef5dSMark de Wever   check(loc, SV("%u='1'\t%Ou='一'\t%w='8'\t%Ow='八'\n"), lfmt, std::chrono::weekday_last{std::chrono::weekday(8)});
285105fef5dSMark de Wever   check(loc, SV("%u='3'\t%Ou='三'\t%w='255'\t%Ow='255'\n"), lfmt, std::chrono::weekday_last{std::chrono::weekday(255)});
2868f01029bSMark de Wever #endif                // defined(__APPLE__) || defined(__FreeBSD__)
287105fef5dSMark de Wever 
288105fef5dSMark de Wever   std::locale::global(std::locale::classic());
289105fef5dSMark de Wever }
290105fef5dSMark de Wever 
291105fef5dSMark de Wever template <class CharT>
292105fef5dSMark de Wever static void test() {
293105fef5dSMark de Wever   test_no_chrono_specs<CharT>();
294105fef5dSMark de Wever   test_valid_values<CharT>();
295105fef5dSMark de Wever   test_invalid_values<CharT>();
296105fef5dSMark de Wever   check_invalid_types<CharT>({SV("a"), SV("A"), SV("t"), SV("u"), SV("w"), SV("Ou"), SV("Ow")},
297105fef5dSMark de Wever                              std::chrono::weekday_last{std::chrono::weekday(0)});
298105fef5dSMark de Wever 
299105fef5dSMark de Wever   check_exception(
300402eb2efSMark de Wever       "The format specifier expects a '%' or a '}'", SV("{:A"), std::chrono::weekday_last{std::chrono::weekday(0)});
301402eb2efSMark de Wever   check_exception(
302402eb2efSMark de Wever       "The chrono specifiers contain a '{'", SV("{:%%{"), std::chrono::weekday_last{std::chrono::weekday(0)});
303402eb2efSMark de Wever   check_exception("End of input while parsing a conversion specifier",
304105fef5dSMark de Wever                   SV("{:%"),
305105fef5dSMark de Wever                   std::chrono::weekday_last{std::chrono::weekday(0)});
306105fef5dSMark de Wever   check_exception(
307105fef5dSMark de Wever       "End of input while parsing the modifier E", SV("{:%E"), std::chrono::weekday_last{std::chrono::weekday(0)});
308105fef5dSMark de Wever   check_exception(
309105fef5dSMark de Wever       "End of input while parsing the modifier O", SV("{:%O"), std::chrono::weekday_last{std::chrono::weekday(0)});
310105fef5dSMark de Wever 
311105fef5dSMark de Wever   // Precision not allowed
312402eb2efSMark de Wever   check_exception(
313402eb2efSMark de Wever       "The format specifier expects a '%' or a '}'", SV("{:.3}"), std::chrono::weekday_last{std::chrono::weekday(0)});
314105fef5dSMark de Wever }
315105fef5dSMark de Wever 
316105fef5dSMark de Wever int main(int, char**) {
317105fef5dSMark de Wever   test<char>();
318105fef5dSMark de Wever 
319105fef5dSMark de Wever #ifndef TEST_HAS_NO_WIDE_CHARACTERS
320105fef5dSMark de Wever   test<wchar_t>();
321105fef5dSMark de Wever #endif
322105fef5dSMark de Wever 
323105fef5dSMark de Wever   return 0;
324105fef5dSMark de Wever }
325