libstdc++-v3/ChangeLog: * testsuite/std/time/format/empty_spec.cc: New tests. * testsuite/std/time/format/precision.cc: New test. --- Testing on x86_64-linux. OK for trunk when tests passes?
.../testsuite/std/time/format/empty_spec.cc | 51 +++++++++ .../testsuite/std/time/format/precision.cc | 107 ++++++++++++++++++ 2 files changed, 158 insertions(+) create mode 100644 libstdc++-v3/testsuite/std/time/format/precision.cc diff --git a/libstdc++-v3/testsuite/std/time/format/empty_spec.cc b/libstdc++-v3/testsuite/std/time/format/empty_spec.cc index 99cbd740d5f..a94eee19f57 100644 --- a/libstdc++-v3/testsuite/std/time/format/empty_spec.cc +++ b/libstdc++-v3/testsuite/std/time/format/empty_spec.cc @@ -170,6 +170,13 @@ test_duration() verify( -di, WIDEN("-40ms") ); res = std::format(WIDEN("{:>6}"), -di); VERIFY( res == WIDEN(" -40ms") ); +} + +template<typename _CharT> +void +test_duration_fp() +{ + std::basic_string<_CharT> res; const duration<double> df(11.22); verify( df, WIDEN("11.22s") ); @@ -179,6 +186,10 @@ test_duration() verify( -df, WIDEN("-11.22s") ); res = std::format(WIDEN("{:=^12}"), -df); VERIFY( res == WIDEN("==-11.22s===") ); + + // precision accepted but ignored + res = std::format(WIDEN("{:.6}"), df); + VERIFY( res == WIDEN("11.22s") ); } template<typename _CharT> @@ -292,6 +303,44 @@ test_hh_mm_ss() WIDEN("-14322:24:54.111222333") ); } +template<typename _CharT> +void +test_hh_mm_ss_fp() +{ + duration<double> dt = 22h + 24min + 54s + 111222333ns; + // period controls number of subseconds + verify( hms<nanoseconds>(dt), + WIDEN("22:24:54.111222333") ); + verify( hms<microseconds>(dt), + WIDEN("22:24:54.111222") ); + verify( hms<milliseconds>(dt), + WIDEN("22:24:54.111") ); + verify( hms<deciseconds>(dt), + WIDEN("22:24:54.1") ); + verify( hms<seconds>(dt), + WIDEN("22:24:54") ); + verify( hms<nanoseconds>(-dt), + WIDEN("-22:24:54.111222333") ); + verify( hms<microseconds>(-dt), + WIDEN("-22:24:54.111222") ); + verify( hms<milliseconds>(-dt), + WIDEN("-22:24:54.111") ); + verify( hms<deciseconds>(-dt), + WIDEN("-22:24:54.1") ); + verify( hms<seconds>(-dt), + WIDEN("-22:24:54") ); + + // but hour and minutes are preserved + verify( hms<minutes>(dt), + WIDEN("22:24:54") ); + verify( hms<hours>(dt), + WIDEN("22:24:54") ); + verify( hms<minutes>(-dt), + WIDEN("-22:24:54") ); + verify( hms<hours>(-dt), + WIDEN("-22:24:54") ); +} + template<typename _CharT> void test_hh_mm_ss_cust() @@ -339,9 +388,11 @@ void test_durations() { test_duration<CharT>(); + test_duration_fp<CharT>(); test_duration_cust<CharT>(); test_hh_mm_ss<CharT>(); + test_hh_mm_ss_fp<CharT>(); test_hh_mm_ss_cust<CharT>(); } diff --git a/libstdc++-v3/testsuite/std/time/format/precision.cc b/libstdc++-v3/testsuite/std/time/format/precision.cc new file mode 100644 index 00000000000..f65d06a71f3 --- /dev/null +++ b/libstdc++-v3/testsuite/std/time/format/precision.cc @@ -0,0 +1,107 @@ +// { 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(0.111222); + res = std::format(WIDEN("{:.3}"), d); + VERIFY( res == WIDEN("0.111222s") ); + res = std::format(WIDEN("{:.6}"), d); + VERIFY( res == WIDEN("0.111222s") ); + res = std::format(WIDEN("{:.9}"), d); + VERIFY( res == WIDEN("0.111222s") ); + + // Uses ostream operator<< + const duration<double, std::nano> nd = d; + res = std::format(WIDEN("{:.3}"), nd); + VERIFY( res == WIDEN("1.11222e+08ns") ); + res = std::format(WIDEN("{:.6}"), nd); + VERIFY( res == WIDEN("1.11222e+08ns") ); + res = std::format(WIDEN("{:.9}"), nd); + VERIFY( res == WIDEN("1.11222e+08ns") ); +} + +template<typename _CharT> +void +test_Q() +{ + std::basic_string<_CharT> res; + + const duration<double> d(0.111222); + res = std::format(WIDEN("{:.3%Q}"), d); + VERIFY( res == WIDEN("0.111222") ); + res = std::format(WIDEN("{:.6%Q}"), d); + VERIFY( res == WIDEN("0.111222") ); + res = std::format(WIDEN("{:.9%Q}"), d); + VERIFY( res == WIDEN("0.111222") ); + + const duration<double, std::nano> nd = d; + res = std::format(WIDEN("{:.3%Q}"), nd); + VERIFY( res == WIDEN("111222000") ); + res = std::format(WIDEN("{:.6%Q}"), nd); + VERIFY( res == WIDEN("111222000") ); + res = std::format(WIDEN("{:.9%Q}"), nd); + VERIFY( res == WIDEN("111222000") ); +} + +template<typename _CharT> +void +test_S() +{ + std::basic_string<_CharT> res; + + // Precision is ignored, but period affects output + const duration<double> d(0.111222); + res = std::format(WIDEN("{:.3%S}"), d); + VERIFY( res == WIDEN("00") ); + res = std::format(WIDEN("{:.6%S}"), d); + VERIFY( res == WIDEN("00") ); + res = std::format(WIDEN("{:.9%S}"), d); + VERIFY( res == WIDEN("00") ); + + const duration<double, std::milli> md = d; + res = std::format(WIDEN("{:.3%S}"), md); + VERIFY( res == WIDEN("00.111") ); + res = std::format(WIDEN("{:.6%S}"), md); + VERIFY( res == WIDEN("00.111") ); + res = std::format(WIDEN("{:.9%S}"), md); + VERIFY( res == WIDEN("00.111") ); + + const duration<double, std::nano> nd = d; + res = std::format(WIDEN("{:.3%S}"), nd); + VERIFY( res == WIDEN("00.111222000") ); + res = std::format(WIDEN("{:.6%S}"), nd); + VERIFY( res == WIDEN("00.111222000") ); + res = std::format(WIDEN("{:.9%S}"), nd); + VERIFY( res == WIDEN("00.111222000") ); +} + +template<typename CharT> +void +test_all() +{ + test_empty<CharT>(); + test_Q<CharT>(); + test_S<CharT>(); +} + +int main() +{ + test_all<char>(); + +#ifdef _GLIBCXX_USE_WCHAR_T + test_all<wchar_t>(); +#endif // _GLIBCXX_USE_WCHAR_T +} -- 2.49.0