The Perl Toolchain Summit 2025 Needs You: You can help 🙏 Learn more

#include "../test.h"
#define TEST(name) TEST_CASE("relative-basic: " name, "[relative-basic]")
TEST("ctor") {
SECTION("empty") {
DateRel rel;
CHECK(rel.sec() == 0);
CHECK(rel.min() == 0);
CHECK(rel.hour() == 0);
CHECK(rel.day() == 0);
CHECK(rel.month() == 0);
CHECK(rel.year() == 0);
CHECK(rel.to_string() == "");
}
SECTION("from list") {
DateRel rel(1,2,3,4,5,6);
CHECK(rel.sec() == 6);
CHECK(rel.min() == 5);
CHECK(rel.hour() == 4);
CHECK(rel.day() == 3);
CHECK(rel.month() == 2);
CHECK(rel.year() == 1);
CHECK(rel.to_string() == "1Y 2M 3D 4h 5m 6s");
}
SECTION("copy ctor") {
DateRel rel(1,2,3,4,5,6);
auto rel2 = rel;
CHECK(rel2.to_string() == "1Y 2M 3D 4h 5m 6s");
}
SECTION("from date pair") {
DateRel rel(Date("2012-03-02 15:47:32"), Date("2013-04-03 16:48:33"));
CHECK(rel.to_string() == "1Y 1M 1D 1h 1m 1s");
CHECK(rel.duration() == 34304461);
CHECK(rel.duration() != DateRel(rel.to_string()).duration());
CHECK(rel.from()->to_string() == "2012-03-02 15:47:32");
CHECK(rel.till()->to_string() == "2013-04-03 16:48:33");
rel = DateRel("2013-04-03 16:48:33", "2012-03-02 15:47:32");
CHECK(rel.to_string() == "-1Y -1M -1D -1h -1m -1s");
CHECK(rel.duration() == -34304461);
CHECK(rel.from()->to_string() == "2013-04-03 16:48:33");
CHECK(rel.till()->to_string() == "2012-03-02 15:47:32");
CHECK(rel.duration() != DateRel(rel.to_string()).duration());
}
}
TEST("set") {
DateRel rel;
SECTION("string") {
rel = "1Y 2M 3D 4h 5m 6s";
}
SECTION("oth") {
rel = DateRel("1Y 2M 3D 4h 5m 6s");
}
SECTION("dates") {
rel.set("2020-01-01 00:00:00", "2021-03-04 04:05:06");
}
CHECK(rel.to_string() == "1Y 2M 3D 4h 5m 6s");
}
TEST("duration") {
SECTION("without date") {
DateRel rel(1,2,3,4,5,6);
CHECK(rel.to_secs() == 37090322);
CHECK(rel.to_secs() == rel.duration());
is_approx(rel.to_mins(), 618172.033333);
is_approx(rel.to_hours(), 10302.867222);
is_approx(rel.to_days(), 429.286134);
is_approx(rel.to_months(), 14.104156);
is_approx(rel.to_years(), 1.175346);
CHECK(rel.to_string() == "1Y 2M 3D 4h 5m 6s");
}
SECTION("with date") {
DateRel rel(Date(1000000000), Date(1100000000));
CHECK(rel.duration() == 100000000);
CHECK(rel.to_secs() == rel.duration());
is_approx(rel.to_mins(), 1666666.666666);
is_approx(rel.to_hours(), 27777.777777);
is_approx(rel.to_days(), 1157.36574);
is_approx(rel.to_months(), 38.012191);
is_approx(rel.to_years(), 3.167682);
CHECK(rel.to_string() == "3Y 2M 8h 46m 40s");
}
}
TEST("includes") {
DateRel rel("2004-09-10", "2004-11-10");
CHECK(rel.includes(Date("2004-09-01")) == 1);
CHECK(rel.includes(Date("2004-09-10")) == 0);
CHECK(rel.includes(Date("2004-10-01")) == 0);
CHECK(rel.includes(Date("2004-11-10")) == 0);
CHECK(rel.includes(Date(1101848400)) == -1);
CHECK(DateRel("100s").includes(Date(123456)) == 0);
}
TEST("constants") {
CHECK(SEC == DateRel("1s"));
CHECK(MIN == DateRel("1m"));
CHECK(HOUR == DateRel("1h"));
CHECK(DAY == DateRel("1D"));
CHECK(WEEK == DateRel("7D"));
CHECK(MONTH == DateRel("1M"));
CHECK(YEAR == DateRel("1Y"));
}
TEST("different timezones") {
auto rel = DateRel(Date("2021-05-10T17:00:00+03:00"), Date("2021-05-10T17:00:00+03:00"));
CHECK(rel.duration() == 0);
rel = DateRel(Date("2021-05-10T17:00:00+04:00"), Date("2021-05-10T17:00:00+03:00"));
CHECK(rel.duration() == 3600);
rel = DateRel(Date("2021-05-10T17:00:00+02:00"), Date("2021-05-10T17:00:00+03:00"));
CHECK(rel.duration() == -3600);
rel = DateRel(Date("2021-05-10T17:00:00+02:00"), Date("2021-05-10T17:00:00", tzget("Europe/Moscow")));
CHECK(rel.duration() == -3600);
}