blob: 1623aca1c7a82847d7fdb9bfe6c297ceec5e65b7 [file] [log] [blame]
// { dg-do run { target c++20 } }
// { dg-require-effective-target tzdb }
// { dg-require-effective-target cxx11_abi }
#include <chrono>
#include <testsuite_hooks.h>
void
test_members()
{
using namespace std::chrono;
const time_zone* const zone = locate_zone("Europe/London");
sys_time<minutes> t = sys_days(2022y/February/1) + 1h + 23min;
zoned_time<minutes> zt("Europe/London", t);
VERIFY( zt.get_time_zone() == zone );
VERIFY( zt.get_sys_time() == t);
VERIFY( zt.get_local_time().time_since_epoch() == t.time_since_epoch() );
VERIFY( zt.get_info().offset == 0h );
VERIFY( zt.get_info().abbrev == "GMT" );
VERIFY( static_cast<sys_seconds>(zt) == t );
VERIFY( static_cast<local_seconds>(zt) == zt.get_local_time() );
t = sys_days(2022y/June/1);
zt = t;
VERIFY( zt.get_time_zone() == zone );
VERIFY( zt.get_sys_time() == t);
VERIFY( zt.get_local_time().time_since_epoch() == t.time_since_epoch() + 1h );
VERIFY( zt.get_info().offset == 1h );
VERIFY( zt.get_info().abbrev == "BST" );
VERIFY( static_cast<sys_seconds>(zt) == t );
VERIFY( static_cast<local_seconds>(zt) == zt.get_local_time() );
zoned_seconds zs(zt);
VERIFY( zs == zt );
local_time<seconds> local(zt.get_local_time() + days(1) + hours(2));
zt = time_point_cast<minutes>(local);
VERIFY( zt.get_sys_time() == zs.get_sys_time() + days(1) + hours(2) );
}
void
test_zurich()
{
using namespace std::chrono;
const time_zone* const zurich = locate_zone("Europe/Zurich");
{
sys_days d = 1853y/July/16;
auto z = zoned_seconds(zurich, sys_seconds(d) - 1s);
auto info = z.get_info();
VERIFY( info.offset == (34min + 8s) );
VERIFY( info.abbrev == "LMT" );
z = zoned_seconds(zurich, d);
info = z.get_info();
VERIFY( info.offset == (29min + 46s) );
VERIFY( info.abbrev == "BMT" );
z = zoned_seconds(zurich, d + 1s);
info = z.get_info();
VERIFY( info.offset == (29min + 46s) );
VERIFY( info.abbrev == "BMT" );
auto z2 = zoned_time(zurich, d + 0.001s);
info = z2.get_info();
VERIFY( info.offset == (29min + 46s) );
VERIFY( info.abbrev == "BMT" );
}
{
sys_days d = 1894y/June/1;
auto z = zoned_seconds(zurich, sys_seconds(d) - 1s);
auto info = z.get_info();
VERIFY( info.offset == (29min + 46s) );
VERIFY( info.abbrev == "BMT" );
z = zoned_seconds(zurich, d);
info = z.get_info();
VERIFY( info.offset == 1h );
VERIFY( info.abbrev == "CET" );
}
{
sys_days d = 1941y/May/Monday[1];
auto z = zoned_seconds(zurich, d - 1s);
auto info = z.get_info();
VERIFY( info.offset == 1h );
VERIFY( info.abbrev == "CET" );
// CEST daylight savings time starts at 1am local time (UTC+1).
z = zoned_seconds(zurich, d);
info = z.get_info();
VERIFY( info.offset == 2h );
VERIFY( info.abbrev == "CEST" );
}
{
sys_days d = 1941y/October/Monday[1];
auto z = zoned_seconds(zurich, d - 1s);
auto info = z.get_info();
VERIFY( info.offset == 2h );
VERIFY( info.abbrev == "CEST" );
// CET standard time starts at 2am local time (UTC+2).
z = zoned_seconds(zurich, d);
info = z.get_info();
VERIFY( info.offset == 1h );
VERIFY( info.abbrev == "CET" );
}
{
sys_days d = 1942y/May/Monday[1];
auto z = zoned_seconds(zurich, d - 1s);
auto info = z.get_info();
VERIFY( info.offset == 1h );
VERIFY( info.abbrev == "CET" );
// CEST daylight savings time starts at 1am local time (UTC+1).
z = zoned_seconds(zurich, d);
info = z.get_info();
VERIFY( info.offset == 2h );
VERIFY( info.abbrev == "CEST" );
}
{
sys_days d = 1942y/October/Monday[1];
auto z = zoned_seconds(zurich, d - 1s);
auto info = z.get_info();
VERIFY( info.offset == 2h );
VERIFY( info.abbrev == "CEST" );
// CET standard time starts at 2am local time (UTC+2).
z = zoned_seconds(zurich, d);
info = z.get_info();
VERIFY( info.offset == 1h );
VERIFY( info.abbrev == "CET" );
}
{
sys_days d = 1943y/May/Monday[1];
// No daylight savings from 1943 until 1981.
auto z = zoned_seconds(zurich, d);
auto info = z.get_info();
VERIFY( info.offset == 1h );
VERIFY( info.abbrev == "CET" );
z = zoned_seconds(zurich, d + days(60));
info = z.get_info();
VERIFY( info.offset == 1h );
VERIFY( info.abbrev == "CET" );
z = zoned_seconds(zurich, d + years(10));
info = z.get_info();
VERIFY( info.offset == 1h );
VERIFY( info.abbrev == "CET" );
z = zoned_seconds(zurich, sys_days(1979y/June/3));
info = z.get_info();
VERIFY( info.offset == 1h );
VERIFY( info.abbrev == "CET" );
}
{
// Switzerland uses EU rules from 1981
sys_days d = 1981y/March/Sunday[last];
auto z = zoned_seconds(zurich, d);
auto info = z.get_info();
VERIFY( info.offset == 1h );
VERIFY( info.abbrev == "CET" );
z = zoned_seconds(zurich, d + 59min + 59s);
info = z.get_info();
VERIFY( info.offset == 1h );
VERIFY( info.abbrev == "CET" );
// CEST begins at 1am UTC
z = zoned_seconds(zurich, d + 1h);
info = z.get_info();
VERIFY( info.offset == 2h );
VERIFY( info.abbrev == "CEST" );
}
{
sys_days d = 1981y/September/Sunday[last];
auto z = zoned_seconds(zurich, d + 59min + 59s);
auto info = z.get_info();
VERIFY( info.offset == 2h );
VERIFY( info.abbrev == "CEST" );
// CEST ends at 1am UTC
z = zoned_seconds(zurich, d + 1h);
info = z.get_info();
VERIFY( info.offset == 1h );
VERIFY( info.abbrev == "CET" );
}
{
sys_days d = 1994y/September/Sunday[last];
auto z = zoned_seconds(zurich, d + 59min + 59s);
auto info = z.get_info();
VERIFY( info.offset == 2h );
VERIFY( info.abbrev == "CEST" );
// CEST ends at 1am UTC
z = zoned_seconds(zurich, d + 1h);
info = z.get_info();
VERIFY( info.offset == 1h );
VERIFY( info.abbrev == "CET" );
d = 1995y/September/Sunday[last];
z = zoned_seconds(zurich, d + 59min + 59s);
info = z.get_info();
VERIFY( info.offset == 2h );
VERIFY( info.abbrev == "CEST" );
// CEST ends at 1am UTC
z = zoned_seconds(zurich, d + 1h);
info = z.get_info();
VERIFY( info.offset == 1h );
VERIFY( info.abbrev == "CET" );
d = 1996y/September/Sunday[last];
// CEST ends in October since 1996
z = zoned_seconds(zurich, d + 1h);
info = z.get_info();
VERIFY( info.offset == 2h );
VERIFY( info.abbrev == "CEST" );
d = 1996y/October/Sunday[last];
// CEST ends at 1am UTC
z = zoned_seconds(zurich, d + 1h);
info = z.get_info();
VERIFY( info.offset == 1h );
VERIFY( info.abbrev == "CET" );
}
}
int main()
{
test_members();
test_zurich();
}