1 #include "../chrono/datetime.h" 2 #include "../chrono/format.h" 3 #include "../chrono/period.h" 4 #include "../chrono/timespan.h" 5 #include "../conversion/conversionexception.h" 6 #include "../tests/testutils.h" 8 #include <cppunit/TestFixture.h> 9 #include <cppunit/extensions/HelperMacros.h> 29 CPPUNIT_TEST(testDateTime);
30 CPPUNIT_TEST(testTimeSpan);
31 CPPUNIT_TEST(testOperators);
32 CPPUNIT_TEST(testHashing);
33 CPPUNIT_TEST_SUITE_END();
57 const auto test1 = DateTime::fromDateAndTime(2012, 2, 29, 15, 34, 20, 33.0);
58 CPPUNIT_ASSERT_EQUAL(2012, test1.year());
59 CPPUNIT_ASSERT_EQUAL(2, test1.month());
60 CPPUNIT_ASSERT_EQUAL(29, test1.day());
61 CPPUNIT_ASSERT_EQUAL(34, test1.minute());
62 CPPUNIT_ASSERT_EQUAL(20, test1.second());
63 CPPUNIT_ASSERT_EQUAL(33, test1.millisecond());
64 CPPUNIT_ASSERT(test1.dayOfWeek() == DayOfWeek::Wednesday);
65 CPPUNIT_ASSERT_EQUAL((31 + 29), test1.dayOfYear());
66 CPPUNIT_ASSERT(test1.isLeapYear());
67 CPPUNIT_ASSERT_EQUAL(
"Wed 2012-02-29 15:34:20.033"s, test1.toString(DateTimeOutputFormat::DateTimeAndShortWeekday));
70 const auto fromTimeStampGmt = DateTime::fromTimeStampGmt(1453840331), fromTimeStamp = DateTime::fromTimeStamp(1453840331);
71 CPPUNIT_ASSERT_EQUAL(
"Tue 2016-01-26 20:32:11"s, fromTimeStampGmt.toString(DateTimeOutputFormat::DateTimeAndShortWeekday));
72 CPPUNIT_ASSERT(fabs((fromTimeStamp - fromTimeStampGmt).totalDays()) <= 1.0);
73 CPPUNIT_ASSERT_EQUAL(
DateTime(), DateTime::fromTimeStamp(0));
78 CPPUNIT_ASSERT_THROW(DateTime::fromDateAndTime(0, 2, 29, 15, 34, 20, 33),
ConversionException);
79 CPPUNIT_ASSERT_THROW(DateTime::fromDateAndTime(2013, 2, 29, 15, 34, 20, 33),
ConversionException);
80 CPPUNIT_ASSERT_THROW(DateTime::fromDateAndTime(2012, 2, 29, 15, 61, 20, 33),
ConversionException);
81 CPPUNIT_ASSERT_THROW(DateTime::fromDateAndTime(2012, 4, 31, 15, 0, 20, 33),
ConversionException);
82 CPPUNIT_ASSERT_THROW(DateTime::fromDateAndTime(2012, 3, 31, 15, 0, 61, 33),
ConversionException);
84 CPPUNIT_ASSERT_THROW(DateTime::fromDateAndTime(2012, 1, 1, 15, 2, 1, 2000.0),
ConversionException);
87 CPPUNIT_ASSERT_EQUAL(test1, DateTime::fromString(
"2012-02-29 15:34:20.033"));
88 CPPUNIT_ASSERT_EQUAL(
"2012-02-29 15:34:20.033"s, test1.toString(DateTimeOutputFormat::DateAndTime,
false));
89 CPPUNIT_ASSERT_THROW(TimeSpan::fromString(
"2012-02-29 15:34:34:20.033"),
ConversionException);
90 const auto test3 = DateTime::fromIsoString(
"2016-08-29T21:32:31.125+02:00");
91 CPPUNIT_ASSERT_EQUAL(
"2016-08-29T21:32:31.125+02:00"s, test3.first.toIsoString(test3.second));
95 #if defined(PLATFORM_UNIX) 96 const auto delta = DateTime::gmtNow() - DateTime::exactGmtNow();
97 CPPUNIT_ASSERT(delta < TimeSpan::fromSeconds(2) && delta > TimeSpan::fromSeconds(-2));
107 CPPUNIT_ASSERT_EQUAL(
TimeSpan(), TimeSpan::fromString(
string()));
108 CPPUNIT_ASSERT_EQUAL(TimeSpan::fromSeconds(5.0), TimeSpan::fromString(
"5.0"));
109 CPPUNIT_ASSERT_EQUAL(TimeSpan::fromMinutes(5.5), TimeSpan::fromString(
"5:30"));
110 CPPUNIT_ASSERT_EQUAL(TimeSpan::fromHours(7) + TimeSpan::fromMinutes(5.5), TimeSpan::fromString(
"7:5:30"));
111 const auto test1 = TimeSpan::fromString(
"2:34:53:2.5");
113 CPPUNIT_ASSERT_EQUAL(3, test1.days());
114 CPPUNIT_ASSERT_EQUAL(10, test1.hours());
115 CPPUNIT_ASSERT_EQUAL(53, test1.minutes());
116 CPPUNIT_ASSERT_EQUAL(2, test1.seconds());
117 CPPUNIT_ASSERT_EQUAL(500, test1.milliseconds());
118 CPPUNIT_ASSERT(test1.totalDays() > 3.0 && test1.totalDays() < 4.0);
119 CPPUNIT_ASSERT(test1.totalHours() > (2 * 24 + 34) && test1.totalHours() < (2 * 24 + 35));
120 CPPUNIT_ASSERT(test1.totalMinutes() > (2 * 24 * 60 + 34 * 60 + 53) && test1.totalHours() < (2 * 24 * 60 + 34 * 60 + 54));
122 CPPUNIT_ASSERT_EQUAL(
"3 d 10 h 53 min 2 s 500 ms"s, test1.toString(TimeSpanOutputFormat::WithMeasures,
false));
123 CPPUNIT_ASSERT_EQUAL(
"07:05:30"s, (TimeSpan::fromHours(7) + TimeSpan::fromMinutes(5.5)).toString());
124 CPPUNIT_ASSERT_EQUAL(
"-5 s"s, TimeSpan::fromSeconds(-5.0).toString(TimeSpanOutputFormat::WithMeasures,
false));
125 CPPUNIT_ASSERT_EQUAL(
"0 s"s,
TimeSpan().toString(TimeSpanOutputFormat::WithMeasures,
false));
126 CPPUNIT_ASSERT_EQUAL(
"5e+02 µs"s, TimeSpan::fromMilliseconds(0.5).toString(TimeSpanOutputFormat::WithMeasures,
false));
137 auto dateTime = DateTime::fromDateAndTime(1999, 1, 5, 4, 16);
138 CPPUNIT_ASSERT_EQUAL(7, (dateTime + TimeSpan::fromDays(2)).day());
139 CPPUNIT_ASSERT_EQUAL(6, (dateTime + TimeSpan::fromHours(24)).day());
140 CPPUNIT_ASSERT_EQUAL(3, (dateTime + TimeSpan::fromHours(24) + TimeSpan::fromHours(-1)).hour());
141 CPPUNIT_ASSERT_EQUAL(17, (dateTime + TimeSpan::fromHours(24) - TimeSpan::fromMinutes(-1)).minute());
142 dateTime += TimeSpan::fromDays(365);
143 CPPUNIT_ASSERT_EQUAL(2000, dateTime.year());
144 CPPUNIT_ASSERT_EQUAL(5, dateTime.day());
145 CPPUNIT_ASSERT_EQUAL(2,
Period(dateTime, dateTime + TimeSpan::fromDays(62)).months());
153 set<DateTime> dateTimes;
154 dateTimes.emplace(DateTime::fromDate(2500, 2, 1));
155 dateTimes.emplace(DateTime::fromDate(2500, 2, 2));
156 dateTimes.emplace(DateTime::fromDate(2500, 2, 1));
157 CPPUNIT_ASSERT_EQUAL(2_st, dateTimes.size());
159 set<TimeSpan> timeSpans;
160 timeSpans.emplace(TimeSpan::fromDays(5));
161 timeSpans.emplace(TimeSpan::fromDays(10));
162 timeSpans.emplace(TimeSpan::fromDays(5));
163 CPPUNIT_ASSERT_EQUAL(2_st, timeSpans.size());
CPPUNIT_TEST_SUITE_REGISTRATION(ChronoTests)
Represents an instant in time, typically expressed as a date and time of day.
Contains classes providing a means for handling date and time information.
The ConversionException class is thrown by the various conversion functions of this library when a co...
Represents a time interval.
Contains literals to ease asserting with CPPUNIT_ASSERT_EQUAL.
void testHashing()
Tests hashing DateTime / TimeSpan by using in a set.
void testOperators()
Tests operators of DateTime / TimeSpan.
void testDateTime()
Tests most important DateTime features.
void testTimeSpan()
Tests most important TimeSpan features.
Represents a period of time.
The ChronoTests class tests classes and methods of the ChronoUtilities namespace. ...
Contains several functions providing conversions between different data types.