#include <algorithm>
#include <cassert>
#include <chrono>
#include <format>
#include "test_macros.h"
#include "assert_macros.h"
#include "concat_macros.h"
[[nodiscard]] static std::chrono::sys_seconds to_sys_seconds(
std::chrono::year year,
std::chrono::month month,
std::chrono::day day,
std::chrono::hours h = std::chrono::hours(0),
std::chrono::minutes m = std::chrono::minutes{0},
std::chrono::seconds s = std::chrono::seconds{0}) {
std::chrono::year_month_day result{year, month, day};
return std::chrono::time_point_cast<std::chrono::seconds>(static_cast<std::chrono::sys_days>(result)) + h + m + s;
}
static void assert_equal(const std::chrono::sys_info& lhs, const std::chrono::sys_info& rhs) {
TEST_REQUIRE(lhs.begin == rhs.begin,
TEST_WRITE_CONCATENATED("\nBegin:\nExpected output ", lhs.begin, "\nActual output ", rhs.begin, '\n'));
TEST_REQUIRE(lhs.end == rhs.end,
TEST_WRITE_CONCATENATED("\nEnd:\nExpected output ", lhs.end, "\nActual output ", rhs.end, '\n'));
TEST_REQUIRE(
lhs.offset == rhs.offset,
TEST_WRITE_CONCATENATED("\nOffset:\nExpected output ", lhs.offset, "\nActual output ", rhs.offset, '\n'));
TEST_REQUIRE(lhs.save == rhs.save,
TEST_WRITE_CONCATENATED("\nSave:\nExpected output ", lhs.save, "\nActual output ", rhs.save, '\n'));
TEST_REQUIRE(
lhs.abbrev == rhs.abbrev,
TEST_WRITE_CONCATENATED("\nAbbrev:\nExpected output ", lhs.abbrev, "\nActual output ", rhs.abbrev, '\n'));
}
static void assert_equal(std::string_view expected, const std::chrono::sys_info& value) {
std::string result = std::format(
"[{}, {}) {:%T} {:%Q%q} {}",
value.begin,
value.end,
std::chrono::hh_mm_ss{value.offset},
value.save,
value.abbrev);
TEST_REQUIRE(expected == result,
TEST_WRITE_CONCATENATED("\nExpected output ", expected, "\nActual output ", result, '\n'));
}
static void
assert_range(std::string_view expected, const std::chrono::sys_info& begin, const std::chrono::sys_info& end) {
assert_equal(expected, begin);
assert_equal(expected, end);
}
static void assert_cycle(
std::string_view expected_1,
const std::chrono::sys_info& begin_1,
const std::chrono::sys_info& end_1,
std::string_view expected_2,
const std::chrono::sys_info& begin_2,
const std::chrono::sys_info& end_2
) {
assert_range(expected_1, begin_1, end_1);
assert_range(expected_2, begin_2, end_2);
}
static void test_gmt() {
const std::chrono::time_zone* tz = std::chrono::locate_zone("GMT");
assert_equal(
std::chrono::sys_info(
std::chrono::sys_seconds::min(),
std::chrono::sys_seconds::max(),
std::chrono::seconds(0),
std::chrono::minutes(0),
"GMT"),
tz->get_info(std::chrono::sys_seconds::min()));
assert_equal(
std::chrono::sys_info(
std::chrono::sys_seconds::min(),
std::chrono::sys_seconds::max(),
std::chrono::seconds(0),
std::chrono::minutes(0),
"GMT"),
tz->get_info(std::chrono::sys_seconds(std::chrono::seconds{0})));
assert_equal(
std::chrono::sys_info(
std::chrono::sys_seconds::min(),
std::chrono::sys_seconds::max(),
std::chrono::seconds(0),
std::chrono::minutes(0),
"GMT"),
tz->get_info(std::chrono::sys_seconds::max() - std::chrono::seconds{1}));
}
static void test_durations() {
const std::chrono::time_zone* tz = std::chrono::locate_zone("GMT");
std::chrono::sys_info expected(
std::chrono::sys_seconds::min(),
std::chrono::sys_seconds::max(),
std::chrono::seconds(0),
std::chrono::minutes(0),
"GMT");
assert_equal(expected, tz->get_info(std::chrono::sys_time<std::chrono::nanoseconds>{}));
assert_equal(expected, tz->get_info(std::chrono::sys_time<std::chrono::microseconds>{}));
assert_equal(expected, tz->get_info(std::chrono::sys_time<std::chrono::milliseconds>{}));
assert_equal(expected, tz->get_info(std::chrono::sys_time<std::chrono::seconds>{}));
assert_equal(expected, tz->get_info(std::chrono::sys_time<std::chrono::minutes>{}));
assert_equal(expected, tz->get_info(std::chrono::sys_time<std::chrono::minutes>{}));
assert_equal(expected, tz->get_info(std::chrono::sys_time<std::chrono::hours>{}));
assert_equal(expected, tz->get_info(std::chrono::sys_time<std::chrono::days>{}));
assert_equal(expected, tz->get_info(std::chrono::sys_time<std::chrono::weeks>{}));
assert_equal(expected, tz->get_info(std::chrono::sys_time<std::chrono::months>{}));
assert_equal(expected, tz->get_info(std::chrono::sys_time<std::chrono::years>{}));
}
static void test_antarctica_syowa() {
const std::chrono::time_zone* tz = std::chrono::locate_zone("Antarctica/Syowa");
std::chrono::sys_seconds transition =
to_sys_seconds(std::chrono::year(1957), std::chrono::January, std::chrono::day(29));
assert_equal(
std::chrono::sys_info(
std::chrono::sys_seconds::min(),
transition,
std::chrono::seconds(0),
std::chrono::minutes(0),
"-00"),
tz->get_info(std::chrono::sys_seconds::min()));
assert_equal(
std::chrono::sys_info(
std::chrono::sys_seconds::min(),
transition,
std::chrono::seconds(0),
std::chrono::minutes(0),
"-00"),
tz->get_info(transition - std::chrono::seconds(1)));
assert_equal(
std::chrono::sys_info(
transition,
std::chrono::sys_seconds::max(),
std::chrono::hours(3),
std::chrono::minutes(0),
"+03"),
tz->get_info(transition));
}
static void test_asia_hong_kong() {
using namespace std::literals::chrono_literals;
const std::chrono::time_zone* tz = std::chrono::locate_zone("Asia/Hong_Kong");
assert_equal(
std::chrono::sys_info(
std::chrono::sys_seconds::min(),
to_sys_seconds(1904y, std::chrono::October, 29d, 17h),
7h + 36min + 42s,
0min,
"LMT"),
tz->get_info(std::chrono::sys_seconds::min()));
assert_equal(
std::chrono::sys_info(
std::chrono::sys_seconds::min(),
to_sys_seconds(1904y, std::chrono::October, 29d, 17h),
7h + 36min + 42s,
0min,
"LMT"),
tz->get_info(to_sys_seconds(1904y, std::chrono::October, 29d, 16h, 59min, 59s)));
assert_range("[1904-10-29 17:00:00, 1941-06-14 19:00:00) 08:00:00 0min HKT",
tz->get_info(to_sys_seconds(1904y, std::chrono::October, 29d, 17h)),
tz->get_info(to_sys_seconds(1941y, std::chrono::June, 14d, 18h, 59min, 59s)));
assert_range("[1941-06-14 19:00:00, 1941-09-30 19:00:00) 09:00:00 60min HKST",
tz->get_info(to_sys_seconds(1941y, std::chrono::June, 14d, 19h)),
tz->get_info(to_sys_seconds(1941y, std::chrono::September, 30d, 18h, 59min, 59s)));
assert_range("[1941-09-30 19:00:00, 1941-12-24 15:30:00) 08:30:00 30min HKWT",
tz->get_info(to_sys_seconds(1941y, std::chrono::September, 30d, 19h)),
tz->get_info(to_sys_seconds(1941y, std::chrono::December, 24d, 15h, 29min, 59s)));
assert_range("[1941-12-24 15:30:00, 1945-11-17 17:00:00) 09:00:00 0min JST",
tz->get_info(to_sys_seconds(1941y, std::chrono::December, 24d, 15h, 30min)),
tz->get_info(to_sys_seconds(1945y, std::chrono::November, 17d, 16h, 59min, 59s)));
assert_range("[1945-11-17 17:00:00, 1946-04-20 16:00:00) 08:00:00 0min HKT",
tz->get_info(to_sys_seconds(1945y, std::chrono::November, 17d, 17h)),
tz->get_info(to_sys_seconds(1946y, std::chrono::April, 20d, 15h, 59min, 59s)));
assert_cycle(
"[1946-04-20 16:00:00, 1946-11-30 19:30:00) 09:00:00 60min HKST",
tz->get_info(to_sys_seconds(1946y, std::chrono::April, 20d, 16h)),
tz->get_info(to_sys_seconds(1946y, std::chrono::November, 30d, 19h, 29min, 59s)),
"[1946-11-30 19:30:00, 1947-04-12 19:30:00) 08:00:00 0min HKT",
tz->get_info(to_sys_seconds(1946y, std::chrono::November, 30d, 19h, 30min)),
tz->get_info(to_sys_seconds(1947y, std::chrono::April, 12d, 19h, 29min, 59s)));
assert_cycle(
"[1947-04-12 19:30:00, 1947-11-29 19:30:00) 09:00:00 60min HKST",
tz->get_info(to_sys_seconds(1947y, std::chrono::April, 12d, 19h, 30min)),
tz->get_info(to_sys_seconds(1947y, std::chrono::November, 29d, 19h, 29min, 59s)),
"[1947-11-29 19:30:00, 1948-05-01 19:30:00) 08:00:00 0min HKT",
tz->get_info(to_sys_seconds(1947y, std::chrono::November, 29d, 19h, 30min)),
tz->get_info(to_sys_seconds(1948y, std::chrono::May, 1d, 19h, 29min, 59s)));
assert_cycle(
"[1948-05-01 19:30:00, 1948-10-30 19:30:00) 09:00:00 60min HKST",
tz->get_info(to_sys_seconds(1948y, std::chrono::May, 1d, 19h, 30min)),
tz->get_info(to_sys_seconds(1948y, std::chrono::October, 30d, 19h, 29min, 59s)),
"[1948-10-30 19:30:00, 1949-04-02 19:30:00) 08:00:00 0min HKT",
tz->get_info(to_sys_seconds(1948y, std::chrono::October, 30d, 19h, 30min)),
tz->get_info(to_sys_seconds(1949y, std::chrono::April, 2d, 19h, 29min, 59s)));
assert_cycle(
"[1949-04-02 19:30:00, 1949-10-29 19:30:00) 09:00:00 60min HKST",
tz->get_info(to_sys_seconds(1949y, std::chrono::April, 2d, 19h, 30min)),
tz->get_info(to_sys_seconds(1949y, std::chrono::October, 29d, 19h, 29min, 59s)),
"[1949-10-29 19:30:00, 1950-04-01 19:30:00) 08:00:00 0min HKT",
tz->get_info(to_sys_seconds(1949y, std::chrono::October, 29d, 19h, 30min)),
tz->get_info(to_sys_seconds(1950y, std::chrono::April, 1d, 19h, 29min, 59s)));
assert_range(
"[1953-10-31 18:30:00, 1954-03-20 19:30:00) 08:00:00 0min HKT",
tz->get_info(to_sys_seconds(1953y, std::chrono::October, 31d, 18h, 30min)),
tz->get_info(to_sys_seconds(1954y, std::chrono::March, 20d, 19h, 29min, 59s)));
assert_cycle(
"[1953-04-04 19:30:00, 1953-10-31 18:30:00) 09:00:00 60min HKST",
tz->get_info(to_sys_seconds(1953y, std::chrono::April, 4d, 19h, 30min)),
tz->get_info(to_sys_seconds(1953y, std::chrono::October, 31d, 18h, 29min, 59s)),
"[1953-10-31 18:30:00, 1954-03-20 19:30:00) 08:00:00 0min HKT",
tz->get_info(to_sys_seconds(1953y, std::chrono::October, 31d, 18h, 30min)),
tz->get_info(to_sys_seconds(1954y, std::chrono::March, 20d, 19h, 29min, 59s)));
assert_cycle(
"[1972-04-15 19:30:00, 1972-10-21 18:30:00) 09:00:00 60min HKST",
tz->get_info(to_sys_seconds(1972y, std::chrono::April, 19d, 19h, 30min)),
tz->get_info(to_sys_seconds(1972y, std::chrono::October, 21d, 18h, 29min, 59s)),
"[1972-10-21 18:30:00, 1973-04-21 19:30:00) 08:00:00 0min HKT",
tz->get_info(to_sys_seconds(1972y, std::chrono::October, 21d, 18h, 30min)),
tz->get_info(to_sys_seconds(1973y, std::chrono::April, 21d, 19h, 29min, 59s)));
assert_range(
"[1973-04-21 19:30:00, 1973-10-20 18:30:00) 09:00:00 60min HKST",
tz->get_info(to_sys_seconds(1973y, std::chrono::April, 21d, 19h, 30min)),
tz->get_info(to_sys_seconds(1973y, std::chrono::October, 20d, 18h, 29min, 59s)));
assert_range(
"[1973-10-20 18:30:00, 1973-12-29 19:30:00) 08:00:00 0min HKT",
tz->get_info(to_sys_seconds(1973y, std::chrono::October, 20d, 18h, 30min)),
tz->get_info(to_sys_seconds(1973y, std::chrono::December, 29d, 19h, 29min, 59s)));
assert_range(
"[1973-12-29 19:30:00, 1974-10-19 18:30:00) 09:00:00 60min HKST",
tz->get_info(to_sys_seconds(1973y, std::chrono::December, 29d, 19h, 30min)),
tz->get_info(to_sys_seconds(1974y, std::chrono::October, 19d, 18h, 29min, 59s)));
assert_range(
"[1976-04-17 19:30:00, 1976-10-16 18:30:00) 09:00:00 60min HKST",
tz->get_info(to_sys_seconds(1976y, std::chrono::April, 17d, 19h, 30min)),
tz->get_info(to_sys_seconds(1976y, std::chrono::October, 16d, 18h, 29min, 59s)));
assert_range(
"[1976-10-16 18:30:00, 1979-05-12 19:30:00) 08:00:00 0min HKT",
tz->get_info(to_sys_seconds(1976y, std::chrono::October, 16d, 18h, 30min)),
tz->get_info(to_sys_seconds(1979y, std::chrono::May, 12d, 19h, 29min, 59s)));
assert_range(
"[1979-05-12 19:30:00, 1979-10-20 18:30:00) 09:00:00 60min HKST",
tz->get_info(to_sys_seconds(1979y, std::chrono::May, 12d, 19h, 30min)),
tz->get_info(to_sys_seconds(1979y, std::chrono::October, 20d, 18h, 29min, 59s)));
assert_equal(
std::chrono::sys_info(
to_sys_seconds(1979y, std::chrono::October, 20d, 18h, 30min),
std::chrono::sys_seconds::max(),
8h,
std::chrono::minutes(0),
"HKT"),
tz->get_info(to_sys_seconds(1979y, std::chrono::October, 20d, 18h, 30min)));
assert_equal(
std::chrono::sys_info(
to_sys_seconds(1979y, std::chrono::October, 20d, 18h, 30min),
std::chrono::sys_seconds::max(),
8h,
std::chrono::minutes(0),
"HKT"),
tz->get_info(std::chrono::sys_seconds::max() - std::chrono::seconds{1}));
}
static void test_europe_berlin() {
using namespace std::literals::chrono_literals;
const std::chrono::time_zone* tz = std::chrono::locate_zone("Europe/Berlin");
assert_equal(
std::chrono::sys_info(
std::chrono::sys_seconds::min(),
to_sys_seconds(1893y, std::chrono::March, 31d, 23h, 6min, 32s),
53min + 28s,
0min,
"LMT"),
tz->get_info(std::chrono::sys_seconds::min()));
assert_equal(
std::chrono::sys_info(
std::chrono::sys_seconds::min(),
to_sys_seconds(1893y, std::chrono::March, 31d, 23h, 6min, 32s),
53min + 28s,
0min,
"LMT"),
tz->get_info(to_sys_seconds(1893y, std::chrono::March, 31d, 23h, 6min, 31s)));
assert_range(
"[1893-03-31 23:06:32, 1916-04-30 22:00:00) 01:00:00 0min CET",
tz->get_info(to_sys_seconds(1893y, std::chrono::March, 31d, 23h, 6min, 32s)),
tz->get_info(to_sys_seconds(1916y, std::chrono::April, 30d, 21h, 59min, 59s)));
assert_cycle(
"[1916-04-30 22:00:00, 1916-09-30 23:00:00) 02:00:00 60min CEST",
tz->get_info(to_sys_seconds(1916y, std::chrono::April, 30d, 22h)),
tz->get_info(to_sys_seconds(1916y, std::chrono::September, 30d, 22h, 59min, 59s)),
"[1916-09-30 23:00:00, 1917-04-16 01:00:00) 01:00:00 0min CET",
tz->get_info(to_sys_seconds(1916y, std::chrono::September, 30d, 23h)),
tz->get_info(to_sys_seconds(1917y, std::chrono::April, 16d, 0h, 59min, 59s)));
assert_cycle(
"[1917-04-16 01:00:00, 1917-09-17 01:00:00) 02:00:00 60min CEST",
tz->get_info(to_sys_seconds(1917y, std::chrono::April, 16d, 1h)),
tz->get_info(to_sys_seconds(1917y, std::chrono::September, 17d, 0h, 59min, 59s)),
"[1917-09-17 01:00:00, 1918-04-15 01:00:00) 01:00:00 0min CET",
tz->get_info(to_sys_seconds(1917y, std::chrono::September, 17d, 1h)),
tz->get_info(to_sys_seconds(1918y, std::chrono::April, 15d, 0h, 59min, 59s)));
assert_cycle(
"[1918-04-15 01:00:00, 1918-09-16 01:00:00) 02:00:00 60min CEST",
tz->get_info(to_sys_seconds(1918y, std::chrono::April, 15d, 1h)),
tz->get_info(to_sys_seconds(1918y, std::chrono::September, 16d, 0h, 59min, 59s)),
"[1918-09-16 01:00:00, 1940-04-01 01:00:00) 01:00:00 0min CET",
tz->get_info(to_sys_seconds(1918y, std::chrono::September, 16d, 1h)),
tz->get_info(to_sys_seconds(1940y, std::chrono::April, 1d, 0h, 59min, 59s)));
assert_cycle(
"[1940-04-01 01:00:00, 1942-11-02 01:00:00) 02:00:00 60min CEST",
tz->get_info(to_sys_seconds(1940y, std::chrono::April, 1d, 1h)),
tz->get_info(to_sys_seconds(1942y, std::chrono::November, 2d, 0h, 59min, 59s)),
"[1942-11-02 01:00:00, 1943-03-29 01:00:00) 01:00:00 0min CET",
tz->get_info(to_sys_seconds(1942y, std::chrono::November, 2d, 1h)),
tz->get_info(to_sys_seconds(1943y, std::chrono::March, 29d, 0h, 59min, 59s)));
assert_range(
"[1945-04-02 01:00:00, 1945-05-24 00:00:00) 02:00:00 60min CEST",
tz->get_info(to_sys_seconds(1945y, std::chrono::April, 2d, 1h)),
tz->get_info(to_sys_seconds(1945y, std::chrono::May, 23d, 23h, 59min, 59s)));
assert_range(
"[1945-05-24 00:00:00, 1945-09-24 00:00:00) 03:00:00 120min CEMT",
tz->get_info(to_sys_seconds(1945y, std::chrono::May, 24d)),
tz->get_info(to_sys_seconds(1945y, std::chrono::September, 23d, 23h, 59min, 59s)));
assert_range(
"[1945-09-24 00:00:00, 1945-11-18 01:00:00) 02:00:00 60min CEST",
tz->get_info(to_sys_seconds(1945y, std::chrono::September, 24d)),
tz->get_info(to_sys_seconds(1945y, std::chrono::November, 18d, 0h, 59min, 59s)));
assert_range(
"[1945-11-18 01:00:00, 1946-04-14 01:00:00) 01:00:00 0min CET",
tz->get_info(to_sys_seconds(1945y, std::chrono::November, 18d, 1h)),
tz->get_info(to_sys_seconds(1946y, std::chrono::April, 14d, 0h, 59min, 59s)));
assert_range(
"[1946-04-14 01:00:00, 1946-10-07 01:00:00) 02:00:00 60min CEST",
tz->get_info(to_sys_seconds(1946y, std::chrono::April, 14d, 1h)),
tz->get_info(to_sys_seconds(1946y, std::chrono::October, 7d, 0h, 59min, 59s)));
assert_range(
"[1946-10-07 01:00:00, 1947-04-06 02:00:00) 01:00:00 0min CET",
tz->get_info(to_sys_seconds(1946y, std::chrono::October, 7d, 1h)),
tz->get_info(to_sys_seconds(1947y, std::chrono::April, 6d, 1h, 59min, 59s)));
assert_range(
"[1947-04-06 02:00:00, 1947-05-11 01:00:00) 02:00:00 60min CEST",
tz->get_info(to_sys_seconds(1947y, std::chrono::April, 6d, 2h)),
tz->get_info(to_sys_seconds(1947y, std::chrono::May, 11d, 0h, 59min, 59s)));
assert_range(
"[1947-05-11 01:00:00, 1947-06-29 00:00:00) 03:00:00 120min CEMT",
tz->get_info(to_sys_seconds(1947y, std::chrono::May, 11d, 1h)),
tz->get_info(to_sys_seconds(1947y, std::chrono::June, 28d, 23h, 59min, 59s)));
assert_cycle(
"[1947-06-29 00:00:00, 1947-10-05 01:00:00) 02:00:00 60min CEST",
tz->get_info(to_sys_seconds(1947y, std::chrono::June, 29d)),
tz->get_info(to_sys_seconds(1947y, std::chrono::October, 5d, 0h, 59min, 59s)),
"[1947-10-05 01:00:00, 1948-04-18 01:00:00) 01:00:00 0min CET",
tz->get_info(to_sys_seconds(1947y, std::chrono::October, 5d, 1h)),
tz->get_info(to_sys_seconds(1948y, std::chrono::April, 18d, 0h, 59min, 59s)));
assert_cycle(
"[1948-04-18 01:00:00, 1948-10-03 01:00:00) 02:00:00 60min CEST",
tz->get_info(to_sys_seconds(1948y, std::chrono::April, 18d, 1h)),
tz->get_info(to_sys_seconds(1948y, std::chrono::October, 3d, 0h, 59min, 59s)),
"[1948-10-03 01:00:00, 1949-04-10 01:00:00) 01:00:00 0min CET",
tz->get_info(to_sys_seconds(1948y, std::chrono::October, 3d, 1h)),
tz->get_info(to_sys_seconds(1949y, std::chrono::April, 10d, 0h, 59min, 59s)));
assert_cycle(
"[1949-04-10 01:00:00, 1949-10-02 01:00:00) 02:00:00 60min CEST",
tz->get_info(to_sys_seconds(1949y, std::chrono::April, 10d, 1h)),
tz->get_info(to_sys_seconds(1949y, std::chrono::October, 2d, 0h, 59min, 59s)),
"[1949-10-02 01:00:00, 1980-04-06 01:00:00) 01:00:00 0min CET",
tz->get_info(to_sys_seconds(1949y, std::chrono::October, 2d, 1h)),
tz->get_info(
to_sys_seconds(1980y, std::chrono::April, 6d, 0h, 59min, 59s)));
assert_cycle(
"[2020-03-29 01:00:00, 2020-10-25 01:00:00) 02:00:00 60min CEST",
tz->get_info(to_sys_seconds(2020y, std::chrono::March, 29d, 1h)),
tz->get_info(to_sys_seconds(2020y, std::chrono::October, 25d, 0h, 59min, 59s)),
"[2020-10-25 01:00:00, 2021-03-28 01:00:00) 01:00:00 0min CET",
tz->get_info(to_sys_seconds(2020y, std::chrono::October, 25d, 1h)),
tz->get_info(to_sys_seconds(2021y, std::chrono::March, 28d, 0h, 59min, 59s)));
assert_cycle(
"[2021-03-28 01:00:00, 2021-10-31 01:00:00) 02:00:00 60min CEST",
tz->get_info(to_sys_seconds(2021y, std::chrono::March, 28d, 1h)),
tz->get_info(to_sys_seconds(2021y, std::chrono::October, 31d, 0h, 59min, 59s)),
"[2021-10-31 01:00:00, 2022-03-27 01:00:00) 01:00:00 0min CET",
tz->get_info(to_sys_seconds(2021y, std::chrono::October, 31d, 1h)),
tz->get_info(to_sys_seconds(2022y, std::chrono::March, 27d, 0h, 59min, 59s)));
}
static void test_america_st_johns() {
using namespace std::literals::chrono_literals;
const std::chrono::time_zone* tz = std::chrono::locate_zone("America/St_Johns");
assert_equal(
std::chrono::sys_info(
std::chrono::sys_seconds::min(),
to_sys_seconds(1884y, std::chrono::January, 1d, 3h, 30min, 52s),
-(3h + 30min + 52s),
0min,
"LMT"),
tz->get_info(std::chrono::sys_seconds::min()));
assert_equal(
std::chrono::sys_info(
std::chrono::sys_seconds::min(),
to_sys_seconds(1884y, std::chrono::January, 1d, 3h, 30min, 52s),
-(3h + 30min + 52s),
0min,
"LMT"),
tz->get_info(to_sys_seconds(1884y, std::chrono::January, 1d, 3h, 30min, 51s)));
assert_range(
"[1884-01-01 03:30:52, 1917-04-08 05:30:52) -03:30:52 0min NST",
tz->get_info(to_sys_seconds(1884y, std::chrono::January, 1d, 3h, 30min, 52s)),
tz->get_info(to_sys_seconds(1917y, std::chrono::April, 8d, 5h, 30min, 51s)));
assert_range(
"[1917-04-08 05:30:52, 1917-09-17 04:30:52) -02:30:52 60min NDT",
tz->get_info(to_sys_seconds(1917y, std::chrono::April, 8d, 5h, 30min, 52s)),
tz->get_info(to_sys_seconds(1917y, std::chrono::September, 17d, 4h, 30min, 51s)));
assert_range("[1917-09-17 04:30:52, 1918-04-14 05:30:52) -03:30:52 0min NST",
tz->get_info(
to_sys_seconds(1917y, std::chrono::September, 17d, 4h, 30min, 52s)),
tz->get_info(
to_sys_seconds(1918y, std::chrono::April, 14d, 5h, 30min, 51s)));
assert_range(
"[1918-04-14 05:30:52, 1918-10-27 04:30:52) -02:30:52 60min NDT",
tz->get_info(to_sys_seconds(1918y, std::chrono::April, 14d, 5h, 30min, 52s)),
tz->get_info(to_sys_seconds(1918y, std::chrono::October, 27d, 4h, 30min, 51s)));
assert_range("[1918-10-27 04:30:52, 1919-05-06 02:30:52) -03:30:52 0min NST",
tz->get_info(
to_sys_seconds(1918y, std::chrono::October, 27d, 4h, 30min, 52s)),
tz->get_info(
to_sys_seconds(1919y, std::chrono::May, 6d, 2h, 30min, 51s)));
assert_range(
"[1934-10-29 01:30:52, 1935-03-30 03:30:52) -03:30:52 0min NST",
tz->get_info(to_sys_seconds(1934y, std::chrono::October, 29d, 1h, 30min, 52s)),
tz->get_info(to_sys_seconds(1935y, std::chrono::March, 30d, 3h, 30min, 51s)));
assert_range(
"[1935-03-30 03:30:52, 1935-05-06 02:30:00) -03:30:00 0min NST",
tz->get_info(to_sys_seconds(1935y, std::chrono::March, 30d, 3h, 30min, 52s)),
tz->get_info(to_sys_seconds(1935y, std::chrono::May, 6d, 2h, 29min, 59s)));
assert_range(
"[1935-05-06 02:30:00, 1935-10-28 01:30:00) -02:30:00 60min NDT",
tz->get_info(to_sys_seconds(1935y, std::chrono::May, 6d, 2h, 30min, 0s)),
tz->get_info(to_sys_seconds(1935y, std::chrono::October, 28d, 1h, 29min, 59s)));
assert_range(
"[1941-10-06 02:30:00, 1942-05-11 03:30:00) -03:30:00 0min NST",
tz->get_info(to_sys_seconds(1941y, std::chrono::October, 6d, 2h, 30min, 0s)),
tz->get_info(to_sys_seconds(1942y, std::chrono::May, 11d, 3h, 29min, 59s)));
assert_range(
"[1942-05-11 03:30:00, 1945-08-14 23:00:00) -02:30:00 60min NWT",
tz->get_info(to_sys_seconds(1942y, std::chrono::May, 11d, 3h, 30min, 0s)),
tz->get_info(to_sys_seconds(1945y, std::chrono::August, 14d, 22h, 59min, 59s)));
assert_range(
"[1945-08-14 23:00:00, 1945-09-30 04:30:00) -02:30:00 60min NPT",
tz->get_info(to_sys_seconds(1945y, std::chrono::August, 14d, 23h, 0min, 0s)),
tz->get_info(to_sys_seconds(1945y, std::chrono::September, 30d, 4h, 29min, 59s)));
assert_range(
"[1945-09-30 04:30:00, 1946-05-12 05:30:00) -03:30:00 0min NST",
tz->get_info(
to_sys_seconds(1945y, std::chrono::September, 30d, 4h, 30min, 0s)),
tz->get_info(to_sys_seconds(
1946y, std::chrono::May, 12d, 5h, 29min, 59s)));
assert_range(
"[1988-04-03 03:31:00, 1988-10-30 01:31:00) -01:30:00 120min NDDT",
tz->get_info(to_sys_seconds(1988y, std::chrono::April, 3d, 3h, 31min, 0s)),
tz->get_info(to_sys_seconds(1988y, std::chrono::October, 30d, 1h, 30min, 59s)));
assert_range("[2011-03-13 03:31:00, 2011-11-06 04:30:00) -02:30:00 60min NDT",
tz->get_info(
to_sys_seconds(2011y, std::chrono::March, 13d, 3h, 31min, 0s)),
tz->get_info(
to_sys_seconds(2011y, std::chrono::November, 6d, 04h, 29min, 59s)));
}
static void test_get_at_standard_time_universal() {
using namespace std::literals::chrono_literals;
const std::chrono::time_zone* tz = std::chrono::locate_zone("Asia/Barnaul");
assert_equal(
std::chrono::sys_info(
to_sys_seconds(2010y, std::chrono::October, 30d, 20h),
to_sys_seconds(2011y, std::chrono::March, 26d, 20h),
6h,
0min,
"+06"),
tz->get_info(to_sys_seconds(2010y, std::chrono::October, 31d, 10h)));
}
static void test_get_at_standard_time_standard() {
using namespace std::literals::chrono_literals;
const std::chrono::time_zone* tz = std::chrono::locate_zone("Africa/Bissau");
assert_equal(
std::chrono::sys_info(
std::chrono::sys_seconds::min(),
to_sys_seconds(1912y, std::chrono::January, 1d, 1h),
-(1h + 2min + 20s),
0min,
"LMT"),
tz->get_info(std::chrono::sys_seconds::min()));
}
static void test_get_at_save_universal() {
using namespace std::literals::chrono_literals;
const std::chrono::time_zone* tz = std::chrono::locate_zone("America/Tijuana");
assert_equal(
std::chrono::sys_info(
to_sys_seconds(1942y, std::chrono::April, 24d, 8h),
to_sys_seconds(1945y, std::chrono::August, 14d, 23h),
-7h,
60min,
"PWT"),
tz->get_info(to_sys_seconds(1942y, std::chrono::April, 24d, 8h)));
}
static void test_get_at_rule_standard() {
using namespace std::literals::chrono_literals;
const std::chrono::time_zone* tz = std::chrono::locate_zone("Antarctica/Macquarie");
assert_equal(
std::chrono::sys_info(
to_sys_seconds(1916y, std::chrono::September, 30d, 16h),
to_sys_seconds(1917y, std::chrono::March, 24d, 16h),
11h,
60min,
"AEDT"),
tz->get_info(to_sys_seconds(1916y, std::chrono::September, 30d, 16h)));
}
static void test_get_at_rule_universal() {
using namespace std::literals::chrono_literals;
const std::chrono::time_zone* tz = std::chrono::locate_zone("America/Nuuk");
assert_equal(
std::chrono::sys_info(
to_sys_seconds(1980y, std::chrono::April, 6d, 5h),
to_sys_seconds(1980y, std::chrono::September, 28d, 1h),
-2h,
60min,
"-02"),
tz->get_info(to_sys_seconds(1980y, std::chrono::April, 6d, 5h)));
}
static void test_format_with_alternatives_west() {
using namespace std::literals::chrono_literals;
const std::chrono::time_zone* tz = std::chrono::locate_zone("America/Nuuk");
assert_cycle(
"[2019-10-27 01:00:00, 2020-03-29 01:00:00) -03:00:00 0min -03",
tz->get_info(to_sys_seconds(2019y, std::chrono::October, 27d, 1h)),
tz->get_info(to_sys_seconds(2020y, std::chrono::March, 29d, 0h, 59min, 59s)),
"[2020-03-29 01:00:00, 2020-10-25 01:00:00) -02:00:00 60min -02",
tz->get_info(to_sys_seconds(2020y, std::chrono::March, 29d, 1h)),
tz->get_info(to_sys_seconds(2020y, std::chrono::October, 25d, 0h, 59min, 59s)));
}
static void test_format_with_alternatives_east() {
using namespace std::literals::chrono_literals;
const std::chrono::time_zone* tz = std::chrono::locate_zone("Asia/Barnaul");
assert_cycle(
"[2000-03-25 20:00:00, 2000-10-28 20:00:00) 07:00:00 60min +07",
tz->get_info(to_sys_seconds(2000y, std::chrono::March, 25d, 20h)),
tz->get_info(to_sys_seconds(2000y, std::chrono::October, 28d, 19h, 59min, 59s)),
"[2000-10-28 20:00:00, 2001-03-24 20:00:00) 06:00:00 0min +06",
tz->get_info(to_sys_seconds(2000y, std::chrono::October, 28d, 20h)),
tz->get_info(to_sys_seconds(2001y, std::chrono::March, 24d, 19h, 59min, 59s)));
}
static void test_africa_algiers() {
using namespace std::literals::chrono_literals;
const std::chrono::time_zone* tz = std::chrono::locate_zone("Africa/Algiers");
assert_equal(
std::chrono::sys_info(
to_sys_seconds(1977y, std::chrono::October, 20d, 23h),
to_sys_seconds(1978y, std::chrono::March, 24d),
1h,
std::chrono::minutes(0),
"CET"),
tz->get_info(to_sys_seconds(1977y, std::chrono::October, 20d, 23h)));
assert_range("[1977-05-06 00:00:00, 1977-10-20 23:00:00) 01:00:00 60min WEST",
tz->get_info(to_sys_seconds(1977y, std::chrono::May, 6d)),
tz->get_info(to_sys_seconds(1977y, std::chrono::October, 20d, 22h, 59min, 59s)));
assert_range("[1977-10-20 23:00:00, 1978-03-24 00:00:00) 01:00:00 0min CET",
tz->get_info(to_sys_seconds(1977y, std::chrono::October, 20d, 23h)),
tz->get_info(to_sys_seconds(1978y, std::chrono::March, 23d, 23h, 59min, 59s)));
}
static void test_africa_casablanca() {
using namespace std::literals::chrono_literals;
const std::chrono::time_zone* tz = std::chrono::locate_zone("Africa/Casablanca");
assert_range("[2018-06-17 02:00:00, 2018-10-28 02:00:00) 01:00:00 60min +01",
tz->get_info(to_sys_seconds(2018y, std::chrono::June, 17d, 2h)),
tz->get_info(to_sys_seconds(2018y, std::chrono::October, 28d, 1h, 59min, 59s)));
assert_range("[2018-10-28 02:00:00, 2019-05-05 02:00:00) 01:00:00 0min +01",
tz->get_info(
to_sys_seconds(2018y, std::chrono::October, 28d, 2h)),
tz->get_info(
to_sys_seconds(2019y, std::chrono::May, 5d, 1h, 59min, 59s)));
assert_range("[2019-05-05 02:00:00, 2019-06-09 02:00:00) 00:00:00 -60min +00",
tz->get_info(to_sys_seconds(2019y, std::chrono::May, 5d, 2h)),
tz->get_info(to_sys_seconds(2019y, std::chrono::June, 9d, 1h, 59min, 59s)));
assert_range("[2019-06-09 02:00:00, 2020-04-19 02:00:00) 01:00:00 0min +01",
tz->get_info(
to_sys_seconds(2019y, std::chrono::June, 9d, 2h)),
tz->get_info(
to_sys_seconds(2020y, std::chrono::April, 19d, 1h, 59min, 59s)));
}
static void test_africa_ceuta() {
using namespace std::literals::chrono_literals;
const std::chrono::time_zone* tz = std::chrono::locate_zone("Africa/Ceuta");
assert_range(
"[1928-10-07 00:00:00, 1967-06-03 12:00:00) 00:00:00 0min WET",
tz->get_info(to_sys_seconds(1928y, std::chrono::October, 7d)),
tz->get_info(
to_sys_seconds(1967y, std::chrono::June, 3d, 11h, 59min, 59s)));
}
static void test_africa_freetown() {
using namespace std::literals::chrono_literals;
const std::chrono::time_zone* tz = std::chrono::locate_zone("Africa/Freetown");
assert_range("[1882-01-01 00:53:00, 1913-07-01 00:53:00) -00:53:00 0min FMT",
tz->get_info(to_sys_seconds(1882y, std::chrono::January, 1d, 0h, 53min)),
tz->get_info(
to_sys_seconds(1913y, std::chrono::July, 1d, 0h, 52min, 59s)));
assert_range("[1939-09-01 01:00:00, 1939-09-05 00:40:00) -00:40:00 20min -0040",
tz->get_info(
to_sys_seconds(1939y, std::chrono::September, 1d, 1h)),
tz->get_info(
to_sys_seconds(1939y, std::chrono::September, 5d, 0h, 39min, 59s)));
}
static void test_africa_windhoek() {
using namespace std::literals::chrono_literals;
const std::chrono::time_zone* tz = std::chrono::locate_zone("Africa/Windhoek");
assert_range(
"[1990-03-20 22:00:00, 1994-03-20 22:00:00) 02:00:00 0min CAT",
tz->get_info(to_sys_seconds(1990y, std::chrono::March, 20d, 22h)),
tz->get_info(to_sys_seconds(1994y, std::chrono::March, 20d, 21h, 59min, 59s)));
}
static void test_america_adak() {
using namespace std::literals::chrono_literals;
const std::chrono::time_zone* tz = std::chrono::locate_zone("America/Adak");
assert_range(
"[1983-10-30 12:00:00, 1983-11-30 10:00:00) -10:00:00 0min AHST",
tz->get_info(to_sys_seconds(1983y, std::chrono::October, 30d, 12h)),
tz->get_info(to_sys_seconds(1983y, std::chrono::November, 30d, 9h, 59min, 59s)));
}
static void test_america_auncion() {
using namespace std::literals::chrono_literals;
const std::chrono::time_zone* tz = std::chrono::locate_zone("America/Asuncion");
assert_range("[1974-04-01 03:00:00, 1975-10-01 04:00:00) -04:00:00 0min -04",
tz->get_info(to_sys_seconds(1974y, std::chrono::April, 1d, 3h)),
tz->get_info(to_sys_seconds(1975y, std::chrono::October, 1d, 3h, 59min, 59s)));
assert_range("[1975-10-01 04:00:00, 1976-03-01 03:00:00) -03:00:00 60min -03",
tz->get_info(to_sys_seconds(1975y, std::chrono::October, 1d, 4h)),
tz->get_info(to_sys_seconds(1976y, std::chrono::March, 1d, 2h, 59min, 59s)));
}
static void test_america_ciudad_juarez() {
using namespace std::literals::chrono_literals;
const std::chrono::time_zone* tz = std::chrono::locate_zone("America/Ciudad_Juarez");
assert_range("[1996-04-07 08:00:00, 1996-10-27 07:00:00) -05:00:00 60min CDT",
tz->get_info(to_sys_seconds(1996y, std::chrono::April, 7d, 8h)),
tz->get_info(to_sys_seconds(1996y, std::chrono::October, 27d, 6h, 59min, 59s)));
}
static void test_america_argentina_buenos_aires() {
using namespace std::literals::chrono_literals;
const std::chrono::time_zone* tz = std::chrono::locate_zone("America/Argentina/Buenos_Aires");
assert_range("[1999-10-03 03:00:00, 2000-03-03 03:00:00) -03:00:00 60min -03",
tz->get_info(to_sys_seconds(1999y, std::chrono::October, 3d, 3h)),
tz->get_info(to_sys_seconds(2000y, std::chrono::March, 3d, 2h, 59min, 59s)));
assert_range("[2000-03-03 03:00:00, 2007-12-30 03:00:00) -03:00:00 0min -03",
tz->get_info(to_sys_seconds(2000y, std::chrono::March, 3d, 3h)),
tz->get_info(to_sys_seconds(2007y, std::chrono::December, 30d, 2h, 59min, 59s)));
}
static void test_america_argentina_la_rioja() {
using namespace std::literals::chrono_literals;
const std::chrono::time_zone* tz = std::chrono::locate_zone("America/Argentina/La_Rioja");
assert_range("[1990-10-21 03:00:00, 1991-03-01 02:00:00) -02:00:00 60min -02",
tz->get_info(to_sys_seconds(1990y, std::chrono::October, 21d, 3h)),
tz->get_info(to_sys_seconds(1991y, std::chrono::March, 1d, 1h, 59min, 59s)));
}
static void test_america_argentina_san_luis() {
using namespace std::literals::chrono_literals;
const std::chrono::time_zone* tz = std::chrono::locate_zone("America/Argentina/San_Luis");
assert_range("[1989-10-15 03:00:00, 1990-03-14 02:00:00) -02:00:00 60min -02",
tz->get_info(
to_sys_seconds(1989y, std::chrono::October, 15d, 3h)),
tz->get_info(
to_sys_seconds(1990y, std::chrono::March, 14d, 1h, 59min, 59s)));
assert_range("[2008-01-21 02:00:00, 2008-03-09 03:00:00) -03:00:00 60min -03",
tz->get_info(to_sys_seconds(2008y, std::chrono::January, 21d, 2h)),
tz->get_info(to_sys_seconds(2008y, std::chrono::March, 9d, 2h, 59min, 59s)));
}
static void test_america_indiana_knox() {
using namespace std::literals::chrono_literals;
const std::chrono::time_zone* tz = std::chrono::locate_zone("America/Indiana/Knox");
assert_range("[2006-04-02 07:00:00, 2006-10-29 07:00:00) -05:00:00 60min CDT",
tz->get_info(to_sys_seconds(2006y, std::chrono::April, 2d, 7h)),
tz->get_info(to_sys_seconds(2006y, std::chrono::October, 29d, 6h, 59min, 59s)));
}
static void test_america_punta_arenas() {
using namespace std::literals::chrono_literals;
const std::chrono::time_zone* tz = std::chrono::locate_zone("America/Punta_Arenas");
assert_equal(
std::chrono::sys_info(
to_sys_seconds(1927y, std::chrono::September, 1d, 4h, 42min, 45s),
to_sys_seconds(1928y, std::chrono::April, 1d, 4h),
-4h,
60min,
"-04"),
tz->get_info(to_sys_seconds(1927y, std::chrono::September, 1d, 4h, 42min, 45s)));
assert_equal(
std::chrono::sys_info(
to_sys_seconds(1927y, std::chrono::September, 1d, 4h, 42min, 45s),
to_sys_seconds(1928y, std::chrono::April, 1d, 4h),
-4h,
60min,
"-04"),
tz->get_info(to_sys_seconds(1928y, std::chrono::April, 1d, 3h, 59min, 59s)));
}
static void test_europ_ljubljana() {
using namespace std::literals::chrono_literals;
const std::chrono::time_zone* tz = std::chrono::locate_zone("Europe/Ljubljana");
assert_equal(
std::chrono::sys_info(
to_sys_seconds(1945y, std::chrono::April, 2d, 1h),
to_sys_seconds(1945y, std::chrono::September, 16d, 1h),
2h,
60min,
"CEST"),
tz->get_info(to_sys_seconds(1945y, std::chrono::April, 2d, 1h)));
assert_equal(
std::chrono::sys_info(
to_sys_seconds(1945y, std::chrono::April, 2d, 1h),
to_sys_seconds(1945y, std::chrono::September, 16d, 1h),
2h,
60min,
"CEST"),
tz->get_info(to_sys_seconds(1945y, std::chrono::September, 16d, 0h, 59min, 59s)));
}
int main(int, const char**) {
test_gmt();
test_durations();
test_antarctica_syowa();
test_asia_hong_kong();
test_europe_berlin();
test_america_st_johns();
test_get_at_standard_time_universal();
test_get_at_standard_time_standard();
test_get_at_save_universal();
test_get_at_rule_standard();
test_get_at_rule_universal();
test_format_with_alternatives_west();
test_format_with_alternatives_east();
test_africa_algiers();
test_africa_casablanca();
test_africa_ceuta();
test_africa_freetown();
test_africa_windhoek();
test_america_adak();
test_america_argentina_buenos_aires();
test_america_argentina_la_rioja();
test_america_argentina_san_luis();
test_america_auncion();
test_america_ciudad_juarez();
test_america_indiana_knox();
test_america_punta_arenas();
test_europ_ljubljana();
return 0;
}