3 //some unused features are still in the wrapper, unconverted
9 #include "timevalops.h"
15 #define TEST_ASSERT_EQUAL_timeval(a, b) { \
16 TEST_ASSERT_EQUAL_MESSAGE(a.tv_sec, b.tv_sec, "Field tv_sec"); \
17 TEST_ASSERT_EQUAL_MESSAGE(a.tv_usec, b.tv_usec, "Field tv_usec"); \
20 //timeval has time_t, long, and time_t is basically uint
22 static u_int32 my_tick_to_tsf(u_int32 ticks);
23 static u_int32 my_tsf_to_tick(u_int32 tsf);
32 //******************************************MY CUSTOM FUNCTIONS*******************************
34 typedef int bool; //TRUE and FALSE are already defined somewhere, so I can't do typedef enum { FALSE, TRUE } boolean;
36 struct timeval timeval_init( time_t hi, long lo){
43 const bool timeval_isValid(struct timeval V)
44 { return V.tv_usec >= 0 && V.tv_usec < 1000000; }
46 //taken from lfpfunc.c -> maybe remove this from timevalops.c and lfpfunc. and put in c_timstructs.h ????!!!!!
47 l_fp l_fp_init(int32 i, u_int32 f)
56 bool AssertTimevalClose(const struct timeval m, const struct timeval n, const struct timeval limit)
60 diff = abs_tval(sub_tval(m, n));
61 if (cmp_tval(limit, diff) >= 0)
67 //<< m_expr << " which is " << timeval_wrap(m)
69 //<< n_expr << " which is " << timeval_wrap(n)
70 //<< "\nare not close; diff=" << timeval_wrap(diff);
75 bool AssertFpClose(const l_fp m,const l_fp n, const l_fp limit)
79 if (L_ISGEQ(&m, &n)) {
86 if (L_ISGEQ(&limit, &diff)){
90 //<< m_expr << " which is " << l_fp_wrap(m)
92 //<< n_expr << " which is " << l_fp_wrap(n)
93 //<< "\nare not close; diff=" << l_fp_wrap(diff);
99 //---------------------------------------------------
101 static const lfpfracdata fdata[] = {
102 { 0, 0x00000000 }, { 7478, 0x01ea1405 },
103 { 22077, 0x05a6d699 }, { 125000, 0x20000000 },
104 { 180326, 0x2e29d841 }, { 207979, 0x353e1c9b },
105 { 250000, 0x40000000 }, { 269509, 0x44fe8ab5 },
106 { 330441, 0x5497c808 }, { 333038, 0x5541fa76 },
107 { 375000, 0x60000000 }, { 394734, 0x650d4995 },
108 { 446327, 0x72427c7c }, { 500000, 0x80000000 },
109 { 517139, 0x846338b4 }, { 571953, 0x926b8306 },
110 { 587353, 0x965cc426 }, { 625000, 0xa0000000 },
111 { 692136, 0xb12fd32c }, { 750000, 0xc0000000 },
112 { 834068, 0xd5857aff }, { 848454, 0xd9344806 },
113 { 854222, 0xdaae4b02 }, { 861465, 0xdc88f862 },
114 { 875000, 0xe0000000 }, { 910661, 0xe921144d },
115 { 922162, 0xec12cf10 }, { 942190, 0xf1335d25 }
119 u_int32 my_tick_to_tsf(u_int32 ticks)
121 // convert microseconds to l_fp fractional units, using double
122 // precision float calculations or, if available, 64bit integer
123 // arithmetic. This should give the precise fraction, rounded to
124 // the nearest representation.
126 return (u_int32)((( ((u_int64)(ticks)) << 32) + 500000) / 1000000); //I put too much () when casting just to be safe
128 return (u_int32)( ((double)(ticks)) * 4294.967296 + 0.5);
130 // And before you ask: if ticks >= 1000000, the result is
131 // truncated nonsense, so don't use it out-of-bounds.
134 u_int32 my_tsf_to_tick(u_int32 tsf)
136 // Inverse operation: converts fraction to microseconds.
138 return (u_int32)( ((u_int64)(tsf) * 1000000 + 0x80000000) >> 32); //CHECK ME!!!
140 return (u_int32)(double(tsf) / 4294.967296 + 0.5);
142 // Beware: The result might be 10^6 due to rounding!
146 //***************************************END OF CUSTOM FUNCTIONS*****************************
149 // ---------------------------------------------------------------------
150 // test support stuff - part1
151 // ---------------------------------------------------------------------
153 void test_Helpers1() {
156 for (x.tv_sec = -2; x.tv_sec < 3; x.tv_sec++) {
158 TEST_ASSERT_FALSE(timeval_isValid(x));
160 TEST_ASSERT_TRUE(timeval_isValid(x));
162 TEST_ASSERT_TRUE(timeval_isValid(x));
164 TEST_ASSERT_FALSE(timeval_isValid(x));
169 //----------------------------------------------------------------------
170 // test normalisation
171 //----------------------------------------------------------------------
173 void test_Normalise() {
175 for (ns = -2000000000; ns <= 2000000000; ns += 10000000) {
176 struct timeval x = timeval_init(0, ns);
178 x = normalize_tval(x);
179 TEST_ASSERT_TRUE(timeval_isValid(x));
183 //----------------------------------------------------------------------
184 // test classification
185 //----------------------------------------------------------------------
187 void test_SignNoFrac() {
189 // sign test, no fraction
190 for (i = -4; i <= 4; ++i) {
191 struct timeval a = timeval_init(i, 0);
192 int E = (i > 0) - (i < 0);
193 int r = test_tval(a);
195 TEST_ASSERT_EQUAL(E, r);
199 void test_SignWithFrac() {
200 // sign test, with fraction
202 for (i = -4; i <= 4; ++i) {
203 struct timeval a = timeval_init(i, 10);
204 int E = (i >= 0) - (i < 0);
205 int r = test_tval(a);
207 TEST_ASSERT_EQUAL(E, r);
211 //----------------------------------------------------------------------
213 //----------------------------------------------------------------------
214 void test_CmpFracEQ() {
216 // fractions are equal
217 for (i = -4; i <= 4; ++i)
218 for (j = -4; j <= 4; ++j) {
219 struct timeval a = timeval_init(i, 200);
220 struct timeval b = timeval_init(j, 200);
221 int E = (i > j) - (i < j);
222 int r = cmp_tval_denorm(a, b);
224 TEST_ASSERT_EQUAL(E, r);
228 void test_CmpFracGT() {
229 // fraction a bigger fraction b
231 for (i = -4; i <= 4; ++i)
232 for (j = -4; j <= 4; ++j) {
233 struct timeval a = timeval_init( i , 999800);
234 struct timeval b = timeval_init( j , 200);
235 int E = (i >= j) - (i < j);
236 int r = cmp_tval_denorm(a, b);
238 TEST_ASSERT_EQUAL(E, r);
242 void test_CmpFracLT() {
243 // fraction a less fraction b
245 for (i = -4; i <= 4; ++i)
246 for (j = -4; j <= 4; ++j) {
247 struct timeval a = timeval_init(i, 200);
248 struct timeval b = timeval_init(j, 999800);
249 int E = (i > j) - (i <= j);
250 int r = cmp_tval_denorm(a, b);
252 TEST_ASSERT_EQUAL(E, r);
256 //----------------------------------------------------------------------
257 // Test addition (sum)
258 //----------------------------------------------------------------------
260 void test_AddFullNorm() {
262 for (i = -4; i <= 4; ++i)
263 for (j = -4; j <= 4; ++j) {
264 struct timeval a = timeval_init(i, 200);
265 struct timeval b = timeval_init(j, 400);
266 struct timeval E = timeval_init(i + j, 200 + 400);
270 TEST_ASSERT_EQUAL_timeval(E, c);
274 void test_AddFullOflow1() {
276 for (i = -4; i <= 4; ++i)
277 for (j = -4; j <= 4; ++j) {
278 struct timeval a = timeval_init(i, 200);
279 struct timeval b = timeval_init(j, 999900);
280 struct timeval E = timeval_init(i + j + 1, 100);
284 TEST_ASSERT_EQUAL_timeval(E, c);
288 void test_AddUsecNorm() {
290 for (i = -4; i <= 4; ++i) {
291 struct timeval a = timeval_init(i, 200);
292 struct timeval E = timeval_init(i, 600);
295 c = add_tval_us(a, 600 - 200);
296 TEST_ASSERT_EQUAL_timeval(E, c);
300 void test_AddUsecOflow1() {
302 for (i = -4; i <= 4; ++i) {
303 struct timeval a = timeval_init(i, 200);
304 struct timeval E = timeval_init(i + 1, 100);
307 c = add_tval_us(a, MICROSECONDS - 100);
308 TEST_ASSERT_EQUAL_timeval(E, c);
312 //----------------------------------------------------------------------
313 // test subtraction (difference)
314 //----------------------------------------------------------------------
316 void test_SubFullNorm() {
318 for (i = -4; i <= 4; ++i)
319 for (j = -4; j <= 4; ++j) {
320 struct timeval a = timeval_init(i, 600);
321 struct timeval b = timeval_init(j, 400);
322 struct timeval E = timeval_init(i - j, 600 - 400);
326 TEST_ASSERT_EQUAL_timeval(E, c);
330 void test_SubFullOflow() {
332 for (i = -4; i <= 4; ++i)
333 for (j = -4; j <= 4; ++j) {
334 struct timeval a = timeval_init(i, 100);
335 struct timeval b = timeval_init(j, 999900);
336 struct timeval E = timeval_init(i - j - 1, 200);
340 TEST_ASSERT_EQUAL_timeval(E, c);
344 void test_SubUsecNorm() {
346 for (i = -4; i <= 4; ++i) {
347 struct timeval a = timeval_init(i, 600);
348 struct timeval E = timeval_init(i, 200);
351 c = sub_tval_us(a, 600 - 200);
352 TEST_ASSERT_EQUAL_timeval(E, c);
356 void test_SubUsecOflow() {
358 for (i = -4; i <= 4; ++i) {
359 struct timeval a = timeval_init(i, 100);
360 struct timeval E = timeval_init(i - 1, 200);
363 c = sub_tval_us(a, MICROSECONDS - 100);
364 TEST_ASSERT_EQUAL_timeval(E, c);
368 //----------------------------------------------------------------------
370 //----------------------------------------------------------------------
374 for (i = -4; i <= 4; ++i) {
375 struct timeval a = timeval_init(i, 100);
381 TEST_ASSERT_EQUAL(0, test_tval(c));
385 //----------------------------------------------------------------------
387 //----------------------------------------------------------------------
389 void test_AbsNoFrac() {
391 for (i = -4; i <= 4; ++i) {
392 struct timeval a = timeval_init(i, 0);
396 TEST_ASSERT_EQUAL((i != 0), test_tval(b));
400 void test_AbsWithFrac() {
402 for (i = -4; i <= 4; ++i) {
403 struct timeval a = timeval_init(i, 100);
407 TEST_ASSERT_EQUAL(1, test_tval(b));
411 // ---------------------------------------------------------------------
412 // test support stuff -- part 2
413 // ---------------------------------------------------------------------
416 void test_Helpers2() {
417 //struct AssertTimevalClose isClose = AssertTimevalClose_init(0, 2);
418 struct timeval limit = timeval_init(0, 2);
422 for (x.tv_sec = -2; x.tv_sec < 3; x.tv_sec++){
425 x.tv_usec += 499999) {
426 for (i = -4; i < 5; i++) {
429 if (i >= -2 && i <= 2){
430 TEST_ASSERT_TRUE(AssertTimevalClose(x,y,limit));//ASSERT_PRED_FORMAT2(isClose, x, y);
433 TEST_ASSERT_FALSE(AssertTimevalClose(x,y,limit));//ASSERT_PRED_FORMAT2(!isClose, x, y);
440 // and the global predicate instances we're using here
442 //static l_fp lfpClose = l_fp_init(0,1); //static AssertFpClose FpClose(0, 1);
443 //static struct timeval timevalClose = timeval_init(0,1); //static AssertTimevalClose TimevalClose(0, 1);
445 //----------------------------------------------------------------------
446 // conversion to l_fp
447 //----------------------------------------------------------------------
449 void test_ToLFPbittest() {
450 l_fp lfpClose = l_fp_init(0,1);
453 for (i = 0; i < 1000000; i++) {
454 struct timeval a = timeval_init(1, i);
455 l_fp E = l_fp_init(1,my_tick_to_tsf(i));
458 r = tval_intv_to_lfp(a);
459 TEST_ASSERT_TRUE(AssertFpClose(E,r,lfpClose)); //ASSERT_PRED_FORMAT2(FpClose, E, r);
464 void test_ToLFPrelPos() {
465 l_fp lfpClose = l_fp_init(0,1);
468 for (i = 0; i < COUNTOF(fdata); i++) {
469 struct timeval a = timeval_init(1, fdata[i].usec);
470 l_fp E = l_fp_init(1, fdata[i].frac);
473 r = tval_intv_to_lfp(a);
474 TEST_ASSERT_TRUE(AssertFpClose(E,r,lfpClose)); //ASSERT_PRED_FORMAT2(FpClose, E, r);
478 void test_ToLFPrelNeg() {
479 l_fp lfpClose = l_fp_init(0,1);
481 for (i = 0; i < COUNTOF(fdata); i++) {
482 struct timeval a = timeval_init(-1, fdata[i].usec);
483 l_fp E = l_fp_init(~0, fdata[i].frac);
486 r = tval_intv_to_lfp(a);
487 TEST_ASSERT_TRUE(AssertFpClose(E,r,lfpClose)); //ASSERT_PRED_FORMAT2(FpClose,E, r);
491 void test_ToLFPabs() {
492 l_fp lfpClose = l_fp_init(0,1);
495 for (i = 0; i < COUNTOF(fdata); i++) {
496 struct timeval a = timeval_init(1, fdata[i].usec);
497 l_fp E = l_fp_init(1 + JAN_1970, fdata[i].frac);
500 r = tval_stamp_to_lfp(a);
501 TEST_ASSERT_TRUE(AssertFpClose(E,r,lfpClose)); //ASSERT_PRED_FORMAT2(FpClose, E, r);
505 //----------------------------------------------------------------------
506 // conversion from l_fp
507 //----------------------------------------------------------------------
509 void test_FromLFPbittest() {
510 struct timeval timevalClose = timeval_init(0,1);
511 // Not *exactly* a bittest, because 2**32 tests would take a
512 // really long time even on very fast machines! So we do test
513 // every 1000 fractional units.
515 for (tsf = 0; tsf < ~((u_int32)(1000)); tsf += 1000) {
516 struct timeval E = timeval_init(1, my_tsf_to_tick(tsf));
517 l_fp a = l_fp_init(1, tsf);
520 r = lfp_intv_to_tval(a);
521 // The conversion might be off by one microsecond when
522 // comparing to calculated value.
523 TEST_ASSERT_TRUE(AssertTimevalClose(E,r,timevalClose)); //ASSERT_PRED_FORMAT2(TimevalClose, E, r);
527 void test_FromLFPrelPos() {
528 struct timeval timevalClose = timeval_init(0,1);
530 for (i = 0; i < COUNTOF(fdata); i++) {
531 l_fp a = l_fp_init(1, fdata[i].frac);
532 struct timeval E = timeval_init(1, fdata[i].usec);
535 r = lfp_intv_to_tval(a);
536 TEST_ASSERT_TRUE(AssertTimevalClose(E,r,timevalClose)); //ASSERT_PRED_FORMAT2(TimevalClose, E, r);
540 void test_FromLFPrelNeg() {
541 struct timeval timevalClose = timeval_init(0,1);
543 for (i = 0; i < COUNTOF(fdata); i++) {
544 l_fp a = l_fp_init(~0, fdata[i].frac);
545 struct timeval E = timeval_init(-1, fdata[i].usec);
548 r = lfp_intv_to_tval(a);
549 TEST_ASSERT_TRUE(AssertTimevalClose(E,r,timevalClose)); //ASSERT_PRED_FORMAT2(TimevalClose, E, r);
553 // usec -> frac -> usec roundtrip, using a prime start and increment
554 void test_LFProundtrip() {
557 for (t = -1; t < 2; ++t)
558 for (i = 5; i < 1000000; i+=11) {
559 struct timeval E = timeval_init(t, i);
563 a = tval_intv_to_lfp(E);
564 r = lfp_intv_to_tval(a);
565 TEST_ASSERT_EQUAL_timeval(E, r);
569 //----------------------------------------------------------------------
571 //----------------------------------------------------------------------
573 void test_ToString() {
574 static const struct {
579 { 0, 0, "0.000000" },
580 { 2, 0, "2.000000" },
581 {-2, 0, "-2.000000" },
582 { 0, 1, "0.000001" },
583 { 0,-1, "-0.000001" },
584 { 1,-1, "0.999999" },
585 {-1, 1, "-0.999999" },
586 {-1,-1, "-1.000001" },
589 for (i = 0; i < COUNTOF(data); ++i) {
590 struct timeval a = timeval_init(data[i].sec, data[i].usec);
591 const char * E = data[i].repr; //??
592 const char * r = tvaltoa(a);
594 TEST_ASSERT_EQUAL_STRING(E, r);