Commit | Line | Data |
---|---|---|
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 |
19 | using namespace std; |
20 | using namespace I2n; | |
8047e088 | 21 | using namespace I2n::Time; |
8d2b7645 | 22 | |
9fe0853b | 23 | class TestTimeFuncFixture |
8d2b7645 | 24 | { |
8d2b7645 | 25 | protected: |
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 | 53 | public: |
9fe0853b TJ |
54 | TestTimeFuncFixture() |
55 | { | |
56 | } | |
57 | ||
58 | ~TestTimeFuncFixture() | |
59 | { | |
60 | remove_check_files(); | |
61 | } | |
62 | }; | |
8d2b7645 | 63 | |
9fe0853b | 64 | BOOST_FIXTURE_TEST_SUITE(TestTimeFunc, TestTimeFuncFixture) |
8d2b7645 | 65 | |
9fe0853b TJ |
66 | BOOST_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 |
85 | BOOST_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 |
102 | BOOST_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 |
119 | BOOST_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 |
136 | BOOST_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 |
153 | BOOST_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 |
181 | BOOST_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 |
198 | BOOST_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 |
211 | BOOST_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 |
231 | BOOST_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 |
247 | BOOST_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 |
264 | BOOST_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 |
284 | BOOST_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 |
309 | BOOST_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 |
330 | BOOST_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 |
337 | BOOST_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 |
344 | BOOST_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 |
351 | BOOST_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 |
358 | BOOST_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 |
365 | BOOST_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 |
372 | BOOST_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 |
379 | BOOST_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 |
386 | BOOST_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 |
393 | BOOST_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 |
400 | BOOST_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 |
407 | BOOST_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 |
414 | BOOST_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 |
421 | BOOST_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 | 428 | BOOST_AUTO_TEST_SUITE_END() |