implement basic operations over class Time
[libi2ncommon] / test / test_timefunc.cpp
CommitLineData
0e23f538
TJ
1/*
2The software in this package is distributed under the GNU General
3Public License version 2 (with a special exception described below).
4
5A copy of GNU General Public License (GPL) is included in this distribution,
6in the file COPYING.GPL.
7
8As a special exception, if other files instantiate templates or use macros
9or inline functions from this file, or you compile this file and link it
10with other works to produce a work based on this file, this file
11does not by itself cause the resulting work to be covered
12by the GNU General Public License.
13
14However the source code for this file must still be made available
15in accordance with section (3) of the GNU General Public License.
16
17This exception does not invalidate any other reasons why a work based
18on this file might be covered by the GNU General Public License.
19*/
8d2b7645
TJ
20/** @file
21 * @brief unit test for time related functions.
22 *
23 * @copyright Copyright © 2001-2008 by Intra2net AG
8d2b7645
TJ
24 *
25 */
26
9fe0853b
TJ
27#define BOOST_TEST_DYN_LINK
28#include <boost/test/unit_test.hpp>
8d2b7645
TJ
29
30#include <timefunc.hxx>
31#include <filefunc.hxx>
32
96d0be2e 33#include <unistd.h>
9fe0853b 34#include <set>
96d0be2e 35
8d2b7645
TJ
36using namespace std;
37using namespace I2n;
8047e088 38using namespace I2n::Time;
8d2b7645 39
9fe0853b 40class TestTimeFuncFixture
8d2b7645 41{
8d2b7645 42protected:
8d2b7645 43 typedef std::list< std::string > StringList;
8d2b7645
TJ
44 std::set<std::string> used_check_files;
45
46 std::string get_check_file_path(std::string tag)
47 {
48 std::string result;
49 result= "__unittest__" + tag + ".dat";
50 used_check_files.insert(result);
51 return result;
52 } // eo get_check_file_path
53
8d2b7645
TJ
54 void remove_check_files()
55 {
56 for (std::set<std::string>::iterator it= used_check_files.begin();
57 it != used_check_files.end();
58 ++it)
59 {
60 std::string filepath(*it);
61 if (path_exists(filepath))
62 {
63 unlink(filepath);
64 }
65 //TODO
66 }
67 used_check_files.clear();
68 } // eo remove_check_files
69
8d2b7645 70public:
9fe0853b
TJ
71 TestTimeFuncFixture()
72 {
73 }
74
75 ~TestTimeFuncFixture()
76 {
77 remove_check_files();
78 }
79};
8d2b7645 80
9fe0853b 81BOOST_FIXTURE_TEST_SUITE(TestTimeFunc, TestTimeFuncFixture)
8d2b7645 82
9fe0853b
TJ
83BOOST_AUTO_TEST_CASE(AddIntervalsDisjoint)
84{
85 Intervals intervals;
8d2b7645 86
9fe0853b
TJ
87 intervals.add( Interval( 10, 100 ) );
88 intervals.add( Interval( 600, 620 ) );
8d2b7645 89
9fe0853b
TJ
90 BOOST_CHECK_EQUAL( false, intervals.empty() );
91 BOOST_CHECK_EQUAL( 2u, intervals.size() );
8d2b7645 92
9fe0853b
TJ
93 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
94 BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() );
8d2b7645 95
9fe0853b
TJ
96 BOOST_CHECK_EQUAL( 600u, intervals.back().lower_bound() );
97 BOOST_CHECK_EQUAL( 620u, intervals.back().upper_bound() );
98} // eo AddIntervalsDisjoint()
8d2b7645
TJ
99
100
101
9fe0853b
TJ
102BOOST_AUTO_TEST_CASE(AddIntervalsInclude)
103{
104 Intervals intervals;
8d2b7645 105
9fe0853b
TJ
106 intervals.add( Interval( 10, 100 ) );
107 intervals.add( Interval( 10, 80 ) );
8d2b7645 108
9fe0853b
TJ
109 BOOST_CHECK_EQUAL( false, intervals.empty() );
110 BOOST_CHECK_EQUAL( 1u, intervals.size() );
8d2b7645 111
9fe0853b
TJ
112 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
113 BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() );
114 BOOST_CHECK_EQUAL( false, intervals.front().changed() );
115} // eo AddIntervalsInclude()
8d2b7645
TJ
116
117
118
9fe0853b
TJ
119BOOST_AUTO_TEST_CASE(AddIntervalsEmbrace)
120{
121 Intervals intervals;
8d2b7645 122
9fe0853b
TJ
123 intervals.add( Interval( 10, 100 ) );
124 intervals.add( Interval( 5, 120 ) );
8d2b7645 125
9fe0853b
TJ
126 BOOST_CHECK_EQUAL( false, intervals.empty() );
127 BOOST_CHECK_EQUAL( 1u, intervals.size() );
8d2b7645 128
9fe0853b
TJ
129 BOOST_CHECK_EQUAL( 5u, intervals.front().lower_bound() );
130 BOOST_CHECK_EQUAL( 120u, intervals.front().upper_bound() );
131 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
132} // eo AddIntervalsEmbrace()
8d2b7645
TJ
133
134
135
9fe0853b
TJ
136BOOST_AUTO_TEST_CASE(AddIntervalsJoin1)
137{
138 Intervals intervals;
8d2b7645 139
9fe0853b
TJ
140 intervals.add( Interval( 10, 100 ) );
141 intervals.add( Interval( 60, 120 ) );
8d2b7645 142
9fe0853b
TJ
143 BOOST_CHECK_EQUAL( false, intervals.empty() );
144 BOOST_CHECK_EQUAL( 1u, intervals.size() );
8d2b7645 145
9fe0853b
TJ
146 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
147 BOOST_CHECK_EQUAL( 120u, intervals.front().upper_bound() );
148 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
149} // eo AddIntervalsJoin1()
8d2b7645
TJ
150
151
152
9fe0853b
TJ
153BOOST_AUTO_TEST_CASE(AddIntervalsJoin1b)
154{
155 Intervals intervals;
8d2b7645 156
9fe0853b
TJ
157 intervals.add( Interval( 10, 100 ) );
158 intervals.add( Interval( 100, 120 ) );
8d2b7645 159
9fe0853b
TJ
160 BOOST_CHECK_EQUAL( false, intervals.empty() );
161 BOOST_CHECK_EQUAL( 1u, intervals.size() );
8d2b7645 162
9fe0853b
TJ
163 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
164 BOOST_CHECK_EQUAL( 120u, intervals.front().upper_bound() );
165 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
166} // eo AddIntervalsJoin1b()
8d2b7645
TJ
167
168
169
9fe0853b
TJ
170BOOST_AUTO_TEST_CASE(AddIntervalsJoin2)
171{
172 Intervals intervals;
8d2b7645 173
9fe0853b
TJ
174 intervals.add( Interval( 10, 100 ) );
175 intervals.add( Interval( 200, 250 ) );
8d2b7645 176
9fe0853b
TJ
177 BOOST_CHECK_EQUAL( false, intervals.empty() );
178 BOOST_CHECK_EQUAL( 2u, intervals.size() );
8d2b7645 179
9fe0853b
TJ
180 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
181 BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() );
182 BOOST_CHECK_EQUAL( 200u, intervals.back().lower_bound() );
183 BOOST_CHECK_EQUAL( 250u, intervals.back().upper_bound() );
8d2b7645 184
9fe0853b
TJ
185 // now add the gap; the intervals should collapse to one covering all:
186 intervals.add( Interval(100, 200) );
8d2b7645 187
9fe0853b
TJ
188 BOOST_CHECK_EQUAL( false, intervals.empty() );
189 BOOST_CHECK_EQUAL( 1u, intervals.size() );
8d2b7645 190
9fe0853b
TJ
191 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
192 BOOST_CHECK_EQUAL( 250u, intervals.front().upper_bound() );
193 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
194} // eo AddIntervalsJoin2()
8d2b7645
TJ
195
196
197
9fe0853b
TJ
198BOOST_AUTO_TEST_CASE(SubIntervalsDisjoint)
199{
200 Intervals intervals;
8d2b7645 201
9fe0853b
TJ
202 intervals.add( Interval(10, 100) );
203 intervals.sub( Interval(0, 10) );
8d2b7645 204
9fe0853b
TJ
205 BOOST_CHECK_EQUAL( false, intervals.empty() );
206 BOOST_CHECK_EQUAL( 1u, intervals.size() );
8d2b7645 207
9fe0853b
TJ
208 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
209 BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() );
210 BOOST_CHECK_EQUAL( false, intervals.front().changed() );
211} // eo SubIntervalsDisjoint()
8d2b7645
TJ
212
213
214
9fe0853b
TJ
215BOOST_AUTO_TEST_CASE(SubIntervalsExact)
216{
217 Intervals intervals;
8d2b7645 218
9fe0853b
TJ
219 intervals.add( Interval(10, 100) );
220 intervals.sub( Interval(10, 100) );
8d2b7645 221
9fe0853b
TJ
222 BOOST_CHECK_EQUAL( true, intervals.empty() );
223 BOOST_CHECK_EQUAL( 0u, intervals.size() );
224} // eo SubIntervalsExact()
8d2b7645
TJ
225
226
227
9fe0853b
TJ
228BOOST_AUTO_TEST_CASE(SubIntervalsSplit1)
229{
230 Intervals intervals;
8d2b7645 231
9fe0853b
TJ
232 intervals.add( Interval(10, 100) );
233 intervals.sub( Interval(20, 40) );
8d2b7645 234
9fe0853b
TJ
235 BOOST_CHECK_EQUAL( false, intervals.empty() );
236 BOOST_CHECK_EQUAL( 2u, intervals.size() );
8d2b7645 237
9fe0853b
TJ
238 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
239 BOOST_CHECK_EQUAL( 20u, intervals.front().upper_bound() );
8d2b7645 240
9fe0853b
TJ
241 BOOST_CHECK_EQUAL( 40u, intervals.back().lower_bound() );
242 BOOST_CHECK_EQUAL( 100u, intervals.back().upper_bound() );
243 BOOST_CHECK_EQUAL( false, intervals.front().changed() );
244 BOOST_CHECK_EQUAL( true, intervals.back().changed() );
245} // eo SubIntervalsSplit1()
8d2b7645
TJ
246
247
9fe0853b
TJ
248BOOST_AUTO_TEST_CASE(SubIntervalsCutFront)
249{
250 Intervals intervals;
8d2b7645 251
9fe0853b
TJ
252 intervals.add( Interval(10, 100) );
253 intervals.sub( Interval(10, 20) );
8d2b7645 254
9fe0853b
TJ
255 BOOST_CHECK_EQUAL( false, intervals.empty() );
256 BOOST_CHECK_EQUAL( 1u, intervals.size() );
8d2b7645 257
9fe0853b
TJ
258 BOOST_CHECK_EQUAL( 20u, intervals.front().lower_bound() );
259 BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() );
260 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
261} // eo SubIntervalsCutFront()
8d2b7645
TJ
262
263
9fe0853b
TJ
264BOOST_AUTO_TEST_CASE(SubIntervalsCutBack)
265{
266 Intervals intervals;
8d2b7645 267
9fe0853b
TJ
268 intervals.add( Interval(10, 100) );
269 intervals.sub( Interval(87, 100) );
8d2b7645 270
9fe0853b
TJ
271 BOOST_CHECK_EQUAL( false, intervals.empty() );
272 BOOST_CHECK_EQUAL( 1u, intervals.size() );
8d2b7645 273
9fe0853b
TJ
274 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
275 BOOST_CHECK_EQUAL( 87u, intervals.front().upper_bound() );
276 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
277} // eo SubIntervalsCutBack()
8d2b7645
TJ
278
279
280
9fe0853b
TJ
281BOOST_AUTO_TEST_CASE(SubIntervalsCutMore)
282{
283 Intervals intervals;
8d2b7645 284
9fe0853b
TJ
285 intervals.add( Interval( 10, 100) );
286 intervals.add( Interval(110, 200) );
287 intervals.add( Interval(210, 300) );
8d2b7645 288
9fe0853b
TJ
289 // this should remove the first 2 intervals and cut the third:
290 intervals.sub( Interval(8, 220) );
8d2b7645 291
9fe0853b
TJ
292 BOOST_CHECK_EQUAL( false, intervals.empty() );
293 BOOST_CHECK_EQUAL( 1u, intervals.size() );
8d2b7645 294
9fe0853b
TJ
295 BOOST_CHECK_EQUAL( 220u, intervals.front().lower_bound() );
296 BOOST_CHECK_EQUAL( 300u, intervals.front().upper_bound() );
297 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
298} // eo SubIntervalsCutMore()
8d2b7645
TJ
299
300
9fe0853b
TJ
301BOOST_AUTO_TEST_CASE(IntervalComparisons)
302{
303 Intervals intervals1;
304 Intervals intervals2;
8d2b7645 305
9fe0853b 306 intervals1.add( Interval( 10, 120) );
8d2b7645 307
9fe0853b
TJ
308 intervals2.add( Interval( 10, 110 ) );
309 intervals2.add( Interval( 100, 120 ) );
8d2b7645 310
9fe0853b 311 BOOST_CHECK_EQUAL( 1u, intervals2.size() );
8d2b7645 312
9fe0853b
TJ
313 BOOST_CHECK( intervals1 == intervals2 );
314 BOOST_CHECK_EQUAL( true, intervals1.contains( intervals2 ));
315 BOOST_CHECK_EQUAL( true, intervals2.contains( intervals1 ));
8d2b7645 316
9fe0853b 317 intervals2.sub( Interval( 40, 50) );
8d2b7645 318
9fe0853b
TJ
319 BOOST_CHECK( intervals1 != intervals2 );
320 BOOST_CHECK_EQUAL( true, intervals1.contains( intervals2 ));
321 BOOST_CHECK_EQUAL( false, intervals2.contains( intervals1 ));
322} // eo IntervalComparisons()
8d2b7645 323
96d0be2e
TJ
324
325
9fe0853b
TJ
326BOOST_AUTO_TEST_CASE(MonotonicClock)
327{
328 long sec0, nsec0;
329 long sec1, nsec1;
96d0be2e 330
9fe0853b
TJ
331 bool res = monotonic_clock_gettime(sec0,nsec0);
332 BOOST_CHECK_EQUAL( true, res );
96d0be2e 333
9fe0853b
TJ
334 usleep(250000);
335 res= monotonic_clock_gettime(sec1,nsec1);
336 BOOST_CHECK_EQUAL( true, res);
96d0be2e 337
9fe0853b
TJ
338 long delta_sec = sec1 - sec0;
339 long delta_nsec= nsec1 - nsec0;
96d0be2e 340
9fe0853b 341 long delta_millisec= ( delta_nsec / 1000000L) + delta_sec * 1000L;
96d0be2e 342
9fe0853b
TJ
343 BOOST_CHECK( delta_millisec >= 250 - /*fuzz*/ 1);
344 BOOST_CHECK( delta_millisec < 300 );
345} // eo MonotonicClock()
96d0be2e 346
9fe0853b
TJ
347BOOST_AUTO_TEST_CASE(WeekInvalid)
348{
349 Week week("99999999");
350 BOOST_CHECK_EQUAL(false, week.is_valid());
351 BOOST_CHECK_EQUAL(string(""), week.get_displaystring());
352}
8047e088 353
9fe0853b
TJ
354BOOST_AUTO_TEST_CASE(WeekDisplayString1)
355{
356 Week week("");
357 BOOST_CHECK_EQUAL(true, week.is_valid());
358 BOOST_CHECK_EQUAL(string(""), week.get_displaystring());
359}
8047e088 360
9fe0853b
TJ
361BOOST_AUTO_TEST_CASE(WeekDisplayString2)
362{
363 Week week("0123456");
364 BOOST_CHECK_EQUAL(true, week.is_valid());
365 BOOST_CHECK_EQUAL(string("Mon-Sun"), week.get_displaystring());
366}
8047e088 367
9fe0853b
TJ
368BOOST_AUTO_TEST_CASE(WeekDisplayString3)
369{
370 Week week("123456");
371 BOOST_CHECK_EQUAL(true, week.is_valid());
372 BOOST_CHECK_EQUAL(string("Mon-Sat"), week.get_displaystring());
373}
8047e088 374
9fe0853b
TJ
375BOOST_AUTO_TEST_CASE(WeekDisplayString4)
376{
377 Week week("012345");
378 BOOST_CHECK_EQUAL(true, week.is_valid());
379 BOOST_CHECK_EQUAL(string("Mon-Fri, Sun"), week.get_displaystring());
380}
8047e088 381
9fe0853b
TJ
382BOOST_AUTO_TEST_CASE(WeekDisplayString5)
383{
384 Week week("1256");
385 BOOST_CHECK_EQUAL(true, week.is_valid());
386 BOOST_CHECK_EQUAL(string("Mon, Tue, Fri, Sat"), week.get_displaystring());
387}
8047e088 388
9fe0853b
TJ
389BOOST_AUTO_TEST_CASE(WeekDisplayString6)
390{
391 Week week("0246");
392 BOOST_CHECK_EQUAL(true, week.is_valid());
393 BOOST_CHECK_EQUAL(string("Tue, Thu, Sat, Sun"), week.get_displaystring());
394}
96d0be2e 395
9fe0853b
TJ
396BOOST_AUTO_TEST_CASE(WeekDisplayString7)
397{
398 Week week("135");
399 BOOST_CHECK_EQUAL(true, week.is_valid());
400 BOOST_CHECK_EQUAL(string("Mon, Wed, Fri"), week.get_displaystring());
401}
8047e088 402
9fe0853b
TJ
403BOOST_AUTO_TEST_CASE(WeekDisplayString8)
404{
405 Week week("15");
406 BOOST_CHECK_EQUAL(true, week.is_valid());
407 BOOST_CHECK_EQUAL(string("Mon, Fri"), week.get_displaystring());
408}
8047e088 409
9fe0853b
TJ
410BOOST_AUTO_TEST_CASE(WeekDisplayString9)
411{
412 Week week("06");
413 BOOST_CHECK_EQUAL(true, week.is_valid());
414 BOOST_CHECK_EQUAL(string("Sat, Sun"), week.get_displaystring());
415}
8047e088 416
9fe0853b
TJ
417BOOST_AUTO_TEST_CASE(WeekDisplayString10)
418{
419 Week week("056");
420 BOOST_CHECK_EQUAL(true, week.is_valid());
421 BOOST_CHECK_EQUAL(string("Fri-Sun"), week.get_displaystring());
422}
8047e088 423
9fe0853b
TJ
424BOOST_AUTO_TEST_CASE(WeekDisplayString11)
425{
426 Week week("0");
427 BOOST_CHECK_EQUAL(true, week.is_valid());
428 BOOST_CHECK_EQUAL(string("Sun"), week.get_displaystring());
429}
8047e088 430
9fe0853b
TJ
431BOOST_AUTO_TEST_CASE(WeekDisplayString12)
432{
433 Week week("6");
434 BOOST_CHECK_EQUAL(true, week.is_valid());
435 BOOST_CHECK_EQUAL(string("Sat"), week.get_displaystring());
436}
8047e088 437
9fe0853b
TJ
438BOOST_AUTO_TEST_CASE(WeekDisplayString13)
439{
440 Week week("123");
441 BOOST_CHECK_EQUAL(true, week.is_valid());
442 BOOST_CHECK_EQUAL(string("Mon-Wed"), week.get_displaystring());
443}
8d2b7645 444
532d6b3a
TJ
445BOOST_AUTO_TEST_CASE(FormatFullTime)
446{
447 time_t seconds = 1318844005;
448
449 BOOST_CHECK_EQUAL("17.10.2011 11:33", format_full_time(seconds));
450}
451
dad9e26f
GE
452BOOST_AUTO_TEST_CASE(DateToSeconds1)
453{
454 // no DST
455 BOOST_CHECK_EQUAL(1325372400, date_to_seconds("2012-01-01"));
456}
457
458BOOST_AUTO_TEST_CASE(DateToSeconds2)
459{
460 // DST
461 BOOST_CHECK_EQUAL(1341093600, date_to_seconds("2012-07-01"));
462}
463
8b5814e2
PG
464BOOST_AUTO_TEST_SUITE(Clock)
465
466 BOOST_AUTO_TEST_CASE(ctor_simple)
467 {
468 I2n::clock::Time t;
469
470 BOOST_CHECK_EQUAL(t.get_sec (), 0);
471 BOOST_CHECK_EQUAL(t.get_nsec (), 0);
472 }
473
474 BOOST_AUTO_TEST_CASE(ctor_type)
475 {
476 I2n::clock::Time t (I2n::clock::type::real);
477
478 BOOST_CHECK_EQUAL(t.get_sec (), 0);
479 BOOST_CHECK_EQUAL(t.get_nsec (), 0);
480 }
481
482 BOOST_AUTO_TEST_CASE(ctor_variant)
483 {
484 I2n::clock::Time t (I2n::clock::type::cpu,
485 I2n::clock::type::thread);
486
487 BOOST_CHECK_EQUAL(t.get_sec (), 0);
488 BOOST_CHECK_EQUAL(t.get_nsec (), 0);
489 }
490
491 BOOST_AUTO_TEST_CASE(initializer_now)
492 {
493 boost::optional<I2n::clock::Time> t = I2n::clock::now ();
494
495 BOOST_CHECK(t);
496 BOOST_CHECK_GT(t->get_sec (), 0);
497 BOOST_CHECK_EQUAL(t->err, 0);
498 }
499
e36ca33c
PG
500 BOOST_AUTO_TEST_CASE(initializer_zero)
501 {
502 I2n::clock::Time stundenull = I2n::clock::zero ();
503
504 BOOST_CHECK_EQUAL(stundenull.get_sec (), 0);
505 BOOST_CHECK_EQUAL(stundenull.get_nsec (), 0);
506 BOOST_CHECK_EQUAL(stundenull.err, 0);
507 }
508
509 BOOST_AUTO_TEST_CASE(member_set_now)
510 {
511 I2n::clock::Time t;
512
513 BOOST_CHECK(t.set ());
514
515 BOOST_CHECK_NE(t.get_sec (), 0);
516 }
517
518 BOOST_AUTO_TEST_CASE(member_set_value)
519 {
520 I2n::clock::Time t;
521
522 t.set (42, 42);
523
524 BOOST_CHECK_EQUAL(t.get_sec (), 42);
525 BOOST_CHECK_EQUAL(t.get_nsec (), 42);
526 }
527
528 BOOST_AUTO_TEST_CASE(member_set_value_type)
529 {
530 I2n::clock::Time t;
531
532 t.set (42, 42, I2n::clock::type::real, I2n::clock::type::exact);
533
534 BOOST_CHECK_EQUAL(t.get_sec (), 42);
535 BOOST_CHECK_EQUAL(t.get_nsec (), 42);
536 }
537
538 BOOST_AUTO_TEST_CASE(member_add_parts)
539 {
540 I2n::clock::Time t;
541
542 t.set (42, 42);
543 t.add (2187, 2187);
544
545 BOOST_CHECK_EQUAL(t.get_sec (), 2229);
546 BOOST_CHECK_EQUAL(t.get_nsec (), 2229);
547 }
548
549 BOOST_AUTO_TEST_CASE(member_sub_parts)
550 {
551 I2n::clock::Time t;
552
553 t.set (2, 0L);
554 t.subtract (1, 1L);
555
556 BOOST_CHECK_EQUAL(t.get_sec (), 0);
557 BOOST_CHECK_EQUAL(t.get_nsec (), 999999999);
558 }
559
560 BOOST_AUTO_TEST_CASE(member_sub_Time)
561 {
562 I2n::clock::Time t1;
563 I2n::clock::Time t2;
564
565 t1.set (42, 42L);
566 t2.set (42, 0L);
567
568 t1.subtract (t2);
569
570 BOOST_CHECK_EQUAL(t1.get_sec (), 0);
571 BOOST_CHECK_EQUAL(t1.get_nsec (), 42L);
572 }
573
574 BOOST_AUTO_TEST_CASE(member_diff)
575 {
576 static const time_t five = 5 * 365 * 24 * 3600;
577
578 I2n::clock::Time t1 (42, 1337);
579 I2n::clock::Time t2 = t1 + five;;
580 I2n::clock::Time t3 = t1 - five;;
581
582 BOOST_CHECK_EQUAL(t2, I2n::clock::Time ((time_t)42 + five, 1337));
583 BOOST_CHECK_EQUAL(t3, I2n::clock::Time ((time_t)42 - five, 1337));
584 BOOST_CHECK_EQUAL(t1.difference (t3), t3.difference (t1));
585 BOOST_CHECK_EQUAL(t3.difference (t3), t3.difference (t3));
586 }
587
588 BOOST_AUTO_TEST_CASE(op_copyassign)
589 {
590 I2n::clock::Time t1;
591 I2n::clock::Time t2;
592
593 BOOST_CHECK(t1.set ());
594
595 t2 = t1;
596
597 BOOST_CHECK_EQUAL(t1.get_sec (), t2.get_sec ());
598 BOOST_CHECK_EQUAL(t1.get_nsec (), t2.get_nsec ());
599 }
600
601 BOOST_AUTO_TEST_CASE(op_equal)
602 {
603 I2n::clock::Time t1;
604 I2n::clock::Time t2;
605
606 BOOST_CHECK(t1.set ());
607 t2 = t1;
608
609 BOOST_CHECK_EQUAL(t1, t2);
610 }
611
612 BOOST_AUTO_TEST_CASE(op_add_Time)
613 {
614 I2n::clock::Time t1;
615 I2n::clock::Time t2;
616 I2n::clock::Time tsum;
617
618 t1.set (2187, 2187);
619 t2.set (1337, 1337);
620 tsum = t1 + t2;
621
622 BOOST_CHECK_EQUAL(tsum.get_sec (), 3524);
623 BOOST_CHECK_EQUAL(tsum.get_nsec (), 3524);
624 }
625
626 BOOST_AUTO_TEST_CASE(op_add_Time_carry)
627 {
628 I2n::clock::Time t1;
629 I2n::clock::Time t2;
630 I2n::clock::Time tsum;
631
632 t1.set (2187, 2187);
633 t2.set (1300, 37L * 1000 * 1000 * 1000 + 1337);
634
635 tsum = t1 + t2;
636
637 BOOST_CHECK_EQUAL(tsum.get_sec (), 3524);
638 BOOST_CHECK_EQUAL(tsum.get_nsec (), 3524);
639 }
640
641 BOOST_AUTO_TEST_CASE(op_add_time_t)
642 {
643 I2n::clock::Time t1 (2187, 2187);
644 time_t t2 = 1337;
645 I2n::clock::Time tsum;
646
647 tsum = t1 + t2;
648
649 BOOST_CHECK_EQUAL(tsum.get_sec (), 3524);
650 BOOST_CHECK_EQUAL(tsum.get_nsec (), 2187);
651 }
652
653 BOOST_AUTO_TEST_CASE(op_add_time_t_external)
654 {
655 time_t t1 = 1337;
656 I2n::clock::Time t2 (2187, 2187);
657 I2n::clock::Time tsum;
658
659 tsum = t1 + t2;
660
661 BOOST_CHECK_EQUAL(tsum.get_sec (), 3524);
662 BOOST_CHECK_EQUAL(tsum.get_nsec (), 2187);
663 }
664
665 BOOST_AUTO_TEST_CASE(op_incr_Time)
666 {
667 I2n::clock::Time t1 (2187, 2187);
668 I2n::clock::Time t2 (1337, 1337);
669
670 t1 += t2;
671
672 BOOST_CHECK_EQUAL(t1.get_sec (), 3524);
673 BOOST_CHECK_EQUAL(t1.get_nsec (), 3524);
674 }
675
676 BOOST_AUTO_TEST_CASE(op_incr_time_t)
677 {
678 I2n::clock::Time t1 (2187, 2187);
679 time_t t2 = 1337;
680
681 t1 += t2;
682
683 BOOST_CHECK_EQUAL(t1.get_sec (), 3524);
684 BOOST_CHECK_EQUAL(t1.get_nsec (), 2187);
685 }
686
687 BOOST_AUTO_TEST_CASE(op_subtract_Time)
688 {
689 I2n::clock::Time t1;
690 I2n::clock::Time t2;
691 I2n::clock::Time tdiff;
692
693 t1.set (2187, 2187);
694 t2.set (1337, 1337);
695 tdiff = t1 - t2;
696
697 BOOST_CHECK_EQUAL(tdiff.get_sec (), 850);
698 BOOST_CHECK_EQUAL(tdiff.get_nsec (), 850);
699 }
700
701 BOOST_AUTO_TEST_CASE(op_subtract_time_t)
702 {
703 I2n::clock::Time t1 (2187, 2187);
704 time_t t2 = 1337;
705 I2n::clock::Time tdiff;
706
707 tdiff = t1 - t2;
708
709 BOOST_CHECK_EQUAL(tdiff.get_sec (), 850);
710 BOOST_CHECK_EQUAL(tdiff.get_nsec (), 2187);
711 }
712
713 BOOST_AUTO_TEST_CASE(op_subtract_time_t_external)
714 {
715 time_t t1 = 1337;
716 I2n::clock::Time t2 (2187, 2187);
717 I2n::clock::Time tdiff;
718
719 tdiff = t1 - t2;
720
721 BOOST_CHECK_EQUAL(tdiff.get_sec (), -851);
722 BOOST_CHECK_EQUAL(tdiff.get_nsec (), 999997813);
723 }
724
725 BOOST_AUTO_TEST_CASE(op_decr_Time)
726 {
727 I2n::clock::Time t1 (2187, 2187);
728 I2n::clock::Time t2 (1337, 1337);
729
730 t1 -= t2;
731
732 BOOST_CHECK_EQUAL(t1.get_sec (), 850);
733 BOOST_CHECK_EQUAL(t1.get_nsec (), 850);
734 }
735
736 BOOST_AUTO_TEST_CASE(op_decr_time_t)
737 {
738 I2n::clock::Time t1 (2187, 2187);
739 time_t t2 = 1337;
740
741 t1 -= t2;
742
743 BOOST_CHECK_EQUAL(t1.get_sec (), 850);
744 BOOST_CHECK_EQUAL(t1.get_nsec (), 2187);
745 }
746
747 BOOST_AUTO_TEST_CASE(op_mult_scale)
748 {
749 I2n::clock::Time t1;
750 I2n::clock::Time t2;
751
752 t1.set (1, 1);
753 t2 = t1 * 42;
754
755 BOOST_CHECK_EQUAL(t2.get_sec (), 42);
756 BOOST_CHECK_EQUAL(t2.get_nsec (), 42);
757 }
758
759 BOOST_AUTO_TEST_CASE(op_mult_mutate)
760 {
761 I2n::clock::Time t1 ( 42, 42);
762 I2n::clock::Time t2 (1337, 0);
763
764 t1 *= 2;
765 t2 *= -10;
766
767 BOOST_CHECK_EQUAL(t1.get_sec (), 84);
768 BOOST_CHECK_EQUAL(t1.get_nsec (), 84);
769 BOOST_CHECK_EQUAL(t2.get_sec (), -13370);
770 }
771
772 BOOST_AUTO_TEST_CASE(op_mult_scale_carry)
773 {
774 I2n::clock::Time t1;
775 I2n::clock::Time t2;
776
777 t1.set (1, 500 * 1000 * 1000);
778 t2 = t1 * 3;
779
780 BOOST_CHECK_EQUAL(t2.get_sec (), 4);
781 BOOST_CHECK_EQUAL(t2.get_nsec (), 500 * 1000 * 1000);
782 }
783
784 BOOST_AUTO_TEST_CASE(op_equals)
785 {
786 I2n::clock::Time t1;
787 I2n::clock::Time t2;
788
789 t1.set (50, 50);
790 t2.set (50, 50);
791
792 BOOST_CHECK_EQUAL(t1, t2);
793 }
794
795 BOOST_AUTO_TEST_CASE(compare_equal)
796 {
797 I2n::clock::Time t1;
798 I2n::clock::Time t2;
799
800 t1.set (42, 42);
801 t2.set (42, 42);
802
803 BOOST_CHECK_EQUAL(I2n::clock::compare (t1, t2), 0);
804 }
805
806 BOOST_AUTO_TEST_CASE(compare_equal_type)
807 {
808 I2n::clock::Time t1 (42, 42, I2n::clock::type::real);
809 I2n::clock::Time t2 (42, 42, I2n::clock::type::cpu);
810 I2n::clock::Time t3 (42, 0, I2n::clock::type::real);
811 I2n::clock::Time t4 (42, 42, I2n::clock::type::real);
812
813 BOOST_CHECK_NE(t1, t2);
814 BOOST_CHECK_NE(t1, t3);
815 BOOST_CHECK_EQUAL(t1, t4);
816 }
817
818 BOOST_AUTO_TEST_CASE(compare_ne_sec)
819 {
820 I2n::clock::Time t1;
821 I2n::clock::Time t2;
822
823 t1.set ( 42, 42);
824 t2.set (1337, 42);
825
826 BOOST_CHECK_EQUAL(I2n::clock::compare (t1, t2), -1);
827 BOOST_CHECK_EQUAL(I2n::clock::compare (t2, t1), 1);
828 }
829
830 BOOST_AUTO_TEST_CASE(compare_ne_nsec)
831 {
832 I2n::clock::Time t1;
833 I2n::clock::Time t2;
834
835 t1.set (42, 42);
836 t2.set (42, 1337);
837
838 BOOST_CHECK_EQUAL(I2n::clock::compare (t1, t2), -1);
839 BOOST_CHECK_EQUAL(I2n::clock::compare (t2, t1), 1);
840 }
841
842 BOOST_AUTO_TEST_CASE(compare_ne_both)
843 {
844 I2n::clock::Time t1;
845 I2n::clock::Time t2;
846
847 t1.set (42, 2187);
848 t2.set (23, 1337);
849
850 BOOST_CHECK_EQUAL(I2n::clock::compare (t1, t2), 1);
851 BOOST_CHECK_EQUAL(I2n::clock::compare (t2, t1), -1);
852 }
853
854 BOOST_AUTO_TEST_CASE(op_ineq_sec)
855 {
856 I2n::clock::Time t1 (1337);
857 I2n::clock::Time t2 (2187);
858
859 BOOST_CHECK_LT(t1, t2);
860 BOOST_CHECK_GT(t2, t1);
861 }
862
863 BOOST_AUTO_TEST_CASE(op_ineq_nsec)
864 {
865 I2n::clock::Time t1 (1337, 23);
866 I2n::clock::Time t2 (1337, 42);
867
868 BOOST_CHECK_LT(t1, t2);
869 BOOST_CHECK_GT(t2, t1);
870 }
871
872 BOOST_AUTO_TEST_CASE(op_ineq_both)
873 {
874 I2n::clock::Time t1 (2187, 23);
875 I2n::clock::Time t2 (1337, 42);
876
877 BOOST_CHECK_LT(t2, t1);
878 BOOST_CHECK_GT(t1, t2);
879 }
880
881 BOOST_AUTO_TEST_CASE(op_eq_time_t)
882 {
883 boost::optional<I2n::clock::Time> t1 = I2n::clock::now ();
884 const time_t t2 = time (NULL); /* race here */
885
886 *t1 -= (time_t)42;
887
888 BOOST_CHECK_NE(*t1, t2);
889 BOOST_CHECK_LT(*t1, t2);
890 BOOST_CHECK_GT( t2, *t1);
891 }
892
893 BOOST_AUTO_TEST_CASE(containers_list)
894 {
895 std::list<I2n::clock::Time> ts;
896
897 ts.push_back (I2n::clock::zero ());
898 ts.push_back (I2n::clock::zero ());
899
900 BOOST_CHECK_EQUAL(ts.size (), 2);
901 }
902
903 BOOST_AUTO_TEST_CASE(containers_vec)
904 {
905 std::vector<I2n::clock::Time> ts;
906
907 ts.push_back (I2n::clock::zero ());
908 ts.push_back (I2n::clock::zero ());
909
910 BOOST_CHECK_EQUAL(ts.size (), 2);
911 }
912
913 BOOST_AUTO_TEST_CASE(containers_set)
914 {
915 std::set<I2n::clock::Time> ts;
916
917 ts.insert (I2n::clock::zero ());
918 ts.insert (I2n::clock::Time (42, 2187));
919 ts.insert (I2n::clock::zero ());
920
921 BOOST_CHECK_EQUAL(ts.size (), 2);
922 }
923
924BOOST_AUTO_TEST_SUITE_END() /* [Clock] */
dad9e26f 925
9fe0853b 926BOOST_AUTO_TEST_SUITE_END()