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 #define BOOST_TEST_DYN_LINK
28 #include <boost/test/unit_test.hpp>
30 #include <timefunc.hxx>
31 #include <filefunc.hxx>
39 using namespace I2n::Time;
41 class TestTimeFuncFixture
44 typedef std::list< std::string > StringList;
45 std::set<std::string> used_check_files;
46 std::string tz; /* save and restore TZ from envp */
48 std::string get_check_file_path(std::string tag)
51 result= "__unittest__" + tag + ".dat";
52 used_check_files.insert(result);
54 } // eo get_check_file_path
56 void remove_check_files()
58 for (std::set<std::string>::iterator it= used_check_files.begin();
59 it != used_check_files.end();
62 std::string filepath(*it);
63 if (path_exists(filepath))
69 used_check_files.clear();
70 } // eo remove_check_files
75 if (setenv ("TZ", "UTC", 1) == -1)
78 << "error setting environment 'TZ': [" << this->tz << "]"
89 : tz (secure_getenv ("TZ") ?: "")
93 ~TestTimeFuncFixture()
98 if (setenv ("TZ", this->tz.c_str (), 1) == -1)
101 << "error cleaning up environment 'TZ': [" << this->tz << "]"
112 BOOST_FIXTURE_TEST_SUITE(TestTimeFunc, TestTimeFuncFixture)
114 BOOST_AUTO_TEST_CASE(AddIntervalsDisjoint)
118 intervals.add( Interval( 10, 100 ) );
119 intervals.add( Interval( 600, 620 ) );
121 BOOST_CHECK_EQUAL( false, intervals.empty() );
122 BOOST_CHECK_EQUAL( 2u, intervals.size() );
124 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
125 BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() );
127 BOOST_CHECK_EQUAL( 600u, intervals.back().lower_bound() );
128 BOOST_CHECK_EQUAL( 620u, intervals.back().upper_bound() );
129 } // eo AddIntervalsDisjoint()
133 BOOST_AUTO_TEST_CASE(AddIntervalsInclude)
137 intervals.add( Interval( 10, 100 ) );
138 intervals.add( Interval( 10, 80 ) );
140 BOOST_CHECK_EQUAL( false, intervals.empty() );
141 BOOST_CHECK_EQUAL( 1u, intervals.size() );
143 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
144 BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() );
145 BOOST_CHECK_EQUAL( false, intervals.front().changed() );
146 } // eo AddIntervalsInclude()
150 BOOST_AUTO_TEST_CASE(AddIntervalsEmbrace)
154 intervals.add( Interval( 10, 100 ) );
155 intervals.add( Interval( 5, 120 ) );
157 BOOST_CHECK_EQUAL( false, intervals.empty() );
158 BOOST_CHECK_EQUAL( 1u, intervals.size() );
160 BOOST_CHECK_EQUAL( 5u, intervals.front().lower_bound() );
161 BOOST_CHECK_EQUAL( 120u, intervals.front().upper_bound() );
162 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
163 } // eo AddIntervalsEmbrace()
167 BOOST_AUTO_TEST_CASE(AddIntervalsJoin1)
171 intervals.add( Interval( 10, 100 ) );
172 intervals.add( Interval( 60, 120 ) );
174 BOOST_CHECK_EQUAL( false, intervals.empty() );
175 BOOST_CHECK_EQUAL( 1u, intervals.size() );
177 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
178 BOOST_CHECK_EQUAL( 120u, intervals.front().upper_bound() );
179 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
180 } // eo AddIntervalsJoin1()
184 BOOST_AUTO_TEST_CASE(AddIntervalsJoin1b)
188 intervals.add( Interval( 10, 100 ) );
189 intervals.add( Interval( 100, 120 ) );
191 BOOST_CHECK_EQUAL( false, intervals.empty() );
192 BOOST_CHECK_EQUAL( 1u, intervals.size() );
194 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
195 BOOST_CHECK_EQUAL( 120u, intervals.front().upper_bound() );
196 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
197 } // eo AddIntervalsJoin1b()
201 BOOST_AUTO_TEST_CASE(AddIntervalsJoin2)
205 intervals.add( Interval( 10, 100 ) );
206 intervals.add( Interval( 200, 250 ) );
208 BOOST_CHECK_EQUAL( false, intervals.empty() );
209 BOOST_CHECK_EQUAL( 2u, intervals.size() );
211 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
212 BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() );
213 BOOST_CHECK_EQUAL( 200u, intervals.back().lower_bound() );
214 BOOST_CHECK_EQUAL( 250u, intervals.back().upper_bound() );
216 // now add the gap; the intervals should collapse to one covering all:
217 intervals.add( Interval(100, 200) );
219 BOOST_CHECK_EQUAL( false, intervals.empty() );
220 BOOST_CHECK_EQUAL( 1u, intervals.size() );
222 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
223 BOOST_CHECK_EQUAL( 250u, intervals.front().upper_bound() );
224 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
225 } // eo AddIntervalsJoin2()
229 BOOST_AUTO_TEST_CASE(SubIntervalsDisjoint)
233 intervals.add( Interval(10, 100) );
234 intervals.sub( Interval(0, 10) );
236 BOOST_CHECK_EQUAL( false, intervals.empty() );
237 BOOST_CHECK_EQUAL( 1u, intervals.size() );
239 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
240 BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() );
241 BOOST_CHECK_EQUAL( false, intervals.front().changed() );
242 } // eo SubIntervalsDisjoint()
246 BOOST_AUTO_TEST_CASE(SubIntervalsExact)
250 intervals.add( Interval(10, 100) );
251 intervals.sub( Interval(10, 100) );
253 BOOST_CHECK_EQUAL( true, intervals.empty() );
254 BOOST_CHECK_EQUAL( 0u, intervals.size() );
255 } // eo SubIntervalsExact()
259 BOOST_AUTO_TEST_CASE(SubIntervalsSplit1)
263 intervals.add( Interval(10, 100) );
264 intervals.sub( Interval(20, 40) );
266 BOOST_CHECK_EQUAL( false, intervals.empty() );
267 BOOST_CHECK_EQUAL( 2u, intervals.size() );
269 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
270 BOOST_CHECK_EQUAL( 20u, intervals.front().upper_bound() );
272 BOOST_CHECK_EQUAL( 40u, intervals.back().lower_bound() );
273 BOOST_CHECK_EQUAL( 100u, intervals.back().upper_bound() );
274 BOOST_CHECK_EQUAL( false, intervals.front().changed() );
275 BOOST_CHECK_EQUAL( true, intervals.back().changed() );
276 } // eo SubIntervalsSplit1()
279 BOOST_AUTO_TEST_CASE(SubIntervalsCutFront)
283 intervals.add( Interval(10, 100) );
284 intervals.sub( Interval(10, 20) );
286 BOOST_CHECK_EQUAL( false, intervals.empty() );
287 BOOST_CHECK_EQUAL( 1u, intervals.size() );
289 BOOST_CHECK_EQUAL( 20u, intervals.front().lower_bound() );
290 BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() );
291 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
292 } // eo SubIntervalsCutFront()
295 BOOST_AUTO_TEST_CASE(SubIntervalsCutBack)
299 intervals.add( Interval(10, 100) );
300 intervals.sub( Interval(87, 100) );
302 BOOST_CHECK_EQUAL( false, intervals.empty() );
303 BOOST_CHECK_EQUAL( 1u, intervals.size() );
305 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
306 BOOST_CHECK_EQUAL( 87u, intervals.front().upper_bound() );
307 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
308 } // eo SubIntervalsCutBack()
312 BOOST_AUTO_TEST_CASE(SubIntervalsCutMore)
316 intervals.add( Interval( 10, 100) );
317 intervals.add( Interval(110, 200) );
318 intervals.add( Interval(210, 300) );
320 // this should remove the first 2 intervals and cut the third:
321 intervals.sub( Interval(8, 220) );
323 BOOST_CHECK_EQUAL( false, intervals.empty() );
324 BOOST_CHECK_EQUAL( 1u, intervals.size() );
326 BOOST_CHECK_EQUAL( 220u, intervals.front().lower_bound() );
327 BOOST_CHECK_EQUAL( 300u, intervals.front().upper_bound() );
328 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
329 } // eo SubIntervalsCutMore()
332 BOOST_AUTO_TEST_CASE(IntervalComparisons)
334 Intervals intervals1;
335 Intervals intervals2;
337 intervals1.add( Interval( 10, 120) );
339 intervals2.add( Interval( 10, 110 ) );
340 intervals2.add( Interval( 100, 120 ) );
342 BOOST_CHECK_EQUAL( 1u, intervals2.size() );
344 BOOST_CHECK( intervals1 == intervals2 );
345 BOOST_CHECK_EQUAL( true, intervals1.contains( intervals2 ));
346 BOOST_CHECK_EQUAL( true, intervals2.contains( intervals1 ));
348 intervals2.sub( Interval( 40, 50) );
350 BOOST_CHECK( intervals1 != intervals2 );
351 BOOST_CHECK_EQUAL( true, intervals1.contains( intervals2 ));
352 BOOST_CHECK_EQUAL( false, intervals2.contains( intervals1 ));
353 } // eo IntervalComparisons()
357 BOOST_AUTO_TEST_CASE(MonotonicClock)
362 bool res = monotonic_clock_gettime(sec0,nsec0);
363 BOOST_CHECK_EQUAL( true, res );
366 res= monotonic_clock_gettime(sec1,nsec1);
367 BOOST_CHECK_EQUAL( true, res);
369 long delta_sec = sec1 - sec0;
370 long delta_nsec= nsec1 - nsec0;
372 long delta_millisec= ( delta_nsec / 1000000L) + delta_sec * 1000L;
374 BOOST_CHECK( delta_millisec >= 250 - /*fuzz*/ 1);
375 BOOST_CHECK( delta_millisec < 300 );
376 } // eo MonotonicClock()
378 BOOST_AUTO_TEST_CASE(WeekInvalid)
380 Week week("99999999");
381 BOOST_CHECK_EQUAL(false, week.is_valid());
382 BOOST_CHECK_EQUAL(string(""), week.get_displaystring());
385 BOOST_AUTO_TEST_CASE(WeekDisplayString1)
388 BOOST_CHECK_EQUAL(true, week.is_valid());
389 BOOST_CHECK_EQUAL(string(""), week.get_displaystring());
392 BOOST_AUTO_TEST_CASE(WeekDisplayString2)
394 Week week("0123456");
395 BOOST_CHECK_EQUAL(true, week.is_valid());
396 BOOST_CHECK_EQUAL(string("Mon-Sun"), week.get_displaystring());
399 BOOST_AUTO_TEST_CASE(WeekDisplayString3)
402 BOOST_CHECK_EQUAL(true, week.is_valid());
403 BOOST_CHECK_EQUAL(string("Mon-Sat"), week.get_displaystring());
406 BOOST_AUTO_TEST_CASE(WeekDisplayString4)
409 BOOST_CHECK_EQUAL(true, week.is_valid());
410 BOOST_CHECK_EQUAL(string("Mon-Fri, Sun"), week.get_displaystring());
413 BOOST_AUTO_TEST_CASE(WeekDisplayString5)
416 BOOST_CHECK_EQUAL(true, week.is_valid());
417 BOOST_CHECK_EQUAL(string("Mon, Tue, Fri, Sat"), week.get_displaystring());
420 BOOST_AUTO_TEST_CASE(WeekDisplayString6)
423 BOOST_CHECK_EQUAL(true, week.is_valid());
424 BOOST_CHECK_EQUAL(string("Tue, Thu, Sat, Sun"), week.get_displaystring());
427 BOOST_AUTO_TEST_CASE(WeekDisplayString7)
430 BOOST_CHECK_EQUAL(true, week.is_valid());
431 BOOST_CHECK_EQUAL(string("Mon, Wed, Fri"), week.get_displaystring());
434 BOOST_AUTO_TEST_CASE(WeekDisplayString8)
437 BOOST_CHECK_EQUAL(true, week.is_valid());
438 BOOST_CHECK_EQUAL(string("Mon, Fri"), week.get_displaystring());
441 BOOST_AUTO_TEST_CASE(WeekDisplayString9)
444 BOOST_CHECK_EQUAL(true, week.is_valid());
445 BOOST_CHECK_EQUAL(string("Sat, Sun"), week.get_displaystring());
448 BOOST_AUTO_TEST_CASE(WeekDisplayString10)
451 BOOST_CHECK_EQUAL(true, week.is_valid());
452 BOOST_CHECK_EQUAL(string("Fri-Sun"), week.get_displaystring());
455 BOOST_AUTO_TEST_CASE(WeekDisplayString11)
458 BOOST_CHECK_EQUAL(true, week.is_valid());
459 BOOST_CHECK_EQUAL(string("Sun"), week.get_displaystring());
462 BOOST_AUTO_TEST_CASE(WeekDisplayString12)
465 BOOST_CHECK_EQUAL(true, week.is_valid());
466 BOOST_CHECK_EQUAL(string("Sat"), week.get_displaystring());
469 BOOST_AUTO_TEST_CASE(WeekDisplayString13)
472 BOOST_CHECK_EQUAL(true, week.is_valid());
473 BOOST_CHECK_EQUAL(string("Mon-Wed"), week.get_displaystring());
476 BOOST_AUTO_TEST_CASE(FormatFullTime)
478 time_t seconds = 1318844005;
480 BOOST_CHECK_EQUAL("17.10.2011 11:33", format_full_time(seconds));
483 BOOST_AUTO_TEST_CASE(DateToSeconds1)
486 BOOST_CHECK_EQUAL(1325372400, date_to_seconds("2012-01-01"));
489 BOOST_AUTO_TEST_CASE(DateToSeconds2)
492 BOOST_CHECK_EQUAL(1341093600, date_to_seconds("2012-07-01"));
495 BOOST_AUTO_TEST_CASE(FormatISO8601_T)
497 const time_t moment = 1515492684;
498 BOOST_CHECK_EQUAL("10:11:24",
499 format_iso8601 (moment, true, false, true, false));
502 BOOST_AUTO_TEST_CASE(FormatISO8601_TZ_local)
504 const time_t moment = 1515492684;
505 BOOST_CHECK_EQUAL("11:11:24Z+0100",
506 format_iso8601 (moment, false, false, true, true));
509 BOOST_AUTO_TEST_CASE(FormatISO8601_TZ)
511 const time_t moment = 1515492684;
512 BOOST_CHECK_EQUAL("10:11:24Z+0000",
513 format_iso8601 (moment, true, false, true, true));
516 BOOST_AUTO_TEST_CASE(FormatISO8601_DTZ_local)
518 const time_t moment = 1515492684;
519 BOOST_CHECK_EQUAL("2018-01-09T11:11:24Z+0100",
520 format_iso8601 (moment, false, true, true, true));
523 BOOST_AUTO_TEST_CASE(FormatISO8601_DTZ)
525 const time_t moment = 1515492684;
526 BOOST_CHECK_EQUAL("2018-01-09T10:11:24Z+0000",
527 format_iso8601 (moment, true, true, true, true));
530 BOOST_AUTO_TEST_CASE(FormatISO8601_DT)
532 const time_t moment = 1515492684;
533 BOOST_CHECK_EQUAL("2018-01-09T10:11:24",
534 format_iso8601 (moment, true, true, true, false));
537 BOOST_AUTO_TEST_CASE(FormatISO8601_D)
539 const time_t moment = 1515492684;
540 BOOST_CHECK_EQUAL("2018-01-09",
541 format_iso8601 (moment, true, true, false, false));
544 BOOST_AUTO_TEST_CASE(FormatISO8601_DTZ_struct_tm)
552 helau.tm_year = 2018 - 1900;
557 helau.tm_zone = NULL;
559 BOOST_CHECK_EQUAL("2018-11-11T11:11:11Z+0000",
560 format_iso8601 (helau, true, true, true));
563 BOOST_AUTO_TEST_CASE(FormatISO8601_DTZ_struct_timespec)
565 struct timespec ts = { 1541934671, 11 };
567 BOOST_CHECK_EQUAL("2018-11-11T11:11:11Z+0000",
568 format_iso8601 (ts, true, true, true, true));
571 BOOST_AUTO_TEST_SUITE(Clock)
573 BOOST_AUTO_TEST_CASE(ctor_simple)
577 BOOST_CHECK_EQUAL(t.get_sec (), 0);
578 BOOST_CHECK_EQUAL(t.get_nsec (), 0);
581 BOOST_AUTO_TEST_CASE(ctor_type)
583 I2n::clock::Time t1 (I2n::clock::type::real);
584 I2n::clock::Time t2 (I2n::clock::type::mono);
585 I2n::clock::Time t3 (I2n::clock::type::boot);
586 I2n::clock::Time t4 (I2n::clock::type::cpu);
588 BOOST_CHECK_EQUAL(t1.get_sec (), 0);
589 BOOST_CHECK_EQUAL(t1.get_nsec (), 0);
591 BOOST_CHECK_EQUAL(t2.get_sec (), 0);
592 BOOST_CHECK_EQUAL(t2.get_nsec (), 0);
594 BOOST_CHECK_EQUAL(t3.get_sec (), 0);
595 BOOST_CHECK_EQUAL(t3.get_nsec (), 0);
597 BOOST_CHECK_EQUAL(t4.get_sec (), 0);
598 BOOST_CHECK_EQUAL(t4.get_nsec (), 0);
601 BOOST_AUTO_TEST_CASE(ctor_variant)
603 I2n::clock::Time tmc (I2n::clock::type::mono);
604 I2n::clock::Time tmr (I2n::clock::type::mono, I2n::clock::type::raw);
605 I2n::clock::Time tme (I2n::clock::type::mono, I2n::clock::type::exact);
607 I2n::clock::Time trc (I2n::clock::type::real);
608 I2n::clock::Time tre (I2n::clock::type::real, I2n::clock::type::exact);
610 I2n::clock::Time tb (I2n::clock::type::boot);
612 I2n::clock::Time tcp (I2n::clock::type::cpu);
613 I2n::clock::Time tct (I2n::clock::type::cpu, I2n::clock::type::thread);
615 BOOST_CHECK_EQUAL(tmc.get_sec (), 0); /* MONO */
616 BOOST_CHECK_EQUAL(tmc.get_nsec (), 0);
618 BOOST_CHECK_EQUAL(tmr.get_sec (), 0);
619 BOOST_CHECK_EQUAL(tmr.get_nsec (), 0);
621 BOOST_CHECK_EQUAL(tme.get_sec (), 0);
622 BOOST_CHECK_EQUAL(tme.get_nsec (), 0);
624 BOOST_CHECK_EQUAL(trc.get_sec (), 0); /* REAL */
625 BOOST_CHECK_EQUAL(trc.get_nsec (), 0);
627 BOOST_CHECK_EQUAL(tre.get_sec (), 0);
628 BOOST_CHECK_EQUAL(tre.get_nsec (), 0);
630 BOOST_CHECK_EQUAL(tb.get_sec (), 0); /* BOOT */
631 BOOST_CHECK_EQUAL(tb.get_nsec (), 0);
633 BOOST_CHECK_EQUAL(tcp.get_sec (), 0); /* CPU */
634 BOOST_CHECK_EQUAL(tcp.get_nsec (), 0);
636 BOOST_CHECK_EQUAL(tct.get_sec (), 0);
637 BOOST_CHECK_EQUAL(tct.get_nsec (), 0);
640 BOOST_AUTO_TEST_CASE(initializer_now)
642 boost::optional<I2n::clock::Time> t = I2n::clock::now ();
645 BOOST_CHECK_GT(t->get_sec (), 0);
646 BOOST_CHECK_EQUAL(t->err, 0);
649 BOOST_AUTO_TEST_CASE(initializer_zero)
651 I2n::clock::Time stundenull = I2n::clock::zero ();
653 BOOST_CHECK_EQUAL(stundenull.get_sec (), 0);
654 BOOST_CHECK_EQUAL(stundenull.get_nsec (), 0);
655 BOOST_CHECK_EQUAL(stundenull.err, 0);
658 BOOST_AUTO_TEST_CASE(member_set_now)
662 BOOST_CHECK(t.set ());
664 BOOST_CHECK_NE(t.get_sec (), 0);
667 BOOST_AUTO_TEST_CASE(member_set_value)
673 BOOST_CHECK_EQUAL(t.get_sec (), 42);
674 BOOST_CHECK_EQUAL(t.get_nsec (), 42);
677 BOOST_AUTO_TEST_CASE(member_set_value_type)
681 t.set (42, 42, I2n::clock::type::real, I2n::clock::type::exact);
683 BOOST_CHECK_EQUAL(t.get_sec (), 42);
684 BOOST_CHECK_EQUAL(t.get_nsec (), 42);
687 BOOST_AUTO_TEST_CASE(member_add_parts)
694 BOOST_CHECK_EQUAL(t.get_sec (), 2229);
695 BOOST_CHECK_EQUAL(t.get_nsec (), 2229);
698 BOOST_AUTO_TEST_CASE(member_sub_parts)
705 BOOST_CHECK_EQUAL(t.get_sec (), 0);
706 BOOST_CHECK_EQUAL(t.get_nsec (), 999999999);
709 BOOST_AUTO_TEST_CASE(member_sub_Time)
719 BOOST_CHECK_EQUAL(t1.get_sec (), 0);
720 BOOST_CHECK_EQUAL(t1.get_nsec (), 42L);
723 BOOST_AUTO_TEST_CASE(member_diff)
725 static const time_t five = 5 * 365 * 24 * 3600;
727 I2n::clock::Time t1 (42, 1337);
728 I2n::clock::Time t2 = t1 + five;;
729 I2n::clock::Time t3 = t1 - five;;
731 BOOST_CHECK_EQUAL(t2, I2n::clock::Time ((time_t)42 + five, 1337));
732 BOOST_CHECK_EQUAL(t3, I2n::clock::Time ((time_t)42 - five, 1337));
733 BOOST_CHECK_EQUAL(t1.difference (t3), t3.difference (t1));
734 BOOST_CHECK_EQUAL(t3.difference (t3), t3.difference (t3));
737 BOOST_AUTO_TEST_CASE(op_copyassign)
742 BOOST_CHECK(t1.set ());
746 BOOST_CHECK_EQUAL(t1.get_sec (), t2.get_sec ());
747 BOOST_CHECK_EQUAL(t1.get_nsec (), t2.get_nsec ());
750 BOOST_AUTO_TEST_CASE(op_equal)
755 BOOST_CHECK(t1.set ());
758 BOOST_CHECK_EQUAL(t1, t2);
761 BOOST_AUTO_TEST_CASE(op_add_Time)
765 I2n::clock::Time tsum;
771 BOOST_CHECK_EQUAL(tsum.get_sec (), 3524);
772 BOOST_CHECK_EQUAL(tsum.get_nsec (), 3524);
775 BOOST_AUTO_TEST_CASE(op_add_Time_carry)
779 I2n::clock::Time tsum;
783 t2.set (1300, 2L * 1000 * 1000 * 1000 + 1337);
785 t2.set (1300, 37L * 1000 * 1000 * 1000 + 1337);
791 BOOST_CHECK_EQUAL(tsum.get_sec (), 3489);
792 BOOST_CHECK_EQUAL(tsum.get_nsec (), 3524);
794 BOOST_CHECK_EQUAL(tsum.get_sec (), 3524);
795 BOOST_CHECK_EQUAL(tsum.get_nsec (), 3524);
799 BOOST_AUTO_TEST_CASE(op_add_time_t)
801 I2n::clock::Time t1 (2187, 2187);
803 I2n::clock::Time tsum;
807 BOOST_CHECK_EQUAL(tsum.get_sec (), 3524);
808 BOOST_CHECK_EQUAL(tsum.get_nsec (), 2187);
811 BOOST_AUTO_TEST_CASE(op_add_time_t_external)
814 I2n::clock::Time t2 (2187, 2187);
815 I2n::clock::Time tsum;
819 BOOST_CHECK_EQUAL(tsum.get_sec (), 3524);
820 BOOST_CHECK_EQUAL(tsum.get_nsec (), 2187);
823 BOOST_AUTO_TEST_CASE(op_incr_Time)
825 I2n::clock::Time t1 (2187, 2187);
826 I2n::clock::Time t2 (1337, 1337);
830 BOOST_CHECK_EQUAL(t1.get_sec (), 3524);
831 BOOST_CHECK_EQUAL(t1.get_nsec (), 3524);
834 BOOST_AUTO_TEST_CASE(op_incr_time_t)
836 I2n::clock::Time t1 (2187, 2187);
841 BOOST_CHECK_EQUAL(t1.get_sec (), 3524);
842 BOOST_CHECK_EQUAL(t1.get_nsec (), 2187);
845 BOOST_AUTO_TEST_CASE(op_subtract_Time)
849 I2n::clock::Time tdiff;
855 BOOST_CHECK_EQUAL(tdiff.get_sec (), 850);
856 BOOST_CHECK_EQUAL(tdiff.get_nsec (), 850);
859 BOOST_AUTO_TEST_CASE(op_subtract_time_t)
861 I2n::clock::Time t1 (2187, 2187);
863 I2n::clock::Time tdiff;
867 BOOST_CHECK_EQUAL(tdiff.get_sec (), 850);
868 BOOST_CHECK_EQUAL(tdiff.get_nsec (), 2187);
871 BOOST_AUTO_TEST_CASE(op_subtract_time_t_external)
874 I2n::clock::Time t2 (2187, 2187);
875 I2n::clock::Time tdiff;
879 BOOST_CHECK_EQUAL(tdiff.get_sec (), -851);
880 BOOST_CHECK_EQUAL(tdiff.get_nsec (), 999997813);
883 BOOST_AUTO_TEST_CASE(op_decr_Time)
885 I2n::clock::Time t1 (2187, 2187);
886 I2n::clock::Time t2 (1337, 1337);
890 BOOST_CHECK_EQUAL(t1.get_sec (), 850);
891 BOOST_CHECK_EQUAL(t1.get_nsec (), 850);
894 BOOST_AUTO_TEST_CASE(op_decr_time_t)
896 I2n::clock::Time t1 (2187, 2187);
901 BOOST_CHECK_EQUAL(t1.get_sec (), 850);
902 BOOST_CHECK_EQUAL(t1.get_nsec (), 2187);
905 BOOST_AUTO_TEST_CASE(op_mult_scale)
913 BOOST_CHECK_EQUAL(t2.get_sec (), 42);
914 BOOST_CHECK_EQUAL(t2.get_nsec (), 42);
917 BOOST_AUTO_TEST_CASE(op_mult_mutate)
919 I2n::clock::Time t1 ( 42, 42);
920 I2n::clock::Time t2 (1337, 0);
925 BOOST_CHECK_EQUAL(t1.get_sec (), 84);
926 BOOST_CHECK_EQUAL(t1.get_nsec (), 84);
927 BOOST_CHECK_EQUAL(t2.get_sec (), -13370);
930 BOOST_AUTO_TEST_CASE(op_mult_scale_carry)
935 t1.set (1, 500 * 1000 * 1000);
938 BOOST_CHECK_EQUAL(t2.get_sec (), 4);
939 BOOST_CHECK_EQUAL(t2.get_nsec (), 500 * 1000 * 1000);
942 BOOST_AUTO_TEST_CASE(op_equals)
950 BOOST_CHECK_EQUAL(t1, t2);
953 BOOST_AUTO_TEST_CASE(compare_equal)
961 BOOST_CHECK_EQUAL(I2n::clock::compare (t1, t2), 0);
964 BOOST_AUTO_TEST_CASE(compare_equal_type)
966 I2n::clock::Time t1 (42, 42, I2n::clock::type::real);
967 I2n::clock::Time t2 (42, 42, I2n::clock::type::cpu);
968 I2n::clock::Time t3 (42, 0, I2n::clock::type::real);
969 I2n::clock::Time t4 (42, 42, I2n::clock::type::real);
971 BOOST_CHECK_NE(t1, t2);
972 BOOST_CHECK_NE(t1, t3);
973 BOOST_CHECK_EQUAL(t1, t4);
976 BOOST_AUTO_TEST_CASE(compare_ne_sec)
984 BOOST_CHECK_EQUAL(I2n::clock::compare (t1, t2), -1);
985 BOOST_CHECK_EQUAL(I2n::clock::compare (t2, t1), 1);
988 BOOST_AUTO_TEST_CASE(compare_ne_nsec)
996 BOOST_CHECK_EQUAL(I2n::clock::compare (t1, t2), -1);
997 BOOST_CHECK_EQUAL(I2n::clock::compare (t2, t1), 1);
1000 BOOST_AUTO_TEST_CASE(compare_ne_both)
1002 I2n::clock::Time t1;
1003 I2n::clock::Time t2;
1008 BOOST_CHECK_EQUAL(I2n::clock::compare (t1, t2), 1);
1009 BOOST_CHECK_EQUAL(I2n::clock::compare (t2, t1), -1);
1012 BOOST_AUTO_TEST_CASE(op_ineq_sec)
1014 I2n::clock::Time t1 (1337);
1015 I2n::clock::Time t2 (2187);
1017 BOOST_CHECK_LT(t1, t2);
1018 BOOST_CHECK_GT(t2, t1);
1021 BOOST_AUTO_TEST_CASE(op_ineq_nsec)
1023 I2n::clock::Time t1 (1337, 23);
1024 I2n::clock::Time t2 (1337, 42);
1026 BOOST_CHECK_LT(t1, t2);
1027 BOOST_CHECK_GT(t2, t1);
1030 BOOST_AUTO_TEST_CASE(op_ineq_both)
1032 I2n::clock::Time t1 (2187, 23);
1033 I2n::clock::Time t2 (1337, 42);
1035 BOOST_CHECK_LT(t2, t1);
1036 BOOST_CHECK_GT(t1, t2);
1039 BOOST_AUTO_TEST_CASE(op_eq_time_t)
1041 boost::optional<I2n::clock::Time> t1 = I2n::clock::now ();
1042 const time_t t2 = time (NULL); /* race here */
1046 BOOST_CHECK_NE(*t1, t2);
1047 BOOST_CHECK_LT(*t1, t2);
1048 BOOST_CHECK_GT( t2, *t1);
1051 BOOST_AUTO_TEST_CASE(Format_sec_msec)
1053 I2n::clock::Time t1 (42, 42);
1054 I2n::clock::Time t2 ( 4, 242424242);
1055 I2n::clock::Time t3 ( 0, 133713371);
1056 I2n::clock::Time t4 ( 0, 0);
1058 std::string s1 = t1.format_sec_msec ();
1059 std::string s2 = t2.format_sec_msec ();
1060 std::string s3 = t3.format_sec_msec ();
1061 std::string s4 = t4.format_sec_msec ();
1063 BOOST_CHECK_EQUAL("42s 0ms" , s1);
1064 BOOST_CHECK_EQUAL( "4s 242ms", s2);
1065 BOOST_CHECK_EQUAL( "0s 133ms", s3);
1066 BOOST_CHECK_EQUAL( "0s 0ms" , s4);
1069 BOOST_AUTO_TEST_CASE(Format_min_sec_msec)
1071 I2n::clock::Time t1 (42*60 + 42, 42);
1072 I2n::clock::Time t2 ( 4*60 + 42, 242424242);
1073 I2n::clock::Time t3 ( 0*60 + 42, 133713371);
1074 I2n::clock::Time t4 ( 0 + 0, 0);
1076 std::string s1 = *t1.format_min_sec_msec ();
1077 std::string s2 = *t2.format_min_sec_msec ();
1078 std::string s3 = *t3.format_min_sec_msec ();
1079 std::string s4 = *t4.format_min_sec_msec ();
1081 BOOST_CHECK_EQUAL("42m42.000s", s1);
1082 BOOST_CHECK_EQUAL( "4m42.242s", s2);
1083 BOOST_CHECK_EQUAL( "0m42.133s", s3);
1084 BOOST_CHECK_EQUAL( "0m0.000s", s4);
1087 BOOST_AUTO_TEST_CASE(FormatISO8601_T)
1089 I2n::clock::Time t (42, 42);
1090 boost::optional<std::string> s = t.format_iso8601 (true, false, true, false);
1092 BOOST_CHECK_EQUAL("00:00:42", *s);
1095 BOOST_AUTO_TEST_CASE(FormatISO8601_DT)
1097 I2n::clock::Time t (1541934671, 0);
1098 boost::optional<std::string> s = t.format_iso8601 (true, true, true, false);
1100 BOOST_CHECK_EQUAL("2018-11-11T11:11:11", *s);
1103 BOOST_AUTO_TEST_CASE(FormatISO8601_DTZ)
1105 I2n::clock::Time t (1541934671, 0);
1106 boost::optional<std::string> s = t.format_iso8601 (true, true, true, true);
1108 BOOST_CHECK_EQUAL("2018-11-11T11:11:11Z+0000", *s);
1111 BOOST_AUTO_TEST_CASE(Format_make_nice_time)
1113 I2n::clock::Time t (111111, 0);
1114 boost::optional<std::string> s = t.make_nice_time ();
1116 BOOST_CHECK_EQUAL("1 day, 06:51:51", *s);
1119 BOOST_AUTO_TEST_CASE(Format_format_full_time)
1121 I2n::clock::Time t (1541934671, 0);
1123 * brr, the old formatters use localtime without a way to opt out of
1127 boost::optional<std::string> s = t.format_full_time ();
1129 BOOST_CHECK_EQUAL("11.11.2018 11:11", *s);
1132 BOOST_AUTO_TEST_CASE(Format_format_date)
1134 I2n::clock::Time t (1541934671, 0);
1135 boost::optional<std::string> s = t.format_date ();
1137 BOOST_CHECK_EQUAL("11.11.2018", *s);
1140 BOOST_AUTO_TEST_CASE(FromString_iso8601_full)
1142 const std::string in1 ("0001-01-01T00:00:00Z+0000");
1143 const std::string in2 ("2018-11-11T11:11:11Z+0000");
1147 boost::optional<I2n::clock::Time> t1 = I2n::clock::time_of_iso8601 (in1);
1148 boost::optional<I2n::clock::Time> t2 = I2n::clock::time_of_iso8601 (in2);
1154 BOOST_CHECK_EQUAL(*t1->format_iso8601 (), in1);
1158 BOOST_CHECK_EQUAL(*t2->format_iso8601 (), in2);
1161 BOOST_AUTO_TEST_CASE(FromString_iso8601_full_negyear)
1163 const std::string in1 ("-0001-01-01T00:00:00Z+0000");
1164 const std::string in2 ("-2018-11-11T11:11:11Z+0000");
1168 boost::optional<I2n::clock::Time> t1 = I2n::clock::time_of_iso8601 (in1);
1169 boost::optional<I2n::clock::Time> t2 = I2n::clock::time_of_iso8601 (in2);
1177 BOOST_CHECK_EQUAL(*t1->format_iso8601 (), in1);
1178 BOOST_CHECK_EQUAL(*t2->format_iso8601 (), in2);
1182 BOOST_AUTO_TEST_CASE(FromString_iso8601_partial)
1184 const std::string in1 ("2018-11-11T11:11:11");
1185 const std::string in2 ("2018-11-11");
1189 boost::optional<I2n::clock::Time> t1 =
1190 I2n::clock::time_of_iso8601 (in1, true, true, false);
1191 boost::optional<I2n::clock::Time> t2 =
1192 I2n::clock::time_of_iso8601 (in2, true, false, false);
1197 * We test for the difference here which is zero if the number is
1198 * correct but causes the difference from the expected value to be
1199 * printed in case the test fails.
1201 BOOST_CHECK_EQUAL(*t1->format_iso8601 (true, true, true, false), in1);
1202 BOOST_CHECK_EQUAL(*t2->format_iso8601 (true, true, false, false), in2);
1205 BOOST_AUTO_TEST_CASE(FromString_iso8601_32bit_time_t_err)
1207 const std::string timeless ("11:11:11");
1208 boost::optional<I2n::clock::Time> untimely = boost::none;
1212 untimely = I2n::clock::time_of_iso8601 (timeless, false, true, false);
1215 BOOST_CHECK(!untimely);
1217 BOOST_CHECK(untimely);
1218 BOOST_CHECK_EQUAL(*untimely->format_iso8601 (true, false, true, false),
1223 BOOST_AUTO_TEST_CASE(Ctor_32bit_time_t_err)
1225 boost::optional<std::string> threw = boost::none;
1228 memset (&tm, 0, sizeof (tm));
1239 I2n::clock::Time untimely (tm);
1240 } catch (I2n::clock::conversion_error &exn) {
1241 threw = std::string (exn);
1246 BOOST_CHECK_EQUAL(*threw,
1247 "errno=0 [mktime: from struct tm {Sun Nov 11 11:11:11 1111}]");
1249 BOOST_CHECK(!threw);
1253 BOOST_AUTO_TEST_CASE(containers_list)
1255 std::list<I2n::clock::Time> ts;
1257 ts.push_back (I2n::clock::zero ());
1258 ts.push_back (I2n::clock::zero ());
1260 BOOST_CHECK_EQUAL(ts.size (), 2);
1263 BOOST_AUTO_TEST_CASE(containers_vec)
1265 std::vector<I2n::clock::Time> ts;
1267 ts.push_back (I2n::clock::zero ());
1268 ts.push_back (I2n::clock::zero ());
1270 BOOST_CHECK_EQUAL(ts.size (), 2);
1273 BOOST_AUTO_TEST_CASE(containers_set)
1275 std::set<I2n::clock::Time> ts;
1277 ts.insert (I2n::clock::zero ());
1278 ts.insert (I2n::clock::Time (42, 2187));
1279 ts.insert (I2n::clock::zero ());
1281 BOOST_CHECK_EQUAL(ts.size (), 2);
1284 BOOST_AUTO_TEST_CASE(containers_list_mean)
1286 std::list<I2n::clock::Time> ts;
1288 ts.push_back (I2n::clock::Time (42, 42));
1289 ts.push_back (I2n::clock::Time (1337, 1337));
1291 BOOST_CHECK_EQUAL(I2n::clock::mean (ts),
1292 I2n::clock::Time (689, 500000689));
1295 BOOST_AUTO_TEST_CASE(containers_list_mean_zero)
1297 std::list<I2n::clock::Time> ts;
1299 ts.push_back (I2n::clock::Time (0, 0));
1300 ts.push_back (I2n::clock::Time (0, 0));
1301 ts.push_back (I2n::clock::Time (0, 0));
1302 ts.push_back (I2n::clock::Time (0, 0));
1304 BOOST_CHECK_EQUAL(I2n::clock::mean (ts),
1305 I2n::clock::zero ());
1308 BOOST_AUTO_TEST_CASE(containers_list_mean_empty)
1310 std::list<I2n::clock::Time> ts;
1312 BOOST_CHECK_EQUAL(I2n::clock::mean (ts), I2n::clock::Time (0, 0));
1315 BOOST_AUTO_TEST_CASE(containers_set_mean)
1317 std::set<I2n::clock::Time> ts;
1319 ts.insert (I2n::clock::Time (42));
1320 ts.insert (I2n::clock::Time (1337));
1321 ts.insert (I2n::clock::Time (2187));
1323 BOOST_CHECK_EQUAL(I2n::clock::mean (ts),
1324 I2n::clock::Time (1188, 666666666));
1327 BOOST_AUTO_TEST_CASE(containers_set_median_empty)
1329 std::set<I2n::clock::Time> ts;
1331 BOOST_CHECK_EQUAL(I2n::clock::median (ts), I2n::clock::Time (0, 0));
1334 BOOST_AUTO_TEST_CASE(containers_set_median_one)
1336 std::set<I2n::clock::Time> ts;
1338 ts.insert (I2n::clock::Time (42, 0));
1340 BOOST_CHECK_EQUAL(I2n::clock::median (ts),
1341 I2n::clock::Time (42, 0));
1344 BOOST_AUTO_TEST_CASE(containers_set_median_multi)
1346 std::set<I2n::clock::Time> ts;
1348 ts.insert (I2n::clock::Time (42));
1349 ts.insert (I2n::clock::Time (1337));
1350 ts.insert (I2n::clock::Time (2187));
1352 BOOST_CHECK_EQUAL(I2n::clock::median (ts), I2n::clock::Time (1337));
1355 BOOST_AUTO_TEST_CASE(containers_vec_median_multi)
1357 std::vector<I2n::clock::Time> ts;
1359 ts.push_back (I2n::clock::Time (42));
1360 ts.push_back (I2n::clock::Time (1337));
1361 ts.push_back (I2n::clock::Time (2187));
1363 BOOST_CHECK_EQUAL(I2n::clock::median (ts), I2n::clock::Time (1337));
1366 BOOST_AUTO_TEST_CASE(containers_list_median_multi)
1368 std::list<I2n::clock::Time> ts;
1370 ts.push_back (I2n::clock::Time (42));
1371 ts.push_back (I2n::clock::Time (1337));
1372 ts.push_back (I2n::clock::Time (2187));
1373 ts.push_back (I2n::clock::Time (0xdead));
1374 ts.push_back (I2n::clock::Time (0xbeef));
1376 BOOST_CHECK_EQUAL(I2n::clock::median (ts),
1377 I2n::clock::Time (2187));
1380 BOOST_AUTO_TEST_CASE(containers_list_median_multi_evensize)
1382 std::list<I2n::clock::Time> ts;
1384 ts.push_back (I2n::clock::Time (42));
1385 ts.push_back (I2n::clock::Time (1337));
1386 ts.push_back (I2n::clock::Time (2187));
1387 ts.push_back (I2n::clock::Time (0xf00d));
1388 ts.push_back (I2n::clock::Time (0xfeed));
1389 ts.push_back (I2n::clock::Time (0xdeadf0e));
1391 BOOST_CHECK_EQUAL(I2n::clock::median (ts), I2n::clock::Time (0xf00d));
1394 BOOST_AUTO_TEST_SUITE_END() /* [Clock] */
1396 BOOST_AUTO_TEST_SUITE_END()