]> git.tdb.fi Git - libs/core.git/blob - tests/datetime.cpp
Add unit tests
[libs/core.git] / tests / datetime.cpp
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>
6
7 using namespace std;
8 using namespace Msp;
9
10 class DateTimeTests: public Test::RegisteredTest<DateTimeTests>
11 {
12 public:
13         DateTimeTests();
14
15         static const char *get_name() { return "DateTime"; }
16
17 private:
18         void add_days();
19         void add_timedelta();
20         void leap_year();
21         void format();
22         void timestamp();
23         void timezone();
24 };
25
26
27 DateTimeTests::DateTimeTests()
28 {
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");
35 }
36
37 void DateTimeTests::add_days()
38 {
39         Time::DateTime dt(2010, 1, 1);
40         dt.add_days(1);
41         EXPECT_EQUAL(dt, Time::DateTime(2010, 1, 2));
42         dt.add_days(57);
43         EXPECT_EQUAL(dt, Time::DateTime(2010, 2, 28));
44         dt.add_days(307);
45         EXPECT_EQUAL(dt, Time::DateTime(2011, 1, 1));
46         dt.add_days(-366);
47         EXPECT_EQUAL(dt, Time::DateTime(2009, 12, 31));
48 }
49
50 void DateTimeTests::add_timedelta()
51 {
52         Time::DateTime dt(2010, 1, 1, 23, 50, 0);
53         dt += 20*Time::min;
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));
57         dt += 52*Time::week;
58         EXPECT_EQUAL(dt, Time::DateTime(2011, 1, 2));
59 }
60
61 void DateTimeTests::leap_year()
62 {
63         Time::DateTime dt(1996, 2, 1);
64         dt.add_days(29);
65         EXPECT_EQUAL(dt, Time::DateTime(1996, 3, 1));
66
67         dt = Time::DateTime(2000, 2, 1);
68         dt.add_days(29);
69         EXPECT_EQUAL(dt, Time::DateTime(2000, 3, 1));
70
71         dt = Time::DateTime(2100, 2, 1);
72         dt.add_days(29);
73         EXPECT_EQUAL(dt, Time::DateTime(2100, 3, 2));
74
75         dt = Time::DateTime(1996, 2, 1);
76         dt.add_days(8*365);
77         EXPECT_EQUAL(dt, Time::DateTime(2004, 1, 30));
78
79         dt = Time::DateTime(2096, 2, 1);
80         dt.add_days(8*365);
81         EXPECT_EQUAL(dt, Time::DateTime(2104, 1, 31));
82
83         dt = Time::DateTime(2010, 2, 1);
84         dt.add_days(400*365+96);
85         EXPECT_EQUAL(dt, Time::DateTime(2410, 1, 31));
86 }
87
88 void DateTimeTests::format()
89 {
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");
99 }
100
101 void DateTimeTests::timestamp()
102 {
103         Time::DateTime dt(2010, 1, 1);
104         Time::TimeStamp ts = dt.get_timestamp();
105         Time::DateTime dt2(ts);
106         EXPECT_EQUAL(dt, dt2);
107 }
108
109 void DateTimeTests::timezone()
110 {
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));
118 }