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
39 #include <boost/test/unit_test.hpp>
41 #include <timefunc.hxx>
42 #include <filefunc.hxx>
51 using namespace I2n::Time;
53 class TestTimeFuncFixture
56 typedef std::list< std::string > StringList;
57 std::set<std::string> used_check_files;
60 std::string env; /* save and restore TZ from envp */
66 std::string get_check_file_path(std::string tag)
69 result= "__unittest__" + tag + ".dat";
70 used_check_files.insert(result);
72 } // eo get_check_file_path
74 void dump_tz_info (void)
76 fprintf (stderr, "timezone: %s(%s) %ld, dst: %d\n",
77 tzname[0], tzname[1], ::timezone, daylight);
80 void remove_check_files()
82 for (std::set<std::string>::iterator it= used_check_files.begin();
83 it != used_check_files.end();
86 std::string filepath(*it);
87 if (path_exists(filepath))
93 used_check_files.clear();
94 } // eo remove_check_files
96 void set_tz (const std::string &tzname)
99 if (setenv ("TZ", tzname.c_str (), 1) == -1)
102 << "error setting environment 'TZ': [" << tzname << "]"
111 inline void set_utc (void)
113 this->set_tz ("UTC");
116 void set_dst (const bool dst=true)
118 daylight = dst ? 1 : 0;
123 TestTimeFuncFixture()
125 this->timezone.env = std::string (secure_getenv ("TZ") ?: "");
126 this->timezone.name[0] = tzname [0];
127 this->timezone.name[1] = tzname [1];
128 this->timezone.zone = ::timezone;
129 this->timezone.dst = daylight;
132 ~TestTimeFuncFixture()
134 remove_check_files();
136 /* time zone related cleanup */
137 daylight = this->timezone.dst;
138 ::timezone = this->timezone.zone;
140 tzname [0] = this->timezone.name[0];
141 tzname [1] = this->timezone.name[1];
144 if (setenv ("TZ", this->timezone.env.c_str (), 1) == -1)
147 << "error cleaning up environment 'TZ': [" << this->timezone.env << "]"
156 BOOST_FIXTURE_TEST_SUITE(TestTimeFunc, TestTimeFuncFixture)
158 BOOST_AUTO_TEST_CASE(AddIntervalsDisjoint)
162 intervals.add( Interval( 10, 100 ) );
163 intervals.add( Interval( 600, 620 ) );
165 BOOST_CHECK_EQUAL( false, intervals.empty() );
166 BOOST_CHECK_EQUAL( 2u, intervals.size() );
168 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
169 BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() );
171 BOOST_CHECK_EQUAL( 600u, intervals.back().lower_bound() );
172 BOOST_CHECK_EQUAL( 620u, intervals.back().upper_bound() );
173 } // eo AddIntervalsDisjoint()
177 BOOST_AUTO_TEST_CASE(AddIntervalsInclude)
181 intervals.add( Interval( 10, 100 ) );
182 intervals.add( Interval( 10, 80 ) );
184 BOOST_CHECK_EQUAL( false, intervals.empty() );
185 BOOST_CHECK_EQUAL( 1u, intervals.size() );
187 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
188 BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() );
189 BOOST_CHECK_EQUAL( false, intervals.front().changed() );
190 } // eo AddIntervalsInclude()
194 BOOST_AUTO_TEST_CASE(AddIntervalsEmbrace)
198 intervals.add( Interval( 10, 100 ) );
199 intervals.add( Interval( 5, 120 ) );
201 BOOST_CHECK_EQUAL( false, intervals.empty() );
202 BOOST_CHECK_EQUAL( 1u, intervals.size() );
204 BOOST_CHECK_EQUAL( 5u, intervals.front().lower_bound() );
205 BOOST_CHECK_EQUAL( 120u, intervals.front().upper_bound() );
206 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
207 } // eo AddIntervalsEmbrace()
211 BOOST_AUTO_TEST_CASE(AddIntervalsJoin1)
215 intervals.add( Interval( 10, 100 ) );
216 intervals.add( Interval( 60, 120 ) );
218 BOOST_CHECK_EQUAL( false, intervals.empty() );
219 BOOST_CHECK_EQUAL( 1u, intervals.size() );
221 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
222 BOOST_CHECK_EQUAL( 120u, intervals.front().upper_bound() );
223 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
224 } // eo AddIntervalsJoin1()
228 BOOST_AUTO_TEST_CASE(AddIntervalsJoin1b)
232 intervals.add( Interval( 10, 100 ) );
233 intervals.add( Interval( 100, 120 ) );
235 BOOST_CHECK_EQUAL( false, intervals.empty() );
236 BOOST_CHECK_EQUAL( 1u, intervals.size() );
238 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
239 BOOST_CHECK_EQUAL( 120u, intervals.front().upper_bound() );
240 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
241 } // eo AddIntervalsJoin1b()
245 BOOST_AUTO_TEST_CASE(AddIntervalsJoin2)
249 intervals.add( Interval( 10, 100 ) );
250 intervals.add( Interval( 200, 250 ) );
252 BOOST_CHECK_EQUAL( false, intervals.empty() );
253 BOOST_CHECK_EQUAL( 2u, intervals.size() );
255 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
256 BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() );
257 BOOST_CHECK_EQUAL( 200u, intervals.back().lower_bound() );
258 BOOST_CHECK_EQUAL( 250u, intervals.back().upper_bound() );
260 // now add the gap; the intervals should collapse to one covering all:
261 intervals.add( Interval(100, 200) );
263 BOOST_CHECK_EQUAL( false, intervals.empty() );
264 BOOST_CHECK_EQUAL( 1u, intervals.size() );
266 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
267 BOOST_CHECK_EQUAL( 250u, intervals.front().upper_bound() );
268 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
269 } // eo AddIntervalsJoin2()
273 BOOST_AUTO_TEST_CASE(SubIntervalsDisjoint)
277 intervals.add( Interval(10, 100) );
278 intervals.sub( Interval(0, 10) );
280 BOOST_CHECK_EQUAL( false, intervals.empty() );
281 BOOST_CHECK_EQUAL( 1u, intervals.size() );
283 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
284 BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() );
285 BOOST_CHECK_EQUAL( false, intervals.front().changed() );
286 } // eo SubIntervalsDisjoint()
290 BOOST_AUTO_TEST_CASE(SubIntervalsExact)
294 intervals.add( Interval(10, 100) );
295 intervals.sub( Interval(10, 100) );
297 BOOST_CHECK_EQUAL( true, intervals.empty() );
298 BOOST_CHECK_EQUAL( 0u, intervals.size() );
299 } // eo SubIntervalsExact()
303 BOOST_AUTO_TEST_CASE(SubIntervalsSplit1)
307 intervals.add( Interval(10, 100) );
308 intervals.sub( Interval(20, 40) );
310 BOOST_CHECK_EQUAL( false, intervals.empty() );
311 BOOST_CHECK_EQUAL( 2u, intervals.size() );
313 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
314 BOOST_CHECK_EQUAL( 20u, intervals.front().upper_bound() );
316 BOOST_CHECK_EQUAL( 40u, intervals.back().lower_bound() );
317 BOOST_CHECK_EQUAL( 100u, intervals.back().upper_bound() );
318 BOOST_CHECK_EQUAL( false, intervals.front().changed() );
319 BOOST_CHECK_EQUAL( true, intervals.back().changed() );
320 } // eo SubIntervalsSplit1()
323 BOOST_AUTO_TEST_CASE(SubIntervalsCutFront)
327 intervals.add( Interval(10, 100) );
328 intervals.sub( Interval(10, 20) );
330 BOOST_CHECK_EQUAL( false, intervals.empty() );
331 BOOST_CHECK_EQUAL( 1u, intervals.size() );
333 BOOST_CHECK_EQUAL( 20u, intervals.front().lower_bound() );
334 BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() );
335 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
336 } // eo SubIntervalsCutFront()
339 BOOST_AUTO_TEST_CASE(SubIntervalsCutBack)
343 intervals.add( Interval(10, 100) );
344 intervals.sub( Interval(87, 100) );
346 BOOST_CHECK_EQUAL( false, intervals.empty() );
347 BOOST_CHECK_EQUAL( 1u, intervals.size() );
349 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
350 BOOST_CHECK_EQUAL( 87u, intervals.front().upper_bound() );
351 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
352 } // eo SubIntervalsCutBack()
356 BOOST_AUTO_TEST_CASE(SubIntervalsCutMore)
360 intervals.add( Interval( 10, 100) );
361 intervals.add( Interval(110, 200) );
362 intervals.add( Interval(210, 300) );
364 // this should remove the first 2 intervals and cut the third:
365 intervals.sub( Interval(8, 220) );
367 BOOST_CHECK_EQUAL( false, intervals.empty() );
368 BOOST_CHECK_EQUAL( 1u, intervals.size() );
370 BOOST_CHECK_EQUAL( 220u, intervals.front().lower_bound() );
371 BOOST_CHECK_EQUAL( 300u, intervals.front().upper_bound() );
372 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
373 } // eo SubIntervalsCutMore()
376 BOOST_AUTO_TEST_CASE(IntervalComparisons)
378 Intervals intervals1;
379 Intervals intervals2;
381 intervals1.add( Interval( 10, 120) );
383 intervals2.add( Interval( 10, 110 ) );
384 intervals2.add( Interval( 100, 120 ) );
386 BOOST_CHECK_EQUAL( 1u, intervals2.size() );
388 BOOST_CHECK( intervals1 == intervals2 );
389 BOOST_CHECK_EQUAL( true, intervals1.contains( intervals2 ));
390 BOOST_CHECK_EQUAL( true, intervals2.contains( intervals1 ));
392 intervals2.sub( Interval( 40, 50) );
394 BOOST_CHECK( intervals1 != intervals2 );
395 BOOST_CHECK_EQUAL( true, intervals1.contains( intervals2 ));
396 BOOST_CHECK_EQUAL( false, intervals2.contains( intervals1 ));
397 } // eo IntervalComparisons()
401 BOOST_AUTO_TEST_CASE(MonotonicClock)
406 bool res = monotonic_clock_gettime(sec0,nsec0);
407 BOOST_CHECK_EQUAL( true, res );
410 res= monotonic_clock_gettime(sec1,nsec1);
411 BOOST_CHECK_EQUAL( true, res);
413 long delta_sec = sec1 - sec0;
414 long delta_nsec= nsec1 - nsec0;
416 long delta_millisec= ( delta_nsec / 1000000L) + delta_sec * 1000L;
418 BOOST_CHECK( delta_millisec >= 250 - /*fuzz*/ 1);
419 BOOST_CHECK( delta_millisec < 300 );
420 } // eo MonotonicClock()
422 BOOST_AUTO_TEST_CASE(WeekInvalid)
424 Week week("99999999");
425 BOOST_CHECK_EQUAL(false, week.is_valid());
426 BOOST_CHECK_EQUAL(string(""), week.get_displaystring());
429 BOOST_AUTO_TEST_CASE(WeekDisplayString1)
432 BOOST_CHECK_EQUAL(true, week.is_valid());
433 BOOST_CHECK_EQUAL(string(""), week.get_displaystring());
436 BOOST_AUTO_TEST_CASE(WeekDisplayString2)
438 Week week("0123456");
439 BOOST_CHECK_EQUAL(true, week.is_valid());
440 BOOST_CHECK_EQUAL(string("Mon-Sun"), week.get_displaystring());
443 BOOST_AUTO_TEST_CASE(WeekDisplayString3)
446 BOOST_CHECK_EQUAL(true, week.is_valid());
447 BOOST_CHECK_EQUAL(string("Mon-Sat"), week.get_displaystring());
450 BOOST_AUTO_TEST_CASE(WeekDisplayString4)
453 BOOST_CHECK_EQUAL(true, week.is_valid());
454 BOOST_CHECK_EQUAL(string("Mon-Fri, Sun"), week.get_displaystring());
457 BOOST_AUTO_TEST_CASE(WeekDisplayString5)
460 BOOST_CHECK_EQUAL(true, week.is_valid());
461 BOOST_CHECK_EQUAL(string("Mon, Tue, Fri, Sat"), week.get_displaystring());
464 BOOST_AUTO_TEST_CASE(WeekDisplayString6)
467 BOOST_CHECK_EQUAL(true, week.is_valid());
468 BOOST_CHECK_EQUAL(string("Tue, Thu, Sat, Sun"), week.get_displaystring());
471 BOOST_AUTO_TEST_CASE(WeekDisplayString7)
474 BOOST_CHECK_EQUAL(true, week.is_valid());
475 BOOST_CHECK_EQUAL(string("Mon, Wed, Fri"), week.get_displaystring());
478 BOOST_AUTO_TEST_CASE(WeekDisplayString8)
481 BOOST_CHECK_EQUAL(true, week.is_valid());
482 BOOST_CHECK_EQUAL(string("Mon, Fri"), week.get_displaystring());
485 BOOST_AUTO_TEST_CASE(WeekDisplayString9)
488 BOOST_CHECK_EQUAL(true, week.is_valid());
489 BOOST_CHECK_EQUAL(string("Sat, Sun"), week.get_displaystring());
492 BOOST_AUTO_TEST_CASE(WeekDisplayString10)
495 BOOST_CHECK_EQUAL(true, week.is_valid());
496 BOOST_CHECK_EQUAL(string("Fri-Sun"), week.get_displaystring());
499 BOOST_AUTO_TEST_CASE(WeekDisplayString11)
502 BOOST_CHECK_EQUAL(true, week.is_valid());
503 BOOST_CHECK_EQUAL(string("Sun"), week.get_displaystring());
506 BOOST_AUTO_TEST_CASE(WeekDisplayString12)
509 BOOST_CHECK_EQUAL(true, week.is_valid());
510 BOOST_CHECK_EQUAL(string("Sat"), week.get_displaystring());
513 BOOST_AUTO_TEST_CASE(WeekDisplayString13)
516 BOOST_CHECK_EQUAL(true, week.is_valid());
517 BOOST_CHECK_EQUAL(string("Mon-Wed"), week.get_displaystring());
520 BOOST_AUTO_TEST_CASE(FormatFullTime)
522 this->set_tz ("CET");
523 time_t seconds = 1318844005;
525 BOOST_CHECK_EQUAL("17.10.2011 11:33", format_full_time(seconds));
528 BOOST_AUTO_TEST_CASE(DateToSeconds1)
530 this->set_tz ("CET");
532 BOOST_CHECK_EQUAL(1325372400, date_to_seconds("2012-01-01"));
535 BOOST_AUTO_TEST_CASE(DateToSeconds2)
537 this->set_tz ("CET");
539 BOOST_CHECK_EQUAL(1341093600, date_to_seconds("2012-07-01"));
542 BOOST_AUTO_TEST_CASE(FormatISO8601_T)
544 const time_t moment = 1515492684;
545 BOOST_CHECK_EQUAL("10:11:24",
546 format_iso8601 (moment, true, false, true, false));
549 BOOST_AUTO_TEST_CASE(FormatISO8601_TZ_local)
551 this->set_tz ("CET");
552 const time_t moment = 1515492684;
553 BOOST_CHECK_EQUAL("11:11:24+0100",
554 format_iso8601 (moment, false, false, true, true));
557 BOOST_AUTO_TEST_CASE(FormatISO8601_TZ)
559 const time_t moment = 1515492684;
560 BOOST_CHECK_EQUAL("10:11:24+0000",
561 format_iso8601 (moment, true, false, true, true));
564 BOOST_AUTO_TEST_CASE(FormatISO8601_DTZ_local)
566 this->set_tz ("CET");
567 const time_t moment = 1515492684;
568 BOOST_CHECK_EQUAL("2018-01-09T11:11:24+0100",
569 format_iso8601 (moment, false, true, true, true));
572 BOOST_AUTO_TEST_CASE(FormatISO8601_DTZ)
574 const time_t moment = 1515492684;
575 BOOST_CHECK_EQUAL("2018-01-09T10:11:24+0000",
576 format_iso8601 (moment, true, true, true, true));
579 BOOST_AUTO_TEST_CASE(FormatISO8601_DT)
581 const time_t moment = 1515492684;
582 BOOST_CHECK_EQUAL("2018-01-09T10:11:24",
583 format_iso8601 (moment, true, true, true, false));
586 BOOST_AUTO_TEST_CASE(FormatISO8601_D)
588 const time_t moment = 1515492684;
589 BOOST_CHECK_EQUAL("2018-01-09",
590 format_iso8601 (moment, true, true, false, false));
593 BOOST_AUTO_TEST_CASE(FormatISO8601_DTZ_struct_tm)
601 helau.tm_year = 2018 - 1900;
606 helau.tm_zone = NULL;
608 BOOST_CHECK_EQUAL("2018-11-11T11:11:11+0000",
609 format_iso8601 (helau, true, true, true));
612 BOOST_AUTO_TEST_CASE(FormatISO8601_DTZ_struct_timespec)
614 struct timespec ts = { 1541934671, 11 };
616 BOOST_CHECK_EQUAL("2018-11-11T11:11:11+0000",
617 format_iso8601 (ts, true, true, true, true));
620 BOOST_AUTO_TEST_SUITE(Clock)
622 BOOST_AUTO_TEST_CASE(ctor_simple)
626 BOOST_CHECK_EQUAL(t.get_sec (), 0);
627 BOOST_CHECK_EQUAL(t.get_nsec (), 0);
630 BOOST_AUTO_TEST_CASE(ctor_type)
632 I2n::clock::Time t1 (I2n::clock::type::real);
633 I2n::clock::Time t2 (I2n::clock::type::mono);
634 I2n::clock::Time t3 (I2n::clock::type::boot);
635 I2n::clock::Time t4 (I2n::clock::type::cpu);
637 BOOST_CHECK_EQUAL(t1.get_sec (), 0);
638 BOOST_CHECK_EQUAL(t1.get_nsec (), 0);
640 BOOST_CHECK_EQUAL(t2.get_sec (), 0);
641 BOOST_CHECK_EQUAL(t2.get_nsec (), 0);
643 BOOST_CHECK_EQUAL(t3.get_sec (), 0);
644 BOOST_CHECK_EQUAL(t3.get_nsec (), 0);
646 BOOST_CHECK_EQUAL(t4.get_sec (), 0);
647 BOOST_CHECK_EQUAL(t4.get_nsec (), 0);
650 BOOST_AUTO_TEST_CASE(ctor_variant)
652 I2n::clock::Time tmc (I2n::clock::type::mono);
653 I2n::clock::Time tmr (I2n::clock::type::mono, I2n::clock::type::raw);
654 I2n::clock::Time tme (I2n::clock::type::mono, I2n::clock::type::exact);
656 I2n::clock::Time trc (I2n::clock::type::real);
657 I2n::clock::Time tre (I2n::clock::type::real, I2n::clock::type::exact);
659 I2n::clock::Time tb (I2n::clock::type::boot);
661 I2n::clock::Time tcp (I2n::clock::type::cpu);
662 I2n::clock::Time tct (I2n::clock::type::cpu, I2n::clock::type::thread);
664 BOOST_CHECK_EQUAL(tmc.get_sec (), 0); /* MONO */
665 BOOST_CHECK_EQUAL(tmc.get_nsec (), 0);
667 BOOST_CHECK_EQUAL(tmr.get_sec (), 0);
668 BOOST_CHECK_EQUAL(tmr.get_nsec (), 0);
670 BOOST_CHECK_EQUAL(tme.get_sec (), 0);
671 BOOST_CHECK_EQUAL(tme.get_nsec (), 0);
673 BOOST_CHECK_EQUAL(trc.get_sec (), 0); /* REAL */
674 BOOST_CHECK_EQUAL(trc.get_nsec (), 0);
676 BOOST_CHECK_EQUAL(tre.get_sec (), 0);
677 BOOST_CHECK_EQUAL(tre.get_nsec (), 0);
679 BOOST_CHECK_EQUAL(tb.get_sec (), 0); /* BOOT */
680 BOOST_CHECK_EQUAL(tb.get_nsec (), 0);
682 BOOST_CHECK_EQUAL(tcp.get_sec (), 0); /* CPU */
683 BOOST_CHECK_EQUAL(tcp.get_nsec (), 0);
685 BOOST_CHECK_EQUAL(tct.get_sec (), 0);
686 BOOST_CHECK_EQUAL(tct.get_nsec (), 0);
689 BOOST_AUTO_TEST_CASE(initializer_now)
691 boost::optional<I2n::clock::Time> t = I2n::clock::now ();
694 BOOST_CHECK_GT(t->get_sec (), 0);
695 BOOST_CHECK_EQUAL(t->err, 0);
698 BOOST_AUTO_TEST_CASE(initializer_zero)
700 I2n::clock::Time stundenull = I2n::clock::zero ();
702 BOOST_CHECK_EQUAL(stundenull.get_sec (), 0);
703 BOOST_CHECK_EQUAL(stundenull.get_nsec (), 0);
704 BOOST_CHECK_EQUAL(stundenull.err, 0);
707 BOOST_AUTO_TEST_CASE(member_set_now)
711 BOOST_CHECK(t.set ());
713 BOOST_CHECK_NE(t.get_sec (), 0);
716 BOOST_AUTO_TEST_CASE(member_set_value)
722 BOOST_CHECK_EQUAL(t.get_sec (), 42);
723 BOOST_CHECK_EQUAL(t.get_nsec (), 42);
726 BOOST_AUTO_TEST_CASE(member_set_value_type)
730 t.set (42, 42, I2n::clock::type::real, I2n::clock::type::exact);
732 BOOST_CHECK_EQUAL(t.get_sec (), 42);
733 BOOST_CHECK_EQUAL(t.get_nsec (), 42);
736 BOOST_AUTO_TEST_CASE(member_add_parts)
743 BOOST_CHECK_EQUAL(t.get_sec (), 2229);
744 BOOST_CHECK_EQUAL(t.get_nsec (), 2229);
747 BOOST_AUTO_TEST_CASE(member_sub_parts)
754 BOOST_CHECK_EQUAL(t.get_sec (), 0);
755 BOOST_CHECK_EQUAL(t.get_nsec (), 999999999);
758 BOOST_AUTO_TEST_CASE(member_sub_Time)
768 BOOST_CHECK_EQUAL(t1.get_sec (), 0);
769 BOOST_CHECK_EQUAL(t1.get_nsec (), 42L);
772 BOOST_AUTO_TEST_CASE(member_diff)
774 static const time_t five = 5 * 365 * 24 * 3600;
776 I2n::clock::Time t1 (42, 1337);
777 I2n::clock::Time t2 = t1 + five;;
778 I2n::clock::Time t3 = t1 - five;;
780 BOOST_CHECK_EQUAL(t2, I2n::clock::Time ((time_t)42 + five, 1337));
781 BOOST_CHECK_EQUAL(t3, I2n::clock::Time ((time_t)42 - five, 1337));
782 BOOST_CHECK_EQUAL(t1.difference (t3), t3.difference (t1));
783 BOOST_CHECK_EQUAL(t3.difference (t3), t3.difference (t3));
786 BOOST_AUTO_TEST_CASE(op_copyassign)
791 BOOST_CHECK(t1.set ());
795 BOOST_CHECK_EQUAL(t1.get_sec (), t2.get_sec ());
796 BOOST_CHECK_EQUAL(t1.get_nsec (), t2.get_nsec ());
799 BOOST_AUTO_TEST_CASE(op_equal)
804 BOOST_CHECK(t1.set ());
807 BOOST_CHECK_EQUAL(t1, t2);
810 BOOST_AUTO_TEST_CASE(op_add_Time)
814 I2n::clock::Time tsum;
820 BOOST_CHECK_EQUAL(tsum.get_sec (), 3524);
821 BOOST_CHECK_EQUAL(tsum.get_nsec (), 3524);
824 BOOST_AUTO_TEST_CASE(op_add_Time_carry)
828 I2n::clock::Time tsum;
832 t2.set (1300, 2L * 1000 * 1000 * 1000 + 1337);
834 t2.set (1300, 37L * 1000 * 1000 * 1000 + 1337);
840 BOOST_CHECK_EQUAL(tsum.get_sec (), 3489);
841 BOOST_CHECK_EQUAL(tsum.get_nsec (), 3524);
843 BOOST_CHECK_EQUAL(tsum.get_sec (), 3524);
844 BOOST_CHECK_EQUAL(tsum.get_nsec (), 3524);
848 BOOST_AUTO_TEST_CASE(op_add_time_t)
850 I2n::clock::Time t1 (2187, 2187);
852 I2n::clock::Time tsum;
856 BOOST_CHECK_EQUAL(tsum.get_sec (), 3524);
857 BOOST_CHECK_EQUAL(tsum.get_nsec (), 2187);
860 BOOST_AUTO_TEST_CASE(op_add_time_t_external)
863 I2n::clock::Time t2 (2187, 2187);
864 I2n::clock::Time tsum;
868 BOOST_CHECK_EQUAL(tsum.get_sec (), 3524);
869 BOOST_CHECK_EQUAL(tsum.get_nsec (), 2187);
872 BOOST_AUTO_TEST_CASE(op_incr_Time)
874 I2n::clock::Time t1 (2187, 2187);
875 I2n::clock::Time t2 (1337, 1337);
879 BOOST_CHECK_EQUAL(t1.get_sec (), 3524);
880 BOOST_CHECK_EQUAL(t1.get_nsec (), 3524);
883 BOOST_AUTO_TEST_CASE(op_incr_time_t)
885 I2n::clock::Time t1 (2187, 2187);
890 BOOST_CHECK_EQUAL(t1.get_sec (), 3524);
891 BOOST_CHECK_EQUAL(t1.get_nsec (), 2187);
894 BOOST_AUTO_TEST_CASE(op_subtract_Time)
898 I2n::clock::Time tdiff;
904 BOOST_CHECK_EQUAL(tdiff.get_sec (), 850);
905 BOOST_CHECK_EQUAL(tdiff.get_nsec (), 850);
908 BOOST_AUTO_TEST_CASE(op_subtract_time_t)
910 I2n::clock::Time t1 (2187, 2187);
912 I2n::clock::Time tdiff;
916 BOOST_CHECK_EQUAL(tdiff.get_sec (), 850);
917 BOOST_CHECK_EQUAL(tdiff.get_nsec (), 2187);
920 BOOST_AUTO_TEST_CASE(op_subtract_time_t_external)
923 I2n::clock::Time t2 (2187, 2187);
924 I2n::clock::Time tdiff;
928 BOOST_CHECK_EQUAL(tdiff.get_sec (), -851);
929 BOOST_CHECK_EQUAL(tdiff.get_nsec (), 999997813);
932 BOOST_AUTO_TEST_CASE(op_decr_Time)
934 I2n::clock::Time t1 (2187, 2187);
935 I2n::clock::Time t2 (1337, 1337);
939 BOOST_CHECK_EQUAL(t1.get_sec (), 850);
940 BOOST_CHECK_EQUAL(t1.get_nsec (), 850);
943 BOOST_AUTO_TEST_CASE(op_decr_time_t)
945 I2n::clock::Time t1 (2187, 2187);
950 BOOST_CHECK_EQUAL(t1.get_sec (), 850);
951 BOOST_CHECK_EQUAL(t1.get_nsec (), 2187);
954 BOOST_AUTO_TEST_CASE(op_mult_scale)
962 BOOST_CHECK_EQUAL(t2.get_sec (), 42);
963 BOOST_CHECK_EQUAL(t2.get_nsec (), 42);
966 BOOST_AUTO_TEST_CASE(op_mult_mutate)
968 I2n::clock::Time t1 ( 42, 42);
969 I2n::clock::Time t2 (1337, 0);
974 BOOST_CHECK_EQUAL(t1.get_sec (), 84);
975 BOOST_CHECK_EQUAL(t1.get_nsec (), 84);
976 BOOST_CHECK_EQUAL(t2.get_sec (), -13370);
979 BOOST_AUTO_TEST_CASE(op_mult_scale_carry)
984 t1.set (1, 500 * 1000 * 1000);
987 BOOST_CHECK_EQUAL(t2.get_sec (), 4);
988 BOOST_CHECK_EQUAL(t2.get_nsec (), 500 * 1000 * 1000);
991 BOOST_AUTO_TEST_CASE(op_equals)
999 BOOST_CHECK_EQUAL(t1, t2);
1002 BOOST_AUTO_TEST_CASE(compare_equal)
1004 I2n::clock::Time t1;
1005 I2n::clock::Time t2;
1010 BOOST_CHECK_EQUAL(I2n::clock::compare (t1, t2), 0);
1013 BOOST_AUTO_TEST_CASE(compare_equal_type)
1015 I2n::clock::Time t1 (42, 42, I2n::clock::type::real);
1016 I2n::clock::Time t2 (42, 42, I2n::clock::type::cpu);
1017 I2n::clock::Time t3 (42, 0, I2n::clock::type::real);
1018 I2n::clock::Time t4 (42, 42, I2n::clock::type::real);
1020 BOOST_CHECK_NE(t1, t2);
1021 BOOST_CHECK_NE(t1, t3);
1022 BOOST_CHECK_EQUAL(t1, t4);
1025 BOOST_AUTO_TEST_CASE(compare_ne_sec)
1027 I2n::clock::Time t1;
1028 I2n::clock::Time t2;
1033 BOOST_CHECK_EQUAL(I2n::clock::compare (t1, t2), -1);
1034 BOOST_CHECK_EQUAL(I2n::clock::compare (t2, t1), 1);
1037 BOOST_AUTO_TEST_CASE(compare_ne_nsec)
1039 I2n::clock::Time t1;
1040 I2n::clock::Time t2;
1045 BOOST_CHECK_EQUAL(I2n::clock::compare (t1, t2), -1);
1046 BOOST_CHECK_EQUAL(I2n::clock::compare (t2, t1), 1);
1049 BOOST_AUTO_TEST_CASE(compare_ne_both)
1051 I2n::clock::Time t1;
1052 I2n::clock::Time t2;
1057 BOOST_CHECK_EQUAL(I2n::clock::compare (t1, t2), 1);
1058 BOOST_CHECK_EQUAL(I2n::clock::compare (t2, t1), -1);
1061 BOOST_AUTO_TEST_CASE(op_ineq_sec)
1063 I2n::clock::Time t1 (1337);
1064 I2n::clock::Time t2 (2187);
1066 BOOST_CHECK_LT(t1, t2);
1067 BOOST_CHECK_GT(t2, t1);
1070 BOOST_AUTO_TEST_CASE(op_ineq_nsec)
1072 I2n::clock::Time t1 (1337, 23);
1073 I2n::clock::Time t2 (1337, 42);
1075 BOOST_CHECK_LT(t1, t2);
1076 BOOST_CHECK_GT(t2, t1);
1079 BOOST_AUTO_TEST_CASE(op_ineq_both)
1081 I2n::clock::Time t1 (2187, 23);
1082 I2n::clock::Time t2 (1337, 42);
1084 BOOST_CHECK_LT(t2, t1);
1085 BOOST_CHECK_GT(t1, t2);
1088 BOOST_AUTO_TEST_CASE(op_eq_time_t)
1090 boost::optional<I2n::clock::Time> t1 = I2n::clock::now ();
1091 const time_t t2 = time (NULL); /* race here */
1095 BOOST_CHECK_NE(*t1, t2);
1096 BOOST_CHECK_LT(*t1, t2);
1097 BOOST_CHECK_GT( t2, *t1);
1100 BOOST_AUTO_TEST_CASE(Format_sec_msec)
1102 I2n::clock::Time t1 (42, 42);
1103 I2n::clock::Time t2 ( 4, 242424242);
1104 I2n::clock::Time t3 ( 0, 133713371);
1105 I2n::clock::Time t4 ( 0, 0);
1107 std::string s1 = t1.format_sec_msec ();
1108 std::string s2 = t2.format_sec_msec ();
1109 std::string s3 = t3.format_sec_msec ();
1110 std::string s4 = t4.format_sec_msec ();
1112 BOOST_CHECK_EQUAL("42s 0ms" , s1);
1113 BOOST_CHECK_EQUAL( "4s 242ms", s2);
1114 BOOST_CHECK_EQUAL( "0s 133ms", s3);
1115 BOOST_CHECK_EQUAL( "0s 0ms" , s4);
1118 BOOST_AUTO_TEST_CASE(Format_min_sec_msec)
1120 I2n::clock::Time t1 (42*60 + 42, 42);
1121 I2n::clock::Time t2 ( 4*60 + 42, 242424242);
1122 I2n::clock::Time t3 ( 0*60 + 42, 133713371);
1123 I2n::clock::Time t4 ( 0 + 0, 0);
1125 std::string s1 = *t1.format_min_sec_msec ();
1126 std::string s2 = *t2.format_min_sec_msec ();
1127 std::string s3 = *t3.format_min_sec_msec ();
1128 std::string s4 = *t4.format_min_sec_msec ();
1130 BOOST_CHECK_EQUAL("42m42.000s", s1);
1131 BOOST_CHECK_EQUAL( "4m42.242s", s2);
1132 BOOST_CHECK_EQUAL( "0m42.133s", s3);
1133 BOOST_CHECK_EQUAL( "0m0.000s", s4);
1136 BOOST_AUTO_TEST_CASE(FormatISO8601_T)
1138 I2n::clock::Time t (42, 42);
1139 boost::optional<std::string> s = t.format_iso8601 (true, false, true, false);
1141 BOOST_CHECK_EQUAL("00:00:42", *s);
1144 BOOST_AUTO_TEST_CASE(FormatISO8601_DT)
1146 I2n::clock::Time t (1541934671, 0);
1147 boost::optional<std::string> s = t.format_iso8601 (true, true, true, false);
1149 BOOST_CHECK_EQUAL("2018-11-11T11:11:11", *s);
1152 BOOST_AUTO_TEST_CASE(FormatISO8601_DTZ)
1154 I2n::clock::Time t (1541934671, 0);
1155 boost::optional<std::string> s = t.format_iso8601 (true, true, true, true);
1157 BOOST_CHECK_EQUAL("2018-11-11T11:11:11+0000", *s);
1160 BOOST_AUTO_TEST_CASE(Format_make_nice_time)
1162 I2n::clock::Time t (111111, 0);
1163 boost::optional<std::string> s = t.make_nice_time ();
1165 BOOST_CHECK_EQUAL("1 day, 06:51:51", *s);
1168 BOOST_AUTO_TEST_CASE(Format_format_full_time)
1170 I2n::clock::Time t (1541934671, 0);
1172 * brr, the old formatters use localtime without a way to opt out of
1176 boost::optional<std::string> s = t.format_full_time ();
1178 BOOST_CHECK_EQUAL("11.11.2018 11:11", *s);
1181 BOOST_AUTO_TEST_CASE(Format_format_date)
1183 I2n::clock::Time t (1541934671, 0);
1184 boost::optional<std::string> s = t.format_date ();
1186 BOOST_CHECK_EQUAL("11.11.2018", *s);
1189 BOOST_AUTO_TEST_CASE(FromString_iso8601_full)
1191 const std::string in1 ("0001-01-01T00:00:00+0000");
1192 const std::string in2 ("2018-11-11T11:11:11+0000");
1196 boost::optional<I2n::clock::Time> t1 = I2n::clock::time_of_iso8601 (in1);
1197 boost::optional<I2n::clock::Time> t2 = I2n::clock::time_of_iso8601 (in2);
1203 BOOST_CHECK_EQUAL(*t1->format_iso8601 (), in1);
1207 BOOST_CHECK_EQUAL(*t2->format_iso8601 (), in2);
1210 BOOST_AUTO_TEST_CASE(FromString_iso8601_full_negyear)
1212 const std::string in1 ("-0001-01-01T00:00:00+0000");
1213 const std::string in2 ("-2018-11-11T11:11:11+0000");
1217 boost::optional<I2n::clock::Time> t1 = I2n::clock::time_of_iso8601 (in1);
1218 boost::optional<I2n::clock::Time> t2 = I2n::clock::time_of_iso8601 (in2);
1226 BOOST_CHECK_EQUAL(*t1->format_iso8601 (), in1);
1227 BOOST_CHECK_EQUAL(*t2->format_iso8601 (), in2);
1231 # ifndef GLIBC_STRPTIME_LACKS_Z
1232 BOOST_AUTO_TEST_CASE(FromString_iso8601_Z)
1234 const std::string in1 ("2019-04-25T13:41:47+0000");
1235 const std::string in2 ("2019-04-25T13:41:47Z");
1238 boost::optional<I2n::clock::Time> t1 = I2n::clock::time_of_iso8601 (in1, true, true, true);
1239 boost::optional<I2n::clock::Time> t2 = I2n::clock::time_of_iso8601 (in2, true, true, true);
1244 BOOST_CHECK_EQUAL(*t1, *t2);
1245 BOOST_CHECK_EQUAL(*t1->format_iso8601 (), *t2->format_iso8601 ());
1246 BOOST_CHECK_EQUAL(*t2->format_iso8601 (), in1);
1250 BOOST_AUTO_TEST_CASE(FromString_iso8601_partial)
1252 const std::string in1 ("2018-11-11T11:11:11");
1253 const std::string in2 ("2018-11-11");
1257 boost::optional<I2n::clock::Time> t1 =
1258 I2n::clock::time_of_iso8601 (in1, true, true, false);
1259 boost::optional<I2n::clock::Time> t2 =
1260 I2n::clock::time_of_iso8601 (in2, true, false, false);
1265 * We test for the difference here which is zero if the number is
1266 * correct but causes the difference from the expected value to be
1267 * printed in case the test fails.
1269 BOOST_CHECK_EQUAL(*t1->format_iso8601 (true, true, true, false), in1);
1270 BOOST_CHECK_EQUAL(*t2->format_iso8601 (true, true, false, false), in2);
1273 BOOST_AUTO_TEST_CASE(FromString_iso8601_offset)
1275 const std::string in1 ("2019-04-25T13:41:47Z");
1276 const std::string in2 ("2019-04-25T13:41:47+0200"); /* = UTC(in1 + 2h) */
1277 const std::string in3 ("2019-04-25T15:41:47+0000"); /* = UTC(in2) */
1280 boost::optional<I2n::clock::Time> t1 = I2n::clock::time_of_iso8601 (in1, true, true, true);
1281 boost::optional<I2n::clock::Time> t2 = I2n::clock::time_of_iso8601 (in2, true, true, true);
1282 boost::optional<I2n::clock::Time> t3 = I2n::clock::time_of_iso8601 (in3, true, true, true);
1284 # ifdef GLIBC_STRPTIME_LACKS_Z
1292 # ifndef GLIBC_STRPTIME_LACKS_Z
1293 BOOST_CHECK_EQUAL(*t1->format_iso8601 (), "2019-04-25T13:41:47+0000");
1294 BOOST_CHECK_EQUAL(t1->get_sec (), 1556199707);
1296 BOOST_CHECK_EQUAL(*t2->format_iso8601 (), "2019-04-25T15:41:47+0000");
1297 # ifndef GLIBC_STRPTIME_LACKS_Z
1298 BOOST_CHECK_EQUAL(t2->get_sec (), t1->get_sec () + 2 * 60 * 60);
1300 BOOST_CHECK_EQUAL(*t2, *t3);
1301 BOOST_CHECK_EQUAL(*t3->format_iso8601 (), "2019-04-25T15:41:47+0000");
1304 BOOST_AUTO_TEST_CASE(FromString_iso8601_dst)
1306 const std::string in1 ("2019-03-30T12:42:42"); /* “winter time” */
1307 const std::string in2 ("2019-03-31T12:42:42"); /* “summer time” */
1310 boost::optional<I2n::clock::Time> t1 = I2n::clock::time_of_iso8601 (in1, true, true, false);
1311 boost::optional<I2n::clock::Time> t2 = I2n::clock::time_of_iso8601 (in2, true, true, false);
1315 BOOST_CHECK_EQUAL(t1->get_sec (), 1553949762);
1316 BOOST_CHECK_EQUAL(t2->get_sec (), 1554036162);
1317 BOOST_CHECK_EQUAL(*t1->format_iso8601 (), in1 + "+0000");
1318 BOOST_CHECK_EQUAL(*t2->format_iso8601 (), in2 + "+0000");
1320 this->set_tz ("CET");
1321 BOOST_CHECK_EQUAL(*t1->format_iso8601 (false, true, true, true), "2019-03-30T13:42:42+0100");
1322 BOOST_CHECK_EQUAL(*t2->format_iso8601 (false, true, true, true), "2019-03-31T14:42:42+0200");
1325 BOOST_AUTO_TEST_CASE(FromString_iso8601_tzdiff)
1327 const std::string in ("2019-04-26T13:45:02+0000");
1329 this->set_tz ("UTC");
1330 boost::optional<I2n::clock::Time> t1 = I2n::clock::time_of_iso8601 (in, true, true, false);
1332 this->set_tz ("CET");
1333 boost::optional<I2n::clock::Time> t2 = I2n::clock::time_of_iso8601 (in, true, true, false);
1335 BOOST_CHECK_EQUAL(*t1->format_iso8601 (true, true, true, true), in);
1336 BOOST_CHECK_EQUAL(*t2->format_iso8601 (true, true, true, true), "2019-04-26T13:45:02+0000");
1339 BOOST_AUTO_TEST_CASE(FromString_iso8601_32bit_time_t_err)
1341 const std::string timeless ("11:11:11");
1342 boost::optional<I2n::clock::Time> untimely = boost::none;
1346 untimely = I2n::clock::time_of_iso8601 (timeless, false, true, false);
1349 BOOST_CHECK(!untimely);
1351 BOOST_CHECK(untimely);
1352 BOOST_CHECK_EQUAL(*untimely->format_iso8601 (true, false, true, false),
1357 BOOST_AUTO_TEST_CASE(Ctor_32bit_time_t_err)
1359 boost::optional<std::string> threw = boost::none;
1362 memset (&tm, 0, sizeof (tm));
1373 I2n::clock::Time untimely (tm);
1374 } catch (I2n::clock::conversion_error &exn) {
1375 threw = std::string (exn);
1380 BOOST_CHECK_EQUAL(*threw,
1381 "errno=0 [mktime: from struct tm {Sun Nov 11 11:11:11 1111}]");
1383 BOOST_CHECK(!threw);
1387 BOOST_AUTO_TEST_CASE(containers_list)
1389 std::list<I2n::clock::Time> ts;
1391 ts.push_back (I2n::clock::zero ());
1392 ts.push_back (I2n::clock::zero ());
1394 BOOST_CHECK_EQUAL(ts.size (), 2);
1397 BOOST_AUTO_TEST_CASE(containers_vec)
1399 std::vector<I2n::clock::Time> ts;
1401 ts.push_back (I2n::clock::zero ());
1402 ts.push_back (I2n::clock::zero ());
1404 BOOST_CHECK_EQUAL(ts.size (), 2);
1407 BOOST_AUTO_TEST_CASE(containers_set)
1409 std::set<I2n::clock::Time> ts;
1411 ts.insert (I2n::clock::zero ());
1412 ts.insert (I2n::clock::Time (42, 2187));
1413 ts.insert (I2n::clock::zero ());
1415 BOOST_CHECK_EQUAL(ts.size (), 2);
1418 BOOST_AUTO_TEST_CASE(containers_list_mean)
1420 std::list<I2n::clock::Time> ts;
1422 ts.push_back (I2n::clock::Time (42, 42));
1423 ts.push_back (I2n::clock::Time (1337, 1337));
1425 BOOST_CHECK_EQUAL(I2n::clock::mean (ts),
1426 I2n::clock::Time (689, 500000689));
1429 BOOST_AUTO_TEST_CASE(containers_list_mean_zero)
1431 std::list<I2n::clock::Time> ts;
1433 ts.push_back (I2n::clock::Time (0, 0));
1434 ts.push_back (I2n::clock::Time (0, 0));
1435 ts.push_back (I2n::clock::Time (0, 0));
1436 ts.push_back (I2n::clock::Time (0, 0));
1438 BOOST_CHECK_EQUAL(I2n::clock::mean (ts),
1439 I2n::clock::zero ());
1442 BOOST_AUTO_TEST_CASE(containers_list_mean_empty)
1444 std::list<I2n::clock::Time> ts;
1446 BOOST_CHECK_EQUAL(I2n::clock::mean (ts), I2n::clock::Time (0, 0));
1449 BOOST_AUTO_TEST_CASE(containers_set_mean)
1451 std::set<I2n::clock::Time> ts;
1453 ts.insert (I2n::clock::Time (42));
1454 ts.insert (I2n::clock::Time (1337));
1455 ts.insert (I2n::clock::Time (2187));
1457 BOOST_CHECK_EQUAL(I2n::clock::mean (ts),
1458 I2n::clock::Time (1188, 666666666));
1461 BOOST_AUTO_TEST_CASE(containers_set_median_empty)
1463 std::set<I2n::clock::Time> ts;
1465 BOOST_CHECK_EQUAL(I2n::clock::median (ts), I2n::clock::Time (0, 0));
1468 BOOST_AUTO_TEST_CASE(containers_set_median_one)
1470 std::set<I2n::clock::Time> ts;
1472 ts.insert (I2n::clock::Time (42, 0));
1474 BOOST_CHECK_EQUAL(I2n::clock::median (ts),
1475 I2n::clock::Time (42, 0));
1478 BOOST_AUTO_TEST_CASE(containers_set_median_multi)
1480 std::set<I2n::clock::Time> ts;
1482 ts.insert (I2n::clock::Time (42));
1483 ts.insert (I2n::clock::Time (1337));
1484 ts.insert (I2n::clock::Time (2187));
1486 BOOST_CHECK_EQUAL(I2n::clock::median (ts), I2n::clock::Time (1337));
1489 BOOST_AUTO_TEST_CASE(containers_vec_median_multi)
1491 std::vector<I2n::clock::Time> ts;
1493 ts.push_back (I2n::clock::Time (42));
1494 ts.push_back (I2n::clock::Time (1337));
1495 ts.push_back (I2n::clock::Time (2187));
1497 BOOST_CHECK_EQUAL(I2n::clock::median (ts), I2n::clock::Time (1337));
1500 BOOST_AUTO_TEST_CASE(containers_list_median_multi)
1502 std::list<I2n::clock::Time> ts;
1504 ts.push_back (I2n::clock::Time (42));
1505 ts.push_back (I2n::clock::Time (1337));
1506 ts.push_back (I2n::clock::Time (2187));
1507 ts.push_back (I2n::clock::Time (0xdead));
1508 ts.push_back (I2n::clock::Time (0xbeef));
1510 BOOST_CHECK_EQUAL(I2n::clock::median (ts),
1511 I2n::clock::Time (2187));
1514 BOOST_AUTO_TEST_CASE(containers_list_median_multi_evensize)
1516 std::list<I2n::clock::Time> ts;
1518 ts.push_back (I2n::clock::Time (42));
1519 ts.push_back (I2n::clock::Time (1337));
1520 ts.push_back (I2n::clock::Time (2187));
1521 ts.push_back (I2n::clock::Time (0xf00d));
1522 ts.push_back (I2n::clock::Time (0xfeed));
1523 ts.push_back (I2n::clock::Time (0xdeadf0e));
1525 BOOST_CHECK_EQUAL(I2n::clock::median (ts), I2n::clock::Time (0xf00d));
1528 BOOST_AUTO_TEST_CASE(operator_shift_left)
1530 std::ostringstream os1;
1531 std::ostringstream os2;
1532 std::ostringstream os3;
1533 std::ostringstream os4;
1535 os1 << I2n::clock::Time ( 42, 42);
1536 os2 << I2n::clock::Time (-42, 42);
1537 os3 << I2n::clock::Time ( 42, -42);
1538 os4 << I2n::clock::Time (-42, -42);
1540 BOOST_CHECK_EQUAL(os1.str (), "42s, 42ns");
1541 BOOST_CHECK_EQUAL(os2.str (), "-42s, 42ns");
1542 BOOST_CHECK_EQUAL(os3.str (), "41s, 999999958ns");
1543 BOOST_CHECK_EQUAL(os4.str (), "-43s, 999999958ns");
1546 BOOST_AUTO_TEST_SUITE_END() /* [Clock] */
1548 BOOST_AUTO_TEST_SUITE_END()