Commit | Line | Data |
---|---|---|
0e23f538 TJ |
1 | /* |
2 | The software in this package is distributed under the GNU General | |
3 | Public License version 2 (with a special exception described below). | |
4 | ||
5 | A copy of GNU General Public License (GPL) is included in this distribution, | |
6 | in the file COPYING.GPL. | |
7 | ||
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. | |
13 | ||
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. | |
16 | ||
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. | |
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> |
ccbeb66c | 35 | #include <iostream> |
96d0be2e | 36 | |
8d2b7645 TJ |
37 | using namespace std; |
38 | using namespace I2n; | |
8047e088 | 39 | using namespace I2n::Time; |
8d2b7645 | 40 | |
9fe0853b | 41 | class TestTimeFuncFixture |
8d2b7645 | 42 | { |
8d2b7645 | 43 | protected: |
8d2b7645 | 44 | typedef std::list< std::string > StringList; |
8d2b7645 | 45 | std::set<std::string> used_check_files; |
ccbeb66c | 46 | std::string tz; /* save and restore TZ from envp */ |
8d2b7645 TJ |
47 | |
48 | std::string get_check_file_path(std::string tag) | |
49 | { | |
50 | std::string result; | |
51 | result= "__unittest__" + tag + ".dat"; | |
52 | used_check_files.insert(result); | |
53 | return result; | |
54 | } // eo get_check_file_path | |
55 | ||
8d2b7645 TJ |
56 | void remove_check_files() |
57 | { | |
58 | for (std::set<std::string>::iterator it= used_check_files.begin(); | |
59 | it != used_check_files.end(); | |
60 | ++it) | |
61 | { | |
62 | std::string filepath(*it); | |
63 | if (path_exists(filepath)) | |
64 | { | |
65 | unlink(filepath); | |
66 | } | |
67 | //TODO | |
68 | } | |
69 | used_check_files.clear(); | |
70 | } // eo remove_check_files | |
71 | ||
ccbeb66c PG |
72 | void set_utc (void) |
73 | { | |
74 | errno = 0; | |
75 | if (setenv ("TZ", "UTC", 1) == -1) | |
76 | { | |
77 | std::cerr | |
78 | << "error setting environment 'TZ': [" << this->tz << "]" | |
79 | << std::endl | |
80 | ; | |
81 | return; | |
82 | } | |
83 | ||
84 | tzset (); | |
85 | } | |
86 | ||
8d2b7645 | 87 | public: |
9fe0853b | 88 | TestTimeFuncFixture() |
ccbeb66c | 89 | : tz (secure_getenv ("TZ") ?: "") |
9fe0853b TJ |
90 | { |
91 | } | |
92 | ||
93 | ~TestTimeFuncFixture() | |
94 | { | |
95 | remove_check_files(); | |
ccbeb66c PG |
96 | |
97 | errno = 0; | |
98 | if (setenv ("TZ", this->tz.c_str (), 1) == -1) | |
99 | { | |
100 | std::cerr | |
101 | << "error cleaning up environment 'TZ': [" << this->tz << "]" | |
102 | << std::endl | |
103 | ; | |
104 | } | |
105 | else | |
106 | { | |
107 | tzset(); | |
108 | } | |
9fe0853b TJ |
109 | } |
110 | }; | |
8d2b7645 | 111 | |
9fe0853b | 112 | BOOST_FIXTURE_TEST_SUITE(TestTimeFunc, TestTimeFuncFixture) |
8d2b7645 | 113 | |
9fe0853b TJ |
114 | BOOST_AUTO_TEST_CASE(AddIntervalsDisjoint) |
115 | { | |
116 | Intervals intervals; | |
8d2b7645 | 117 | |
9fe0853b TJ |
118 | intervals.add( Interval( 10, 100 ) ); |
119 | intervals.add( Interval( 600, 620 ) ); | |
8d2b7645 | 120 | |
9fe0853b TJ |
121 | BOOST_CHECK_EQUAL( false, intervals.empty() ); |
122 | BOOST_CHECK_EQUAL( 2u, intervals.size() ); | |
8d2b7645 | 123 | |
9fe0853b TJ |
124 | BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() ); |
125 | BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() ); | |
8d2b7645 | 126 | |
9fe0853b TJ |
127 | BOOST_CHECK_EQUAL( 600u, intervals.back().lower_bound() ); |
128 | BOOST_CHECK_EQUAL( 620u, intervals.back().upper_bound() ); | |
129 | } // eo AddIntervalsDisjoint() | |
8d2b7645 TJ |
130 | |
131 | ||
132 | ||
9fe0853b TJ |
133 | BOOST_AUTO_TEST_CASE(AddIntervalsInclude) |
134 | { | |
135 | Intervals intervals; | |
8d2b7645 | 136 | |
9fe0853b TJ |
137 | intervals.add( Interval( 10, 100 ) ); |
138 | intervals.add( Interval( 10, 80 ) ); | |
8d2b7645 | 139 | |
9fe0853b TJ |
140 | BOOST_CHECK_EQUAL( false, intervals.empty() ); |
141 | BOOST_CHECK_EQUAL( 1u, intervals.size() ); | |
8d2b7645 | 142 | |
9fe0853b TJ |
143 | BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() ); |
144 | BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() ); | |
145 | BOOST_CHECK_EQUAL( false, intervals.front().changed() ); | |
146 | } // eo AddIntervalsInclude() | |
8d2b7645 TJ |
147 | |
148 | ||
149 | ||
9fe0853b TJ |
150 | BOOST_AUTO_TEST_CASE(AddIntervalsEmbrace) |
151 | { | |
152 | Intervals intervals; | |
8d2b7645 | 153 | |
9fe0853b TJ |
154 | intervals.add( Interval( 10, 100 ) ); |
155 | intervals.add( Interval( 5, 120 ) ); | |
8d2b7645 | 156 | |
9fe0853b TJ |
157 | BOOST_CHECK_EQUAL( false, intervals.empty() ); |
158 | BOOST_CHECK_EQUAL( 1u, intervals.size() ); | |
8d2b7645 | 159 | |
9fe0853b TJ |
160 | BOOST_CHECK_EQUAL( 5u, intervals.front().lower_bound() ); |
161 | BOOST_CHECK_EQUAL( 120u, intervals.front().upper_bound() ); | |
162 | BOOST_CHECK_EQUAL( true, intervals.front().changed() ); | |
163 | } // eo AddIntervalsEmbrace() | |
8d2b7645 TJ |
164 | |
165 | ||
166 | ||
9fe0853b TJ |
167 | BOOST_AUTO_TEST_CASE(AddIntervalsJoin1) |
168 | { | |
169 | Intervals intervals; | |
8d2b7645 | 170 | |
9fe0853b TJ |
171 | intervals.add( Interval( 10, 100 ) ); |
172 | intervals.add( Interval( 60, 120 ) ); | |
8d2b7645 | 173 | |
9fe0853b TJ |
174 | BOOST_CHECK_EQUAL( false, intervals.empty() ); |
175 | BOOST_CHECK_EQUAL( 1u, intervals.size() ); | |
8d2b7645 | 176 | |
9fe0853b TJ |
177 | BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() ); |
178 | BOOST_CHECK_EQUAL( 120u, intervals.front().upper_bound() ); | |
179 | BOOST_CHECK_EQUAL( true, intervals.front().changed() ); | |
180 | } // eo AddIntervalsJoin1() | |
8d2b7645 TJ |
181 | |
182 | ||
183 | ||
9fe0853b TJ |
184 | BOOST_AUTO_TEST_CASE(AddIntervalsJoin1b) |
185 | { | |
186 | Intervals intervals; | |
8d2b7645 | 187 | |
9fe0853b TJ |
188 | intervals.add( Interval( 10, 100 ) ); |
189 | intervals.add( Interval( 100, 120 ) ); | |
8d2b7645 | 190 | |
9fe0853b TJ |
191 | BOOST_CHECK_EQUAL( false, intervals.empty() ); |
192 | BOOST_CHECK_EQUAL( 1u, intervals.size() ); | |
8d2b7645 | 193 | |
9fe0853b TJ |
194 | BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() ); |
195 | BOOST_CHECK_EQUAL( 120u, intervals.front().upper_bound() ); | |
196 | BOOST_CHECK_EQUAL( true, intervals.front().changed() ); | |
197 | } // eo AddIntervalsJoin1b() | |
8d2b7645 TJ |
198 | |
199 | ||
200 | ||
9fe0853b TJ |
201 | BOOST_AUTO_TEST_CASE(AddIntervalsJoin2) |
202 | { | |
203 | Intervals intervals; | |
8d2b7645 | 204 | |
9fe0853b TJ |
205 | intervals.add( Interval( 10, 100 ) ); |
206 | intervals.add( Interval( 200, 250 ) ); | |
8d2b7645 | 207 | |
9fe0853b TJ |
208 | BOOST_CHECK_EQUAL( false, intervals.empty() ); |
209 | BOOST_CHECK_EQUAL( 2u, intervals.size() ); | |
8d2b7645 | 210 | |
9fe0853b TJ |
211 | BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() ); |
212 | BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() ); | |
213 | BOOST_CHECK_EQUAL( 200u, intervals.back().lower_bound() ); | |
214 | BOOST_CHECK_EQUAL( 250u, intervals.back().upper_bound() ); | |
8d2b7645 | 215 | |
9fe0853b TJ |
216 | // now add the gap; the intervals should collapse to one covering all: |
217 | intervals.add( Interval(100, 200) ); | |
8d2b7645 | 218 | |
9fe0853b TJ |
219 | BOOST_CHECK_EQUAL( false, intervals.empty() ); |
220 | BOOST_CHECK_EQUAL( 1u, intervals.size() ); | |
8d2b7645 | 221 | |
9fe0853b TJ |
222 | BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() ); |
223 | BOOST_CHECK_EQUAL( 250u, intervals.front().upper_bound() ); | |
224 | BOOST_CHECK_EQUAL( true, intervals.front().changed() ); | |
225 | } // eo AddIntervalsJoin2() | |
8d2b7645 TJ |
226 | |
227 | ||
228 | ||
9fe0853b TJ |
229 | BOOST_AUTO_TEST_CASE(SubIntervalsDisjoint) |
230 | { | |
231 | Intervals intervals; | |
8d2b7645 | 232 | |
9fe0853b TJ |
233 | intervals.add( Interval(10, 100) ); |
234 | intervals.sub( Interval(0, 10) ); | |
8d2b7645 | 235 | |
9fe0853b TJ |
236 | BOOST_CHECK_EQUAL( false, intervals.empty() ); |
237 | BOOST_CHECK_EQUAL( 1u, intervals.size() ); | |
8d2b7645 | 238 | |
9fe0853b TJ |
239 | BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() ); |
240 | BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() ); | |
241 | BOOST_CHECK_EQUAL( false, intervals.front().changed() ); | |
242 | } // eo SubIntervalsDisjoint() | |
8d2b7645 TJ |
243 | |
244 | ||
245 | ||
9fe0853b TJ |
246 | BOOST_AUTO_TEST_CASE(SubIntervalsExact) |
247 | { | |
248 | Intervals intervals; | |
8d2b7645 | 249 | |
9fe0853b TJ |
250 | intervals.add( Interval(10, 100) ); |
251 | intervals.sub( Interval(10, 100) ); | |
8d2b7645 | 252 | |
9fe0853b TJ |
253 | BOOST_CHECK_EQUAL( true, intervals.empty() ); |
254 | BOOST_CHECK_EQUAL( 0u, intervals.size() ); | |
255 | } // eo SubIntervalsExact() | |
8d2b7645 TJ |
256 | |
257 | ||
258 | ||
9fe0853b TJ |
259 | BOOST_AUTO_TEST_CASE(SubIntervalsSplit1) |
260 | { | |
261 | Intervals intervals; | |
8d2b7645 | 262 | |
9fe0853b TJ |
263 | intervals.add( Interval(10, 100) ); |
264 | intervals.sub( Interval(20, 40) ); | |
8d2b7645 | 265 | |
9fe0853b TJ |
266 | BOOST_CHECK_EQUAL( false, intervals.empty() ); |
267 | BOOST_CHECK_EQUAL( 2u, intervals.size() ); | |
8d2b7645 | 268 | |
9fe0853b TJ |
269 | BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() ); |
270 | BOOST_CHECK_EQUAL( 20u, intervals.front().upper_bound() ); | |
8d2b7645 | 271 | |
9fe0853b TJ |
272 | BOOST_CHECK_EQUAL( 40u, intervals.back().lower_bound() ); |
273 | BOOST_CHECK_EQUAL( 100u, intervals.back().upper_bound() ); | |
274 | BOOST_CHECK_EQUAL( false, intervals.front().changed() ); | |
275 | BOOST_CHECK_EQUAL( true, intervals.back().changed() ); | |
276 | } // eo SubIntervalsSplit1() | |
8d2b7645 TJ |
277 | |
278 | ||
9fe0853b TJ |
279 | BOOST_AUTO_TEST_CASE(SubIntervalsCutFront) |
280 | { | |
281 | Intervals intervals; | |
8d2b7645 | 282 | |
9fe0853b TJ |
283 | intervals.add( Interval(10, 100) ); |
284 | intervals.sub( Interval(10, 20) ); | |
8d2b7645 | 285 | |
9fe0853b TJ |
286 | BOOST_CHECK_EQUAL( false, intervals.empty() ); |
287 | BOOST_CHECK_EQUAL( 1u, intervals.size() ); | |
8d2b7645 | 288 | |
9fe0853b TJ |
289 | BOOST_CHECK_EQUAL( 20u, intervals.front().lower_bound() ); |
290 | BOOST_CHECK_EQUAL( 100u, intervals.front().upper_bound() ); | |
291 | BOOST_CHECK_EQUAL( true, intervals.front().changed() ); | |
292 | } // eo SubIntervalsCutFront() | |
8d2b7645 TJ |
293 | |
294 | ||
9fe0853b TJ |
295 | BOOST_AUTO_TEST_CASE(SubIntervalsCutBack) |
296 | { | |
297 | Intervals intervals; | |
8d2b7645 | 298 | |
9fe0853b TJ |
299 | intervals.add( Interval(10, 100) ); |
300 | intervals.sub( Interval(87, 100) ); | |
8d2b7645 | 301 | |
9fe0853b TJ |
302 | BOOST_CHECK_EQUAL( false, intervals.empty() ); |
303 | BOOST_CHECK_EQUAL( 1u, intervals.size() ); | |
8d2b7645 | 304 | |
9fe0853b TJ |
305 | BOOST_CHECK_EQUAL( 10u, intervals.front().lower_bound() ); |
306 | BOOST_CHECK_EQUAL( 87u, intervals.front().upper_bound() ); | |
307 | BOOST_CHECK_EQUAL( true, intervals.front().changed() ); | |
308 | } // eo SubIntervalsCutBack() | |
8d2b7645 TJ |
309 | |
310 | ||
311 | ||
9fe0853b TJ |
312 | BOOST_AUTO_TEST_CASE(SubIntervalsCutMore) |
313 | { | |
314 | Intervals intervals; | |
8d2b7645 | 315 | |
9fe0853b TJ |
316 | intervals.add( Interval( 10, 100) ); |
317 | intervals.add( Interval(110, 200) ); | |
318 | intervals.add( Interval(210, 300) ); | |
8d2b7645 | 319 | |
9fe0853b TJ |
320 | // this should remove the first 2 intervals and cut the third: |
321 | intervals.sub( Interval(8, 220) ); | |
8d2b7645 | 322 | |
9fe0853b TJ |
323 | BOOST_CHECK_EQUAL( false, intervals.empty() ); |
324 | BOOST_CHECK_EQUAL( 1u, intervals.size() ); | |
8d2b7645 | 325 | |
9fe0853b TJ |
326 | BOOST_CHECK_EQUAL( 220u, intervals.front().lower_bound() ); |
327 | BOOST_CHECK_EQUAL( 300u, intervals.front().upper_bound() ); | |
328 | BOOST_CHECK_EQUAL( true, intervals.front().changed() ); | |
329 | } // eo SubIntervalsCutMore() | |
8d2b7645 TJ |
330 | |
331 | ||
9fe0853b TJ |
332 | BOOST_AUTO_TEST_CASE(IntervalComparisons) |
333 | { | |
334 | Intervals intervals1; | |
335 | Intervals intervals2; | |
8d2b7645 | 336 | |
9fe0853b | 337 | intervals1.add( Interval( 10, 120) ); |
8d2b7645 | 338 | |
9fe0853b TJ |
339 | intervals2.add( Interval( 10, 110 ) ); |
340 | intervals2.add( Interval( 100, 120 ) ); | |
8d2b7645 | 341 | |
9fe0853b | 342 | BOOST_CHECK_EQUAL( 1u, intervals2.size() ); |
8d2b7645 | 343 | |
9fe0853b TJ |
344 | BOOST_CHECK( intervals1 == intervals2 ); |
345 | BOOST_CHECK_EQUAL( true, intervals1.contains( intervals2 )); | |
346 | BOOST_CHECK_EQUAL( true, intervals2.contains( intervals1 )); | |
8d2b7645 | 347 | |
9fe0853b | 348 | intervals2.sub( Interval( 40, 50) ); |
8d2b7645 | 349 | |
9fe0853b TJ |
350 | BOOST_CHECK( intervals1 != intervals2 ); |
351 | BOOST_CHECK_EQUAL( true, intervals1.contains( intervals2 )); | |
352 | BOOST_CHECK_EQUAL( false, intervals2.contains( intervals1 )); | |
353 | } // eo IntervalComparisons() | |
8d2b7645 | 354 | |
96d0be2e TJ |
355 | |
356 | ||
9fe0853b TJ |
357 | BOOST_AUTO_TEST_CASE(MonotonicClock) |
358 | { | |
359 | long sec0, nsec0; | |
360 | long sec1, nsec1; | |
96d0be2e | 361 | |
9fe0853b TJ |
362 | bool res = monotonic_clock_gettime(sec0,nsec0); |
363 | BOOST_CHECK_EQUAL( true, res ); | |
96d0be2e | 364 | |
9fe0853b TJ |
365 | usleep(250000); |
366 | res= monotonic_clock_gettime(sec1,nsec1); | |
367 | BOOST_CHECK_EQUAL( true, res); | |
96d0be2e | 368 | |
9fe0853b TJ |
369 | long delta_sec = sec1 - sec0; |
370 | long delta_nsec= nsec1 - nsec0; | |
96d0be2e | 371 | |
9fe0853b | 372 | long delta_millisec= ( delta_nsec / 1000000L) + delta_sec * 1000L; |
96d0be2e | 373 | |
9fe0853b TJ |
374 | BOOST_CHECK( delta_millisec >= 250 - /*fuzz*/ 1); |
375 | BOOST_CHECK( delta_millisec < 300 ); | |
376 | } // eo MonotonicClock() | |
96d0be2e | 377 | |
9fe0853b TJ |
378 | BOOST_AUTO_TEST_CASE(WeekInvalid) |
379 | { | |
380 | Week week("99999999"); | |
381 | BOOST_CHECK_EQUAL(false, week.is_valid()); | |
382 | BOOST_CHECK_EQUAL(string(""), week.get_displaystring()); | |
383 | } | |
8047e088 | 384 | |
9fe0853b TJ |
385 | BOOST_AUTO_TEST_CASE(WeekDisplayString1) |
386 | { | |
387 | Week week(""); | |
388 | BOOST_CHECK_EQUAL(true, week.is_valid()); | |
389 | BOOST_CHECK_EQUAL(string(""), week.get_displaystring()); | |
390 | } | |
8047e088 | 391 | |
9fe0853b TJ |
392 | BOOST_AUTO_TEST_CASE(WeekDisplayString2) |
393 | { | |
394 | Week week("0123456"); | |
395 | BOOST_CHECK_EQUAL(true, week.is_valid()); | |
396 | BOOST_CHECK_EQUAL(string("Mon-Sun"), week.get_displaystring()); | |
397 | } | |
8047e088 | 398 | |
9fe0853b TJ |
399 | BOOST_AUTO_TEST_CASE(WeekDisplayString3) |
400 | { | |
401 | Week week("123456"); | |
402 | BOOST_CHECK_EQUAL(true, week.is_valid()); | |
403 | BOOST_CHECK_EQUAL(string("Mon-Sat"), week.get_displaystring()); | |
404 | } | |
8047e088 | 405 | |
9fe0853b TJ |
406 | BOOST_AUTO_TEST_CASE(WeekDisplayString4) |
407 | { | |
408 | Week week("012345"); | |
409 | BOOST_CHECK_EQUAL(true, week.is_valid()); | |
410 | BOOST_CHECK_EQUAL(string("Mon-Fri, Sun"), week.get_displaystring()); | |
411 | } | |
8047e088 | 412 | |
9fe0853b TJ |
413 | BOOST_AUTO_TEST_CASE(WeekDisplayString5) |
414 | { | |
415 | Week week("1256"); | |
416 | BOOST_CHECK_EQUAL(true, week.is_valid()); | |
417 | BOOST_CHECK_EQUAL(string("Mon, Tue, Fri, Sat"), week.get_displaystring()); | |
418 | } | |
8047e088 | 419 | |
9fe0853b TJ |
420 | BOOST_AUTO_TEST_CASE(WeekDisplayString6) |
421 | { | |
422 | Week week("0246"); | |
423 | BOOST_CHECK_EQUAL(true, week.is_valid()); | |
424 | BOOST_CHECK_EQUAL(string("Tue, Thu, Sat, Sun"), week.get_displaystring()); | |
425 | } | |
96d0be2e | 426 | |
9fe0853b TJ |
427 | BOOST_AUTO_TEST_CASE(WeekDisplayString7) |
428 | { | |
429 | Week week("135"); | |
430 | BOOST_CHECK_EQUAL(true, week.is_valid()); | |
431 | BOOST_CHECK_EQUAL(string("Mon, Wed, Fri"), week.get_displaystring()); | |
432 | } | |
8047e088 | 433 | |
9fe0853b TJ |
434 | BOOST_AUTO_TEST_CASE(WeekDisplayString8) |
435 | { | |
436 | Week week("15"); | |
437 | BOOST_CHECK_EQUAL(true, week.is_valid()); | |
438 | BOOST_CHECK_EQUAL(string("Mon, Fri"), week.get_displaystring()); | |
439 | } | |
8047e088 | 440 | |
9fe0853b TJ |
441 | BOOST_AUTO_TEST_CASE(WeekDisplayString9) |
442 | { | |
443 | Week week("06"); | |
444 | BOOST_CHECK_EQUAL(true, week.is_valid()); | |
445 | BOOST_CHECK_EQUAL(string("Sat, Sun"), week.get_displaystring()); | |
446 | } | |
8047e088 | 447 | |
9fe0853b TJ |
448 | BOOST_AUTO_TEST_CASE(WeekDisplayString10) |
449 | { | |
450 | Week week("056"); | |
451 | BOOST_CHECK_EQUAL(true, week.is_valid()); | |
452 | BOOST_CHECK_EQUAL(string("Fri-Sun"), week.get_displaystring()); | |
453 | } | |
8047e088 | 454 | |
9fe0853b TJ |
455 | BOOST_AUTO_TEST_CASE(WeekDisplayString11) |
456 | { | |
457 | Week week("0"); | |
458 | BOOST_CHECK_EQUAL(true, week.is_valid()); | |
459 | BOOST_CHECK_EQUAL(string("Sun"), week.get_displaystring()); | |
460 | } | |
8047e088 | 461 | |
9fe0853b TJ |
462 | BOOST_AUTO_TEST_CASE(WeekDisplayString12) |
463 | { | |
464 | Week week("6"); | |
465 | BOOST_CHECK_EQUAL(true, week.is_valid()); | |
466 | BOOST_CHECK_EQUAL(string("Sat"), week.get_displaystring()); | |
467 | } | |
8047e088 | 468 | |
9fe0853b TJ |
469 | BOOST_AUTO_TEST_CASE(WeekDisplayString13) |
470 | { | |
471 | Week week("123"); | |
472 | BOOST_CHECK_EQUAL(true, week.is_valid()); | |
473 | BOOST_CHECK_EQUAL(string("Mon-Wed"), week.get_displaystring()); | |
474 | } | |
8d2b7645 | 475 | |
532d6b3a TJ |
476 | BOOST_AUTO_TEST_CASE(FormatFullTime) |
477 | { | |
478 | time_t seconds = 1318844005; | |
479 | ||
480 | BOOST_CHECK_EQUAL("17.10.2011 11:33", format_full_time(seconds)); | |
481 | } | |
482 | ||
dad9e26f GE |
483 | BOOST_AUTO_TEST_CASE(DateToSeconds1) |
484 | { | |
485 | // no DST | |
486 | BOOST_CHECK_EQUAL(1325372400, date_to_seconds("2012-01-01")); | |
487 | } | |
488 | ||
489 | BOOST_AUTO_TEST_CASE(DateToSeconds2) | |
490 | { | |
491 | // DST | |
492 | BOOST_CHECK_EQUAL(1341093600, date_to_seconds("2012-07-01")); | |
493 | } | |
494 | ||
d70f7269 PG |
495 | BOOST_AUTO_TEST_CASE(FormatISO8601_T) |
496 | { | |
497 | const time_t moment = 1515492684; | |
498 | BOOST_CHECK_EQUAL("10:11:24", | |
499 | format_iso8601 (moment, true, false, true, false)); | |
500 | } | |
501 | ||
502 | BOOST_AUTO_TEST_CASE(FormatISO8601_TZ_local) | |
503 | { | |
504 | const time_t moment = 1515492684; | |
505 | BOOST_CHECK_EQUAL("11:11:24Z+0100", | |
506 | format_iso8601 (moment, false, false, true, true)); | |
507 | } | |
508 | ||
509 | BOOST_AUTO_TEST_CASE(FormatISO8601_TZ) | |
510 | { | |
511 | const time_t moment = 1515492684; | |
512 | BOOST_CHECK_EQUAL("10:11:24Z+0000", | |
513 | format_iso8601 (moment, true, false, true, true)); | |
514 | } | |
515 | ||
516 | BOOST_AUTO_TEST_CASE(FormatISO8601_DTZ_local) | |
517 | { | |
518 | const time_t moment = 1515492684; | |
519 | BOOST_CHECK_EQUAL("2018-01-09T11:11:24Z+0100", | |
520 | format_iso8601 (moment, false, true, true, true)); | |
521 | } | |
522 | ||
523 | BOOST_AUTO_TEST_CASE(FormatISO8601_DTZ) | |
524 | { | |
525 | const time_t moment = 1515492684; | |
526 | BOOST_CHECK_EQUAL("2018-01-09T10:11:24Z+0000", | |
527 | format_iso8601 (moment, true, true, true, true)); | |
528 | } | |
529 | ||
530 | BOOST_AUTO_TEST_CASE(FormatISO8601_DT) | |
531 | { | |
532 | const time_t moment = 1515492684; | |
533 | BOOST_CHECK_EQUAL("2018-01-09T10:11:24", | |
534 | format_iso8601 (moment, true, true, true, false)); | |
535 | } | |
536 | ||
537 | BOOST_AUTO_TEST_CASE(FormatISO8601_D) | |
538 | { | |
539 | const time_t moment = 1515492684; | |
540 | BOOST_CHECK_EQUAL("2018-01-09", | |
541 | format_iso8601 (moment, true, true, false, false)); | |
542 | } | |
543 | ||
544 | BOOST_AUTO_TEST_CASE(FormatISO8601_DTZ_struct_tm) | |
545 | { | |
546 | struct tm helau; | |
547 | helau.tm_sec = 11; | |
548 | helau.tm_min = 11; | |
549 | helau.tm_hour = 11; | |
550 | helau.tm_mday = 11; | |
551 | helau.tm_mon = 10; | |
552 | helau.tm_year = 2018 - 1900; | |
553 | helau.tm_wday = 0; | |
554 | helau.tm_yday = 315; | |
555 | helau.tm_isdst = 0; | |
556 | helau.tm_gmtoff = 0; | |
557 | helau.tm_zone = NULL; | |
558 | ||
559 | BOOST_CHECK_EQUAL("2018-11-11T11:11:11Z+0000", | |
560 | format_iso8601 (helau, true, true, true)); | |
561 | } | |
562 | ||
563 | BOOST_AUTO_TEST_CASE(FormatISO8601_DTZ_struct_timespec) | |
564 | { | |
565 | struct timespec ts = { 1541934671, 11 }; | |
566 | ||
567 | BOOST_CHECK_EQUAL("2018-11-11T11:11:11Z+0000", | |
568 | format_iso8601 (ts, true, true, true, true)); | |
569 | } | |
570 | ||
8b5814e2 PG |
571 | BOOST_AUTO_TEST_SUITE(Clock) |
572 | ||
573 | BOOST_AUTO_TEST_CASE(ctor_simple) | |
574 | { | |
575 | I2n::clock::Time t; | |
576 | ||
577 | BOOST_CHECK_EQUAL(t.get_sec (), 0); | |
578 | BOOST_CHECK_EQUAL(t.get_nsec (), 0); | |
579 | } | |
580 | ||
581 | BOOST_AUTO_TEST_CASE(ctor_type) | |
582 | { | |
583 | I2n::clock::Time t (I2n::clock::type::real); | |
584 | ||
585 | BOOST_CHECK_EQUAL(t.get_sec (), 0); | |
586 | BOOST_CHECK_EQUAL(t.get_nsec (), 0); | |
587 | } | |
588 | ||
589 | BOOST_AUTO_TEST_CASE(ctor_variant) | |
590 | { | |
591 | I2n::clock::Time t (I2n::clock::type::cpu, | |
592 | I2n::clock::type::thread); | |
593 | ||
594 | BOOST_CHECK_EQUAL(t.get_sec (), 0); | |
595 | BOOST_CHECK_EQUAL(t.get_nsec (), 0); | |
596 | } | |
597 | ||
598 | BOOST_AUTO_TEST_CASE(initializer_now) | |
599 | { | |
600 | boost::optional<I2n::clock::Time> t = I2n::clock::now (); | |
601 | ||
602 | BOOST_CHECK(t); | |
603 | BOOST_CHECK_GT(t->get_sec (), 0); | |
604 | BOOST_CHECK_EQUAL(t->err, 0); | |
605 | } | |
606 | ||
e36ca33c PG |
607 | BOOST_AUTO_TEST_CASE(initializer_zero) |
608 | { | |
609 | I2n::clock::Time stundenull = I2n::clock::zero (); | |
610 | ||
611 | BOOST_CHECK_EQUAL(stundenull.get_sec (), 0); | |
612 | BOOST_CHECK_EQUAL(stundenull.get_nsec (), 0); | |
613 | BOOST_CHECK_EQUAL(stundenull.err, 0); | |
614 | } | |
615 | ||
616 | BOOST_AUTO_TEST_CASE(member_set_now) | |
617 | { | |
618 | I2n::clock::Time t; | |
619 | ||
620 | BOOST_CHECK(t.set ()); | |
621 | ||
622 | BOOST_CHECK_NE(t.get_sec (), 0); | |
623 | } | |
624 | ||
625 | BOOST_AUTO_TEST_CASE(member_set_value) | |
626 | { | |
627 | I2n::clock::Time t; | |
628 | ||
629 | t.set (42, 42); | |
630 | ||
631 | BOOST_CHECK_EQUAL(t.get_sec (), 42); | |
632 | BOOST_CHECK_EQUAL(t.get_nsec (), 42); | |
633 | } | |
634 | ||
635 | BOOST_AUTO_TEST_CASE(member_set_value_type) | |
636 | { | |
637 | I2n::clock::Time t; | |
638 | ||
639 | t.set (42, 42, I2n::clock::type::real, I2n::clock::type::exact); | |
640 | ||
641 | BOOST_CHECK_EQUAL(t.get_sec (), 42); | |
642 | BOOST_CHECK_EQUAL(t.get_nsec (), 42); | |
643 | } | |
644 | ||
645 | BOOST_AUTO_TEST_CASE(member_add_parts) | |
646 | { | |
647 | I2n::clock::Time t; | |
648 | ||
649 | t.set (42, 42); | |
650 | t.add (2187, 2187); | |
651 | ||
652 | BOOST_CHECK_EQUAL(t.get_sec (), 2229); | |
653 | BOOST_CHECK_EQUAL(t.get_nsec (), 2229); | |
654 | } | |
655 | ||
656 | BOOST_AUTO_TEST_CASE(member_sub_parts) | |
657 | { | |
658 | I2n::clock::Time t; | |
659 | ||
660 | t.set (2, 0L); | |
661 | t.subtract (1, 1L); | |
662 | ||
663 | BOOST_CHECK_EQUAL(t.get_sec (), 0); | |
664 | BOOST_CHECK_EQUAL(t.get_nsec (), 999999999); | |
665 | } | |
666 | ||
667 | BOOST_AUTO_TEST_CASE(member_sub_Time) | |
668 | { | |
669 | I2n::clock::Time t1; | |
670 | I2n::clock::Time t2; | |
671 | ||
672 | t1.set (42, 42L); | |
673 | t2.set (42, 0L); | |
674 | ||
675 | t1.subtract (t2); | |
676 | ||
677 | BOOST_CHECK_EQUAL(t1.get_sec (), 0); | |
678 | BOOST_CHECK_EQUAL(t1.get_nsec (), 42L); | |
679 | } | |
680 | ||
681 | BOOST_AUTO_TEST_CASE(member_diff) | |
682 | { | |
683 | static const time_t five = 5 * 365 * 24 * 3600; | |
684 | ||
685 | I2n::clock::Time t1 (42, 1337); | |
686 | I2n::clock::Time t2 = t1 + five;; | |
687 | I2n::clock::Time t3 = t1 - five;; | |
688 | ||
689 | BOOST_CHECK_EQUAL(t2, I2n::clock::Time ((time_t)42 + five, 1337)); | |
690 | BOOST_CHECK_EQUAL(t3, I2n::clock::Time ((time_t)42 - five, 1337)); | |
691 | BOOST_CHECK_EQUAL(t1.difference (t3), t3.difference (t1)); | |
692 | BOOST_CHECK_EQUAL(t3.difference (t3), t3.difference (t3)); | |
693 | } | |
694 | ||
695 | BOOST_AUTO_TEST_CASE(op_copyassign) | |
696 | { | |
697 | I2n::clock::Time t1; | |
698 | I2n::clock::Time t2; | |
699 | ||
700 | BOOST_CHECK(t1.set ()); | |
701 | ||
702 | t2 = t1; | |
703 | ||
704 | BOOST_CHECK_EQUAL(t1.get_sec (), t2.get_sec ()); | |
705 | BOOST_CHECK_EQUAL(t1.get_nsec (), t2.get_nsec ()); | |
706 | } | |
707 | ||
708 | BOOST_AUTO_TEST_CASE(op_equal) | |
709 | { | |
710 | I2n::clock::Time t1; | |
711 | I2n::clock::Time t2; | |
712 | ||
713 | BOOST_CHECK(t1.set ()); | |
714 | t2 = t1; | |
715 | ||
716 | BOOST_CHECK_EQUAL(t1, t2); | |
717 | } | |
718 | ||
719 | BOOST_AUTO_TEST_CASE(op_add_Time) | |
720 | { | |
721 | I2n::clock::Time t1; | |
722 | I2n::clock::Time t2; | |
723 | I2n::clock::Time tsum; | |
724 | ||
725 | t1.set (2187, 2187); | |
726 | t2.set (1337, 1337); | |
727 | tsum = t1 + t2; | |
728 | ||
729 | BOOST_CHECK_EQUAL(tsum.get_sec (), 3524); | |
730 | BOOST_CHECK_EQUAL(tsum.get_nsec (), 3524); | |
731 | } | |
732 | ||
733 | BOOST_AUTO_TEST_CASE(op_add_Time_carry) | |
734 | { | |
735 | I2n::clock::Time t1; | |
736 | I2n::clock::Time t2; | |
737 | I2n::clock::Time tsum; | |
738 | ||
739 | t1.set (2187, 2187); | |
cf960f73 PG |
740 | # if LONG_BIT == 32 |
741 | t2.set (1300, 2L * 1000 * 1000 * 1000 + 1337); | |
742 | # else | |
e36ca33c | 743 | t2.set (1300, 37L * 1000 * 1000 * 1000 + 1337); |
cf960f73 | 744 | # endif |
e36ca33c PG |
745 | |
746 | tsum = t1 + t2; | |
747 | ||
cf960f73 PG |
748 | # if LONG_BIT == 32 |
749 | BOOST_CHECK_EQUAL(tsum.get_sec (), 3489); | |
750 | BOOST_CHECK_EQUAL(tsum.get_nsec (), 3524); | |
751 | # else | |
e36ca33c PG |
752 | BOOST_CHECK_EQUAL(tsum.get_sec (), 3524); |
753 | BOOST_CHECK_EQUAL(tsum.get_nsec (), 3524); | |
cf960f73 | 754 | # endif |
e36ca33c PG |
755 | } |
756 | ||
757 | BOOST_AUTO_TEST_CASE(op_add_time_t) | |
758 | { | |
759 | I2n::clock::Time t1 (2187, 2187); | |
760 | time_t t2 = 1337; | |
761 | I2n::clock::Time tsum; | |
762 | ||
763 | tsum = t1 + t2; | |
764 | ||
765 | BOOST_CHECK_EQUAL(tsum.get_sec (), 3524); | |
766 | BOOST_CHECK_EQUAL(tsum.get_nsec (), 2187); | |
767 | } | |
768 | ||
769 | BOOST_AUTO_TEST_CASE(op_add_time_t_external) | |
770 | { | |
771 | time_t t1 = 1337; | |
772 | I2n::clock::Time t2 (2187, 2187); | |
773 | I2n::clock::Time tsum; | |
774 | ||
775 | tsum = t1 + t2; | |
776 | ||
777 | BOOST_CHECK_EQUAL(tsum.get_sec (), 3524); | |
778 | BOOST_CHECK_EQUAL(tsum.get_nsec (), 2187); | |
779 | } | |
780 | ||
781 | BOOST_AUTO_TEST_CASE(op_incr_Time) | |
782 | { | |
783 | I2n::clock::Time t1 (2187, 2187); | |
784 | I2n::clock::Time t2 (1337, 1337); | |
785 | ||
786 | t1 += t2; | |
787 | ||
788 | BOOST_CHECK_EQUAL(t1.get_sec (), 3524); | |
789 | BOOST_CHECK_EQUAL(t1.get_nsec (), 3524); | |
790 | } | |
791 | ||
792 | BOOST_AUTO_TEST_CASE(op_incr_time_t) | |
793 | { | |
794 | I2n::clock::Time t1 (2187, 2187); | |
795 | time_t t2 = 1337; | |
796 | ||
797 | t1 += t2; | |
798 | ||
799 | BOOST_CHECK_EQUAL(t1.get_sec (), 3524); | |
800 | BOOST_CHECK_EQUAL(t1.get_nsec (), 2187); | |
801 | } | |
802 | ||
803 | BOOST_AUTO_TEST_CASE(op_subtract_Time) | |
804 | { | |
805 | I2n::clock::Time t1; | |
806 | I2n::clock::Time t2; | |
807 | I2n::clock::Time tdiff; | |
808 | ||
809 | t1.set (2187, 2187); | |
810 | t2.set (1337, 1337); | |
811 | tdiff = t1 - t2; | |
812 | ||
813 | BOOST_CHECK_EQUAL(tdiff.get_sec (), 850); | |
814 | BOOST_CHECK_EQUAL(tdiff.get_nsec (), 850); | |
815 | } | |
816 | ||
817 | BOOST_AUTO_TEST_CASE(op_subtract_time_t) | |
818 | { | |
819 | I2n::clock::Time t1 (2187, 2187); | |
820 | time_t t2 = 1337; | |
821 | I2n::clock::Time tdiff; | |
822 | ||
823 | tdiff = t1 - t2; | |
824 | ||
825 | BOOST_CHECK_EQUAL(tdiff.get_sec (), 850); | |
826 | BOOST_CHECK_EQUAL(tdiff.get_nsec (), 2187); | |
827 | } | |
828 | ||
829 | BOOST_AUTO_TEST_CASE(op_subtract_time_t_external) | |
830 | { | |
831 | time_t t1 = 1337; | |
832 | I2n::clock::Time t2 (2187, 2187); | |
833 | I2n::clock::Time tdiff; | |
834 | ||
835 | tdiff = t1 - t2; | |
836 | ||
837 | BOOST_CHECK_EQUAL(tdiff.get_sec (), -851); | |
838 | BOOST_CHECK_EQUAL(tdiff.get_nsec (), 999997813); | |
839 | } | |
840 | ||
841 | BOOST_AUTO_TEST_CASE(op_decr_Time) | |
842 | { | |
843 | I2n::clock::Time t1 (2187, 2187); | |
844 | I2n::clock::Time t2 (1337, 1337); | |
845 | ||
846 | t1 -= t2; | |
847 | ||
848 | BOOST_CHECK_EQUAL(t1.get_sec (), 850); | |
849 | BOOST_CHECK_EQUAL(t1.get_nsec (), 850); | |
850 | } | |
851 | ||
852 | BOOST_AUTO_TEST_CASE(op_decr_time_t) | |
853 | { | |
854 | I2n::clock::Time t1 (2187, 2187); | |
855 | time_t t2 = 1337; | |
856 | ||
857 | t1 -= t2; | |
858 | ||
859 | BOOST_CHECK_EQUAL(t1.get_sec (), 850); | |
860 | BOOST_CHECK_EQUAL(t1.get_nsec (), 2187); | |
861 | } | |
862 | ||
863 | BOOST_AUTO_TEST_CASE(op_mult_scale) | |
864 | { | |
865 | I2n::clock::Time t1; | |
866 | I2n::clock::Time t2; | |
867 | ||
868 | t1.set (1, 1); | |
869 | t2 = t1 * 42; | |
870 | ||
871 | BOOST_CHECK_EQUAL(t2.get_sec (), 42); | |
872 | BOOST_CHECK_EQUAL(t2.get_nsec (), 42); | |
873 | } | |
874 | ||
875 | BOOST_AUTO_TEST_CASE(op_mult_mutate) | |
876 | { | |
877 | I2n::clock::Time t1 ( 42, 42); | |
878 | I2n::clock::Time t2 (1337, 0); | |
879 | ||
880 | t1 *= 2; | |
881 | t2 *= -10; | |
882 | ||
883 | BOOST_CHECK_EQUAL(t1.get_sec (), 84); | |
884 | BOOST_CHECK_EQUAL(t1.get_nsec (), 84); | |
885 | BOOST_CHECK_EQUAL(t2.get_sec (), -13370); | |
886 | } | |
887 | ||
888 | BOOST_AUTO_TEST_CASE(op_mult_scale_carry) | |
889 | { | |
890 | I2n::clock::Time t1; | |
891 | I2n::clock::Time t2; | |
892 | ||
893 | t1.set (1, 500 * 1000 * 1000); | |
894 | t2 = t1 * 3; | |
895 | ||
896 | BOOST_CHECK_EQUAL(t2.get_sec (), 4); | |
897 | BOOST_CHECK_EQUAL(t2.get_nsec (), 500 * 1000 * 1000); | |
898 | } | |
899 | ||
900 | BOOST_AUTO_TEST_CASE(op_equals) | |
901 | { | |
902 | I2n::clock::Time t1; | |
903 | I2n::clock::Time t2; | |
904 | ||
905 | t1.set (50, 50); | |
906 | t2.set (50, 50); | |
907 | ||
908 | BOOST_CHECK_EQUAL(t1, t2); | |
909 | } | |
910 | ||
911 | BOOST_AUTO_TEST_CASE(compare_equal) | |
912 | { | |
913 | I2n::clock::Time t1; | |
914 | I2n::clock::Time t2; | |
915 | ||
916 | t1.set (42, 42); | |
917 | t2.set (42, 42); | |
918 | ||
919 | BOOST_CHECK_EQUAL(I2n::clock::compare (t1, t2), 0); | |
920 | } | |
921 | ||
922 | BOOST_AUTO_TEST_CASE(compare_equal_type) | |
923 | { | |
924 | I2n::clock::Time t1 (42, 42, I2n::clock::type::real); | |
925 | I2n::clock::Time t2 (42, 42, I2n::clock::type::cpu); | |
926 | I2n::clock::Time t3 (42, 0, I2n::clock::type::real); | |
927 | I2n::clock::Time t4 (42, 42, I2n::clock::type::real); | |
928 | ||
929 | BOOST_CHECK_NE(t1, t2); | |
930 | BOOST_CHECK_NE(t1, t3); | |
931 | BOOST_CHECK_EQUAL(t1, t4); | |
932 | } | |
933 | ||
934 | BOOST_AUTO_TEST_CASE(compare_ne_sec) | |
935 | { | |
936 | I2n::clock::Time t1; | |
937 | I2n::clock::Time t2; | |
938 | ||
939 | t1.set ( 42, 42); | |
940 | t2.set (1337, 42); | |
941 | ||
942 | BOOST_CHECK_EQUAL(I2n::clock::compare (t1, t2), -1); | |
943 | BOOST_CHECK_EQUAL(I2n::clock::compare (t2, t1), 1); | |
944 | } | |
945 | ||
946 | BOOST_AUTO_TEST_CASE(compare_ne_nsec) | |
947 | { | |
948 | I2n::clock::Time t1; | |
949 | I2n::clock::Time t2; | |
950 | ||
951 | t1.set (42, 42); | |
952 | t2.set (42, 1337); | |
953 | ||
954 | BOOST_CHECK_EQUAL(I2n::clock::compare (t1, t2), -1); | |
955 | BOOST_CHECK_EQUAL(I2n::clock::compare (t2, t1), 1); | |
956 | } | |
957 | ||
958 | BOOST_AUTO_TEST_CASE(compare_ne_both) | |
959 | { | |
960 | I2n::clock::Time t1; | |
961 | I2n::clock::Time t2; | |
962 | ||
963 | t1.set (42, 2187); | |
964 | t2.set (23, 1337); | |
965 | ||
966 | BOOST_CHECK_EQUAL(I2n::clock::compare (t1, t2), 1); | |
967 | BOOST_CHECK_EQUAL(I2n::clock::compare (t2, t1), -1); | |
968 | } | |
969 | ||
970 | BOOST_AUTO_TEST_CASE(op_ineq_sec) | |
971 | { | |
972 | I2n::clock::Time t1 (1337); | |
973 | I2n::clock::Time t2 (2187); | |
974 | ||
975 | BOOST_CHECK_LT(t1, t2); | |
976 | BOOST_CHECK_GT(t2, t1); | |
977 | } | |
978 | ||
979 | BOOST_AUTO_TEST_CASE(op_ineq_nsec) | |
980 | { | |
981 | I2n::clock::Time t1 (1337, 23); | |
982 | I2n::clock::Time t2 (1337, 42); | |
983 | ||
984 | BOOST_CHECK_LT(t1, t2); | |
985 | BOOST_CHECK_GT(t2, t1); | |
986 | } | |
987 | ||
988 | BOOST_AUTO_TEST_CASE(op_ineq_both) | |
989 | { | |
990 | I2n::clock::Time t1 (2187, 23); | |
991 | I2n::clock::Time t2 (1337, 42); | |
992 | ||
993 | BOOST_CHECK_LT(t2, t1); | |
994 | BOOST_CHECK_GT(t1, t2); | |
995 | } | |
996 | ||
997 | BOOST_AUTO_TEST_CASE(op_eq_time_t) | |
998 | { | |
999 | boost::optional<I2n::clock::Time> t1 = I2n::clock::now (); | |
1000 | const time_t t2 = time (NULL); /* race here */ | |
1001 | ||
1002 | *t1 -= (time_t)42; | |
1003 | ||
1004 | BOOST_CHECK_NE(*t1, t2); | |
1005 | BOOST_CHECK_LT(*t1, t2); | |
1006 | BOOST_CHECK_GT( t2, *t1); | |
1007 | } | |
1008 | ||
9f39641d PG |
1009 | BOOST_AUTO_TEST_CASE(Format_sec_msec) |
1010 | { | |
1011 | I2n::clock::Time t1 (42, 42); | |
1012 | I2n::clock::Time t2 ( 4, 242424242); | |
1013 | I2n::clock::Time t3 ( 0, 133713371); | |
1014 | I2n::clock::Time t4 ( 0, 0); | |
1015 | ||
1016 | std::string s1 = t1.format_sec_msec (); | |
1017 | std::string s2 = t2.format_sec_msec (); | |
1018 | std::string s3 = t3.format_sec_msec (); | |
1019 | std::string s4 = t4.format_sec_msec (); | |
1020 | ||
1021 | BOOST_CHECK_EQUAL("42s 0ms" , s1); | |
1022 | BOOST_CHECK_EQUAL( "4s 242ms", s2); | |
1023 | BOOST_CHECK_EQUAL( "0s 133ms", s3); | |
1024 | BOOST_CHECK_EQUAL( "0s 0ms" , s4); | |
1025 | } | |
1026 | ||
1027 | BOOST_AUTO_TEST_CASE(Format_min_sec_msec) | |
1028 | { | |
1029 | I2n::clock::Time t1 (42*60 + 42, 42); | |
1030 | I2n::clock::Time t2 ( 4*60 + 42, 242424242); | |
1031 | I2n::clock::Time t3 ( 0*60 + 42, 133713371); | |
1032 | I2n::clock::Time t4 ( 0 + 0, 0); | |
1033 | ||
1034 | std::string s1 = *t1.format_min_sec_msec (); | |
1035 | std::string s2 = *t2.format_min_sec_msec (); | |
1036 | std::string s3 = *t3.format_min_sec_msec (); | |
1037 | std::string s4 = *t4.format_min_sec_msec (); | |
1038 | ||
1039 | BOOST_CHECK_EQUAL("42m42.000s", s1); | |
1040 | BOOST_CHECK_EQUAL( "4m42.242s", s2); | |
1041 | BOOST_CHECK_EQUAL( "0m42.133s", s3); | |
1042 | BOOST_CHECK_EQUAL( "0m0.000s", s4); | |
1043 | } | |
1044 | ||
72acd54c PG |
1045 | BOOST_AUTO_TEST_CASE(FormatISO8601_T) |
1046 | { | |
1047 | I2n::clock::Time t (42, 42); | |
1048 | boost::optional<std::string> s = t.format_iso8601 (true, false, true, false); | |
1049 | ||
1050 | BOOST_CHECK_EQUAL("00:00:42", *s); | |
1051 | } | |
1052 | ||
1053 | BOOST_AUTO_TEST_CASE(FormatISO8601_DT) | |
1054 | { | |
1055 | I2n::clock::Time t (1541934671, 0); | |
1056 | boost::optional<std::string> s = t.format_iso8601 (true, true, true, false); | |
1057 | ||
1058 | BOOST_CHECK_EQUAL("2018-11-11T11:11:11", *s); | |
1059 | } | |
1060 | ||
1061 | BOOST_AUTO_TEST_CASE(FormatISO8601_DTZ) | |
1062 | { | |
1063 | I2n::clock::Time t (1541934671, 0); | |
1064 | boost::optional<std::string> s = t.format_iso8601 (true, true, true, true); | |
1065 | ||
1066 | BOOST_CHECK_EQUAL("2018-11-11T11:11:11Z+0000", *s); | |
1067 | } | |
1068 | ||
1069 | BOOST_AUTO_TEST_CASE(Format_make_nice_time) | |
1070 | { | |
1071 | I2n::clock::Time t (111111, 0); | |
1072 | boost::optional<std::string> s = t.make_nice_time (); | |
1073 | ||
1074 | BOOST_CHECK_EQUAL("1 day, 06:51:51", *s); | |
1075 | } | |
1076 | ||
1077 | BOOST_AUTO_TEST_CASE(Format_format_full_time) | |
1078 | { | |
1079 | I2n::clock::Time t (1541934671, 0); | |
1080 | /* | |
1081 | * brr, the old formatters use localtime without a way to opt out of | |
1082 | * it! | |
1083 | */ | |
ccbeb66c | 1084 | this->set_utc (); |
72acd54c PG |
1085 | boost::optional<std::string> s = t.format_full_time (); |
1086 | ||
1087 | BOOST_CHECK_EQUAL("11.11.2018 11:11", *s); | |
1088 | } | |
1089 | ||
1090 | BOOST_AUTO_TEST_CASE(Format_format_date) | |
1091 | { | |
1092 | I2n::clock::Time t (1541934671, 0); | |
1093 | boost::optional<std::string> s = t.format_date (); | |
1094 | ||
1095 | BOOST_CHECK_EQUAL("11.11.2018", *s); | |
1096 | } | |
1097 | ||
2795e39c PG |
1098 | BOOST_AUTO_TEST_CASE(FromString_iso8601_full) |
1099 | { | |
1100 | const std::string in1 ("0001-01-01T00:00:00Z+0000"); | |
1101 | const std::string in2 ("2018-11-11T11:11:11Z+0000"); | |
1102 | ||
ccbeb66c PG |
1103 | this->set_utc (); |
1104 | ||
2795e39c PG |
1105 | boost::optional<I2n::clock::Time> t1 = I2n::clock::time_of_iso8601 (in1); |
1106 | boost::optional<I2n::clock::Time> t2 = I2n::clock::time_of_iso8601 (in2); | |
1107 | ||
cf960f73 PG |
1108 | # if LONG_BIT == 32 |
1109 | BOOST_CHECK(!t1); | |
1110 | # else | |
2795e39c | 1111 | BOOST_CHECK(t1); |
2795e39c | 1112 | BOOST_CHECK_EQUAL(*t1->format_iso8601 (), in1); |
cf960f73 PG |
1113 | # endif |
1114 | ||
1115 | BOOST_CHECK(t2); | |
2795e39c PG |
1116 | BOOST_CHECK_EQUAL(*t2->format_iso8601 (), in2); |
1117 | } | |
1118 | ||
1119 | BOOST_AUTO_TEST_CASE(FromString_iso8601_full_negyear) | |
1120 | { | |
1121 | const std::string in1 ("-0001-01-01T00:00:00Z+0000"); | |
1122 | const std::string in2 ("-2018-11-11T11:11:11Z+0000"); | |
1123 | ||
ccbeb66c PG |
1124 | this->set_utc (); |
1125 | ||
2795e39c PG |
1126 | boost::optional<I2n::clock::Time> t1 = I2n::clock::time_of_iso8601 (in1); |
1127 | boost::optional<I2n::clock::Time> t2 = I2n::clock::time_of_iso8601 (in2); | |
1128 | ||
cf960f73 PG |
1129 | # if LONG_BIT == 32 |
1130 | BOOST_CHECK(!t1); | |
1131 | BOOST_CHECK(!t2); | |
1132 | # else | |
2795e39c PG |
1133 | BOOST_CHECK(t1); |
1134 | BOOST_CHECK(t2); | |
2795e39c PG |
1135 | BOOST_CHECK_EQUAL(*t1->format_iso8601 (), in1); |
1136 | BOOST_CHECK_EQUAL(*t2->format_iso8601 (), in2); | |
cf960f73 | 1137 | # endif |
2795e39c PG |
1138 | } |
1139 | ||
1140 | BOOST_AUTO_TEST_CASE(FromString_iso8601_partial) | |
1141 | { | |
1142 | const std::string in1 ("2018-11-11T11:11:11"); | |
1143 | const std::string in2 ("2018-11-11"); | |
cf960f73 | 1144 | |
ccbeb66c | 1145 | this->set_utc (); |
2795e39c PG |
1146 | |
1147 | boost::optional<I2n::clock::Time> t1 = | |
1148 | I2n::clock::time_of_iso8601 (in1, true, true, false); | |
1149 | boost::optional<I2n::clock::Time> t2 = | |
1150 | I2n::clock::time_of_iso8601 (in2, true, false, false); | |
2795e39c PG |
1151 | |
1152 | BOOST_CHECK(t1); | |
1153 | BOOST_CHECK(t2); | |
2795e39c PG |
1154 | /* |
1155 | * We test for the difference here which is zero if the number is | |
1156 | * correct but causes the difference from the expected value to be | |
1157 | * printed in case the test fails. | |
1158 | */ | |
1159 | BOOST_CHECK_EQUAL(*t1->format_iso8601 (true, true, true, false), in1); | |
1160 | BOOST_CHECK_EQUAL(*t2->format_iso8601 (true, true, false, false), in2); | |
cf960f73 PG |
1161 | } |
1162 | ||
1163 | BOOST_AUTO_TEST_CASE(FromString_iso8601_32bit_time_t_err) | |
1164 | { | |
1165 | const std::string timeless ("11:11:11"); | |
1166 | boost::optional<I2n::clock::Time> untimely = boost::none; | |
1167 | ||
ccbeb66c PG |
1168 | this->set_utc (); |
1169 | ||
cf960f73 PG |
1170 | untimely = I2n::clock::time_of_iso8601 (timeless, false, true, false); |
1171 | ||
1172 | # if LONG_BIT == 32 | |
1173 | BOOST_CHECK(!untimely); | |
1174 | # else | |
1175 | BOOST_CHECK(untimely); | |
1176 | BOOST_CHECK_EQUAL(*untimely->format_iso8601 (true, false, true, false), | |
1177 | timeless); | |
1178 | # endif | |
1179 | } | |
1180 | ||
1181 | BOOST_AUTO_TEST_CASE(Ctor_32bit_time_t_err) | |
1182 | { | |
1183 | boost::optional<std::string> threw = boost::none; | |
1184 | ||
1185 | struct tm tm; | |
1186 | memset (&tm, 0, sizeof (tm)); | |
1187 | ||
1188 | tm.tm_sec = 11; | |
1189 | tm.tm_min = 11; | |
1190 | tm.tm_hour = 11; | |
1191 | tm.tm_mday = 11; | |
1192 | tm.tm_mon = 10; | |
1193 | tm.tm_year = -789; | |
1194 | tm.tm_gmtoff = 0; | |
1195 | ||
1196 | try { | |
1197 | I2n::clock::Time untimely (tm); | |
1198 | } catch (I2n::clock::conversion_error &exn) { | |
1199 | threw = std::string (exn); | |
1200 | } | |
1201 | ||
1202 | ||
1203 | # if LONG_BIT == 32 | |
1204 | BOOST_CHECK_EQUAL(*threw, | |
1205 | "errno=0 [mktime: from struct tm {Sun Nov 11 11:11:11 1111}]"); | |
1206 | # else | |
1207 | BOOST_CHECK(!threw); | |
1208 | # endif | |
2795e39c PG |
1209 | } |
1210 | ||
c42fd3b3 PG |
1211 | BOOST_AUTO_TEST_CASE(containers_list) |
1212 | { | |
1213 | std::list<I2n::clock::Time> ts; | |
1214 | ||
1215 | ts.push_back (I2n::clock::zero ()); | |
1216 | ts.push_back (I2n::clock::zero ()); | |
1217 | ||
1218 | BOOST_CHECK_EQUAL(ts.size (), 2); | |
1219 | } | |
1220 | ||
1221 | BOOST_AUTO_TEST_CASE(containers_vec) | |
1222 | { | |
1223 | std::vector<I2n::clock::Time> ts; | |
1224 | ||
1225 | ts.push_back (I2n::clock::zero ()); | |
1226 | ts.push_back (I2n::clock::zero ()); | |
1227 | ||
1228 | BOOST_CHECK_EQUAL(ts.size (), 2); | |
1229 | } | |
1230 | ||
1231 | BOOST_AUTO_TEST_CASE(containers_set) | |
1232 | { | |
1233 | std::set<I2n::clock::Time> ts; | |
1234 | ||
1235 | ts.insert (I2n::clock::zero ()); | |
1236 | ts.insert (I2n::clock::Time (42, 2187)); | |
1237 | ts.insert (I2n::clock::zero ()); | |
1238 | ||
1239 | BOOST_CHECK_EQUAL(ts.size (), 2); | |
1240 | } | |
1241 | ||
1242 | BOOST_AUTO_TEST_CASE(containers_list_mean) | |
1243 | { | |
1244 | std::list<I2n::clock::Time> ts; | |
1245 | ||
1246 | ts.push_back (I2n::clock::Time (42, 42)); | |
1247 | ts.push_back (I2n::clock::Time (1337, 1337)); | |
1248 | ||
1249 | BOOST_CHECK_EQUAL(I2n::clock::mean (ts), | |
1250 | I2n::clock::Time (689, 500000689)); | |
1251 | } | |
1252 | ||
1253 | BOOST_AUTO_TEST_CASE(containers_list_mean_zero) | |
1254 | { | |
1255 | std::list<I2n::clock::Time> ts; | |
1256 | ||
1257 | ts.push_back (I2n::clock::Time (0, 0)); | |
1258 | ts.push_back (I2n::clock::Time (0, 0)); | |
1259 | ts.push_back (I2n::clock::Time (0, 0)); | |
1260 | ts.push_back (I2n::clock::Time (0, 0)); | |
1261 | ||
1262 | BOOST_CHECK_EQUAL(I2n::clock::mean (ts), | |
1263 | I2n::clock::zero ()); | |
1264 | } | |
1265 | ||
1266 | BOOST_AUTO_TEST_CASE(containers_list_mean_empty) | |
1267 | { | |
1268 | std::list<I2n::clock::Time> ts; | |
1269 | ||
1270 | BOOST_CHECK_EQUAL(I2n::clock::mean (ts), I2n::clock::Time (0, 0)); | |
1271 | } | |
1272 | ||
1273 | BOOST_AUTO_TEST_CASE(containers_set_mean) | |
1274 | { | |
1275 | std::set<I2n::clock::Time> ts; | |
1276 | ||
1277 | ts.insert (I2n::clock::Time (42)); | |
1278 | ts.insert (I2n::clock::Time (1337)); | |
1279 | ts.insert (I2n::clock::Time (2187)); | |
1280 | ||
1281 | BOOST_CHECK_EQUAL(I2n::clock::mean (ts), | |
1282 | I2n::clock::Time (1188, 666666666)); | |
1283 | } | |
1284 | ||
1285 | BOOST_AUTO_TEST_CASE(containers_set_median_empty) | |
1286 | { | |
1287 | std::set<I2n::clock::Time> ts; | |
1288 | ||
1289 | BOOST_CHECK_EQUAL(I2n::clock::median (ts), I2n::clock::Time (0, 0)); | |
1290 | } | |
1291 | ||
1292 | BOOST_AUTO_TEST_CASE(containers_set_median_one) | |
1293 | { | |
1294 | std::set<I2n::clock::Time> ts; | |
1295 | ||
1296 | ts.insert (I2n::clock::Time (42, 0)); | |
1297 | ||
1298 | BOOST_CHECK_EQUAL(I2n::clock::median (ts), | |
1299 | I2n::clock::Time (42, 0)); | |
1300 | } | |
1301 | ||
1302 | BOOST_AUTO_TEST_CASE(containers_set_median_multi) | |
1303 | { | |
1304 | std::set<I2n::clock::Time> ts; | |
1305 | ||
1306 | ts.insert (I2n::clock::Time (42)); | |
1307 | ts.insert (I2n::clock::Time (1337)); | |
1308 | ts.insert (I2n::clock::Time (2187)); | |
1309 | ||
1310 | BOOST_CHECK_EQUAL(I2n::clock::median (ts), I2n::clock::Time (1337)); | |
1311 | } | |
1312 | ||
1313 | BOOST_AUTO_TEST_CASE(containers_vec_median_multi) | |
1314 | { | |
1315 | std::vector<I2n::clock::Time> ts; | |
1316 | ||
1317 | ts.push_back (I2n::clock::Time (42)); | |
1318 | ts.push_back (I2n::clock::Time (1337)); | |
1319 | ts.push_back (I2n::clock::Time (2187)); | |
1320 | ||
1321 | BOOST_CHECK_EQUAL(I2n::clock::median (ts), I2n::clock::Time (1337)); | |
1322 | } | |
1323 | ||
1324 | BOOST_AUTO_TEST_CASE(containers_list_median_multi) | |
1325 | { | |
1326 | std::list<I2n::clock::Time> ts; | |
1327 | ||
1328 | ts.push_back (I2n::clock::Time (42)); | |
1329 | ts.push_back (I2n::clock::Time (1337)); | |
1330 | ts.push_back (I2n::clock::Time (2187)); | |
cf960f73 PG |
1331 | ts.push_back (I2n::clock::Time (0xdead)); |
1332 | ts.push_back (I2n::clock::Time (0xbeef)); | |
c42fd3b3 | 1333 | |
cf960f73 PG |
1334 | BOOST_CHECK_EQUAL(I2n::clock::median (ts), |
1335 | I2n::clock::Time (2187)); | |
c42fd3b3 PG |
1336 | } |
1337 | ||
1338 | BOOST_AUTO_TEST_CASE(containers_list_median_multi_evensize) | |
1339 | { | |
1340 | std::list<I2n::clock::Time> ts; | |
1341 | ||
1342 | ts.push_back (I2n::clock::Time (42)); | |
1343 | ts.push_back (I2n::clock::Time (1337)); | |
1344 | ts.push_back (I2n::clock::Time (2187)); | |
1345 | ts.push_back (I2n::clock::Time (0xf00d)); | |
cf960f73 PG |
1346 | ts.push_back (I2n::clock::Time (0xfeed)); |
1347 | ts.push_back (I2n::clock::Time (0xdeadf0e)); | |
c42fd3b3 PG |
1348 | |
1349 | BOOST_CHECK_EQUAL(I2n::clock::median (ts), I2n::clock::Time (0xf00d)); | |
1350 | } | |
1351 | ||
e36ca33c | 1352 | BOOST_AUTO_TEST_SUITE_END() /* [Clock] */ |
dad9e26f | 1353 | |
9fe0853b | 1354 | BOOST_AUTO_TEST_SUITE_END() |