blob: 5634e41ff02e644dd123bcab40d847eb34977bf1 [file] [log] [blame]
// { dg-do run { target c++20 } }
// { dg-timeout-factor 2 }
#include <chrono>
#include <format>
#include <testsuite_hooks.h>
void
test_ostream()
{
using std::format;
using namespace std::chrono;
auto st = sys_days{2000y/January/1};
auto tt = clock_cast<tai_clock>(st);
auto s = format("{0:%F %T %Z} == {1:%F %T %Z}", st, tt);
VERIFY( s == "2000-01-01 00:00:00 UTC == 2000-01-01 00:00:32 TAI" );
s = std::format("{:=>21}", tt);
VERIFY( s == "==2000-01-01 00:00:32" );
}
void
test_format()
{
using std::format;
using namespace std::chrono;
auto st = sys_days{2000y/January/1};
auto tt = clock_cast<tai_clock>(st);
auto s = std::format("{}", tt);
VERIFY( s == "2000-01-01 00:00:32" );
// PR libstdc++/113500
s = std::format("{}", tt + 150ms);
VERIFY( s == "2000-01-01 00:00:32.150" );
s = std::format("{:%Z %z %Ez %Oz}", tt);
VERIFY( s == "TAI +0000 +00:00 +00:00" );
s = std::format("{}", tai_seconds{});
VERIFY( s == "1958-01-01 00:00:00" );
}
void
test_parse()
{
using namespace std::chrono;
const sys_seconds expected = sys_days(2023y/August/9) + 20h + 44min + 3s;
tai_seconds tp;
minutes offset;
std::string abbrev;
std::istringstream is("8/9/23 214440 +1 BST#");
VERIFY( is >> parse("%D %2H%2M%2S %Oz %Z", tp, abbrev, offset) );
VERIFY( ! is.eof() );
VERIFY( tp == clock_cast<tai_clock>(expected) );
VERIFY( abbrev == "BST" );
VERIFY( offset == 60min );
// Test round trip
std::stringstream ss;
ss << clock_cast<tai_clock>(expected) << " TAI 0123";
VERIFY( ss >> parse("%F %T %Z %z", tp, abbrev, offset) );
VERIFY( ! ss.eof() );
VERIFY( (tp + offset) == clock_cast<tai_clock>(expected) );
VERIFY( abbrev == "TAI" );
VERIFY( offset == (1h + 23min) );
ss.str("");
ss << tai_seconds{};
VERIFY( ss >> parse("%F %T", tp) );
VERIFY( tp.time_since_epoch() == 0s );
}
int main()
{
test_ostream();
test_format();
test_parse();
}