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>
38 using namespace I2n::Time;
40 class TestTimeFuncFixture
43 typedef std::list< std::string > StringList;
44 std::set<std::string> used_check_files;
46 std::string get_check_file_path(std::string tag)
49 result= "__unittest__" + tag + ".dat";
50 used_check_files.insert(result);
52 } // eo get_check_file_path
54 void remove_check_files()
56 for (std::set<std::string>::iterator it= used_check_files.begin();
57 it != used_check_files.end();
60 std::string filepath(*it);
61 if (path_exists(filepath))
67 used_check_files.clear();
68 } // eo remove_check_files
75 ~TestTimeFuncFixture()
81 BOOST_FIXTURE_TEST_SUITE(TestTimeFunc, TestTimeFuncFixture)
83 BOOST_AUTO_TEST_CASE(AddIntervalsDisjoint)
87 intervals.add( Interval( 10, 100 ) );
88 intervals.add( Interval( 600, 620 ) );
90 BOOST_CHECK_EQUAL( false, intervals.empty() );
91 BOOST_CHECK_EQUAL( 2u, intervals.size() );
93 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
94 BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() );
96 BOOST_CHECK_EQUAL( 600u, intervals.back().lower_bound() );
97 BOOST_CHECK_EQUAL( 620u, intervals.back().upper_bound() );
98 } // eo AddIntervalsDisjoint()
102 BOOST_AUTO_TEST_CASE(AddIntervalsInclude)
106 intervals.add( Interval( 10, 100 ) );
107 intervals.add( Interval( 10, 80 ) );
109 BOOST_CHECK_EQUAL( false, intervals.empty() );
110 BOOST_CHECK_EQUAL( 1u, intervals.size() );
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()
119 BOOST_AUTO_TEST_CASE(AddIntervalsEmbrace)
123 intervals.add( Interval( 10, 100 ) );
124 intervals.add( Interval( 5, 120 ) );
126 BOOST_CHECK_EQUAL( false, intervals.empty() );
127 BOOST_CHECK_EQUAL( 1u, intervals.size() );
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()
136 BOOST_AUTO_TEST_CASE(AddIntervalsJoin1)
140 intervals.add( Interval( 10, 100 ) );
141 intervals.add( Interval( 60, 120 ) );
143 BOOST_CHECK_EQUAL( false, intervals.empty() );
144 BOOST_CHECK_EQUAL( 1u, intervals.size() );
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()
153 BOOST_AUTO_TEST_CASE(AddIntervalsJoin1b)
157 intervals.add( Interval( 10, 100 ) );
158 intervals.add( Interval( 100, 120 ) );
160 BOOST_CHECK_EQUAL( false, intervals.empty() );
161 BOOST_CHECK_EQUAL( 1u, intervals.size() );
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()
170 BOOST_AUTO_TEST_CASE(AddIntervalsJoin2)
174 intervals.add( Interval( 10, 100 ) );
175 intervals.add( Interval( 200, 250 ) );
177 BOOST_CHECK_EQUAL( false, intervals.empty() );
178 BOOST_CHECK_EQUAL( 2u, intervals.size() );
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() );
185 // now add the gap; the intervals should collapse to one covering all:
186 intervals.add( Interval(100, 200) );
188 BOOST_CHECK_EQUAL( false, intervals.empty() );
189 BOOST_CHECK_EQUAL( 1u, intervals.size() );
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()
198 BOOST_AUTO_TEST_CASE(SubIntervalsDisjoint)
202 intervals.add( Interval(10, 100) );
203 intervals.sub( Interval(0, 10) );
205 BOOST_CHECK_EQUAL( false, intervals.empty() );
206 BOOST_CHECK_EQUAL( 1u, intervals.size() );
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()
215 BOOST_AUTO_TEST_CASE(SubIntervalsExact)
219 intervals.add( Interval(10, 100) );
220 intervals.sub( Interval(10, 100) );
222 BOOST_CHECK_EQUAL( true, intervals.empty() );
223 BOOST_CHECK_EQUAL( 0u, intervals.size() );
224 } // eo SubIntervalsExact()
228 BOOST_AUTO_TEST_CASE(SubIntervalsSplit1)
232 intervals.add( Interval(10, 100) );
233 intervals.sub( Interval(20, 40) );
235 BOOST_CHECK_EQUAL( false, intervals.empty() );
236 BOOST_CHECK_EQUAL( 2u, intervals.size() );
238 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
239 BOOST_CHECK_EQUAL( 20u, intervals.front().upper_bound() );
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()
248 BOOST_AUTO_TEST_CASE(SubIntervalsCutFront)
252 intervals.add( Interval(10, 100) );
253 intervals.sub( Interval(10, 20) );
255 BOOST_CHECK_EQUAL( false, intervals.empty() );
256 BOOST_CHECK_EQUAL( 1u, intervals.size() );
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()
264 BOOST_AUTO_TEST_CASE(SubIntervalsCutBack)
268 intervals.add( Interval(10, 100) );
269 intervals.sub( Interval(87, 100) );
271 BOOST_CHECK_EQUAL( false, intervals.empty() );
272 BOOST_CHECK_EQUAL( 1u, intervals.size() );
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()
281 BOOST_AUTO_TEST_CASE(SubIntervalsCutMore)
285 intervals.add( Interval( 10, 100) );
286 intervals.add( Interval(110, 200) );
287 intervals.add( Interval(210, 300) );
289 // this should remove the first 2 intervals and cut the third:
290 intervals.sub( Interval(8, 220) );
292 BOOST_CHECK_EQUAL( false, intervals.empty() );
293 BOOST_CHECK_EQUAL( 1u, intervals.size() );
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()
301 BOOST_AUTO_TEST_CASE(IntervalComparisons)
303 Intervals intervals1;
304 Intervals intervals2;
306 intervals1.add( Interval( 10, 120) );
308 intervals2.add( Interval( 10, 110 ) );
309 intervals2.add( Interval( 100, 120 ) );
311 BOOST_CHECK_EQUAL( 1u, intervals2.size() );
313 BOOST_CHECK( intervals1 == intervals2 );
314 BOOST_CHECK_EQUAL( true, intervals1.contains( intervals2 ));
315 BOOST_CHECK_EQUAL( true, intervals2.contains( intervals1 ));
317 intervals2.sub( Interval( 40, 50) );
319 BOOST_CHECK( intervals1 != intervals2 );
320 BOOST_CHECK_EQUAL( true, intervals1.contains( intervals2 ));
321 BOOST_CHECK_EQUAL( false, intervals2.contains( intervals1 ));
322 } // eo IntervalComparisons()
326 BOOST_AUTO_TEST_CASE(MonotonicClock)
331 bool res = monotonic_clock_gettime(sec0,nsec0);
332 BOOST_CHECK_EQUAL( true, res );
335 res= monotonic_clock_gettime(sec1,nsec1);
336 BOOST_CHECK_EQUAL( true, res);
338 long delta_sec = sec1 - sec0;
339 long delta_nsec= nsec1 - nsec0;
341 long delta_millisec= ( delta_nsec / 1000000L) + delta_sec * 1000L;
343 BOOST_CHECK( delta_millisec >= 250 - /*fuzz*/ 1);
344 BOOST_CHECK( delta_millisec < 300 );
345 } // eo MonotonicClock()
347 BOOST_AUTO_TEST_CASE(WeekInvalid)
349 Week week("99999999");
350 BOOST_CHECK_EQUAL(false, week.is_valid());
351 BOOST_CHECK_EQUAL(string(""), week.get_displaystring());
354 BOOST_AUTO_TEST_CASE(WeekDisplayString1)
357 BOOST_CHECK_EQUAL(true, week.is_valid());
358 BOOST_CHECK_EQUAL(string(""), week.get_displaystring());
361 BOOST_AUTO_TEST_CASE(WeekDisplayString2)
363 Week week("0123456");
364 BOOST_CHECK_EQUAL(true, week.is_valid());
365 BOOST_CHECK_EQUAL(string("Mon-Sun"), week.get_displaystring());
368 BOOST_AUTO_TEST_CASE(WeekDisplayString3)
371 BOOST_CHECK_EQUAL(true, week.is_valid());
372 BOOST_CHECK_EQUAL(string("Mon-Sat"), week.get_displaystring());
375 BOOST_AUTO_TEST_CASE(WeekDisplayString4)
378 BOOST_CHECK_EQUAL(true, week.is_valid());
379 BOOST_CHECK_EQUAL(string("Mon-Fri, Sun"), week.get_displaystring());
382 BOOST_AUTO_TEST_CASE(WeekDisplayString5)
385 BOOST_CHECK_EQUAL(true, week.is_valid());
386 BOOST_CHECK_EQUAL(string("Mon, Tue, Fri, Sat"), week.get_displaystring());
389 BOOST_AUTO_TEST_CASE(WeekDisplayString6)
392 BOOST_CHECK_EQUAL(true, week.is_valid());
393 BOOST_CHECK_EQUAL(string("Tue, Thu, Sat, Sun"), week.get_displaystring());
396 BOOST_AUTO_TEST_CASE(WeekDisplayString7)
399 BOOST_CHECK_EQUAL(true, week.is_valid());
400 BOOST_CHECK_EQUAL(string("Mon, Wed, Fri"), week.get_displaystring());
403 BOOST_AUTO_TEST_CASE(WeekDisplayString8)
406 BOOST_CHECK_EQUAL(true, week.is_valid());
407 BOOST_CHECK_EQUAL(string("Mon, Fri"), week.get_displaystring());
410 BOOST_AUTO_TEST_CASE(WeekDisplayString9)
413 BOOST_CHECK_EQUAL(true, week.is_valid());
414 BOOST_CHECK_EQUAL(string("Sat, Sun"), week.get_displaystring());
417 BOOST_AUTO_TEST_CASE(WeekDisplayString10)
420 BOOST_CHECK_EQUAL(true, week.is_valid());
421 BOOST_CHECK_EQUAL(string("Fri-Sun"), week.get_displaystring());
424 BOOST_AUTO_TEST_CASE(WeekDisplayString11)
427 BOOST_CHECK_EQUAL(true, week.is_valid());
428 BOOST_CHECK_EQUAL(string("Sun"), week.get_displaystring());
431 BOOST_AUTO_TEST_CASE(WeekDisplayString12)
434 BOOST_CHECK_EQUAL(true, week.is_valid());
435 BOOST_CHECK_EQUAL(string("Sat"), week.get_displaystring());
438 BOOST_AUTO_TEST_CASE(WeekDisplayString13)
441 BOOST_CHECK_EQUAL(true, week.is_valid());
442 BOOST_CHECK_EQUAL(string("Mon-Wed"), week.get_displaystring());
445 BOOST_AUTO_TEST_CASE(FormatFullTime)
447 time_t seconds = 1318844005;
449 BOOST_CHECK_EQUAL("17.10.2011 11:33", format_full_time(seconds));
452 BOOST_AUTO_TEST_CASE(DateToSeconds1)
455 BOOST_CHECK_EQUAL(1325372400, date_to_seconds("2012-01-01"));
458 BOOST_AUTO_TEST_CASE(DateToSeconds2)
461 BOOST_CHECK_EQUAL(1341093600, date_to_seconds("2012-07-01"));
464 BOOST_AUTO_TEST_SUITE(Clock)
466 BOOST_AUTO_TEST_CASE(ctor_simple)
470 BOOST_CHECK_EQUAL(t.get_sec (), 0);
471 BOOST_CHECK_EQUAL(t.get_nsec (), 0);
474 BOOST_AUTO_TEST_CASE(ctor_type)
476 I2n::clock::Time t (I2n::clock::type::real);
478 BOOST_CHECK_EQUAL(t.get_sec (), 0);
479 BOOST_CHECK_EQUAL(t.get_nsec (), 0);
482 BOOST_AUTO_TEST_CASE(ctor_variant)
484 I2n::clock::Time t (I2n::clock::type::cpu,
485 I2n::clock::type::thread);
487 BOOST_CHECK_EQUAL(t.get_sec (), 0);
488 BOOST_CHECK_EQUAL(t.get_nsec (), 0);
491 BOOST_AUTO_TEST_CASE(initializer_now)
493 boost::optional<I2n::clock::Time> t = I2n::clock::now ();
496 BOOST_CHECK_GT(t->get_sec (), 0);
497 BOOST_CHECK_EQUAL(t->err, 0);
500 BOOST_AUTO_TEST_SUITE_END()
502 BOOST_AUTO_TEST_SUITE_END()