1#define CHRONO_UTILITIES_TIMESPAN_INTEGER_SCALE_OVERLOADS
3#include "../chrono/datetime.h"
4#include "../chrono/format.h"
5#include "../chrono/period.h"
6#include "../chrono/timespan.h"
7#include "../conversion/conversionexception.h"
8#include "../tests/testutils.h"
10#include <cppunit/TestFixture.h>
11#include <cppunit/extensions/HelperMacros.h>
21using namespace CPPUNIT_NS;
30static_assert(DateTime::eternity().isEternity() && !
DateTime().
isEternity(),
"isEternity()");
31static constexpr auto dateFromUnixEpoch(
32 DateTime::unixEpochStart() + TimeSpan::fromHours(1.0) + TimeSpan::fromMinutes(2.0) + TimeSpan::fromSeconds(3.1256789));
33static_assert(dateFromUnixEpoch.dayOfWeek() == DayOfWeek::Thursday,
"dayOfWeek()");
34static_assert(dateFromUnixEpoch.hour() == 1,
"hour()");
35static_assert(dateFromUnixEpoch.minute() == 2,
"minute()");
36static_assert(dateFromUnixEpoch.second() == 3,
"second()");
37static_assert(dateFromUnixEpoch.millisecond() == 125,
"millisecond()");
38static_assert(dateFromUnixEpoch.microsecond() == 678,
"microsecond()");
39static_assert(dateFromUnixEpoch.nanosecond() == 900,
"nanosecond()");
40static_assert(dateFromUnixEpoch.isSameDay(DateTime::unixEpochStart()),
"isSameDay()");
41static_assert(!dateFromUnixEpoch.isSameDay(DateTime::unixEpochStart() + TimeSpan::fromHours(24.0)),
"!isSameDay()");
47static_assert(TimeSpan::infinity().isInfinity() && !
TimeSpan().
isInfinity(),
"isInfinity()");
49static_assert(TimeSpan::fromMilliseconds(1.0125).nanoseconds() == 500,
"fromMilliseconds()/nanoseconds()");
50static_assert(TimeSpan::fromMilliseconds(1.0125).microseconds() == 12,
"fromMilliseconds()/microseconds()");
51static_assert(TimeSpan::fromMilliseconds(1.0125).milliseconds() == 1,
"fromMilliseconds()/milliseconds()");
52static_assert(TimeSpan::fromSeconds(
TimeSpan::TickType(61)).seconds() == 1,
"fromSeconds()/seconds()");
53static_assert(TimeSpan::fromSeconds(
TimeSpan::TickType(61)).minutes() == 1,
"fromSeconds()/minutes()");
54static_assert(TimeSpan::fromMinutes(
TimeSpan::TickType(61)).minutes() == 1,
"fromMinutes()/minutes()");
55static_assert(TimeSpan::fromHours(
TimeSpan::TickType(25)).hours() == 1,
"fromMinutes()/hours()");
56static_assert(TimeSpan::fromDays(20.5).days() == 20,
"fromDays()/days()");
57static_assert(TimeSpan::fromMinutes(1.5).totalMicroseconds() == 90e6,
"totalMicroseconds()");
58static_assert(TimeSpan::fromMinutes(1.5).totalMilliseconds() == 90e3,
"totalMilliseconds()");
59static_assert(TimeSpan::fromMinutes(1.5).totalSeconds() == 90.0,
"totalSeconds()");
60static_assert(TimeSpan::fromHours(1.5).totalMinutes() == 90.0,
"totalMinutes()");
61static_assert(TimeSpan::fromDays(1.5).totalHours() == 36.0,
"totalHours()");
62static_assert(TimeSpan::fromDays(20.5).totalDays() == 20.5,
"totalDays()");
78 CPPUNIT_TEST_SUITE_END();
104 CPPUNIT_ASSERT_EQUAL(DateTime::daysInMonth(2000, 2), 29);
105 CPPUNIT_ASSERT_EQUAL(DateTime::daysInMonth(2001, 2), 28);
106 CPPUNIT_ASSERT_EQUAL(DateTime::daysInMonth(2100, 2), 28);
107 const auto test1 = DateTime::fromDateAndTime(2012, 2, 29, 15, 34, 20, 33.0);
108 CPPUNIT_ASSERT_EQUAL(2012, test1.year());
109 CPPUNIT_ASSERT_EQUAL(2, test1.month());
110 CPPUNIT_ASSERT_EQUAL(29, test1.day());
111 CPPUNIT_ASSERT_EQUAL(15, test1.hour());
112 CPPUNIT_ASSERT_EQUAL(34, test1.minute());
113 CPPUNIT_ASSERT_EQUAL(20, test1.second());
114 CPPUNIT_ASSERT_EQUAL(33, test1.millisecond());
115 CPPUNIT_ASSERT_EQUAL(DayOfWeek::Wednesday, test1.dayOfWeek());
116 CPPUNIT_ASSERT_EQUAL((31 + 29), test1.dayOfYear());
117 CPPUNIT_ASSERT(test1.isLeapYear());
118 CPPUNIT_ASSERT(test1.isSameDay(test1 + TimeSpan::fromHours(8.0)));
119 CPPUNIT_ASSERT(!test1.isSameDay(test1 + TimeSpan::fromHours(9.0)));
120 CPPUNIT_ASSERT_EQUAL(
"Wed 2012-02-29 15:34:20.033"s, test1.toString(DateTimeOutputFormat::DateTimeAndShortWeekday));
121 const auto test2 = DateTime::fromDateAndTime(1, 1, 1, 15, 34, 20, 33.0);
122 CPPUNIT_ASSERT_EQUAL(1, test2.year());
123 CPPUNIT_ASSERT_EQUAL(1, test2.month());
124 CPPUNIT_ASSERT_EQUAL(1, test2.day());
125 CPPUNIT_ASSERT_EQUAL(15, test2.hour());
126 CPPUNIT_ASSERT_EQUAL(34, test2.minute());
127 CPPUNIT_ASSERT_EQUAL(20, test2.second());
128 CPPUNIT_ASSERT_EQUAL(33, test2.millisecond());
131 const auto timeStamp =
static_cast<time_t
>(1453840331);
132 const auto fromTimeStampGmt = DateTime::fromTimeStampGmt(timeStamp), fromTimeStamp = DateTime::fromTimeStamp(timeStamp);
133 CPPUNIT_ASSERT_EQUAL(
"Tue 2016-01-26 20:32:11"s, fromTimeStampGmt.toString(DateTimeOutputFormat::DateTimeAndShortWeekday));
134 CPPUNIT_ASSERT(fabs((fromTimeStamp - fromTimeStampGmt).totalDays()) <= 1.0);
135 CPPUNIT_ASSERT_EQUAL(
DateTime(), DateTime::fromTimeStamp(0));
136 CPPUNIT_ASSERT_EQUAL(timeStamp, fromTimeStampGmt.toTimeStamp());
139 const auto fromChronoTimePointGmt = DateTime::fromChronoTimePointGmt(chrono::system_clock::from_time_t(timeStamp));
140 CPPUNIT_ASSERT_EQUAL(
"Tue 2016-01-26 20:32:11"s, fromChronoTimePointGmt.toString(DateTimeOutputFormat::DateTimeAndShortWeekday));
145 CPPUNIT_ASSERT_THROW(DateTime::fromDateAndTime(0, 2, 29, 15, 34, 20, 33),
ConversionException);
146 CPPUNIT_ASSERT_THROW(DateTime::fromDateAndTime(2013, 2, 29, 15, 34, 20, 33),
ConversionException);
147 CPPUNIT_ASSERT_THROW(DateTime::fromDateAndTime(2012, 2, 29, 15, 61, 20, 33),
ConversionException);
148 CPPUNIT_ASSERT_THROW(DateTime::fromDateAndTime(2012, 4, 31, 15, 0, 20, 33),
ConversionException);
149 CPPUNIT_ASSERT_THROW(DateTime::fromDateAndTime(2012, 3, 31, 15, 0, 61, 33),
ConversionException);
150 CPPUNIT_ASSERT_THROW(DateTime::fromDateAndTime(2012, 1, 1, 61, 2, 1),
ConversionException);
151 CPPUNIT_ASSERT_THROW(DateTime::fromDateAndTime(2012, 1, 1, 15, 2, 1, 2000.0),
ConversionException);
154 CPPUNIT_ASSERT_EQUAL(test1, DateTime::fromString(
"2012-02-29 15:34:20.033"));
155 CPPUNIT_ASSERT_EQUAL_MESSAGE(
"surplus parts ignored", test1, DateTime::fromString(
"2012-02-29 15:34:20.033:12"));
156 CPPUNIT_ASSERT_EQUAL(
"2012-02-29 15:34:20.033"s, test1.toString(DateTimeOutputFormat::DateAndTime,
false));
157 CPPUNIT_ASSERT_THROW(TimeSpan::fromString(
"2012-02-29 15:34:34:20.033"),
ConversionException);
158 const auto test3 = DateTime::fromIsoString(
"2016-08-29T21:32:31.125+02:00");
159 CPPUNIT_ASSERT_EQUAL(
"2016-08-29T21:32:31.125+02:00"s, test3.first.toIsoString(test3.second));
162 const auto test4 = DateTime::fromIsoString(
"2017-08-23T19:40:15.985077682+02:30");
163 CPPUNIT_ASSERT_EQUAL(2.5, test4.second.totalHours());
164 CPPUNIT_ASSERT_EQUAL(15, test4.first.second());
165 CPPUNIT_ASSERT_EQUAL(985, test4.first.millisecond());
166 CPPUNIT_ASSERT_EQUAL(77, test4.first.microsecond());
167 CPPUNIT_ASSERT_EQUAL(600, test4.first.nanosecond());
168 CPPUNIT_ASSERT_EQUAL(
"2017-08-23T19:40:15.9850776+02:30"s, test4.first.toIsoString(test4.second));
170 const auto test5 = DateTime::fromIsoString(
"2017-08-23T19:40:15.985077682-02:30");
171 CPPUNIT_ASSERT_EQUAL(-2.5, test5.second.totalHours());
172 CPPUNIT_ASSERT_EQUAL(15, test5.first.second());
173 CPPUNIT_ASSERT_EQUAL(985, test5.first.millisecond());
174 CPPUNIT_ASSERT_EQUAL(77, test5.first.microsecond());
175 CPPUNIT_ASSERT_EQUAL(600, test5.first.nanosecond());
176 CPPUNIT_ASSERT_EQUAL(
"2017-08-23T19:40:15.9850776-02:30"s, test5.first.toIsoString(test5.second));
178 CPPUNIT_ASSERT_EQUAL_MESSAGE(
"only year", DateTime::fromDate(2008), DateTime::fromIsoStringGmt(
"2008"));
179 CPPUNIT_ASSERT_EQUAL_MESSAGE(
"only year and month", DateTime::fromDate(2008, 12), DateTime::fromIsoStringGmt(
"2008-12"));
180 CPPUNIT_ASSERT_EQUAL_MESSAGE(
"only date", DateTime::fromDate(2008, 12, 5), DateTime::fromIsoStringGmt(
"2008-12-05"));
181 CPPUNIT_ASSERT_EQUAL_MESSAGE(
"Zulu time",
TimeSpan(), DateTime::fromIsoString(
"2017-08-23T19:40:15.985077682Z").second);
182 CPPUNIT_ASSERT_EQUAL_MESSAGE(
"no minutes", TimeSpan::fromHours(3.0), DateTime::fromIsoString(
"2017-08-23T19:40:15.985077682+03").second);
183 const auto test6 = DateTime::fromIsoString(
"1970-01-01T01:02:03+01:00");
184 CPPUNIT_ASSERT_EQUAL_MESSAGE(
"no seconds fraction (positive timezone offset, 1)", DateTime::fromDateAndTime(1970, 1, 1, 1, 2, 3), test6.first);
185 CPPUNIT_ASSERT_EQUAL_MESSAGE(
"no seconds fraction (positive timezone offset, 2)", TimeSpan::fromHours(1.0), test6.second);
186 const auto test7 = DateTime::fromIsoString(
"2021-05-20T23:02:45-04:00");
187 CPPUNIT_ASSERT_EQUAL_MESSAGE(
"no seconds fraction (negative timezone offset, 1)", DateTime::fromDateAndTime(2021, 5, 20, 23, 2, 45), test7.first);
188 CPPUNIT_ASSERT_EQUAL_MESSAGE(
"no seconds fraction (negative timezone offset, 2)", TimeSpan::fromHours(-4.0), test7.second);
190 CPPUNIT_ASSERT_EQUAL_MESSAGE(
"no separators", test5.first - test5.second, DateTime::fromIsoStringGmt(
"20170823T194015.985077682-0230"));
191 CPPUNIT_ASSERT_EQUAL_MESSAGE(
192 "not even T separator", DateTime::fromDateAndTime(2017, 8, 23, 19, 40, 15), DateTime::fromIsoStringGmt(
"20170823194015"));
193 CPPUNIT_ASSERT_THROW_MESSAGE(
"too many digits after seconds", DateTime::fromIsoString(
"2017082319401516"),
ConversionException);
194 CPPUNIT_ASSERT_THROW_MESSAGE(
"too many digits after timezone offset", DateTime::fromIsoString(
"20170823194015.16+02300"),
ConversionException);
196 CPPUNIT_ASSERT_THROW_MESSAGE(
"digits after Z", DateTime::fromIsoString(
"2017-O8-23T19:40:15.985077682Z02:00"),
ConversionException);
197 CPPUNIT_ASSERT_THROW_MESSAGE(
"invalid letter", DateTime::fromIsoString(
"2017-O8-23T19:40:15.985077682:+02:00"),
ConversionException);
198 CPPUNIT_ASSERT_THROW_MESSAGE(
"invalid T", DateTime::fromIsoString(
"2017-08-23T19:T40:15.985077682+02:00"),
ConversionException);
199 CPPUNIT_ASSERT_THROW_MESSAGE(
"invalid -", DateTime::fromIsoString(
"2017-08-23T19:40-15.985077682+02:00"),
ConversionException);
200 CPPUNIT_ASSERT_THROW_MESSAGE(
"invalid .", DateTime::fromIsoString(
"2017-08.5-23T19:40:15.985077682+02:00"),
ConversionException);
201 CPPUNIT_ASSERT_THROW_MESSAGE(
"invalid :", DateTime::fromIsoString(
"2017:08-23T19:40:15.985077682+02:00"),
ConversionException);
202 CPPUNIT_ASSERT_THROW_MESSAGE(
"invalid :", DateTime::fromIsoString(
"2017-08-23T19:40:15:985077682+02:00"),
ConversionException);
204 CPPUNIT_ASSERT_EQUAL(
"1234-05-06T07:08:09.0105005"s, DateTime::fromDateAndTime(1234, 5, 6, 7, 8, 9, 10.5005).toString(DateTimeOutputFormat::Iso));
205 CPPUNIT_ASSERT_EQUAL(
"1234-05-06T07:08:09.0105005"s,
206 DateTime::fromDateAndTime(1234, 5, 6, 7, 8, 9, 10.5005).toString(DateTimeOutputFormat::IsoOmittingDefaultComponents));
207 CPPUNIT_ASSERT_EQUAL(
"1234-05-06T07:08:09.010500"s,
208 DateTime::fromDateAndTime(1234, 5, 6, 7, 8, 9, 10.500).toString(DateTimeOutputFormat::IsoOmittingDefaultComponents));
209 CPPUNIT_ASSERT_EQUAL(
210 "1234-05-06T07:08:09.010"s, DateTime::fromDateAndTime(1234, 5, 6, 7, 8, 9, 10).toString(DateTimeOutputFormat::IsoOmittingDefaultComponents));
211 CPPUNIT_ASSERT_EQUAL(
212 "1234-05-06T07:08:09"s, DateTime::fromDateAndTime(1234, 5, 6, 7, 8, 9).toString(DateTimeOutputFormat::IsoOmittingDefaultComponents));
213 CPPUNIT_ASSERT_EQUAL(
214 "1234-05-06T07:08"s, DateTime::fromDateAndTime(1234, 5, 6, 7, 8).toString(DateTimeOutputFormat::IsoOmittingDefaultComponents));
215 CPPUNIT_ASSERT_EQUAL(
"1234-05-06T07"s, DateTime::fromDateAndTime(1234, 5, 6, 7).toString(DateTimeOutputFormat::IsoOmittingDefaultComponents));
216 CPPUNIT_ASSERT_EQUAL(
"1234-05-06"s, DateTime::fromDateAndTime(1234, 5, 6).toString(DateTimeOutputFormat::IsoOmittingDefaultComponents));
217 CPPUNIT_ASSERT_EQUAL(
"1234-05"s, DateTime::fromDateAndTime(1234, 5).toString(DateTimeOutputFormat::IsoOmittingDefaultComponents));
218 CPPUNIT_ASSERT_EQUAL(
"1234"s, DateTime::fromDateAndTime(1234).toString(DateTimeOutputFormat::IsoOmittingDefaultComponents));
219 CPPUNIT_ASSERT_EQUAL(
"0001"s,
DateTime().toString(DateTimeOutputFormat::IsoOmittingDefaultComponents));
222#if defined(PLATFORM_UNIX)
223 const auto delta = DateTime::gmtNow() - DateTime::exactGmtNow();
224 CPPUNIT_ASSERT(delta < TimeSpan::fromSeconds(2.0) && delta > TimeSpan::fromSeconds(-2.0));
234 auto expr = DateTimeExpression::fromIsoString(
"1");
235 auto parts = DateTimeParts::Year;
236 CPPUNIT_ASSERT_EQUAL(
DateTime(), expr.value);
237 CPPUNIT_ASSERT_EQUAL(
TimeSpan(), expr.delta);
238 CPPUNIT_ASSERT_EQUAL(parts, expr.parts);
239 CPPUNIT_ASSERT_EQUAL(
"0001"s, expr.toIsoString());
240 expr = DateTimeExpression::fromIsoString(
"1-1");
241 CPPUNIT_ASSERT_EQUAL(
DateTime(), expr.value);
242 CPPUNIT_ASSERT_EQUAL(
TimeSpan(), expr.delta);
243 CPPUNIT_ASSERT_EQUAL(parts |= DateTimeParts::Month, expr.parts);
244 CPPUNIT_ASSERT_EQUAL(
"0001-01"s, expr.toIsoString());
245 expr = DateTimeExpression::fromIsoString(
"1-1-1");
246 CPPUNIT_ASSERT_EQUAL(
DateTime(), expr.value);
247 CPPUNIT_ASSERT_EQUAL(
TimeSpan(), expr.delta);
248 CPPUNIT_ASSERT_EQUAL(parts |= DateTimeParts::Day, expr.parts);
249 CPPUNIT_ASSERT_EQUAL(
"0001-01-01"s, expr.toIsoString());
250 expr = DateTimeExpression::fromIsoString(
"1-1-1T0");
251 CPPUNIT_ASSERT_EQUAL(
DateTime(), expr.value);
252 CPPUNIT_ASSERT_EQUAL(
TimeSpan(), expr.delta);
253 CPPUNIT_ASSERT_EQUAL(parts |= DateTimeParts::Hour, expr.parts);
254 CPPUNIT_ASSERT_EQUAL(
"0001-01-01T00"s, expr.toIsoString());
255 expr = DateTimeExpression::fromIsoString(
"1-1-1T0:0");
256 CPPUNIT_ASSERT_EQUAL(
DateTime(), expr.value);
257 CPPUNIT_ASSERT_EQUAL(
TimeSpan(), expr.delta);
258 CPPUNIT_ASSERT_EQUAL(parts |= DateTimeParts::Minute, expr.parts);
259 CPPUNIT_ASSERT_EQUAL(
"0001-01-01T00:00"s, expr.toIsoString());
260 expr = DateTimeExpression::fromIsoString(
"1-1-1T0:0:0");
261 CPPUNIT_ASSERT_EQUAL(
DateTime(), expr.value);
262 CPPUNIT_ASSERT_EQUAL(
TimeSpan(), expr.delta);
263 CPPUNIT_ASSERT_EQUAL(parts |= DateTimeParts::Second, expr.parts);
264 CPPUNIT_ASSERT_EQUAL(
"0001-01-01T00:00:00"s, expr.toIsoString());
265 expr = DateTimeExpression::fromIsoString(
"1-1-1T0:0:0.0");
266 CPPUNIT_ASSERT_EQUAL(
DateTime(), expr.value);
267 CPPUNIT_ASSERT_EQUAL(
TimeSpan(), expr.delta);
268 CPPUNIT_ASSERT_EQUAL(parts |= DateTimeParts::SubSecond, expr.parts);
269 CPPUNIT_ASSERT_EQUAL(
"0001-01-01T00:00:00.000"s, expr.toIsoString());
270 expr = DateTimeExpression::fromIsoString(
"1-1-1T0:0:0.0+0");
271 CPPUNIT_ASSERT_EQUAL(
DateTime(), expr.value);
272 CPPUNIT_ASSERT_EQUAL(
TimeSpan(), expr.delta);
273 CPPUNIT_ASSERT_EQUAL(parts |= DateTimeParts::DeltaHour, expr.parts);
274 CPPUNIT_ASSERT_EQUAL(
"0001-01-01T00:00:00.000+00"s, expr.toIsoString());
275 expr = DateTimeExpression::fromIsoString(
"1-1-1T0:0:0.0-0:0");
276 CPPUNIT_ASSERT_EQUAL(
DateTime(), expr.value);
277 CPPUNIT_ASSERT_EQUAL(
TimeSpan(), expr.delta);
278 CPPUNIT_ASSERT_EQUAL(parts |= DateTimeParts::DeltaMinute, expr.parts);
279 CPPUNIT_ASSERT_EQUAL(
"0001-01-01T00:00:00.000+00:00"s, expr.toIsoString());
285 expr = DateTimeExpression::fromString(
"1");
286 CPPUNIT_ASSERT_EQUAL(
DateTime(), expr.value);
287 CPPUNIT_ASSERT_EQUAL(
TimeSpan(), expr.delta);
288 CPPUNIT_ASSERT_EQUAL(parts = DateTimeParts::Year, expr.parts);
289 expr = DateTimeExpression::fromString(
"1/1");
290 CPPUNIT_ASSERT_EQUAL(
DateTime(), expr.value);
291 CPPUNIT_ASSERT_EQUAL(
TimeSpan(), expr.delta);
292 CPPUNIT_ASSERT_EQUAL(parts |= DateTimeParts::Month, expr.parts);
293 expr = DateTimeExpression::fromString(
"1/1/1");
294 CPPUNIT_ASSERT_EQUAL(
DateTime(), expr.value);
295 CPPUNIT_ASSERT_EQUAL(
TimeSpan(), expr.delta);
296 CPPUNIT_ASSERT_EQUAL(parts |= DateTimeParts::Day, expr.parts);
297 expr = DateTimeExpression::fromString(
"1/1/1 0");
298 CPPUNIT_ASSERT_EQUAL(
DateTime(), expr.value);
299 CPPUNIT_ASSERT_EQUAL(
TimeSpan(), expr.delta);
300 CPPUNIT_ASSERT_EQUAL(parts |= DateTimeParts::Hour, expr.parts);
301 expr = DateTimeExpression::fromString(
"1/1/1 0:0");
302 CPPUNIT_ASSERT_EQUAL(
DateTime(), expr.value);
303 CPPUNIT_ASSERT_EQUAL(
TimeSpan(), expr.delta);
304 CPPUNIT_ASSERT_EQUAL(parts |= DateTimeParts::Minute, expr.parts);
305 expr = DateTimeExpression::fromString(
"1/1/1 0:0:0");
306 CPPUNIT_ASSERT_EQUAL(
DateTime(), expr.value);
307 CPPUNIT_ASSERT_EQUAL(
TimeSpan(), expr.delta);
308 CPPUNIT_ASSERT_EQUAL(parts |= DateTimeParts::Second, expr.parts);
309 expr = DateTimeExpression::fromString(
"1/1/1 0:0:0.0");
310 CPPUNIT_ASSERT_EQUAL(
DateTime(), expr.value);
311 CPPUNIT_ASSERT_EQUAL(
TimeSpan(), expr.delta);
312 CPPUNIT_ASSERT_EQUAL(parts |= DateTimeParts::SubSecond, expr.parts);
321 CPPUNIT_ASSERT_EQUAL(
TimeSpan(), TimeSpan::fromString(
string()));
322 CPPUNIT_ASSERT_EQUAL(TimeSpan::fromSeconds(5.0), TimeSpan::fromString(
"5.0"));
323 CPPUNIT_ASSERT_EQUAL(TimeSpan::fromMinutes(5.5), TimeSpan::fromString(
"5:30"));
324 CPPUNIT_ASSERT_EQUAL(TimeSpan::fromHours(7.0) + TimeSpan::fromMinutes(5.5), TimeSpan::fromString(
"7:5:30"));
325 const auto test1 = TimeSpan::fromString(
"2:34:53:2.5");
327 CPPUNIT_ASSERT_EQUAL(3, test1.days());
328 CPPUNIT_ASSERT_EQUAL(10, test1.hours());
329 CPPUNIT_ASSERT_EQUAL(53, test1.minutes());
330 CPPUNIT_ASSERT_EQUAL(2, test1.seconds());
331 CPPUNIT_ASSERT_EQUAL(500, test1.milliseconds());
332 CPPUNIT_ASSERT(test1.totalDays() > 3.0 && test1.totalDays() < 4.0);
333 CPPUNIT_ASSERT(test1.totalHours() > (2 * 24 + 34) && test1.totalHours() < (2 * 24 + 35));
334 CPPUNIT_ASSERT(test1.totalMinutes() > (2 * 24 * 60 + 34 * 60 + 53) && test1.totalHours() < (2 * 24 * 60 + 34 * 60 + 54));
336 CPPUNIT_ASSERT_EQUAL(
"3 d 10 h 53 min 2 s 500 ms"s, test1.toString(TimeSpanOutputFormat::WithMeasures,
false));
337 CPPUNIT_ASSERT_EQUAL(
"07:05:30"s, (TimeSpan::fromHours(7.0) + TimeSpan::fromMinutes(5.5)).toString());
338 CPPUNIT_ASSERT_EQUAL(
"-5 s"s, TimeSpan::fromSeconds(-5.0).toString(TimeSpanOutputFormat::WithMeasures,
false));
339 CPPUNIT_ASSERT_EQUAL(
"0 s"s,
TimeSpan().toString(TimeSpanOutputFormat::WithMeasures,
false));
340 CPPUNIT_ASSERT_EQUAL(
"5e+02 µs"s, TimeSpan::fromMilliseconds(0.5).toString(TimeSpanOutputFormat::WithMeasures,
false));
342 const auto test2 = TimeSpan::fromString(
"15.985077682");
343 CPPUNIT_ASSERT_EQUAL(15.9850776, test2.totalSeconds());
344 CPPUNIT_ASSERT_EQUAL(15, test2.seconds());
345 CPPUNIT_ASSERT_EQUAL(985, test2.milliseconds());
346 CPPUNIT_ASSERT_EQUAL(77, test2.microseconds());
347 CPPUNIT_ASSERT_EQUAL(600, test2.nanoseconds());
348 CPPUNIT_ASSERT_EQUAL(
"00:00:15.9850776"s, test2.toString());
349 CPPUNIT_ASSERT_EQUAL(
"15 s 985 ms 77 µs 600 ns"s, test2.toString(TimeSpanOutputFormat::WithMeasures));
350 CPPUNIT_ASSERT_EQUAL(
"15.9850776"s, test2.toString(TimeSpanOutputFormat::TotalSeconds));
361 auto dateTime = DateTime::fromDateAndTime(1999, 1, 5, 4, 16);
362 CPPUNIT_ASSERT_EQUAL(7, (dateTime + TimeSpan::fromDays(2.0)).day());
363 CPPUNIT_ASSERT_EQUAL(6, (dateTime + TimeSpan::fromHours(24.0)).day());
364 CPPUNIT_ASSERT_EQUAL(3, (dateTime + TimeSpan::fromHours(24.0) + TimeSpan::fromHours(-1.0)).hour());
365 CPPUNIT_ASSERT_EQUAL(17, (dateTime + TimeSpan::fromHours(24.0) - TimeSpan::fromMinutes(-1.0)).minute());
366 dateTime += TimeSpan::fromDays(365.0);
367 CPPUNIT_ASSERT_EQUAL(2000, dateTime.year());
368 CPPUNIT_ASSERT_EQUAL(5, dateTime.day());
369 CPPUNIT_ASSERT_EQUAL(TimeSpan::fromDays(1.0), TimeSpan::fromHours(12.0) * 2.0);
370 CPPUNIT_ASSERT_EQUAL(TimeSpan::fromHours(12.0), TimeSpan::fromDays(1.0) / 2.0);
371 CPPUNIT_ASSERT_EQUAL(TimeSpan::fromDays(1.0), TimeSpan::fromHours(12.0) *
TimeSpan::TickType(2));
372 CPPUNIT_ASSERT_EQUAL(TimeSpan::fromHours(12.0), TimeSpan::fromDays(1.0) /
TimeSpan::TickType(2));
373 CPPUNIT_ASSERT_EQUAL(2.0, TimeSpan::fromDays(1.0) / TimeSpan::fromHours(12.0));
381 const auto begin(DateTime::fromDateAndTime(1994, 7, 18, 15, 30, 21)), end(DateTime::fromDateAndTime(2017, 12, 2, 15, 30, 21));
382 const Period period(begin, end);
383 CPPUNIT_ASSERT_EQUAL(23, period.
years());
384 CPPUNIT_ASSERT_EQUAL(4, period.
months());
385 CPPUNIT_ASSERT_EQUAL(14, period.
days());
386 CPPUNIT_ASSERT_EQUAL(end.toString(), (begin + period).toString());
388 const auto end2(DateTime::fromDateAndTime(2018, 1, 2, 15, 30, 21));
389 const Period period2(begin, end2);
390 CPPUNIT_ASSERT_EQUAL(23, period2.
years());
391 CPPUNIT_ASSERT_EQUAL(5, period2.
months());
392 CPPUNIT_ASSERT_EQUAL_MESSAGE(
"one more day, because December has 31 days", 15, period2.
days());
393 CPPUNIT_ASSERT_EQUAL(end2.toString(), (begin + period2).toString());
401 set<DateTime> dateTimes;
402 dateTimes.emplace(DateTime::fromDate(2500, 2, 1));
403 dateTimes.emplace(DateTime::fromDate(2500, 2, 2));
404 dateTimes.emplace(DateTime::fromDate(2500, 2, 1));
405 CPPUNIT_ASSERT_EQUAL(2_st, dateTimes.size());
407 set<TimeSpan> timeSpans;
408 timeSpans.emplace(TimeSpan::fromDays(5.0));
409 timeSpans.emplace(TimeSpan::fromDays(10.0));
410 timeSpans.emplace(TimeSpan::fromDays(5.0));
411 CPPUNIT_ASSERT_EQUAL(2_st, timeSpans.size());
CPPUNIT_TEST_SUITE_REGISTRATION(ChronoTests)
The ChronoTests class tests classes and functions provided by the files inside the chrono directory.
void testTimeSpan()
Tests most important TimeSpan features.
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 testPeriod()
Tests Period.
void testDateTimeExpression()
Tests parsing a DateTimeExpression.
The ConversionException class is thrown by the various conversion functions of this library when a co...
Represents an instant in time, typically expressed as a date and time of day.
constexpr bool isNull() const
Returns true if the date represented by the current DateTime class is null.
constexpr TickType totalTicks() const
Returns the number of ticks which represent the value of the current instance.
constexpr bool isEternity() const
Returns whether the instance has the maximal number of ticks.
Represents a period of time.
constexpr int days() const
Returns the days component of the period represented by the current instance.
constexpr int years() const
Returns the years component of the period represented by the current instance.
constexpr int months() const
Returns the months component of the period represented by the current instance.
Represents a time interval.
constexpr bool isNull() const
Returns true if the time interval represented by the current TimeSpan class is null.
constexpr bool isNegativeInfinity() const
Returns whether the time interval represented by the current instance is the smallest representable T...
constexpr TickType totalTicks() const
Returns the number of ticks that represent the value of the current TimeSpan class.
constexpr bool isInfinity() const
Returns whether the time interval represented by the current instance is the longest representable Ti...
constexpr bool isNegative() const
Returns true if the time interval represented by the current TimeSpan class is negative.
Contains literals to ease asserting with CPPUNIT_ASSERT_EQUAL.
Contains all utilities provides by the c++utilities library.