#include "../test.h"

#define TEST(name) TEST_CASE("relative-format-iso8601: " name, "[relative-format-iso8601]")

TEST("iso8601 duration") {
    auto fmt = DateRel::Format::iso8601d;

    SECTION("s") {
        DateRel rel("PT6S");
        CHECK(rel.sec() == 6);
        CHECK(rel.to_secs() == 6);
        is_approx(rel.to_mins(), 0.1);
        CHECK(rel.to_string(fmt) == "PT6S");
    }

    SECTION("m") {
        DateRel rel("PT5M");
        CHECK(rel.min() == 5);
        CHECK(rel.to_secs() == 300);
        CHECK(rel.to_string(fmt) == "PT5M");
    }

    SECTION("h") {
        DateRel rel("PT2H");
        CHECK(rel.hour() == 2);
        CHECK(rel.to_secs() == 7200);
        CHECK(rel.to_string(fmt) == "PT2H");
    }

    SECTION("hms") {
        DateRel rel("PT1H1M1S");
        CHECK(rel.sec() == 1);
        CHECK(rel.min() == 1);
        CHECK(rel.hour() == 1);
        CHECK(rel.to_secs() == 3661);
        CHECK(rel.to_string(fmt) == "PT1H1M1S");
    }

    SECTION("M") {
        DateRel rel("P-9999M");
        CHECK(rel.month() == -9999);
        CHECK(rel.to_string(fmt) == "P-9999M");
    }

    SECTION("Y") {
        DateRel rel("P12Y");
        CHECK(rel.year() == 12);
        CHECK(rel.to_string(fmt) == "P12Y");
    }

    SECTION("YMDhms") {
        DateRel rel("P1Y2M3DT4H5M6S");
        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(fmt) == "P1Y2M3DT4H5M6S");
    }

    SECTION("negative YMDhms") {
        DateRel rel("P-1Y2M-3DT-4H-5M-6S");
        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(fmt) == "P-1Y2M-3DT-4H-5M-6S");
    }

    SECTION("does not depend on from date") {
        DateRel rel("10s");
        rel.from(Date::now());
        CHECK(rel.to_string(fmt) == "PT10S");
    }
}

TEST("iso8601 interval") {
    auto fmt = DateRel::Format::iso8601i;

    SECTION("normal") {
        DateRel rel("2019-12-31T23:59:59/PT10S");
        CHECK(rel.to_string() == "10s");
        CHECK(rel.from() == Date("2019-12-31 23:59:59"));
        CHECK(rel.to_string(DateRel::Format::iso8601d) == "PT10S");
        CHECK(rel.to_string(fmt) == "2019-12-31T23:59:59+03/PT10S");
    }

    SECTION("fallbacks to duration format when no date") {
        DateRel rel("10s");
        CHECK(rel.to_string(fmt) == "PT10S");
    }
}