On Fri, 30 May 2025 at 15:26, Tomasz Kaminski <tkami...@redhat.com> wrote: > > > > On Fri, May 30, 2025 at 1:55 PM Jonathan Wakely <jwak...@redhat.com> wrote: >> >> On Fri, 30 May 2025 at 10:38, Tomasz Kamiński <tkami...@redhat.com> wrote: >> > >> > Adding a test for behavior of the ostream operator and the formatting >> > with empty chron-spec for the chrono types. This commit covers calendar >> > types. >> > >> > libstdc++-v3/ChangeLog: >> > >> > * testsuite/std/time/format/empty_spec.cc: New test. >> > --- >> > Tested on x86_64-linux. OK for trunk? >> > >> > .../testsuite/std/time/format/empty_spec.cc | 298 ++++++++++++++++++ >> > 1 file changed, 298 insertions(+) >> > create mode 100644 libstdc++-v3/testsuite/std/time/format/empty_spec.cc >> > >> > diff --git a/libstdc++-v3/testsuite/std/time/format/empty_spec.cc >> > b/libstdc++-v3/testsuite/std/time/format/empty_spec.cc >> > new file mode 100644 >> > index 00000000000..91cf7f8d06d >> > --- /dev/null >> > +++ b/libstdc++-v3/testsuite/std/time/format/empty_spec.cc >> > @@ -0,0 +1,298 @@ >> > +// { dg-do run { target c++20 } } >> > +// { dg-timeout-factor 2 } >> > + >> > +#include <chrono> >> > +#include <sstream> >> > +#include <testsuite_hooks.h> >> > + >> > +using namespace std::chrono; >> > + >> > +#define WIDEN_(C, S) ::std::__format::_Widen<C>(S, L##S) >> > +#define WIDEN(S) WIDEN_(_CharT, S) >> > + >> > +template<typename _CharT> >> > +void >> > +test_padding() >> > +{ >> > + std::basic_string<_CharT> res; >> > + >> > + res = std::format(WIDEN("{:5}"), day(2)); >> > + VERIFY( res == WIDEN("02 ") ); >> > + >> > + res = std::format(WIDEN("{:>6}"), weekday(4)); >> > + VERIFY( res == WIDEN(" Thu") ); >> > + >> > + res = std::format(WIDEN("{:^7}"), month(3)); >> > + VERIFY( res == WIDEN(" Mar ") ); >> > + >> > + res = std::format(WIDEN("{:-<4}"), day(30)); >> > + VERIFY( res == WIDEN("30--") ); >> > + >> > + res = std::format(WIDEN("{:+>30}"), weekday(9)); >> > + VERIFY( res == WIDEN("++++++9 is not a valid weekday") ); >> > + >> > + res = std::format(WIDEN("{:=^27}"), month(16)); >> > + VERIFY( res == WIDEN("==16 is not a valid month==") ); >> > +} >> > + >> > +template<typename T, typename _CharT> >> > +void verify(const T& t, const _CharT* str) >> > +{ >> > + std::basic_string<_CharT> res; >> > + >> > + res = std::format(WIDEN("{}"), t); >> > + VERIFY( res == str ); >> > + >> > + std::basic_stringstream<_CharT> os; >> > + os << t; >> > + res = std::move(os).str(); >> > + VERIFY( res == str ); >> > +} >> > + >> > +template<typename _CharT> >> > +void >> > +test_day() >> > +{ >> > + verify( day(0), WIDEN("00 is not a valid day") ); >> > + verify( day(1), WIDEN("01") ); >> > + verify( day(10), WIDEN("10") ); >> > + verify( day(32), WIDEN("32 is not a valid day") ); >> > + verify( day(110), WIDEN("110 is not a valid day") ); >> > + verify( day(255), WIDEN("255 is not a valid day") ); >> > +} >> > + >> > +template<typename _CharT> >> > +void >> > +test_month() >> > +{ >> > + verify( month(0), WIDEN("0 is not a valid month") ); >> > + verify( month(1), WIDEN("Jan") ); >> > + verify( month(10), WIDEN("Oct") ); >> > + verify( month(32), WIDEN("32 is not a valid month") ); >> > + verify( month(110), WIDEN("110 is not a valid month") ); >> > + verify( month(100), WIDEN("100 is not a valid month") ); >> > + verify( month(110), WIDEN("110 is not a valid month") ); >> > + verify( month(255), WIDEN("255 is not a valid month") ); >> > +} >> > + >> > +template<typename _CharT> >> > +void >> > +test_year() >> > +{ >> > + verify( year(-32768), WIDEN("-32768 is not a valid year") ); >> > + verify( year(-32767), WIDEN("-32767") ); >> > + verify( year(-67), WIDEN( "-0067") ); >> > + verify( year(-1), WIDEN( "-0001") ); >> > + verify( year(0), WIDEN( "0000") ); >> > + verify( year(1), WIDEN( "0001") ); >> > + verify( year(123), WIDEN( "0123") ); >> > + verify( year(2025), WIDEN( "2025") ); >> > + verify( year(32767), WIDEN( "32767") ); >> > +} >> > + >> > +template<typename _CharT> >> > +void >> > +test_weekday() >> > +{ >> > + verify( weekday(0), WIDEN("Sun") ); >> > + verify( weekday(2), WIDEN("Tue") ); >> > + verify( weekday(6), WIDEN("Sat") ); >> > + verify( weekday(7), WIDEN("Sun") ); >> > + verify( weekday(9), WIDEN("9 is not a valid weekday") ); >> > + verify( weekday(32), WIDEN("32 is not a valid weekday") ); >> > + verify( weekday(110), WIDEN("110 is not a valid weekday") ); >> > + verify( weekday(255), WIDEN("255 is not a valid weekday") ); >> > +} >> > + >> > +template<typename _CharT> >> > +void >> > +test_weekday_indexed() >> > +{ >> > + verify( weekday(0)[0], WIDEN("Sun[0 is not a valid index]") ); >> > + verify( weekday(2)[1], WIDEN("Tue[1]") ); >> > + verify( weekday(6)[5], WIDEN("Sat[5]") ); >> > + verify( weekday(7)[6], WIDEN("Sun[6 is not a valid index]") ); >> > + verify( weekday(7)[12], WIDEN("Sun[12 is not a valid index]") ); >> > + verify( weekday(5)[117], WIDEN("Fri[117 is not a valid index]") ); >> > + verify( weekday(7)[255], WIDEN("Sun[255 is not a valid index]") ); >> > + verify( weekday(9)[1], WIDEN("9 is not a valid weekday[1]") ); >> > + verify( weekday(32)[7], WIDEN("32 is not a valid weekday[7 is not a >> > valid index]") ); >> > +} >> > + >> > +template<typename _CharT> >> > +void >> > +test_weekday_last() >> > +{ >> > + verify( weekday(0)[last], WIDEN("Sun[last]") ); >> > + verify( weekday(9)[last], WIDEN("9 is not a valid weekday[last]") ); >> > +} >> > + >> > +template<typename _CharT> >> > +void >> > +test_month_day() >> > +{ >> > + verify( month(1)/30, WIDEN("Jan/30") ); >> > + verify( month(3)/32, WIDEN("Mar/32 is not a valid day") ); >> > + verify( month(13)/30, WIDEN("13 is not a valid month/30") ); >> > + verify( month(13)/32, WIDEN("13 is not a valid month/32 is not a valid >> > day") ); >> > +} >> > + >> > +template<typename _CharT> >> > +void >> > +test_month_day_last() >> > +{ >> > + verify( month(1)/last, WIDEN("Jan/last") ); >> > + verify( month(14)/last, WIDEN("14 is not a valid month/last") ); >> > +} >> > + >> > +template<typename _CharT> >> > +void >> > +test_month_weekday() >> > +{ >> > + verify( month(1)/weekday(2)[1], >> > + WIDEN("Jan/Tue[1]") ); >> > + verify( month(3)/weekday(9)[2], >> > + WIDEN("Mar/9 is not a valid weekday[2]") ); >> > + verify( month(13)/weekday(1)[7], >> > + WIDEN("13 is not a valid month/Mon[7 is not a valid index]") ); >> > + verify( month(13)/weekday(10)[3], >> > + WIDEN("13 is not a valid month/10 is not a valid weekday[3]") ); >> > + verify( month(13)/weekday(130)[0], >> > + WIDEN("13 is not a valid month/130 is not a valid weekday[0 is >> > not a valid index]") ); >> > +} >> > + >> > +template<typename _CharT> >> > +void >> > +test_month_weekday_last() >> > +{ >> > + verify( month(1)/weekday(2)[last], >> > + WIDEN("Jan/Tue[last]") ); >> > + verify( month(3)/weekday(9)[last], >> > + WIDEN("Mar/9 is not a valid weekday[last]") ); >> > + verify( month(13)/weekday(1)[last], >> > + WIDEN("13 is not a valid month/Mon[last]") ); >> > + verify( month(13)/weekday(10)[last], >> > + WIDEN("13 is not a valid month/10 is not a valid weekday[last]") >> > ); >> > +} >> > + >> > +template<typename _CharT> >> > +void >> > +test_year_month() >> > +{ >> > + verify( year(2024)/month(1), >> > + WIDEN("2024/Jan") ); >> > + verify( year(2025)/month(14), >> > + WIDEN("2025/14 is not a valid month") ); >> > + verify( year(-32768)/month(2), >> > + WIDEN("-32768 is not a valid year/Feb") ); >> > + verify( year(-32768)/month(0), >> > + WIDEN("-32768 is not a valid year/0 is not a valid month") ); >> > +} >> > + >> > +template<typename _CharT> >> > +void >> > +test_year_month_day() >> > +{ >> > + verify( year(2024)/month(1)/30, >> > + WIDEN("2024-01-30") ); >> > + verify( year(-100)/month(14)/1, >> > + // Should be -0100-14-01 >> > + WIDEN("-100-14-01 is not a valid date") ); >> > + verify( year(2025)/month(11)/100, >> > + // Should be 2025-11-100 ? >> > + WIDEN("2025-11-99 is not a valid date") ); >> > + verify( year(-32768)/month(2)/10, >> > + WIDEN("-32768-02-10 is not a valid date") ); >> > + verify( year(-32768)/month(212)/10, >> > + // Should be 32768-212-10? >> > + WIDEN("-32768-84-10 is not a valid date") ); >> > + verify( year(-32768)/month(2)/105, >> > + // Should be 32768-02-99? >> > + WIDEN("-32768-02-99 is not a valid date") ); >> > + verify( year(-32768)/month(14)/55, >> > + WIDEN("-32768-14-55 is not a valid date") ); >> > +} >> > + >> > +template<typename _CharT> >> > +void >> > +test_year_month_last() >> > +{ >> > + verify( year(2024)/month(1)/last, >> > + WIDEN("2024/Jan/last") ); >> > + verify( year(2025)/month(14)/last, >> > + WIDEN("2025/14 is not a valid month/last") ); >> > + verify( year(-32768)/month(2)/last, >> > + WIDEN("-32768 is not a valid year/Feb/last") ); >> > + verify( year(-32768)/month(0)/last, >> > + WIDEN("-32768 is not a valid year/0 is not a valid month/last") >> > ); >> > +} >> > + >> > +template<typename _CharT> >> > +void >> > +test_year_month_weekday() >> > +{ >> > + verify( year(2024)/month(1)/weekday(2)[1], >> > + WIDEN("2024/Jan/Tue[1]") ); >> > + verify( year(-1)/month(3)/weekday(9)[2], >> > + WIDEN("-0001/Mar/9 is not a valid weekday[2]") ); >> > + verify( year(-32768)/month(13)/weekday(1)[7], >> > + WIDEN("-32768 is not a valid year/13 is not a valid month/Mon[7 >> > is not a valid index]") ); >> > + verify( year(-100)/month(13)/weekday(10)[3], >> > + WIDEN("-0100/13 is not a valid month/10 is not a valid >> > weekday[3]") ); >> > + verify( year(-32768)/month(13)/weekday(130)[0], >> > + WIDEN("-32768 is not a valid year/13 is not a valid month/130 is >> > not a valid weekday[0 is not a valid index]") ); >> > +} >> > + >> > +template<typename _CharT> >> > +void >> > +test_year_month_weekday_last() >> > +{ >> > + verify( year(2024)/month(1)/weekday(2)[last], >> > + WIDEN("2024/Jan/Tue[last]") ); >> > + verify( year(-1)/month(3)/weekday(9)[last], >> > + WIDEN("-0001/Mar/9 is not a valid weekday[last]") ); >> > + verify( year(-32768)/month(13)/weekday(1)[last], >> > + WIDEN("-32768 is not a valid year/13 is not a valid >> > month/Mon[last]") ); >> > + verify( year(-100)/month(13)/weekday(10)[last], >> > + WIDEN("-0100/13 is not a valid month/10 is not a valid >> > weekday[last]") ); >> > + verify( year(-32768)/month(13)/weekday(130)[last], >> > + WIDEN("-32768 is not a valid year/13 is not a valid month/130 is >> > not a valid weekday[last]") ); >> > +} >> > + >> > +template<typename CharT> >> > +void >> > +test_calendar() >> > +{ >> > + test_day<CharT>(); >> > + test_month<CharT>(); >> > + test_year<CharT>(); >> > + >> > + test_weekday<CharT>(); >> > + test_weekday_indexed<CharT>(); >> > + test_weekday_last<CharT>(); >> > + >> > + test_month_day<CharT>(); >> > + test_month_day_last<CharT>(); >> > + test_month_weekday<CharT>(); >> > + test_month_weekday_last<CharT>(); >> > + >> > + test_year_month<CharT>(); >> > + test_year_month_day<CharT>(); >> > + test_year_month_last<CharT>(); >> > + test_year_month_weekday<CharT>(); >> > + test_year_month_weekday_last<CharT>(); >> > +} >> > + >> > +template<typename CharT> >> > +void >> > +test_all() >> > +{ >> > + test_padding<CharT>(); >> > + test_calendar<CharT>(); >> > +} >> > + >> > +int main() >> > +{ >> > + test_all<char>(); >> > + test_all<wchar_t>(); >> >> Please add >> #ifdef _GLIBCXX_USE_WCHAR_T >> to guard the test_all<wchar_t>() call. > > I haven't done this to any of the std/format tests. Should I? > In a separate commit. If so I will add them and push as committed.
Yes please. In bits/formatfwd.h we have: namespace __format { #ifdef _GLIBCXX_USE_WCHAR_T template<typename _CharT> concept __char = same_as<_CharT, char> || same_as<_CharT, wchar_t>; #else template<typename _CharT> concept __char = same_as<_CharT, char>; #endif So nothing can be formatted to wchar_t when that macro is not defined (which happens if you configure with --disable-wchar_t, and at least one person has reported a bug about <format> vs --disable-wchar_t since I implemented it). It's incredibly low priority, but we might as well try to make the tests compatible with that option. >> >> >> OK for trunk with that change, thanks. >>