1 #include <msp/time/datetime.h>
2 #include <msp/time/timestamp.h>
3 #include <msp/time/timezone.h>
4 #include <msp/time/units.h>
5 #include <msp/test/test.h>
10 class DateTimeTests: public Test::RegisteredTest<DateTimeTests>
15 static const char *get_name() { return "DateTime"; }
27 DateTimeTests::DateTimeTests()
29 add(&DateTimeTests::add_days, "add_days");
30 add(&DateTimeTests::add_timedelta, "+= TimeDelta");
31 add(&DateTimeTests::leap_year, "Leap years");
32 add(&DateTimeTests::format, "Formatting");
33 add(&DateTimeTests::timestamp, "Timestamp conversion");
34 add(&DateTimeTests::timezone, "Timezone conversion");
37 void DateTimeTests::add_days()
39 Time::DateTime dt(2010, 1, 1);
41 EXPECT_EQUAL(dt, Time::DateTime(2010, 1, 2));
43 EXPECT_EQUAL(dt, Time::DateTime(2010, 2, 28));
45 EXPECT_EQUAL(dt, Time::DateTime(2011, 1, 1));
47 EXPECT_EQUAL(dt, Time::DateTime(2009, 12, 31));
50 void DateTimeTests::add_timedelta()
52 Time::DateTime dt(2010, 1, 1, 23, 50, 0);
54 EXPECT_EQUAL(dt, Time::DateTime(2010, 1, 2, 0, 10, 0));
55 dt += 23*Time::hour+50*Time::min;
56 EXPECT_EQUAL(dt, Time::DateTime(2010, 1, 3));
58 EXPECT_EQUAL(dt, Time::DateTime(2011, 1, 2));
61 void DateTimeTests::leap_year()
63 Time::DateTime dt(1996, 2, 1);
65 EXPECT_EQUAL(dt, Time::DateTime(1996, 3, 1));
67 dt = Time::DateTime(2000, 2, 1);
69 EXPECT_EQUAL(dt, Time::DateTime(2000, 3, 1));
71 dt = Time::DateTime(2100, 2, 1);
73 EXPECT_EQUAL(dt, Time::DateTime(2100, 3, 2));
75 dt = Time::DateTime(1996, 2, 1);
77 EXPECT_EQUAL(dt, Time::DateTime(2004, 1, 30));
79 dt = Time::DateTime(2096, 2, 1);
81 EXPECT_EQUAL(dt, Time::DateTime(2104, 1, 31));
83 dt = Time::DateTime(2010, 2, 1);
84 dt.add_days(400*365+96);
85 EXPECT_EQUAL(dt, Time::DateTime(2410, 1, 31));
88 void DateTimeTests::format()
90 Time::DateTime dt(2010, 4, 27, 13, 57, 12);
91 EXPECT_EQUAL(dt.format("%Y-%m-%d"), "2010-04-27");
92 EXPECT_EQUAL(dt.format("%d%m%y"), "270410");
93 EXPECT_EQUAL(dt.format("%H:%M:%S"), "13:57:12");
94 EXPECT_EQUAL(dt.format("%I:%M %p"), "01:57 PM");
95 EXPECT_EQUAL(Time::DateTime(2010, 4, 27, 12, 0, 0).format("%p"), "PM");
96 EXPECT_EQUAL(dt.format_rfc3339(), "2010-04-27T13:57:12Z");
97 dt.set_timezone(Time::TimeZone(120));
98 EXPECT_EQUAL(dt.format_rfc3339(), "2010-04-27T13:57:12+02:00");
101 void DateTimeTests::timestamp()
103 Time::DateTime dt(2010, 1, 1);
104 Time::TimeStamp ts = dt.get_timestamp();
105 Time::DateTime dt2(ts);
106 EXPECT_EQUAL(dt, dt2);
109 void DateTimeTests::timezone()
111 Time::DateTime dt(2010, 1, 1, 2, 0, 0);
112 dt.convert_timezone(Time::TimeZone(120));
113 EXPECT_EQUAL(dt, Time::DateTime(2010, 1, 1, 4, 0, 0));
114 dt.convert_timezone(Time::TimeZone(-300));
115 EXPECT_EQUAL(dt, Time::DateTime(2009, 12, 31, 21, 0, 0));
116 dt.convert_timezone(Time::TimeZone::utc());
117 EXPECT_EQUAL(dt, Time::DateTime(2010, 1, 1, 2, 0, 0));