Fix iconv include directory
[libi2ncommon] / test / test_timefunc.cpp
CommitLineData
8d2b7645
TJ
1/** @file
2 * @brief unit test for time related functions.
3 *
4 * @copyright Copyright © 2001-2008 by Intra2net AG
5 * @license commercial
6 * @contact info@intra2net.com
7 *
8 */
9
9fe0853b
TJ
10#define BOOST_TEST_DYN_LINK
11#include <boost/test/unit_test.hpp>
8d2b7645
TJ
12
13#include <timefunc.hxx>
14#include <filefunc.hxx>
15
96d0be2e 16#include <unistd.h>
9fe0853b 17#include <set>
96d0be2e 18
8d2b7645
TJ
19using namespace std;
20using namespace I2n;
8047e088 21using namespace I2n::Time;
8d2b7645 22
9fe0853b 23class TestTimeFuncFixture
8d2b7645 24{
8d2b7645 25protected:
8d2b7645 26 typedef std::list< std::string > StringList;
8d2b7645
TJ
27 std::set<std::string> used_check_files;
28
29 std::string get_check_file_path(std::string tag)
30 {
31 std::string result;
32 result= "__unittest__" + tag + ".dat";
33 used_check_files.insert(result);
34 return result;
35 } // eo get_check_file_path
36
8d2b7645
TJ
37 void remove_check_files()
38 {
39 for (std::set<std::string>::iterator it= used_check_files.begin();
40 it != used_check_files.end();
41 ++it)
42 {
43 std::string filepath(*it);
44 if (path_exists(filepath))
45 {
46 unlink(filepath);
47 }
48 //TODO
49 }
50 used_check_files.clear();
51 } // eo remove_check_files
52
8d2b7645 53public:
9fe0853b
TJ
54 TestTimeFuncFixture()
55 {
56 }
57
58 ~TestTimeFuncFixture()
59 {
60 remove_check_files();
61 }
62};
8d2b7645 63
9fe0853b 64BOOST_FIXTURE_TEST_SUITE(TestTimeFunc, TestTimeFuncFixture)
8d2b7645 65
9fe0853b
TJ
66BOOST_AUTO_TEST_CASE(AddIntervalsDisjoint)
67{
68 Intervals intervals;
8d2b7645 69
9fe0853b
TJ
70 intervals.add( Interval( 10, 100 ) );
71 intervals.add( Interval( 600, 620 ) );
8d2b7645 72
9fe0853b
TJ
73 BOOST_CHECK_EQUAL( false, intervals.empty() );
74 BOOST_CHECK_EQUAL( 2u, intervals.size() );
8d2b7645 75
9fe0853b
TJ
76 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
77 BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() );
8d2b7645 78
9fe0853b
TJ
79 BOOST_CHECK_EQUAL( 600u, intervals.back().lower_bound() );
80 BOOST_CHECK_EQUAL( 620u, intervals.back().upper_bound() );
81} // eo AddIntervalsDisjoint()
8d2b7645
TJ
82
83
84
9fe0853b
TJ
85BOOST_AUTO_TEST_CASE(AddIntervalsInclude)
86{
87 Intervals intervals;
8d2b7645 88
9fe0853b
TJ
89 intervals.add( Interval( 10, 100 ) );
90 intervals.add( Interval( 10, 80 ) );
8d2b7645 91
9fe0853b
TJ
92 BOOST_CHECK_EQUAL( false, intervals.empty() );
93 BOOST_CHECK_EQUAL( 1u, intervals.size() );
8d2b7645 94
9fe0853b
TJ
95 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
96 BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() );
97 BOOST_CHECK_EQUAL( false, intervals.front().changed() );
98} // eo AddIntervalsInclude()
8d2b7645
TJ
99
100
101
9fe0853b
TJ
102BOOST_AUTO_TEST_CASE(AddIntervalsEmbrace)
103{
104 Intervals intervals;
8d2b7645 105
9fe0853b
TJ
106 intervals.add( Interval( 10, 100 ) );
107 intervals.add( Interval( 5, 120 ) );
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( 5u, intervals.front().lower_bound() );
113 BOOST_CHECK_EQUAL( 120u, intervals.front().upper_bound() );
114 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
115} // eo AddIntervalsEmbrace()
8d2b7645
TJ
116
117
118
9fe0853b
TJ
119BOOST_AUTO_TEST_CASE(AddIntervalsJoin1)
120{
121 Intervals intervals;
8d2b7645 122
9fe0853b
TJ
123 intervals.add( Interval( 10, 100 ) );
124 intervals.add( Interval( 60, 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( 10u, intervals.front().lower_bound() );
130 BOOST_CHECK_EQUAL( 120u, intervals.front().upper_bound() );
131 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
132} // eo AddIntervalsJoin1()
8d2b7645
TJ
133
134
135
9fe0853b
TJ
136BOOST_AUTO_TEST_CASE(AddIntervalsJoin1b)
137{
138 Intervals intervals;
8d2b7645 139
9fe0853b
TJ
140 intervals.add( Interval( 10, 100 ) );
141 intervals.add( Interval( 100, 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 AddIntervalsJoin1b()
8d2b7645
TJ
150
151
152
9fe0853b
TJ
153BOOST_AUTO_TEST_CASE(AddIntervalsJoin2)
154{
155 Intervals intervals;
8d2b7645 156
9fe0853b
TJ
157 intervals.add( Interval( 10, 100 ) );
158 intervals.add( Interval( 200, 250 ) );
8d2b7645 159
9fe0853b
TJ
160 BOOST_CHECK_EQUAL( false, intervals.empty() );
161 BOOST_CHECK_EQUAL( 2u, intervals.size() );
8d2b7645 162
9fe0853b
TJ
163 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
164 BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() );
165 BOOST_CHECK_EQUAL( 200u, intervals.back().lower_bound() );
166 BOOST_CHECK_EQUAL( 250u, intervals.back().upper_bound() );
8d2b7645 167
9fe0853b
TJ
168 // now add the gap; the intervals should collapse to one covering all:
169 intervals.add( Interval(100, 200) );
8d2b7645 170
9fe0853b
TJ
171 BOOST_CHECK_EQUAL( false, intervals.empty() );
172 BOOST_CHECK_EQUAL( 1u, intervals.size() );
8d2b7645 173
9fe0853b
TJ
174 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
175 BOOST_CHECK_EQUAL( 250u, intervals.front().upper_bound() );
176 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
177} // eo AddIntervalsJoin2()
8d2b7645
TJ
178
179
180
9fe0853b
TJ
181BOOST_AUTO_TEST_CASE(SubIntervalsDisjoint)
182{
183 Intervals intervals;
8d2b7645 184
9fe0853b
TJ
185 intervals.add( Interval(10, 100) );
186 intervals.sub( Interval(0, 10) );
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( 100u, intervals.front().upper_bound() );
193 BOOST_CHECK_EQUAL( false, intervals.front().changed() );
194} // eo SubIntervalsDisjoint()
8d2b7645
TJ
195
196
197
9fe0853b
TJ
198BOOST_AUTO_TEST_CASE(SubIntervalsExact)
199{
200 Intervals intervals;
8d2b7645 201
9fe0853b
TJ
202 intervals.add( Interval(10, 100) );
203 intervals.sub( Interval(10, 100) );
8d2b7645 204
9fe0853b
TJ
205 BOOST_CHECK_EQUAL( true, intervals.empty() );
206 BOOST_CHECK_EQUAL( 0u, intervals.size() );
207} // eo SubIntervalsExact()
8d2b7645
TJ
208
209
210
9fe0853b
TJ
211BOOST_AUTO_TEST_CASE(SubIntervalsSplit1)
212{
213 Intervals intervals;
8d2b7645 214
9fe0853b
TJ
215 intervals.add( Interval(10, 100) );
216 intervals.sub( Interval(20, 40) );
8d2b7645 217
9fe0853b
TJ
218 BOOST_CHECK_EQUAL( false, intervals.empty() );
219 BOOST_CHECK_EQUAL( 2u, intervals.size() );
8d2b7645 220
9fe0853b
TJ
221 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
222 BOOST_CHECK_EQUAL( 20u, intervals.front().upper_bound() );
8d2b7645 223
9fe0853b
TJ
224 BOOST_CHECK_EQUAL( 40u, intervals.back().lower_bound() );
225 BOOST_CHECK_EQUAL( 100u, intervals.back().upper_bound() );
226 BOOST_CHECK_EQUAL( false, intervals.front().changed() );
227 BOOST_CHECK_EQUAL( true, intervals.back().changed() );
228} // eo SubIntervalsSplit1()
8d2b7645
TJ
229
230
9fe0853b
TJ
231BOOST_AUTO_TEST_CASE(SubIntervalsCutFront)
232{
233 Intervals intervals;
8d2b7645 234
9fe0853b
TJ
235 intervals.add( Interval(10, 100) );
236 intervals.sub( Interval(10, 20) );
8d2b7645 237
9fe0853b
TJ
238 BOOST_CHECK_EQUAL( false, intervals.empty() );
239 BOOST_CHECK_EQUAL( 1u, intervals.size() );
8d2b7645 240
9fe0853b
TJ
241 BOOST_CHECK_EQUAL( 20u, intervals.front().lower_bound() );
242 BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() );
243 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
244} // eo SubIntervalsCutFront()
8d2b7645
TJ
245
246
9fe0853b
TJ
247BOOST_AUTO_TEST_CASE(SubIntervalsCutBack)
248{
249 Intervals intervals;
8d2b7645 250
9fe0853b
TJ
251 intervals.add( Interval(10, 100) );
252 intervals.sub( Interval(87, 100) );
8d2b7645 253
9fe0853b
TJ
254 BOOST_CHECK_EQUAL( false, intervals.empty() );
255 BOOST_CHECK_EQUAL( 1u, intervals.size() );
8d2b7645 256
9fe0853b
TJ
257 BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() );
258 BOOST_CHECK_EQUAL( 87u, intervals.front().upper_bound() );
259 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
260} // eo SubIntervalsCutBack()
8d2b7645
TJ
261
262
263
9fe0853b
TJ
264BOOST_AUTO_TEST_CASE(SubIntervalsCutMore)
265{
266 Intervals intervals;
8d2b7645 267
9fe0853b
TJ
268 intervals.add( Interval( 10, 100) );
269 intervals.add( Interval(110, 200) );
270 intervals.add( Interval(210, 300) );
8d2b7645 271
9fe0853b
TJ
272 // this should remove the first 2 intervals and cut the third:
273 intervals.sub( Interval(8, 220) );
8d2b7645 274
9fe0853b
TJ
275 BOOST_CHECK_EQUAL( false, intervals.empty() );
276 BOOST_CHECK_EQUAL( 1u, intervals.size() );
8d2b7645 277
9fe0853b
TJ
278 BOOST_CHECK_EQUAL( 220u, intervals.front().lower_bound() );
279 BOOST_CHECK_EQUAL( 300u, intervals.front().upper_bound() );
280 BOOST_CHECK_EQUAL( true, intervals.front().changed() );
281} // eo SubIntervalsCutMore()
8d2b7645
TJ
282
283
9fe0853b
TJ
284BOOST_AUTO_TEST_CASE(IntervalComparisons)
285{
286 Intervals intervals1;
287 Intervals intervals2;
8d2b7645 288
9fe0853b 289 intervals1.add( Interval( 10, 120) );
8d2b7645 290
9fe0853b
TJ
291 intervals2.add( Interval( 10, 110 ) );
292 intervals2.add( Interval( 100, 120 ) );
8d2b7645 293
9fe0853b 294 BOOST_CHECK_EQUAL( 1u, intervals2.size() );
8d2b7645 295
9fe0853b
TJ
296 BOOST_CHECK( intervals1 == intervals2 );
297 BOOST_CHECK_EQUAL( true, intervals1.contains( intervals2 ));
298 BOOST_CHECK_EQUAL( true, intervals2.contains( intervals1 ));
8d2b7645 299
9fe0853b 300 intervals2.sub( Interval( 40, 50) );
8d2b7645 301
9fe0853b
TJ
302 BOOST_CHECK( intervals1 != intervals2 );
303 BOOST_CHECK_EQUAL( true, intervals1.contains( intervals2 ));
304 BOOST_CHECK_EQUAL( false, intervals2.contains( intervals1 ));
305} // eo IntervalComparisons()
8d2b7645 306
96d0be2e
TJ
307
308
9fe0853b
TJ
309BOOST_AUTO_TEST_CASE(MonotonicClock)
310{
311 long sec0, nsec0;
312 long sec1, nsec1;
96d0be2e 313
9fe0853b
TJ
314 bool res = monotonic_clock_gettime(sec0,nsec0);
315 BOOST_CHECK_EQUAL( true, res );
96d0be2e 316
9fe0853b
TJ
317 usleep(250000);
318 res= monotonic_clock_gettime(sec1,nsec1);
319 BOOST_CHECK_EQUAL( true, res);
96d0be2e 320
9fe0853b
TJ
321 long delta_sec = sec1 - sec0;
322 long delta_nsec= nsec1 - nsec0;
96d0be2e 323
9fe0853b 324 long delta_millisec= ( delta_nsec / 1000000L) + delta_sec * 1000L;
96d0be2e 325
9fe0853b
TJ
326 BOOST_CHECK( delta_millisec >= 250 - /*fuzz*/ 1);
327 BOOST_CHECK( delta_millisec < 300 );
328} // eo MonotonicClock()
96d0be2e 329
9fe0853b
TJ
330BOOST_AUTO_TEST_CASE(WeekInvalid)
331{
332 Week week("99999999");
333 BOOST_CHECK_EQUAL(false, week.is_valid());
334 BOOST_CHECK_EQUAL(string(""), week.get_displaystring());
335}
8047e088 336
9fe0853b
TJ
337BOOST_AUTO_TEST_CASE(WeekDisplayString1)
338{
339 Week week("");
340 BOOST_CHECK_EQUAL(true, week.is_valid());
341 BOOST_CHECK_EQUAL(string(""), week.get_displaystring());
342}
8047e088 343
9fe0853b
TJ
344BOOST_AUTO_TEST_CASE(WeekDisplayString2)
345{
346 Week week("0123456");
347 BOOST_CHECK_EQUAL(true, week.is_valid());
348 BOOST_CHECK_EQUAL(string("Mon-Sun"), week.get_displaystring());
349}
8047e088 350
9fe0853b
TJ
351BOOST_AUTO_TEST_CASE(WeekDisplayString3)
352{
353 Week week("123456");
354 BOOST_CHECK_EQUAL(true, week.is_valid());
355 BOOST_CHECK_EQUAL(string("Mon-Sat"), week.get_displaystring());
356}
8047e088 357
9fe0853b
TJ
358BOOST_AUTO_TEST_CASE(WeekDisplayString4)
359{
360 Week week("012345");
361 BOOST_CHECK_EQUAL(true, week.is_valid());
362 BOOST_CHECK_EQUAL(string("Mon-Fri, Sun"), week.get_displaystring());
363}
8047e088 364
9fe0853b
TJ
365BOOST_AUTO_TEST_CASE(WeekDisplayString5)
366{
367 Week week("1256");
368 BOOST_CHECK_EQUAL(true, week.is_valid());
369 BOOST_CHECK_EQUAL(string("Mon, Tue, Fri, Sat"), week.get_displaystring());
370}
8047e088 371
9fe0853b
TJ
372BOOST_AUTO_TEST_CASE(WeekDisplayString6)
373{
374 Week week("0246");
375 BOOST_CHECK_EQUAL(true, week.is_valid());
376 BOOST_CHECK_EQUAL(string("Tue, Thu, Sat, Sun"), week.get_displaystring());
377}
96d0be2e 378
9fe0853b
TJ
379BOOST_AUTO_TEST_CASE(WeekDisplayString7)
380{
381 Week week("135");
382 BOOST_CHECK_EQUAL(true, week.is_valid());
383 BOOST_CHECK_EQUAL(string("Mon, Wed, Fri"), week.get_displaystring());
384}
8047e088 385
9fe0853b
TJ
386BOOST_AUTO_TEST_CASE(WeekDisplayString8)
387{
388 Week week("15");
389 BOOST_CHECK_EQUAL(true, week.is_valid());
390 BOOST_CHECK_EQUAL(string("Mon, Fri"), week.get_displaystring());
391}
8047e088 392
9fe0853b
TJ
393BOOST_AUTO_TEST_CASE(WeekDisplayString9)
394{
395 Week week("06");
396 BOOST_CHECK_EQUAL(true, week.is_valid());
397 BOOST_CHECK_EQUAL(string("Sat, Sun"), week.get_displaystring());
398}
8047e088 399
9fe0853b
TJ
400BOOST_AUTO_TEST_CASE(WeekDisplayString10)
401{
402 Week week("056");
403 BOOST_CHECK_EQUAL(true, week.is_valid());
404 BOOST_CHECK_EQUAL(string("Fri-Sun"), week.get_displaystring());
405}
8047e088 406
9fe0853b
TJ
407BOOST_AUTO_TEST_CASE(WeekDisplayString11)
408{
409 Week week("0");
410 BOOST_CHECK_EQUAL(true, week.is_valid());
411 BOOST_CHECK_EQUAL(string("Sun"), week.get_displaystring());
412}
8047e088 413
9fe0853b
TJ
414BOOST_AUTO_TEST_CASE(WeekDisplayString12)
415{
416 Week week("6");
417 BOOST_CHECK_EQUAL(true, week.is_valid());
418 BOOST_CHECK_EQUAL(string("Sat"), week.get_displaystring());
419}
8047e088 420
9fe0853b
TJ
421BOOST_AUTO_TEST_CASE(WeekDisplayString13)
422{
423 Week week("123");
424 BOOST_CHECK_EQUAL(true, week.is_valid());
425 BOOST_CHECK_EQUAL(string("Mon-Wed"), week.get_displaystring());
426}
8d2b7645 427
9fe0853b 428BOOST_AUTO_TEST_SUITE_END()