2 The software in this package is distributed under the GNU General
3 Public License version 2 (with a special exception described below).
5 A copy of GNU General Public License (GPL) is included in this distribution,
6 in the file COPYING.GPL.
8 As a special exception, if other files instantiate templates or use macros
9 or inline functions from this file, or you compile this file and link it
10 with other works to produce a work based on this file, this file
11 does not by itself cause the resulting work to be covered
12 by the GNU General Public License.
14 However the source code for this file must still be made available
15 in accordance with section (3) of the GNU General Public License.
17 This exception does not invalidate any other reasons why a work based
18 on this file might be covered by the GNU General Public License.
21 * @brief unit test for time related functions.
23 * @copyright Copyright © 2001-2008 by Intra2net AG
27 #if (__GLIBC__ <= 2) && (__GLIBC_MINOR__ < 23)
29 * Ancient glibc (pre 2015) has a defective implementation of strptime(3)
30 * that doesn’t handle the ‘Z’ modifier of ISO8601 to indicate UTC. It also
31 * parses fractional timezones only partially so e. g. “+11:11” is treated
34 # define GLIBC_STRPTIME_LACKS_Z
37 #define BOOST_TEST_DYN_LINK
38 #include <boost/test/unit_test.hpp>
40 #include <timefunc.hxx>
41 #include <filefunc.hxx>
49 using namespace I2n::Time;
51 class TestTimeFuncFixture
54 typedef std::list< std::string > StringList;
55 std::set<std::string> used_check_files;
56 std::string tz; /* save and restore TZ from envp */
58 std::string get_check_file_path(std::string tag)
61 result= "__unittest__" + tag + ".dat";
62 used_check_files.insert(result);
64 } // eo get_check_file_path
66 void remove_check_files()
68 for (std::set<std::string>::iterator it= used_check_files.begin();
69 it != used_check_files.end();
72 std::string filepath(*it);
73 if (path_exists(filepath))
79 used_check_files.clear();
80 } // eo remove_check_files
82 void set_tz (const std::string &tzname)
85 if (setenv ("TZ", tzname.c_str (), 1) == -1)
88 << "error setting environment 'TZ': [" << tzname << "]"
97 inline void set_utc (void)
103 TestTimeFuncFixture()
104 : tz (secure_getenv ("TZ") ?: "")
108 ~TestTimeFuncFixture()
110 remove_check_files();
113 if (setenv ("TZ", this->tz.c_str (), 1) == -1)
116 << "error cleaning up environment 'TZ': [" << this->tz << "]"
127 BOOST_FIXTURE_TEST_SUITE(TestTimeFunc, TestTimeFuncFixture)
129 BOOST_AUTO_TEST_CASE(AddIntervalsDisjoint)
133 intervals.add( Interval( 10, 100 ) );
134 intervals.add( Interval( 600, 620 ) );
136 BOOST_CHECK_EQUAL( false, intervals.empty() );
137 BOOST_CHECK_EQUAL( 2u, intervals.size() );
139 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
140 BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() );
142 BOOST_CHECK_EQUAL( 600u, intervals.back().lower_bound() );
143 BOOST_CHECK_EQUAL( 620u, intervals.back().upper_bound() );
144 } // eo AddIntervalsDisjoint()
148 BOOST_AUTO_TEST_CASE(AddIntervalsInclude)
152 intervals.add( Interval( 10, 100 ) );
153 intervals.add( Interval( 10, 80 ) );
155 BOOST_CHECK_EQUAL( false, intervals.empty() );
156 BOOST_CHECK_EQUAL( 1u, intervals.size() );
158 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
159 BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() );
160 BOOST_CHECK_EQUAL( false, intervals.front().changed() );
161 } // eo AddIntervalsInclude()
165 BOOST_AUTO_TEST_CASE(AddIntervalsEmbrace)
169 intervals.add( Interval( 10, 100 ) );
170 intervals.add( Interval( 5, 120 ) );
172 BOOST_CHECK_EQUAL( false, intervals.empty() );
173 BOOST_CHECK_EQUAL( 1u, intervals.size() );
175 BOOST_CHECK_EQUAL( 5u, intervals.front().lower_bound() );
176 BOOST_CHECK_EQUAL( 120u, intervals.front().upper_bound() );
177 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
178 } // eo AddIntervalsEmbrace()
182 BOOST_AUTO_TEST_CASE(AddIntervalsJoin1)
186 intervals.add( Interval( 10, 100 ) );
187 intervals.add( Interval( 60, 120 ) );
189 BOOST_CHECK_EQUAL( false, intervals.empty() );
190 BOOST_CHECK_EQUAL( 1u, intervals.size() );
192 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
193 BOOST_CHECK_EQUAL( 120u, intervals.front().upper_bound() );
194 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
195 } // eo AddIntervalsJoin1()
199 BOOST_AUTO_TEST_CASE(AddIntervalsJoin1b)
203 intervals.add( Interval( 10, 100 ) );
204 intervals.add( Interval( 100, 120 ) );
206 BOOST_CHECK_EQUAL( false, intervals.empty() );
207 BOOST_CHECK_EQUAL( 1u, intervals.size() );
209 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
210 BOOST_CHECK_EQUAL( 120u, intervals.front().upper_bound() );
211 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
212 } // eo AddIntervalsJoin1b()
216 BOOST_AUTO_TEST_CASE(AddIntervalsJoin2)
220 intervals.add( Interval( 10, 100 ) );
221 intervals.add( Interval( 200, 250 ) );
223 BOOST_CHECK_EQUAL( false, intervals.empty() );
224 BOOST_CHECK_EQUAL( 2u, intervals.size() );
226 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
227 BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() );
228 BOOST_CHECK_EQUAL( 200u, intervals.back().lower_bound() );
229 BOOST_CHECK_EQUAL( 250u, intervals.back().upper_bound() );
231 // now add the gap; the intervals should collapse to one covering all:
232 intervals.add( Interval(100, 200) );
234 BOOST_CHECK_EQUAL( false, intervals.empty() );
235 BOOST_CHECK_EQUAL( 1u, intervals.size() );
237 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
238 BOOST_CHECK_EQUAL( 250u, intervals.front().upper_bound() );
239 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
240 } // eo AddIntervalsJoin2()
244 BOOST_AUTO_TEST_CASE(SubIntervalsDisjoint)
248 intervals.add( Interval(10, 100) );
249 intervals.sub( Interval(0, 10) );
251 BOOST_CHECK_EQUAL( false, intervals.empty() );
252 BOOST_CHECK_EQUAL( 1u, intervals.size() );
254 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
255 BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() );
256 BOOST_CHECK_EQUAL( false, intervals.front().changed() );
257 } // eo SubIntervalsDisjoint()
261 BOOST_AUTO_TEST_CASE(SubIntervalsExact)
265 intervals.add( Interval(10, 100) );
266 intervals.sub( Interval(10, 100) );
268 BOOST_CHECK_EQUAL( true, intervals.empty() );
269 BOOST_CHECK_EQUAL( 0u, intervals.size() );
270 } // eo SubIntervalsExact()
274 BOOST_AUTO_TEST_CASE(SubIntervalsSplit1)
278 intervals.add( Interval(10, 100) );
279 intervals.sub( Interval(20, 40) );
281 BOOST_CHECK_EQUAL( false, intervals.empty() );
282 BOOST_CHECK_EQUAL( 2u, intervals.size() );
284 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
285 BOOST_CHECK_EQUAL( 20u, intervals.front().upper_bound() );
287 BOOST_CHECK_EQUAL( 40u, intervals.back().lower_bound() );
288 BOOST_CHECK_EQUAL( 100u, intervals.back().upper_bound() );
289 BOOST_CHECK_EQUAL( false, intervals.front().changed() );
290 BOOST_CHECK_EQUAL( true, intervals.back().changed() );
291 } // eo SubIntervalsSplit1()
294 BOOST_AUTO_TEST_CASE(SubIntervalsCutFront)
298 intervals.add( Interval(10, 100) );
299 intervals.sub( Interval(10, 20) );
301 BOOST_CHECK_EQUAL( false, intervals.empty() );
302 BOOST_CHECK_EQUAL( 1u, intervals.size() );
304 BOOST_CHECK_EQUAL( 20u, intervals.front().lower_bound() );
305 BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() );
306 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
307 } // eo SubIntervalsCutFront()
310 BOOST_AUTO_TEST_CASE(SubIntervalsCutBack)
314 intervals.add( Interval(10, 100) );
315 intervals.sub( Interval(87, 100) );
317 BOOST_CHECK_EQUAL( false, intervals.empty() );
318 BOOST_CHECK_EQUAL( 1u, intervals.size() );
320 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
321 BOOST_CHECK_EQUAL( 87u, intervals.front().upper_bound() );
322 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
323 } // eo SubIntervalsCutBack()
327 BOOST_AUTO_TEST_CASE(SubIntervalsCutMore)
331 intervals.add( Interval( 10, 100) );
332 intervals.add( Interval(110, 200) );
333 intervals.add( Interval(210, 300) );
335 // this should remove the first 2 intervals and cut the third:
336 intervals.sub( Interval(8, 220) );
338 BOOST_CHECK_EQUAL( false, intervals.empty() );
339 BOOST_CHECK_EQUAL( 1u, intervals.size() );
341 BOOST_CHECK_EQUAL( 220u, intervals.front().lower_bound() );
342 BOOST_CHECK_EQUAL( 300u, intervals.front().upper_bound() );
343 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
344 } // eo SubIntervalsCutMore()
347 BOOST_AUTO_TEST_CASE(IntervalComparisons)
349 Intervals intervals1;
350 Intervals intervals2;
352 intervals1.add( Interval( 10, 120) );
354 intervals2.add( Interval( 10, 110 ) );
355 intervals2.add( Interval( 100, 120 ) );
357 BOOST_CHECK_EQUAL( 1u, intervals2.size() );
359 BOOST_CHECK( intervals1 == intervals2 );
360 BOOST_CHECK_EQUAL( true, intervals1.contains( intervals2 ));
361 BOOST_CHECK_EQUAL( true, intervals2.contains( intervals1 ));
363 intervals2.sub( Interval( 40, 50) );
365 BOOST_CHECK( intervals1 != intervals2 );
366 BOOST_CHECK_EQUAL( true, intervals1.contains( intervals2 ));
367 BOOST_CHECK_EQUAL( false, intervals2.contains( intervals1 ));
368 } // eo IntervalComparisons()
372 BOOST_AUTO_TEST_CASE(MonotonicClock)
377 bool res = monotonic_clock_gettime(sec0,nsec0);
378 BOOST_CHECK_EQUAL( true, res );
381 res= monotonic_clock_gettime(sec1,nsec1);
382 BOOST_CHECK_EQUAL( true, res);
384 long delta_sec = sec1 - sec0;
385 long delta_nsec= nsec1 - nsec0;
387 long delta_millisec= ( delta_nsec / 1000000L) + delta_sec * 1000L;
389 BOOST_CHECK( delta_millisec >= 250 - /*fuzz*/ 1);
390 BOOST_CHECK( delta_millisec < 300 );
391 } // eo MonotonicClock()
393 BOOST_AUTO_TEST_CASE(WeekInvalid)
395 Week week("99999999");
396 BOOST_CHECK_EQUAL(false, week.is_valid());
397 BOOST_CHECK_EQUAL(string(""), week.get_displaystring());
400 BOOST_AUTO_TEST_CASE(WeekDisplayString1)
403 BOOST_CHECK_EQUAL(true, week.is_valid());
404 BOOST_CHECK_EQUAL(string(""), week.get_displaystring());
407 BOOST_AUTO_TEST_CASE(WeekDisplayString2)
409 Week week("0123456");
410 BOOST_CHECK_EQUAL(true, week.is_valid());
411 BOOST_CHECK_EQUAL(string("Mon-Sun"), week.get_displaystring());
414 BOOST_AUTO_TEST_CASE(WeekDisplayString3)
417 BOOST_CHECK_EQUAL(true, week.is_valid());
418 BOOST_CHECK_EQUAL(string("Mon-Sat"), week.get_displaystring());
421 BOOST_AUTO_TEST_CASE(WeekDisplayString4)
424 BOOST_CHECK_EQUAL(true, week.is_valid());
425 BOOST_CHECK_EQUAL(string("Mon-Fri, Sun"), week.get_displaystring());
428 BOOST_AUTO_TEST_CASE(WeekDisplayString5)
431 BOOST_CHECK_EQUAL(true, week.is_valid());
432 BOOST_CHECK_EQUAL(string("Mon, Tue, Fri, Sat"), week.get_displaystring());
435 BOOST_AUTO_TEST_CASE(WeekDisplayString6)
438 BOOST_CHECK_EQUAL(true, week.is_valid());
439 BOOST_CHECK_EQUAL(string("Tue, Thu, Sat, Sun"), week.get_displaystring());
442 BOOST_AUTO_TEST_CASE(WeekDisplayString7)
445 BOOST_CHECK_EQUAL(true, week.is_valid());
446 BOOST_CHECK_EQUAL(string("Mon, Wed, Fri"), week.get_displaystring());
449 BOOST_AUTO_TEST_CASE(WeekDisplayString8)
452 BOOST_CHECK_EQUAL(true, week.is_valid());
453 BOOST_CHECK_EQUAL(string("Mon, Fri"), week.get_displaystring());
456 BOOST_AUTO_TEST_CASE(WeekDisplayString9)
459 BOOST_CHECK_EQUAL(true, week.is_valid());
460 BOOST_CHECK_EQUAL(string("Sat, Sun"), week.get_displaystring());
463 BOOST_AUTO_TEST_CASE(WeekDisplayString10)
466 BOOST_CHECK_EQUAL(true, week.is_valid());
467 BOOST_CHECK_EQUAL(string("Fri-Sun"), week.get_displaystring());
470 BOOST_AUTO_TEST_CASE(WeekDisplayString11)
473 BOOST_CHECK_EQUAL(true, week.is_valid());
474 BOOST_CHECK_EQUAL(string("Sun"), week.get_displaystring());
477 BOOST_AUTO_TEST_CASE(WeekDisplayString12)
480 BOOST_CHECK_EQUAL(true, week.is_valid());
481 BOOST_CHECK_EQUAL(string("Sat"), week.get_displaystring());
484 BOOST_AUTO_TEST_CASE(WeekDisplayString13)
487 BOOST_CHECK_EQUAL(true, week.is_valid());
488 BOOST_CHECK_EQUAL(string("Mon-Wed"), week.get_displaystring());
491 BOOST_AUTO_TEST_CASE(FormatFullTime)
493 this->set_tz ("CET");
494 time_t seconds = 1318844005;
496 BOOST_CHECK_EQUAL("17.10.2011 11:33", format_full_time(seconds));
499 BOOST_AUTO_TEST_CASE(DateToSeconds1)
501 this->set_tz ("CET");
503 BOOST_CHECK_EQUAL(1325372400, date_to_seconds("2012-01-01"));
506 BOOST_AUTO_TEST_CASE(DateToSeconds2)
508 this->set_tz ("CET");
510 BOOST_CHECK_EQUAL(1341093600, date_to_seconds("2012-07-01"));
513 BOOST_AUTO_TEST_CASE(FormatISO8601_T)
515 const time_t moment = 1515492684;
516 BOOST_CHECK_EQUAL("10:11:24",
517 format_iso8601 (moment, true, false, true, false));
520 BOOST_AUTO_TEST_CASE(FormatISO8601_TZ_local)
522 this->set_tz ("CET");
523 const time_t moment = 1515492684;
524 BOOST_CHECK_EQUAL("11:11:24+0100",
525 format_iso8601 (moment, false, false, true, true));
528 BOOST_AUTO_TEST_CASE(FormatISO8601_TZ)
530 const time_t moment = 1515492684;
531 BOOST_CHECK_EQUAL("10:11:24+0000",
532 format_iso8601 (moment, true, false, true, true));
535 BOOST_AUTO_TEST_CASE(FormatISO8601_DTZ_local)
537 this->set_tz ("CET");
538 const time_t moment = 1515492684;
539 BOOST_CHECK_EQUAL("2018-01-09T11:11:24+0100",
540 format_iso8601 (moment, false, true, true, true));
543 BOOST_AUTO_TEST_CASE(FormatISO8601_DTZ)
545 const time_t moment = 1515492684;
546 BOOST_CHECK_EQUAL("2018-01-09T10:11:24+0000",
547 format_iso8601 (moment, true, true, true, true));
550 BOOST_AUTO_TEST_CASE(FormatISO8601_DT)
552 const time_t moment = 1515492684;
553 BOOST_CHECK_EQUAL("2018-01-09T10:11:24",
554 format_iso8601 (moment, true, true, true, false));
557 BOOST_AUTO_TEST_CASE(FormatISO8601_D)
559 const time_t moment = 1515492684;
560 BOOST_CHECK_EQUAL("2018-01-09",
561 format_iso8601 (moment, true, true, false, false));
564 BOOST_AUTO_TEST_CASE(FormatISO8601_DTZ_struct_tm)
572 helau.tm_year = 2018 - 1900;
577 helau.tm_zone = NULL;
579 BOOST_CHECK_EQUAL("2018-11-11T11:11:11+0000",
580 format_iso8601 (helau, true, true, true));
583 BOOST_AUTO_TEST_CASE(FormatISO8601_DTZ_struct_timespec)
585 struct timespec ts = { 1541934671, 11 };
587 BOOST_CHECK_EQUAL("2018-11-11T11:11:11+0000",
588 format_iso8601 (ts, true, true, true, true));
591 BOOST_AUTO_TEST_SUITE(Clock)
593 BOOST_AUTO_TEST_CASE(ctor_simple)
597 BOOST_CHECK_EQUAL(t.get_sec (), 0);
598 BOOST_CHECK_EQUAL(t.get_nsec (), 0);
601 BOOST_AUTO_TEST_CASE(ctor_type)
603 I2n::clock::Time t1 (I2n::clock::type::real);
604 I2n::clock::Time t2 (I2n::clock::type::mono);
605 I2n::clock::Time t3 (I2n::clock::type::boot);
606 I2n::clock::Time t4 (I2n::clock::type::cpu);
608 BOOST_CHECK_EQUAL(t1.get_sec (), 0);
609 BOOST_CHECK_EQUAL(t1.get_nsec (), 0);
611 BOOST_CHECK_EQUAL(t2.get_sec (), 0);
612 BOOST_CHECK_EQUAL(t2.get_nsec (), 0);
614 BOOST_CHECK_EQUAL(t3.get_sec (), 0);
615 BOOST_CHECK_EQUAL(t3.get_nsec (), 0);
617 BOOST_CHECK_EQUAL(t4.get_sec (), 0);
618 BOOST_CHECK_EQUAL(t4.get_nsec (), 0);
621 BOOST_AUTO_TEST_CASE(ctor_variant)
623 I2n::clock::Time tmc (I2n::clock::type::mono);
624 I2n::clock::Time tmr (I2n::clock::type::mono, I2n::clock::type::raw);
625 I2n::clock::Time tme (I2n::clock::type::mono, I2n::clock::type::exact);
627 I2n::clock::Time trc (I2n::clock::type::real);
628 I2n::clock::Time tre (I2n::clock::type::real, I2n::clock::type::exact);
630 I2n::clock::Time tb (I2n::clock::type::boot);
632 I2n::clock::Time tcp (I2n::clock::type::cpu);
633 I2n::clock::Time tct (I2n::clock::type::cpu, I2n::clock::type::thread);
635 BOOST_CHECK_EQUAL(tmc.get_sec (), 0); /* MONO */
636 BOOST_CHECK_EQUAL(tmc.get_nsec (), 0);
638 BOOST_CHECK_EQUAL(tmr.get_sec (), 0);
639 BOOST_CHECK_EQUAL(tmr.get_nsec (), 0);
641 BOOST_CHECK_EQUAL(tme.get_sec (), 0);
642 BOOST_CHECK_EQUAL(tme.get_nsec (), 0);
644 BOOST_CHECK_EQUAL(trc.get_sec (), 0); /* REAL */
645 BOOST_CHECK_EQUAL(trc.get_nsec (), 0);
647 BOOST_CHECK_EQUAL(tre.get_sec (), 0);
648 BOOST_CHECK_EQUAL(tre.get_nsec (), 0);
650 BOOST_CHECK_EQUAL(tb.get_sec (), 0); /* BOOT */
651 BOOST_CHECK_EQUAL(tb.get_nsec (), 0);
653 BOOST_CHECK_EQUAL(tcp.get_sec (), 0); /* CPU */
654 BOOST_CHECK_EQUAL(tcp.get_nsec (), 0);
656 BOOST_CHECK_EQUAL(tct.get_sec (), 0);
657 BOOST_CHECK_EQUAL(tct.get_nsec (), 0);
660 BOOST_AUTO_TEST_CASE(initializer_now)
662 boost::optional<I2n::clock::Time> t = I2n::clock::now ();
665 BOOST_CHECK_GT(t->get_sec (), 0);
666 BOOST_CHECK_EQUAL(t->err, 0);
669 BOOST_AUTO_TEST_CASE(initializer_zero)
671 I2n::clock::Time stundenull = I2n::clock::zero ();
673 BOOST_CHECK_EQUAL(stundenull.get_sec (), 0);
674 BOOST_CHECK_EQUAL(stundenull.get_nsec (), 0);
675 BOOST_CHECK_EQUAL(stundenull.err, 0);
678 BOOST_AUTO_TEST_CASE(member_set_now)
682 BOOST_CHECK(t.set ());
684 BOOST_CHECK_NE(t.get_sec (), 0);
687 BOOST_AUTO_TEST_CASE(member_set_value)
693 BOOST_CHECK_EQUAL(t.get_sec (), 42);
694 BOOST_CHECK_EQUAL(t.get_nsec (), 42);
697 BOOST_AUTO_TEST_CASE(member_set_value_type)
701 t.set (42, 42, I2n::clock::type::real, I2n::clock::type::exact);
703 BOOST_CHECK_EQUAL(t.get_sec (), 42);
704 BOOST_CHECK_EQUAL(t.get_nsec (), 42);
707 BOOST_AUTO_TEST_CASE(member_add_parts)
714 BOOST_CHECK_EQUAL(t.get_sec (), 2229);
715 BOOST_CHECK_EQUAL(t.get_nsec (), 2229);
718 BOOST_AUTO_TEST_CASE(member_sub_parts)
725 BOOST_CHECK_EQUAL(t.get_sec (), 0);
726 BOOST_CHECK_EQUAL(t.get_nsec (), 999999999);
729 BOOST_AUTO_TEST_CASE(member_sub_Time)
739 BOOST_CHECK_EQUAL(t1.get_sec (), 0);
740 BOOST_CHECK_EQUAL(t1.get_nsec (), 42L);
743 BOOST_AUTO_TEST_CASE(member_diff)
745 static const time_t five = 5 * 365 * 24 * 3600;
747 I2n::clock::Time t1 (42, 1337);
748 I2n::clock::Time t2 = t1 + five;;
749 I2n::clock::Time t3 = t1 - five;;
751 BOOST_CHECK_EQUAL(t2, I2n::clock::Time ((time_t)42 + five, 1337));
752 BOOST_CHECK_EQUAL(t3, I2n::clock::Time ((time_t)42 - five, 1337));
753 BOOST_CHECK_EQUAL(t1.difference (t3), t3.difference (t1));
754 BOOST_CHECK_EQUAL(t3.difference (t3), t3.difference (t3));
757 BOOST_AUTO_TEST_CASE(op_copyassign)
762 BOOST_CHECK(t1.set ());
766 BOOST_CHECK_EQUAL(t1.get_sec (), t2.get_sec ());
767 BOOST_CHECK_EQUAL(t1.get_nsec (), t2.get_nsec ());
770 BOOST_AUTO_TEST_CASE(op_equal)
775 BOOST_CHECK(t1.set ());
778 BOOST_CHECK_EQUAL(t1, t2);
781 BOOST_AUTO_TEST_CASE(op_add_Time)
785 I2n::clock::Time tsum;
791 BOOST_CHECK_EQUAL(tsum.get_sec (), 3524);
792 BOOST_CHECK_EQUAL(tsum.get_nsec (), 3524);
795 BOOST_AUTO_TEST_CASE(op_add_Time_carry)
799 I2n::clock::Time tsum;
803 t2.set (1300, 2L * 1000 * 1000 * 1000 + 1337);
805 t2.set (1300, 37L * 1000 * 1000 * 1000 + 1337);
811 BOOST_CHECK_EQUAL(tsum.get_sec (), 3489);
812 BOOST_CHECK_EQUAL(tsum.get_nsec (), 3524);
814 BOOST_CHECK_EQUAL(tsum.get_sec (), 3524);
815 BOOST_CHECK_EQUAL(tsum.get_nsec (), 3524);
819 BOOST_AUTO_TEST_CASE(op_add_time_t)
821 I2n::clock::Time t1 (2187, 2187);
823 I2n::clock::Time tsum;
827 BOOST_CHECK_EQUAL(tsum.get_sec (), 3524);
828 BOOST_CHECK_EQUAL(tsum.get_nsec (), 2187);
831 BOOST_AUTO_TEST_CASE(op_add_time_t_external)
834 I2n::clock::Time t2 (2187, 2187);
835 I2n::clock::Time tsum;
839 BOOST_CHECK_EQUAL(tsum.get_sec (), 3524);
840 BOOST_CHECK_EQUAL(tsum.get_nsec (), 2187);
843 BOOST_AUTO_TEST_CASE(op_incr_Time)
845 I2n::clock::Time t1 (2187, 2187);
846 I2n::clock::Time t2 (1337, 1337);
850 BOOST_CHECK_EQUAL(t1.get_sec (), 3524);
851 BOOST_CHECK_EQUAL(t1.get_nsec (), 3524);
854 BOOST_AUTO_TEST_CASE(op_incr_time_t)
856 I2n::clock::Time t1 (2187, 2187);
861 BOOST_CHECK_EQUAL(t1.get_sec (), 3524);
862 BOOST_CHECK_EQUAL(t1.get_nsec (), 2187);
865 BOOST_AUTO_TEST_CASE(op_subtract_Time)
869 I2n::clock::Time tdiff;
875 BOOST_CHECK_EQUAL(tdiff.get_sec (), 850);
876 BOOST_CHECK_EQUAL(tdiff.get_nsec (), 850);
879 BOOST_AUTO_TEST_CASE(op_subtract_time_t)
881 I2n::clock::Time t1 (2187, 2187);
883 I2n::clock::Time tdiff;
887 BOOST_CHECK_EQUAL(tdiff.get_sec (), 850);
888 BOOST_CHECK_EQUAL(tdiff.get_nsec (), 2187);
891 BOOST_AUTO_TEST_CASE(op_subtract_time_t_external)
894 I2n::clock::Time t2 (2187, 2187);
895 I2n::clock::Time tdiff;
899 BOOST_CHECK_EQUAL(tdiff.get_sec (), -851);
900 BOOST_CHECK_EQUAL(tdiff.get_nsec (), 999997813);
903 BOOST_AUTO_TEST_CASE(op_decr_Time)
905 I2n::clock::Time t1 (2187, 2187);
906 I2n::clock::Time t2 (1337, 1337);
910 BOOST_CHECK_EQUAL(t1.get_sec (), 850);
911 BOOST_CHECK_EQUAL(t1.get_nsec (), 850);
914 BOOST_AUTO_TEST_CASE(op_decr_time_t)
916 I2n::clock::Time t1 (2187, 2187);
921 BOOST_CHECK_EQUAL(t1.get_sec (), 850);
922 BOOST_CHECK_EQUAL(t1.get_nsec (), 2187);
925 BOOST_AUTO_TEST_CASE(op_mult_scale)
933 BOOST_CHECK_EQUAL(t2.get_sec (), 42);
934 BOOST_CHECK_EQUAL(t2.get_nsec (), 42);
937 BOOST_AUTO_TEST_CASE(op_mult_mutate)
939 I2n::clock::Time t1 ( 42, 42);
940 I2n::clock::Time t2 (1337, 0);
945 BOOST_CHECK_EQUAL(t1.get_sec (), 84);
946 BOOST_CHECK_EQUAL(t1.get_nsec (), 84);
947 BOOST_CHECK_EQUAL(t2.get_sec (), -13370);
950 BOOST_AUTO_TEST_CASE(op_mult_scale_carry)
955 t1.set (1, 500 * 1000 * 1000);
958 BOOST_CHECK_EQUAL(t2.get_sec (), 4);
959 BOOST_CHECK_EQUAL(t2.get_nsec (), 500 * 1000 * 1000);
962 BOOST_AUTO_TEST_CASE(op_equals)
970 BOOST_CHECK_EQUAL(t1, t2);
973 BOOST_AUTO_TEST_CASE(compare_equal)
981 BOOST_CHECK_EQUAL(I2n::clock::compare (t1, t2), 0);
984 BOOST_AUTO_TEST_CASE(compare_equal_type)
986 I2n::clock::Time t1 (42, 42, I2n::clock::type::real);
987 I2n::clock::Time t2 (42, 42, I2n::clock::type::cpu);
988 I2n::clock::Time t3 (42, 0, I2n::clock::type::real);
989 I2n::clock::Time t4 (42, 42, I2n::clock::type::real);
991 BOOST_CHECK_NE(t1, t2);
992 BOOST_CHECK_NE(t1, t3);
993 BOOST_CHECK_EQUAL(t1, t4);
996 BOOST_AUTO_TEST_CASE(compare_ne_sec)
1004 BOOST_CHECK_EQUAL(I2n::clock::compare (t1, t2), -1);
1005 BOOST_CHECK_EQUAL(I2n::clock::compare (t2, t1), 1);
1008 BOOST_AUTO_TEST_CASE(compare_ne_nsec)
1010 I2n::clock::Time t1;
1011 I2n::clock::Time t2;
1016 BOOST_CHECK_EQUAL(I2n::clock::compare (t1, t2), -1);
1017 BOOST_CHECK_EQUAL(I2n::clock::compare (t2, t1), 1);
1020 BOOST_AUTO_TEST_CASE(compare_ne_both)
1022 I2n::clock::Time t1;
1023 I2n::clock::Time t2;
1028 BOOST_CHECK_EQUAL(I2n::clock::compare (t1, t2), 1);
1029 BOOST_CHECK_EQUAL(I2n::clock::compare (t2, t1), -1);
1032 BOOST_AUTO_TEST_CASE(op_ineq_sec)
1034 I2n::clock::Time t1 (1337);
1035 I2n::clock::Time t2 (2187);
1037 BOOST_CHECK_LT(t1, t2);
1038 BOOST_CHECK_GT(t2, t1);
1041 BOOST_AUTO_TEST_CASE(op_ineq_nsec)
1043 I2n::clock::Time t1 (1337, 23);
1044 I2n::clock::Time t2 (1337, 42);
1046 BOOST_CHECK_LT(t1, t2);
1047 BOOST_CHECK_GT(t2, t1);
1050 BOOST_AUTO_TEST_CASE(op_ineq_both)
1052 I2n::clock::Time t1 (2187, 23);
1053 I2n::clock::Time t2 (1337, 42);
1055 BOOST_CHECK_LT(t2, t1);
1056 BOOST_CHECK_GT(t1, t2);
1059 BOOST_AUTO_TEST_CASE(op_eq_time_t)
1061 boost::optional<I2n::clock::Time> t1 = I2n::clock::now ();
1062 const time_t t2 = time (NULL); /* race here */
1066 BOOST_CHECK_NE(*t1, t2);
1067 BOOST_CHECK_LT(*t1, t2);
1068 BOOST_CHECK_GT( t2, *t1);
1071 BOOST_AUTO_TEST_CASE(Format_sec_msec)
1073 I2n::clock::Time t1 (42, 42);
1074 I2n::clock::Time t2 ( 4, 242424242);
1075 I2n::clock::Time t3 ( 0, 133713371);
1076 I2n::clock::Time t4 ( 0, 0);
1078 std::string s1 = t1.format_sec_msec ();
1079 std::string s2 = t2.format_sec_msec ();
1080 std::string s3 = t3.format_sec_msec ();
1081 std::string s4 = t4.format_sec_msec ();
1083 BOOST_CHECK_EQUAL("42s 0ms" , s1);
1084 BOOST_CHECK_EQUAL( "4s 242ms", s2);
1085 BOOST_CHECK_EQUAL( "0s 133ms", s3);
1086 BOOST_CHECK_EQUAL( "0s 0ms" , s4);
1089 BOOST_AUTO_TEST_CASE(Format_min_sec_msec)
1091 I2n::clock::Time t1 (42*60 + 42, 42);
1092 I2n::clock::Time t2 ( 4*60 + 42, 242424242);
1093 I2n::clock::Time t3 ( 0*60 + 42, 133713371);
1094 I2n::clock::Time t4 ( 0 + 0, 0);
1096 std::string s1 = *t1.format_min_sec_msec ();
1097 std::string s2 = *t2.format_min_sec_msec ();
1098 std::string s3 = *t3.format_min_sec_msec ();
1099 std::string s4 = *t4.format_min_sec_msec ();
1101 BOOST_CHECK_EQUAL("42m42.000s", s1);
1102 BOOST_CHECK_EQUAL( "4m42.242s", s2);
1103 BOOST_CHECK_EQUAL( "0m42.133s", s3);
1104 BOOST_CHECK_EQUAL( "0m0.000s", s4);
1107 BOOST_AUTO_TEST_CASE(FormatISO8601_T)
1109 I2n::clock::Time t (42, 42);
1110 boost::optional<std::string> s = t.format_iso8601 (true, false, true, false);
1112 BOOST_CHECK_EQUAL("00:00:42", *s);
1115 BOOST_AUTO_TEST_CASE(FormatISO8601_DT)
1117 I2n::clock::Time t (1541934671, 0);
1118 boost::optional<std::string> s = t.format_iso8601 (true, true, true, false);
1120 BOOST_CHECK_EQUAL("2018-11-11T11:11:11", *s);
1123 BOOST_AUTO_TEST_CASE(FormatISO8601_DTZ)
1125 I2n::clock::Time t (1541934671, 0);
1126 boost::optional<std::string> s = t.format_iso8601 (true, true, true, true);
1128 BOOST_CHECK_EQUAL("2018-11-11T11:11:11+0000", *s);
1131 BOOST_AUTO_TEST_CASE(Format_make_nice_time)
1133 I2n::clock::Time t (111111, 0);
1134 boost::optional<std::string> s = t.make_nice_time ();
1136 BOOST_CHECK_EQUAL("1 day, 06:51:51", *s);
1139 BOOST_AUTO_TEST_CASE(Format_format_full_time)
1141 I2n::clock::Time t (1541934671, 0);
1143 * brr, the old formatters use localtime without a way to opt out of
1147 boost::optional<std::string> s = t.format_full_time ();
1149 BOOST_CHECK_EQUAL("11.11.2018 11:11", *s);
1152 BOOST_AUTO_TEST_CASE(Format_format_date)
1154 I2n::clock::Time t (1541934671, 0);
1155 boost::optional<std::string> s = t.format_date ();
1157 BOOST_CHECK_EQUAL("11.11.2018", *s);
1160 BOOST_AUTO_TEST_CASE(FromString_iso8601_full)
1162 const std::string in1 ("0001-01-01T00:00:00+0000");
1163 const std::string in2 ("2018-11-11T11:11:11+0000");
1167 boost::optional<I2n::clock::Time> t1 = I2n::clock::time_of_iso8601 (in1);
1168 boost::optional<I2n::clock::Time> t2 = I2n::clock::time_of_iso8601 (in2);
1174 BOOST_CHECK_EQUAL(*t1->format_iso8601 (), in1);
1178 BOOST_CHECK_EQUAL(*t2->format_iso8601 (), in2);
1181 BOOST_AUTO_TEST_CASE(FromString_iso8601_full_negyear)
1183 const std::string in1 ("-0001-01-01T00:00:00+0000");
1184 const std::string in2 ("-2018-11-11T11:11:11+0000");
1188 boost::optional<I2n::clock::Time> t1 = I2n::clock::time_of_iso8601 (in1);
1189 boost::optional<I2n::clock::Time> t2 = I2n::clock::time_of_iso8601 (in2);
1197 BOOST_CHECK_EQUAL(*t1->format_iso8601 (), in1);
1198 BOOST_CHECK_EQUAL(*t2->format_iso8601 (), in2);
1202 # ifndef GLIBC_STRPTIME_LACKS_Z
1203 BOOST_AUTO_TEST_CASE(FromString_iso8601_Z)
1205 const std::string in1 ("2019-04-25T13:41:47+0000");
1206 const std::string in2 ("2019-04-25T13:41:47Z");
1209 boost::optional<I2n::clock::Time> t1 = I2n::clock::time_of_iso8601 (in1, true, true, true);
1210 boost::optional<I2n::clock::Time> t2 = I2n::clock::time_of_iso8601 (in2, true, true, true);
1215 BOOST_CHECK_EQUAL(*t1, *t2);
1216 BOOST_CHECK_EQUAL(*t1->format_iso8601 (), *t2->format_iso8601 ());
1217 BOOST_CHECK_EQUAL(*t2->format_iso8601 (), in1);
1221 BOOST_AUTO_TEST_CASE(FromString_iso8601_partial)
1223 const std::string in1 ("2018-11-11T11:11:11");
1224 const std::string in2 ("2018-11-11");
1228 boost::optional<I2n::clock::Time> t1 =
1229 I2n::clock::time_of_iso8601 (in1, true, true, false);
1230 boost::optional<I2n::clock::Time> t2 =
1231 I2n::clock::time_of_iso8601 (in2, true, false, false);
1236 * We test for the difference here which is zero if the number is
1237 * correct but causes the difference from the expected value to be
1238 * printed in case the test fails.
1240 BOOST_CHECK_EQUAL(*t1->format_iso8601 (true, true, true, false), in1);
1241 BOOST_CHECK_EQUAL(*t2->format_iso8601 (true, true, false, false), in2);
1244 BOOST_AUTO_TEST_CASE(FromString_iso8601_offset)
1246 const std::string in1 ("2019-04-25T13:41:47Z");
1247 const std::string in2 ("2019-04-25T13:41:47+0200"); /* = UTC(in1 + 2h) */
1248 const std::string in3 ("2019-04-25T15:41:47+0000"); /* = UTC(in2) */
1251 boost::optional<I2n::clock::Time> t1 = I2n::clock::time_of_iso8601 (in1, true, true, true);
1252 boost::optional<I2n::clock::Time> t2 = I2n::clock::time_of_iso8601 (in2, true, true, true);
1253 boost::optional<I2n::clock::Time> t3 = I2n::clock::time_of_iso8601 (in3, true, true, true);
1255 # ifdef GLIBC_STRPTIME_LACKS_Z
1263 # ifndef GLIBC_STRPTIME_LACKS_Z
1264 BOOST_CHECK_EQUAL(*t1->format_iso8601 (), "2019-04-25T13:41:47+0000");
1265 BOOST_CHECK_EQUAL(t1->get_sec (), 1556199707);
1267 BOOST_CHECK_EQUAL(*t2->format_iso8601 (), "2019-04-25T15:41:47+0000");
1268 # ifndef GLIBC_STRPTIME_LACKS_Z
1269 BOOST_CHECK_EQUAL(t2->get_sec (), t1->get_sec () + 2 * 60 * 60);
1271 BOOST_CHECK_EQUAL(*t2, *t3);
1272 BOOST_CHECK_EQUAL(*t3->format_iso8601 (), "2019-04-25T15:41:47+0000");
1275 BOOST_AUTO_TEST_CASE(FromString_iso8601_tzdiff)
1277 const std::string in ("2019-04-26T13:45:02+0000");
1279 this->set_tz ("UTC");
1280 boost::optional<I2n::clock::Time> t1 = I2n::clock::time_of_iso8601 (in, true, true, false);
1282 this->set_tz ("CET");
1283 boost::optional<I2n::clock::Time> t2 = I2n::clock::time_of_iso8601 (in, true, true, false);
1285 BOOST_CHECK_EQUAL(*t1->format_iso8601 (true, true, true, true), in);
1286 BOOST_CHECK_EQUAL(*t2->format_iso8601 (true, true, true, true), "2019-04-26T13:45:02+0000");
1289 BOOST_AUTO_TEST_CASE(FromString_iso8601_32bit_time_t_err)
1291 const std::string timeless ("11:11:11");
1292 boost::optional<I2n::clock::Time> untimely = boost::none;
1296 untimely = I2n::clock::time_of_iso8601 (timeless, false, true, false);
1299 BOOST_CHECK(!untimely);
1301 BOOST_CHECK(untimely);
1302 BOOST_CHECK_EQUAL(*untimely->format_iso8601 (true, false, true, false),
1307 BOOST_AUTO_TEST_CASE(Ctor_32bit_time_t_err)
1309 boost::optional<std::string> threw = boost::none;
1312 memset (&tm, 0, sizeof (tm));
1323 I2n::clock::Time untimely (tm);
1324 } catch (I2n::clock::conversion_error &exn) {
1325 threw = std::string (exn);
1330 BOOST_CHECK_EQUAL(*threw,
1331 "errno=0 [mktime: from struct tm {Sun Nov 11 11:11:11 1111}]");
1333 BOOST_CHECK(!threw);
1337 BOOST_AUTO_TEST_CASE(containers_list)
1339 std::list<I2n::clock::Time> ts;
1341 ts.push_back (I2n::clock::zero ());
1342 ts.push_back (I2n::clock::zero ());
1344 BOOST_CHECK_EQUAL(ts.size (), 2);
1347 BOOST_AUTO_TEST_CASE(containers_vec)
1349 std::vector<I2n::clock::Time> ts;
1351 ts.push_back (I2n::clock::zero ());
1352 ts.push_back (I2n::clock::zero ());
1354 BOOST_CHECK_EQUAL(ts.size (), 2);
1357 BOOST_AUTO_TEST_CASE(containers_set)
1359 std::set<I2n::clock::Time> ts;
1361 ts.insert (I2n::clock::zero ());
1362 ts.insert (I2n::clock::Time (42, 2187));
1363 ts.insert (I2n::clock::zero ());
1365 BOOST_CHECK_EQUAL(ts.size (), 2);
1368 BOOST_AUTO_TEST_CASE(containers_list_mean)
1370 std::list<I2n::clock::Time> ts;
1372 ts.push_back (I2n::clock::Time (42, 42));
1373 ts.push_back (I2n::clock::Time (1337, 1337));
1375 BOOST_CHECK_EQUAL(I2n::clock::mean (ts),
1376 I2n::clock::Time (689, 500000689));
1379 BOOST_AUTO_TEST_CASE(containers_list_mean_zero)
1381 std::list<I2n::clock::Time> ts;
1383 ts.push_back (I2n::clock::Time (0, 0));
1384 ts.push_back (I2n::clock::Time (0, 0));
1385 ts.push_back (I2n::clock::Time (0, 0));
1386 ts.push_back (I2n::clock::Time (0, 0));
1388 BOOST_CHECK_EQUAL(I2n::clock::mean (ts),
1389 I2n::clock::zero ());
1392 BOOST_AUTO_TEST_CASE(containers_list_mean_empty)
1394 std::list<I2n::clock::Time> ts;
1396 BOOST_CHECK_EQUAL(I2n::clock::mean (ts), I2n::clock::Time (0, 0));
1399 BOOST_AUTO_TEST_CASE(containers_set_mean)
1401 std::set<I2n::clock::Time> ts;
1403 ts.insert (I2n::clock::Time (42));
1404 ts.insert (I2n::clock::Time (1337));
1405 ts.insert (I2n::clock::Time (2187));
1407 BOOST_CHECK_EQUAL(I2n::clock::mean (ts),
1408 I2n::clock::Time (1188, 666666666));
1411 BOOST_AUTO_TEST_CASE(containers_set_median_empty)
1413 std::set<I2n::clock::Time> ts;
1415 BOOST_CHECK_EQUAL(I2n::clock::median (ts), I2n::clock::Time (0, 0));
1418 BOOST_AUTO_TEST_CASE(containers_set_median_one)
1420 std::set<I2n::clock::Time> ts;
1422 ts.insert (I2n::clock::Time (42, 0));
1424 BOOST_CHECK_EQUAL(I2n::clock::median (ts),
1425 I2n::clock::Time (42, 0));
1428 BOOST_AUTO_TEST_CASE(containers_set_median_multi)
1430 std::set<I2n::clock::Time> ts;
1432 ts.insert (I2n::clock::Time (42));
1433 ts.insert (I2n::clock::Time (1337));
1434 ts.insert (I2n::clock::Time (2187));
1436 BOOST_CHECK_EQUAL(I2n::clock::median (ts), I2n::clock::Time (1337));
1439 BOOST_AUTO_TEST_CASE(containers_vec_median_multi)
1441 std::vector<I2n::clock::Time> ts;
1443 ts.push_back (I2n::clock::Time (42));
1444 ts.push_back (I2n::clock::Time (1337));
1445 ts.push_back (I2n::clock::Time (2187));
1447 BOOST_CHECK_EQUAL(I2n::clock::median (ts), I2n::clock::Time (1337));
1450 BOOST_AUTO_TEST_CASE(containers_list_median_multi)
1452 std::list<I2n::clock::Time> ts;
1454 ts.push_back (I2n::clock::Time (42));
1455 ts.push_back (I2n::clock::Time (1337));
1456 ts.push_back (I2n::clock::Time (2187));
1457 ts.push_back (I2n::clock::Time (0xdead));
1458 ts.push_back (I2n::clock::Time (0xbeef));
1460 BOOST_CHECK_EQUAL(I2n::clock::median (ts),
1461 I2n::clock::Time (2187));
1464 BOOST_AUTO_TEST_CASE(containers_list_median_multi_evensize)
1466 std::list<I2n::clock::Time> ts;
1468 ts.push_back (I2n::clock::Time (42));
1469 ts.push_back (I2n::clock::Time (1337));
1470 ts.push_back (I2n::clock::Time (2187));
1471 ts.push_back (I2n::clock::Time (0xf00d));
1472 ts.push_back (I2n::clock::Time (0xfeed));
1473 ts.push_back (I2n::clock::Time (0xdeadf0e));
1475 BOOST_CHECK_EQUAL(I2n::clock::median (ts), I2n::clock::Time (0xf00d));
1478 BOOST_AUTO_TEST_SUITE_END() /* [Clock] */
1480 BOOST_AUTO_TEST_SUITE_END()