blob: cdde4685eda6228927885ec9a359c7ec1c5287a1 [file] [log] [blame]
// { dg-do run { target c++23 } }
// { dg-options "-fexec-charset=UTF-8" }
// { dg-timeout-factor 2 }
#include <algorithm>
#include <chrono>
#include <testsuite_hooks.h>
#define WIDEN_(C, S) ::std::__format::_Widen<C>(S, L##S)
#define WIDEN(S) WIDEN_(CharT, S)
template<typename CharT>
void
test_from_format_string()
{
std::basic_string<CharT> res;
using namespace std::chrono_literals;
auto date = 2025y/std::chrono::May/05d;
res = std::format(WIDEN("{:+<13%F\U0001f921}"), date);
VERIFY( res == WIDEN("2025-05-05\U0001f921+") );
res = std::format(WIDEN("{:->15%F\U0001f921}"), date);
VERIFY( res == WIDEN("---2025-05-05\U0001f921") );
res = std::format(WIDEN("{:=^20%F\U0001f921}"), date);
VERIFY( res == WIDEN("====2025-05-05\U0001f921====") );
}
template<typename CharT>
void
test_formatted_value()
{
// Custom time_put facet which returns Ideographic Telegraph Symbol
// for given month for Om.
struct TimePut : std::time_put<CharT>
{
using iter_type = std::time_put<CharT>::iter_type;
using char_type = std::time_put<CharT>::char_type;
iter_type
do_put(iter_type out, std::ios_base& io, char_type fill, const tm* t,
char format, char modifier) const override
{
if (format != 'm' && modifier != 'm')
return std::time_put<CharT>::do_put(out, io, fill, t, format, modifier);
std::basic_string_view<CharT> str;
switch (t->tm_mon)
{
case 0:
str = WIDEN("\u32C0");
break;
case 1:
str = WIDEN("\u32C1");
break;
case 2:
str = WIDEN("\u32C2");
break;
case 3:
str = WIDEN("\u32C3");
break;
case 4:
str = WIDEN("\u32C4");
break;
case 5:
str = WIDEN("\u32C5");
break;
case 6:
str = WIDEN("\u32C6");
break;
case 7:
str = WIDEN("\u32C7");
break;
case 8:
str = WIDEN("\u32C8");
break;
case 9:
str = WIDEN("\u32C9");
break;
case 10:
str = WIDEN("\u32CA");
break;
case 11:
str = WIDEN("\u32CB");
break;
};
return std::copy(str.begin(), str.end(), out);
}
};
const std::locale loc(std::locale::classic(), new TimePut);
std::basic_string<CharT> res;
res = std::format(loc, WIDEN("{:<1L%Om}"), std::chrono::January);
VERIFY( res == WIDEN("\u32C0") );
res = std::format(loc, WIDEN("{:>2L%Om}"), std::chrono::February);
VERIFY( res == WIDEN("\u32C1") );
res = std::format(loc, WIDEN("{:<3L%Om}"), std::chrono::March);
VERIFY( res == WIDEN("\u32C2 ") );
res = std::format(loc, WIDEN("{:^4L%Om}"), std::chrono::April);
VERIFY( res == WIDEN(" \u32C3 ") );
res = std::format(loc, WIDEN("{:>5L%Om}"), std::chrono::May);
VERIFY( res == WIDEN(" \u32C4") );
res = std::format(loc, WIDEN("{:+<6L%Om}"), std::chrono::June);
VERIFY( res == WIDEN("\u32C5++++") );
res = std::format(loc, WIDEN("{:=^7L%Om}"), std::chrono::July);
VERIFY( res == WIDEN("==\u32C6===") );
res = std::format(loc, WIDEN("{:->8L%Om}"), std::chrono::August);
VERIFY( res == WIDEN("------\u32C7") );
}
int main()
{
test_from_format_string<char>();
test_from_format_string<wchar_t>();
test_formatted_value<char>();
test_formatted_value<wchar_t>();
}