blob: 687524bb355b75ee744f1be8ae0a172c3761f174 [file]
// { dg-do run { target c++20 } }
// { dg-require-effective-target tzdb }
// { dg-require-effective-target cxx11_abi }
// { dg-xfail-run-if "no weak override on AIX" { powerpc-ibm-aix* } }
// When a Zone line specifies a numeric value as its RULES field, that
// value is the constant DST save value for that zone line. Per
// [time.zone.info.sys] sys_info::offset is the total UTC offset
// (stdoff + save).
#include <chrono>
#include <fstream>
#include <testsuite_hooks.h>
static bool override_used = false;
namespace __gnu_cxx
{
const char* zoneinfo_dir_override() {
override_used = true;
return "./";
}
}
int
main()
{
using namespace std::chrono;
std::ofstream("tzdata.zi") << R"(# version test_numeric_save
Z Test/Gaborone 2 - CAT 1943 Sep 19 2
2 1 CAST 1944 Mar 19 2
2 - CAT
)";
const auto& db = reload_tzdb();
VERIFY( override_used ); // If this fails then XFAIL for the target.
VERIFY( db.version == "test_numeric_save" );
auto* tz = locate_zone("Test/Gaborone");
// Sample well inside the CAST (numeric-save) zone line.
auto info = tz->get_info(sys_days(1943y/December/15));
VERIFY( info.offset == 3h ); // stdoff +2h + save +1h
VERIFY( info.save == 60min );
VERIFY( info.abbrev == "CAST" );
// Bordering zone lines should report the standard offset with save 0.
auto before = tz->get_info(sys_days(1943y/September/1));
VERIFY( before.offset == 2h );
VERIFY( before.save == 0min );
VERIFY( before.abbrev == "CAT" );
auto after = tz->get_info(sys_days(1944y/April/15));
VERIFY( after.offset == 2h );
VERIFY( after.save == 0min );
VERIFY( after.abbrev == "CAT" );
}