#include "test.h"

#define TEST(name) TEST_CASE("operations: " name, "[operations]")

TEST("compare") {
    Date date(1000);
    CHECK(date > Date(0));
    CHECK(date > Date(999));
    CHECK(date >= Date(1000));
    CHECK(date < Date(1001));
    CHECK(date > Date("1970-01-01 03:16:00"));
    CHECK(date < Date("1970-01-01 03:17:00"));
    CHECK(date == Date("1970-01-01 03:16:40"));
    CHECK(date.to_string() == "1970-01-01 03:16:40");
    CHECK(Date("2013-05-06 01:02:03") < Date("2013-05-06 01:02:04"));
    CHECK(Date("2013-05-06 01:02:04") == Date("2013-05-06 01:02:04"));
    CHECK(Date("2001-09-09 05:46:40") == Date(1000000000));
    CHECK(Date("2001-09-09 05:46:40") < Date(1000000001));
    CHECK(Date("2001-09-09 05:46:40") > Date(999999999));
}

TEST("add relative date") {
    Date date("2013-01-01");

    CHECK(date + DateRel(0) == date);

    CHECK(date + DateRel(0, 0, 0, 0, 0, 10) == Date("2013-01-01 00:00:10"));
    CHECK(date + DateRel("15m 60s") == Date("2013-01-01 00:15:60"));
    CHECK(date + DateRel("23h 15m 60s") == Date("2013-01-01 23:15:60"));
    CHECK(date + DateRel("24h 15m 60s") == Date("2013-01-02 00:15:60"));
    CHECK(date + 10*DAY == Date("2013-01-11"));
    CHECK(date + MONTH == Date("2013-02-01"));
    CHECK(date + 2000*YEAR == Date("4013-01-01"));

    date += DateRel("1M");
    CHECK(date == Date("2013-02-01"));
    date += 27*DAY;
    CHECK(date == Date("2013-02-28"));
    date += DAY;
    CHECK(date == Date("2013-03-01"));
}

TEST("check ops table") {
    SECTION("+") {
        Date date("2012-03-02 15:47:32");
        CHECK(date + DateRel("1D") == Date("2012-03-03 15:47:32"));
        CHECK(DateRel("1Y 1m") + date == Date("2013-03-02 15:48:32"));
    }
    SECTION("+=") {
        Date date("2012-03-02 15:47:32");
        date += MONTH;
        CHECK(date.to_string() == "2012-04-02 15:47:32");
    }
    SECTION("-") {
        Date date("2012-03-02 15:47:32");
        CHECK(date - DateRel("1D") == Date("2012-03-01 15:47:32"));
        CHECK(date - HOUR == Date("2012-03-02 14:47:32"));
        CHECK(Date("2013-04-03 16:48:33") - date == DateRel(Date("2012-03-02 15:47:32"), Date("2013-04-03 16:48:33")));
    }
    SECTION("-=") {
        Date date("2012-03-02 15:47:32");
        date -= MONTH;
        CHECK(date.to_string() == "2012-02-02 15:47:32");
        CHECK(date+1 == Date("2012-02-02 15:47:33"));
        CHECK(date-1 == Date("2012-02-02 15:47:31"));
    }
    SECTION("<=>") {
        Date date("2012-03-02 15:47:32");
        CHECK(date > Date("2012-03-02 15:47:31"));
        CHECK(date < Date("2012-03-02 15:47:33"));
        CHECK(date > Date(1330688851));
        CHECK(date < Date(1330688853));
        CHECK(date == Date(1330688852));
    }
    SECTION("eq") {
        Date date("2012-03-02 15:47:32");
        CHECK(date != Date("2012-03-02 15:47:31"));
        CHECK(!(date == Date("2012-03-02 15:47:31")));
        CHECK(date == Date(1330688852));
        CHECK(!(date != Date(1330688852)));
    }
}