| // { dg-do run { target c++20 } } |
| |
| #include <chrono> |
| #include <ranges> |
| #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_empty() |
| { |
| std::basic_string<CharT> res; |
| |
| const duration<double> d(33.111222); |
| res = std::format(WIDEN("{:}"), d); |
| VERIFY( res == WIDEN("33.1112s") ); |
| res = std::format(WIDEN("{:.0}"), d); |
| VERIFY( res == WIDEN("33.1112s") ); |
| res = std::format(WIDEN("{:.3}"), d); |
| VERIFY( res == WIDEN("33.1112s") ); |
| res = std::format(WIDEN("{:.6}"), d); |
| VERIFY( res == WIDEN("33.1112s") ); |
| res = std::format(WIDEN("{:.9}"), d); |
| VERIFY( res == WIDEN("33.1112s") ); |
| |
| // Uses ostream operator<< |
| const duration<double, std::nano> nd = d; |
| res = std::format(WIDEN("{:}"), nd); |
| VERIFY( res == WIDEN("3.31112e+10ns") ); |
| res = std::format(WIDEN("{:.0}"), nd); |
| VERIFY( res == WIDEN("3.31112e+10ns") ); |
| res = std::format(WIDEN("{:.3}"), nd); |
| VERIFY( res == WIDEN("3.31112e+10ns") ); |
| res = std::format(WIDEN("{:.6}"), nd); |
| VERIFY( res == WIDEN("3.31112e+10ns") ); |
| res = std::format(WIDEN("{:.9}"), nd); |
| VERIFY( res == WIDEN("3.31112e+10ns") ); |
| } |
| |
| template<typename CharT> |
| void |
| test_Q() |
| { |
| std::basic_string<CharT> res; |
| |
| const duration<double> d(7.111222); |
| res = std::format(WIDEN("{:%Q}"), d); |
| VERIFY( res == WIDEN("7.111222") ); |
| res = std::format(WIDEN("{:.0%Q}"), d); |
| VERIFY( res == WIDEN("7.111222") ); |
| res = std::format(WIDEN("{:.3%Q}"), d); |
| VERIFY( res == WIDEN("7.111222") ); |
| res = std::format(WIDEN("{:.6%Q}"), d); |
| VERIFY( res == WIDEN("7.111222") ); |
| res = std::format(WIDEN("{:.9%Q}"), d); |
| VERIFY( res == WIDEN("7.111222") ); |
| |
| duration<double, std::milli> md = d; |
| res = std::format(WIDEN("{:%Q}"), md); |
| VERIFY( res == WIDEN("7111.222") ); |
| res = std::format(WIDEN("{:.0%Q}"), md); |
| VERIFY( res == WIDEN("7111.222") ); |
| res = std::format(WIDEN("{:.3%Q}"), md); |
| VERIFY( res == WIDEN("7111.222") ); |
| res = std::format(WIDEN("{:.6%Q}"), md); |
| VERIFY( res == WIDEN("7111.222") ); |
| res = std::format(WIDEN("{:.9%Q}"), md); |
| VERIFY( res == WIDEN("7111.222") ); |
| |
| const duration<double, std::nano> nd = d; |
| res = std::format(WIDEN("{:%Q}"), nd); |
| VERIFY( res == WIDEN("7111222000") ); |
| res = std::format(WIDEN("{:.0%Q}"), nd); |
| VERIFY( res == WIDEN("7111222000") ); |
| res = std::format(WIDEN("{:.3%Q}"), nd); |
| VERIFY( res == WIDEN("7111222000") ); |
| res = std::format(WIDEN("{:.6%Q}"), nd); |
| VERIFY( res == WIDEN("7111222000") ); |
| res = std::format(WIDEN("{:.9%Q}"), nd); |
| VERIFY( res == WIDEN("7111222000") ); |
| } |
| |
| template<typename CharT> |
| void |
| test_S_fp() |
| { |
| std::basic_string<CharT> res; |
| |
| // Precision is ignored, but period affects output |
| duration<double> d(5.111222); |
| res = std::format(WIDEN("{:%S}"), d); |
| VERIFY( res == WIDEN("05") ); |
| res = std::format(WIDEN("{:.0%S}"), d); |
| VERIFY( res == WIDEN("05") ); |
| res = std::format(WIDEN("{:.3%S}"), d); |
| VERIFY( res == WIDEN("05") ); |
| res = std::format(WIDEN("{:.6%S}"), d); |
| VERIFY( res == WIDEN("05") ); |
| res = std::format(WIDEN("{:.9%S}"), d); |
| VERIFY( res == WIDEN("05") ); |
| |
| duration<double, std::milli> md = d; |
| res = std::format(WIDEN("{:%S}"), md); |
| VERIFY( res == WIDEN("05.111") ); |
| res = std::format(WIDEN("{:.0%S}"), md); |
| VERIFY( res == WIDEN("05.111") ); |
| res = std::format(WIDEN("{:.3%S}"), md); |
| VERIFY( res == WIDEN("05.111") ); |
| res = std::format(WIDEN("{:.6%S}"), md); |
| VERIFY( res == WIDEN("05.111") ); |
| res = std::format(WIDEN("{:.9%S}"), md); |
| VERIFY( res == WIDEN("05.111") ); |
| |
| duration<double, std::micro> ud = d; |
| res = std::format(WIDEN("{:%S}"), ud); |
| VERIFY( res == WIDEN("05.111222") ); |
| res = std::format(WIDEN("{:.0%S}"), ud); |
| VERIFY( res == WIDEN("05.111222") ); |
| res = std::format(WIDEN("{:.3%S}"), ud); |
| VERIFY( res == WIDEN("05.111222") ); |
| res = std::format(WIDEN("{:.6%S}"), ud); |
| VERIFY( res == WIDEN("05.111222") ); |
| res = std::format(WIDEN("{:.9%S}"), ud); |
| VERIFY( res == WIDEN("05.111222") ); |
| |
| duration<double, std::nano> nd = d; |
| res = std::format(WIDEN("{:%S}"), nd); |
| VERIFY( res == WIDEN("05.111222000") ); |
| res = std::format(WIDEN("{:.0%S}"), nd); |
| VERIFY( res == WIDEN("05.111222000") ); |
| res = std::format(WIDEN("{:.3%S}"), nd); |
| VERIFY( res == WIDEN("05.111222000") ); |
| res = std::format(WIDEN("{:.6%S}"), nd); |
| VERIFY( res == WIDEN("05.111222000") ); |
| res = std::format(WIDEN("{:.9%S}"), nd); |
| VERIFY( res == WIDEN("05.111222000") ); |
| |
| duration<double, std::pico> pd = d; |
| res = std::format(WIDEN("{:%S}"), pd); |
| VERIFY( res == WIDEN("05.111222000000") ); |
| res = std::format(WIDEN("{:.0%S}"), pd); |
| VERIFY( res == WIDEN("05.111222000000") ); |
| res = std::format(WIDEN("{:.3%S}"), pd); |
| VERIFY( res == WIDEN("05.111222000000") ); |
| res = std::format(WIDEN("{:.6%S}"), pd); |
| VERIFY( res == WIDEN("05.111222000000") ); |
| res = std::format(WIDEN("{:.9%S}"), pd); |
| VERIFY( res == WIDEN("05.111222000000") ); |
| } |
| |
| template<typename CharT> |
| void |
| test_S_int() |
| { |
| std::basic_string<CharT> res; |
| const nanoseconds src(7'000'012'345); |
| |
| auto d = floor<seconds>(src); |
| res = std::format(WIDEN("{:%S}"), d); |
| VERIFY( res == WIDEN("07") ); |
| |
| auto md = floor<milliseconds>(src); |
| res = std::format(WIDEN("{:%S}"), md); |
| VERIFY( res == WIDEN("07.000") ); |
| |
| auto ud = floor<microseconds>(src); |
| res = std::format(WIDEN("{:%S}"), ud); |
| VERIFY( res == WIDEN("07.000012") ); |
| |
| auto nd = floor<nanoseconds>(src); |
| res = std::format(WIDEN("{:%S}"), nd); |
| VERIFY( res == WIDEN("07.000012345") ); |
| |
| using picoseconds = duration<unsigned long long, std::pico>; |
| auto pd = floor<picoseconds>(src); |
| res = std::format(WIDEN("{:%S}"), pd); |
| VERIFY( res == WIDEN("07.000012345000") ); |
| } |
| |
| template<typename CharT> |
| void |
| test_all() |
| { |
| test_empty<CharT>(); |
| test_Q<CharT>(); |
| test_S_int<CharT>(); |
| test_S_fp<CharT>(); |
| } |
| |
| int main() |
| { |
| test_all<char>(); |
| |
| #ifdef _GLIBCXX_USE_WCHAR_T |
| test_all<wchar_t>(); |
| #endif // _GLIBCXX_USE_WCHAR_T |
| } |