1*eabc0478Schristos /* $NetBSD: timevalops.c,v 1.4 2024/08/18 20:47:27 christos Exp $ */ 248f8ae19Schristos 3f17b710fSchristos #include "config.h" 4f17b710fSchristos 5f17b710fSchristos //some unused features are still in the wrapper, unconverted 6f17b710fSchristos 7f17b710fSchristos #include "ntp_types.h" 8f17b710fSchristos #include "ntp_fp.h" 9f17b710fSchristos 10f17b710fSchristos #include "timevalops.h" 11f17b710fSchristos 12a6f3f22fSchristos #include <math.h> 13f17b710fSchristos #include "unity.h" 14f17b710fSchristos 15f17b710fSchristos 16f17b710fSchristos #define TEST_ASSERT_EQUAL_timeval(a, b) { \ 17f17b710fSchristos TEST_ASSERT_EQUAL_MESSAGE(a.tv_sec, b.tv_sec, "Field tv_sec"); \ 18f17b710fSchristos TEST_ASSERT_EQUAL_MESSAGE(a.tv_usec, b.tv_usec, "Field tv_usec"); \ 19f17b710fSchristos } 20f17b710fSchristos 21f17b710fSchristos 22f17b710fSchristos static u_int32 my_tick_to_tsf(u_int32 ticks); 23f17b710fSchristos static u_int32 my_tsf_to_tick(u_int32 tsf); 24f17b710fSchristos 25a6f3f22fSchristos 26f17b710fSchristos // that's it... 27f17b710fSchristos typedef struct { 28f17b710fSchristos long usec; 29f17b710fSchristos u_int32 frac; 30f17b710fSchristos } lfpfracdata ; 31f17b710fSchristos 32a6f3f22fSchristos struct timeval timeval_init( time_t hi, long lo); 33a6f3f22fSchristos const bool timeval_isValid(struct timeval V); 34a6f3f22fSchristos l_fp l_fp_init(int32 i, u_int32 f); 35a6f3f22fSchristos bool AssertTimevalClose(const struct timeval m, const struct timeval n, const struct timeval limit); 36a6f3f22fSchristos bool AssertFpClose(const l_fp m, const l_fp n, const l_fp limit); 37a6f3f22fSchristos 384c290c01Schristos void setUp(void); 39a6f3f22fSchristos void test_Helpers1(void); 40a6f3f22fSchristos void test_Normalise(void); 41a6f3f22fSchristos void test_SignNoFrac(void); 42a6f3f22fSchristos void test_SignWithFrac(void); 43a6f3f22fSchristos void test_CmpFracEQ(void); 44a6f3f22fSchristos void test_CmpFracGT(void); 45a6f3f22fSchristos void test_CmpFracLT(void); 46a6f3f22fSchristos void test_AddFullNorm(void); 47a6f3f22fSchristos void test_AddFullOflow1(void); 48a6f3f22fSchristos void test_AddUsecNorm(void); 49a6f3f22fSchristos void test_AddUsecOflow1(void); 50a6f3f22fSchristos void test_SubFullNorm(void); 51a6f3f22fSchristos void test_SubFullOflow(void); 52a6f3f22fSchristos void test_SubUsecNorm(void); 53a6f3f22fSchristos void test_SubUsecOflow(void); 54a6f3f22fSchristos void test_Neg(void); 55a6f3f22fSchristos void test_AbsNoFrac(void); 56a6f3f22fSchristos void test_AbsWithFrac(void); 57a6f3f22fSchristos void test_Helpers2(void); 58a6f3f22fSchristos void test_ToLFPbittest(void); 59a6f3f22fSchristos void test_ToLFPrelPos(void); 60a6f3f22fSchristos void test_ToLFPrelNeg(void); 61a6f3f22fSchristos void test_ToLFPabs(void); 62a6f3f22fSchristos void test_FromLFPbittest(void); 63a6f3f22fSchristos void test_FromLFPrelPos(void); 64a6f3f22fSchristos void test_FromLFPrelNeg(void); 65a6f3f22fSchristos void test_LFProundtrip(void); 66a6f3f22fSchristos void test_ToString(void); 67a6f3f22fSchristos 68f17b710fSchristos 694c290c01Schristos //**********************************MY CUSTOM FUNCTIONS*********************** 70f17b710fSchristos 71f17b710fSchristos 724c290c01Schristos void 734c290c01Schristos setUp(void) 744c290c01Schristos { 754c290c01Schristos init_lib(); 764c290c01Schristos 774c290c01Schristos return; 784c290c01Schristos } 794c290c01Schristos 80a6f3f22fSchristos 81a6f3f22fSchristos struct timeval 824c290c01Schristos timeval_init(time_t hi, long lo) 834c290c01Schristos { 84f17b710fSchristos struct timeval V; 854c290c01Schristos 86f17b710fSchristos V.tv_sec = hi; 87f17b710fSchristos V.tv_usec = lo; 884c290c01Schristos 89f17b710fSchristos return V; 90f17b710fSchristos } 91f17b710fSchristos 92f17b710fSchristos 93a6f3f22fSchristos const bool 944c290c01Schristos timeval_isValid(struct timeval V) 954c290c01Schristos { 964c290c01Schristos 97a6f3f22fSchristos return V.tv_usec >= 0 && V.tv_usec < 1000000; 98a6f3f22fSchristos } 99a6f3f22fSchristos 100a6f3f22fSchristos 101a6f3f22fSchristos l_fp 1024c290c01Schristos l_fp_init(int32 i, u_int32 f) 1034c290c01Schristos { 104f17b710fSchristos l_fp temp; 1054c290c01Schristos 106f17b710fSchristos temp.l_i = i; 107f17b710fSchristos temp.l_uf = f; 108f17b710fSchristos 109f17b710fSchristos return temp; 110f17b710fSchristos } 111f17b710fSchristos 112a6f3f22fSchristos 113a6f3f22fSchristos bool 1144c290c01Schristos AssertTimevalClose(const struct timeval m, const struct timeval n, const struct timeval limit) 1154c290c01Schristos { 116f17b710fSchristos struct timeval diff; 117f17b710fSchristos 118f17b710fSchristos diff = abs_tval(sub_tval(m, n)); 119f17b710fSchristos if (cmp_tval(limit, diff) >= 0) 120f17b710fSchristos return TRUE; 121a6f3f22fSchristos 12256f2724eSchristos printf("m_expr which is %lld.%06lu \nand\n" 12356f2724eSchristos "n_expr which is %lld.%06lu\nare not close; diff=%lld.%06luusec\n", 124*eabc0478Schristos (long long)m.tv_sec, (u_long)m.tv_usec, 125*eabc0478Schristos (long long)n.tv_sec, (u_long)n.tv_usec, 126*eabc0478Schristos (long long)diff.tv_sec, (u_long)diff.tv_usec); 127f17b710fSchristos return FALSE; 128f17b710fSchristos } 129f17b710fSchristos 130a6f3f22fSchristos 131a6f3f22fSchristos bool 1324c290c01Schristos AssertFpClose(const l_fp m, const l_fp n, const l_fp limit) 1334c290c01Schristos { 134f17b710fSchristos l_fp diff; 135f17b710fSchristos 136f17b710fSchristos if (L_ISGEQ(&m, &n)) { 137f17b710fSchristos diff = m; 138f17b710fSchristos L_SUB(&diff, &n); 139f17b710fSchristos } else { 140f17b710fSchristos diff = n; 141f17b710fSchristos L_SUB(&diff, &m); 142f17b710fSchristos } 143f17b710fSchristos if (L_ISGEQ(&limit, &diff)) { 144f17b710fSchristos return TRUE; 145f17b710fSchristos } 146f17b710fSchristos else { 14756f2724eSchristos printf("m_expr which is %s \nand\nn_expr which is %s\nare not close; diff=%susec\n", 14856f2724eSchristos lfptoa(&m, 10), lfptoa(&n, 10), lfptoa(&diff, 10)); 149f17b710fSchristos return FALSE; 150f17b710fSchristos } 151f17b710fSchristos } 152f17b710fSchristos 153f17b710fSchristos 154f17b710fSchristos //--------------------------------------------------- 155f17b710fSchristos 156f17b710fSchristos static const lfpfracdata fdata[] = { 157f17b710fSchristos { 0, 0x00000000 }, { 7478, 0x01ea1405 }, 158f17b710fSchristos { 22077, 0x05a6d699 }, { 125000, 0x20000000 }, 159f17b710fSchristos { 180326, 0x2e29d841 }, { 207979, 0x353e1c9b }, 160f17b710fSchristos { 250000, 0x40000000 }, { 269509, 0x44fe8ab5 }, 161f17b710fSchristos { 330441, 0x5497c808 }, { 333038, 0x5541fa76 }, 162f17b710fSchristos { 375000, 0x60000000 }, { 394734, 0x650d4995 }, 163f17b710fSchristos { 446327, 0x72427c7c }, { 500000, 0x80000000 }, 164f17b710fSchristos { 517139, 0x846338b4 }, { 571953, 0x926b8306 }, 165f17b710fSchristos { 587353, 0x965cc426 }, { 625000, 0xa0000000 }, 166f17b710fSchristos { 692136, 0xb12fd32c }, { 750000, 0xc0000000 }, 167f17b710fSchristos { 834068, 0xd5857aff }, { 848454, 0xd9344806 }, 168f17b710fSchristos { 854222, 0xdaae4b02 }, { 861465, 0xdc88f862 }, 169f17b710fSchristos { 875000, 0xe0000000 }, { 910661, 0xe921144d }, 170f17b710fSchristos { 922162, 0xec12cf10 }, { 942190, 0xf1335d25 } 171f17b710fSchristos }; 172f17b710fSchristos 173f17b710fSchristos 174a6f3f22fSchristos u_int32 1754c290c01Schristos my_tick_to_tsf(u_int32 ticks) 1764c290c01Schristos { 177f17b710fSchristos // convert microseconds to l_fp fractional units, using double 178f17b710fSchristos // precision float calculations or, if available, 64bit integer 179f17b710fSchristos // arithmetic. This should give the precise fraction, rounded to 180f17b710fSchristos // the nearest representation. 1814c290c01Schristos 182f17b710fSchristos #ifdef HAVE_U_INT64 183f17b710fSchristos return (u_int32)((( ((u_int64)(ticks)) << 32) + 500000) / 1000000); //I put too much () when casting just to be safe 184f17b710fSchristos #else 185f17b710fSchristos return (u_int32)( ((double)(ticks)) * 4294.967296 + 0.5); 186f17b710fSchristos #endif 187f17b710fSchristos // And before you ask: if ticks >= 1000000, the result is 188f17b710fSchristos // truncated nonsense, so don't use it out-of-bounds. 189f17b710fSchristos } 190f17b710fSchristos 191a6f3f22fSchristos 192a6f3f22fSchristos u_int32 1934c290c01Schristos my_tsf_to_tick(u_int32 tsf) 1944c290c01Schristos { 195f17b710fSchristos // Inverse operation: converts fraction to microseconds. 196f17b710fSchristos #ifdef HAVE_U_INT64 197f17b710fSchristos return (u_int32)( ((u_int64)(tsf) * 1000000 + 0x80000000) >> 32); //CHECK ME!!! 198f17b710fSchristos #else 199f17b710fSchristos return (u_int32)(double(tsf) / 4294.967296 + 0.5); 200f17b710fSchristos #endif 201f17b710fSchristos // Beware: The result might be 10^6 due to rounding! 202f17b710fSchristos } 203f17b710fSchristos 204f17b710fSchristos 2054c290c01Schristos //*******************************END OF CUSTOM FUNCTIONS********************* 206f17b710fSchristos 207f17b710fSchristos 208f17b710fSchristos // --------------------------------------------------------------------- 209f17b710fSchristos // test support stuff - part1 210f17b710fSchristos // --------------------------------------------------------------------- 211f17b710fSchristos 212a6f3f22fSchristos void 2134c290c01Schristos test_Helpers1(void) 2144c290c01Schristos { 215f17b710fSchristos struct timeval x; 216f17b710fSchristos 217f17b710fSchristos for (x.tv_sec = -2; x.tv_sec < 3; x.tv_sec++) { 218f17b710fSchristos x.tv_usec = -1; 219f17b710fSchristos TEST_ASSERT_FALSE(timeval_isValid(x)); 220f17b710fSchristos x.tv_usec = 0; 221f17b710fSchristos TEST_ASSERT_TRUE(timeval_isValid(x)); 222f17b710fSchristos x.tv_usec = 999999; 223f17b710fSchristos TEST_ASSERT_TRUE(timeval_isValid(x)); 224f17b710fSchristos x.tv_usec = 1000000; 225f17b710fSchristos TEST_ASSERT_FALSE(timeval_isValid(x)); 226f17b710fSchristos } 2274c290c01Schristos 2284c290c01Schristos return; 229f17b710fSchristos } 230f17b710fSchristos 231f17b710fSchristos 232f17b710fSchristos //---------------------------------------------------------------------- 233f17b710fSchristos // test normalisation 234f17b710fSchristos //---------------------------------------------------------------------- 235f17b710fSchristos 236a6f3f22fSchristos void 2374c290c01Schristos test_Normalise(void) 2384c290c01Schristos { 239f17b710fSchristos long ns; 2404c290c01Schristos 241f17b710fSchristos for (ns = -2000000000; ns <= 2000000000; ns += 10000000) { 242f17b710fSchristos struct timeval x = timeval_init(0, ns); 243f17b710fSchristos 244f17b710fSchristos x = normalize_tval(x); 245f17b710fSchristos TEST_ASSERT_TRUE(timeval_isValid(x)); 246f17b710fSchristos } 2474c290c01Schristos 2484c290c01Schristos return; 249f17b710fSchristos } 250f17b710fSchristos 251f17b710fSchristos //---------------------------------------------------------------------- 252f17b710fSchristos // test classification 253f17b710fSchristos //---------------------------------------------------------------------- 254f17b710fSchristos 255a6f3f22fSchristos void 2564c290c01Schristos test_SignNoFrac(void) 2574c290c01Schristos { 258f17b710fSchristos int i; 2594c290c01Schristos 260f17b710fSchristos // sign test, no fraction 261f17b710fSchristos for (i = -4; i <= 4; ++i) { 262f17b710fSchristos struct timeval a = timeval_init(i, 0); 263f17b710fSchristos int E = (i > 0) - (i < 0); 264f17b710fSchristos int r = test_tval(a); 265f17b710fSchristos 266f17b710fSchristos TEST_ASSERT_EQUAL(E, r); 267f17b710fSchristos } 2684c290c01Schristos 2694c290c01Schristos return; 270f17b710fSchristos } 271f17b710fSchristos 272a6f3f22fSchristos 273a6f3f22fSchristos void 2744c290c01Schristos test_SignWithFrac(void) 2754c290c01Schristos { 276f17b710fSchristos // sign test, with fraction 277f17b710fSchristos int i; 2784c290c01Schristos 279f17b710fSchristos for (i = -4; i <= 4; ++i) { 280f17b710fSchristos struct timeval a = timeval_init(i, 10); 281f17b710fSchristos int E = (i >= 0) - (i < 0); 282f17b710fSchristos int r = test_tval(a); 283f17b710fSchristos 284f17b710fSchristos TEST_ASSERT_EQUAL(E, r); 285f17b710fSchristos } 2864c290c01Schristos 2874c290c01Schristos return; 288f17b710fSchristos } 289f17b710fSchristos 290f17b710fSchristos //---------------------------------------------------------------------- 291f17b710fSchristos // test compare 292f17b710fSchristos //---------------------------------------------------------------------- 293a6f3f22fSchristos void 2944c290c01Schristos test_CmpFracEQ(void) 2954c290c01Schristos { 296f17b710fSchristos int i, j; 2974c290c01Schristos 298f17b710fSchristos // fractions are equal 299f17b710fSchristos for (i = -4; i <= 4; ++i) 300f17b710fSchristos for (j = -4; j <= 4; ++j) { 301f17b710fSchristos struct timeval a = timeval_init(i, 200); 302f17b710fSchristos struct timeval b = timeval_init(j, 200); 303f17b710fSchristos int E = (i > j) - (i < j); 304f17b710fSchristos int r = cmp_tval_denorm(a, b); 305f17b710fSchristos 306f17b710fSchristos TEST_ASSERT_EQUAL(E, r); 307f17b710fSchristos } 3084c290c01Schristos 3094c290c01Schristos return; 310f17b710fSchristos } 311f17b710fSchristos 312a6f3f22fSchristos 313a6f3f22fSchristos void 3144c290c01Schristos test_CmpFracGT(void) 3154c290c01Schristos { 316f17b710fSchristos // fraction a bigger fraction b 317f17b710fSchristos int i, j; 3184c290c01Schristos 319f17b710fSchristos for (i = -4; i <= 4; ++i) 320f17b710fSchristos for (j = -4; j <= 4; ++j) { 321f17b710fSchristos struct timeval a = timeval_init( i , 999800); 322f17b710fSchristos struct timeval b = timeval_init( j , 200); 323f17b710fSchristos int E = (i >= j) - (i < j); 324f17b710fSchristos int r = cmp_tval_denorm(a, b); 325f17b710fSchristos 326f17b710fSchristos TEST_ASSERT_EQUAL(E, r); 327f17b710fSchristos } 3284c290c01Schristos 3294c290c01Schristos return; 330f17b710fSchristos } 331f17b710fSchristos 332a6f3f22fSchristos 333a6f3f22fSchristos void 3344c290c01Schristos test_CmpFracLT(void) 3354c290c01Schristos { 336f17b710fSchristos // fraction a less fraction b 337f17b710fSchristos int i, j; 3384c290c01Schristos 339f17b710fSchristos for (i = -4; i <= 4; ++i) 340f17b710fSchristos for (j = -4; j <= 4; ++j) { 341f17b710fSchristos struct timeval a = timeval_init(i, 200); 342f17b710fSchristos struct timeval b = timeval_init(j, 999800); 343f17b710fSchristos int E = (i > j) - (i <= j); 344f17b710fSchristos int r = cmp_tval_denorm(a, b); 345f17b710fSchristos 346f17b710fSchristos TEST_ASSERT_EQUAL(E, r); 347f17b710fSchristos } 3484c290c01Schristos 3494c290c01Schristos return; 350f17b710fSchristos } 351f17b710fSchristos 352f17b710fSchristos //---------------------------------------------------------------------- 353f17b710fSchristos // Test addition (sum) 354f17b710fSchristos //---------------------------------------------------------------------- 355f17b710fSchristos 356a6f3f22fSchristos void 3574c290c01Schristos test_AddFullNorm(void) 3584c290c01Schristos { 359f17b710fSchristos int i, j; 3604c290c01Schristos 361f17b710fSchristos for (i = -4; i <= 4; ++i) 362f17b710fSchristos for (j = -4; j <= 4; ++j) { 363f17b710fSchristos struct timeval a = timeval_init(i, 200); 364f17b710fSchristos struct timeval b = timeval_init(j, 400); 365f17b710fSchristos struct timeval E = timeval_init(i + j, 200 + 400); 366f17b710fSchristos struct timeval c; 367f17b710fSchristos 368f17b710fSchristos c = add_tval(a, b); 369f17b710fSchristos TEST_ASSERT_EQUAL_timeval(E, c); 370f17b710fSchristos } 3714c290c01Schristos 3724c290c01Schristos return; 373f17b710fSchristos } 374f17b710fSchristos 375a6f3f22fSchristos 376a6f3f22fSchristos void 3774c290c01Schristos test_AddFullOflow1(void) 3784c290c01Schristos { 379f17b710fSchristos int i, j; 3804c290c01Schristos 381f17b710fSchristos for (i = -4; i <= 4; ++i) 382f17b710fSchristos for (j = -4; j <= 4; ++j) { 383f17b710fSchristos struct timeval a = timeval_init(i, 200); 384f17b710fSchristos struct timeval b = timeval_init(j, 999900); 385f17b710fSchristos struct timeval E = timeval_init(i + j + 1, 100); 386f17b710fSchristos struct timeval c; 387f17b710fSchristos 388f17b710fSchristos c = add_tval(a, b); 389f17b710fSchristos TEST_ASSERT_EQUAL_timeval(E, c); 390f17b710fSchristos } 3914c290c01Schristos 3924c290c01Schristos return; 393f17b710fSchristos } 394f17b710fSchristos 395a6f3f22fSchristos 396a6f3f22fSchristos void 3974c290c01Schristos test_AddUsecNorm(void) 3984c290c01Schristos { 399f17b710fSchristos int i; 4004c290c01Schristos 401f17b710fSchristos for (i = -4; i <= 4; ++i) { 402f17b710fSchristos struct timeval a = timeval_init(i, 200); 403f17b710fSchristos struct timeval E = timeval_init(i, 600); 404f17b710fSchristos struct timeval c; 405f17b710fSchristos 406f17b710fSchristos c = add_tval_us(a, 600 - 200); 407f17b710fSchristos TEST_ASSERT_EQUAL_timeval(E, c); 408f17b710fSchristos } 4094c290c01Schristos 4104c290c01Schristos return; 411f17b710fSchristos } 412f17b710fSchristos 413a6f3f22fSchristos 414a6f3f22fSchristos void 4154c290c01Schristos test_AddUsecOflow1(void) 4164c290c01Schristos { 417f17b710fSchristos int i; 4184c290c01Schristos 419f17b710fSchristos for (i = -4; i <= 4; ++i) { 420f17b710fSchristos struct timeval a = timeval_init(i, 200); 421f17b710fSchristos struct timeval E = timeval_init(i + 1, 100); 422f17b710fSchristos struct timeval c; 423f17b710fSchristos 424f17b710fSchristos c = add_tval_us(a, MICROSECONDS - 100); 425f17b710fSchristos TEST_ASSERT_EQUAL_timeval(E, c); 426f17b710fSchristos } 4274c290c01Schristos 4284c290c01Schristos return; 429f17b710fSchristos } 430f17b710fSchristos 431f17b710fSchristos //---------------------------------------------------------------------- 432f17b710fSchristos // test subtraction (difference) 433f17b710fSchristos //---------------------------------------------------------------------- 434f17b710fSchristos 435a6f3f22fSchristos void 4364c290c01Schristos test_SubFullNorm(void) 4374c290c01Schristos { 438f17b710fSchristos int i, j; 4394c290c01Schristos 440f17b710fSchristos for (i = -4; i <= 4; ++i) 441f17b710fSchristos for (j = -4; j <= 4; ++j) { 442f17b710fSchristos struct timeval a = timeval_init(i, 600); 443f17b710fSchristos struct timeval b = timeval_init(j, 400); 444f17b710fSchristos struct timeval E = timeval_init(i - j, 600 - 400); 445f17b710fSchristos struct timeval c; 446f17b710fSchristos 447f17b710fSchristos c = sub_tval(a, b); 448f17b710fSchristos TEST_ASSERT_EQUAL_timeval(E, c); 449f17b710fSchristos } 4504c290c01Schristos 4514c290c01Schristos return; 452f17b710fSchristos } 453f17b710fSchristos 454a6f3f22fSchristos 455a6f3f22fSchristos void 4564c290c01Schristos test_SubFullOflow(void) 4574c290c01Schristos { 458f17b710fSchristos int i, j; 4594c290c01Schristos 460f17b710fSchristos for (i = -4; i <= 4; ++i) 461f17b710fSchristos for (j = -4; j <= 4; ++j) { 462f17b710fSchristos struct timeval a = timeval_init(i, 100); 463f17b710fSchristos struct timeval b = timeval_init(j, 999900); 464f17b710fSchristos struct timeval E = timeval_init(i - j - 1, 200); 465f17b710fSchristos struct timeval c; 466f17b710fSchristos 467f17b710fSchristos c = sub_tval(a, b); 468f17b710fSchristos TEST_ASSERT_EQUAL_timeval(E, c); 469f17b710fSchristos } 4704c290c01Schristos 4714c290c01Schristos return; 472f17b710fSchristos } 473f17b710fSchristos 474a6f3f22fSchristos 475a6f3f22fSchristos void 4764c290c01Schristos test_SubUsecNorm(void) 4774c290c01Schristos { 478f17b710fSchristos int i = -4; 4794c290c01Schristos 480f17b710fSchristos for (i = -4; i <= 4; ++i) { 481f17b710fSchristos struct timeval a = timeval_init(i, 600); 482f17b710fSchristos struct timeval E = timeval_init(i, 200); 483f17b710fSchristos struct timeval c; 484f17b710fSchristos 485f17b710fSchristos c = sub_tval_us(a, 600 - 200); 486f17b710fSchristos TEST_ASSERT_EQUAL_timeval(E, c); 487f17b710fSchristos } 4884c290c01Schristos 4894c290c01Schristos return; 490f17b710fSchristos } 491f17b710fSchristos 492a6f3f22fSchristos 493a6f3f22fSchristos void 4944c290c01Schristos test_SubUsecOflow(void) 4954c290c01Schristos { 496f17b710fSchristos int i = -4; 4974c290c01Schristos 498f17b710fSchristos for (i = -4; i <= 4; ++i) { 499f17b710fSchristos struct timeval a = timeval_init(i, 100); 500f17b710fSchristos struct timeval E = timeval_init(i - 1, 200); 501f17b710fSchristos struct timeval c; 502f17b710fSchristos 503f17b710fSchristos c = sub_tval_us(a, MICROSECONDS - 100); 504f17b710fSchristos TEST_ASSERT_EQUAL_timeval(E, c); 505f17b710fSchristos } 5064c290c01Schristos 5074c290c01Schristos return; 508f17b710fSchristos } 509f17b710fSchristos 510f17b710fSchristos //---------------------------------------------------------------------- 511f17b710fSchristos // test negation 512f17b710fSchristos //---------------------------------------------------------------------- 513f17b710fSchristos 514a6f3f22fSchristos void 5154c290c01Schristos test_Neg(void) 5164c290c01Schristos { 517f17b710fSchristos int i = -4; 5184c290c01Schristos 519f17b710fSchristos for (i = -4; i <= 4; ++i) { 520f17b710fSchristos struct timeval a = timeval_init(i, 100); 521f17b710fSchristos struct timeval b; 522f17b710fSchristos struct timeval c; 523f17b710fSchristos 524f17b710fSchristos b = neg_tval(a); 525f17b710fSchristos c = add_tval(a, b); 526f17b710fSchristos TEST_ASSERT_EQUAL(0, test_tval(c)); 527f17b710fSchristos } 5284c290c01Schristos 5294c290c01Schristos return; 530f17b710fSchristos } 531f17b710fSchristos 532f17b710fSchristos //---------------------------------------------------------------------- 533f17b710fSchristos // test abs value 534f17b710fSchristos //---------------------------------------------------------------------- 535f17b710fSchristos 536a6f3f22fSchristos void 5374c290c01Schristos test_AbsNoFrac(void) 5384c290c01Schristos { 539f17b710fSchristos int i = -4; 5404c290c01Schristos 541f17b710fSchristos for (i = -4; i <= 4; ++i) { 542f17b710fSchristos struct timeval a = timeval_init(i, 0); 543f17b710fSchristos struct timeval b; 544f17b710fSchristos 545f17b710fSchristos b = abs_tval(a); 546f17b710fSchristos TEST_ASSERT_EQUAL((i != 0), test_tval(b)); 547f17b710fSchristos } 5484c290c01Schristos 5494c290c01Schristos return; 550f17b710fSchristos } 551f17b710fSchristos 552a6f3f22fSchristos 553a6f3f22fSchristos void 5544c290c01Schristos test_AbsWithFrac(void) 5554c290c01Schristos { 556f17b710fSchristos int i = -4; 5574c290c01Schristos 558f17b710fSchristos for (i = -4; i <= 4; ++i) { 559f17b710fSchristos struct timeval a = timeval_init(i, 100); 560f17b710fSchristos struct timeval b; 561f17b710fSchristos 562f17b710fSchristos b = abs_tval(a); 563f17b710fSchristos TEST_ASSERT_EQUAL(1, test_tval(b)); 564f17b710fSchristos } 5654c290c01Schristos 5664c290c01Schristos return; 567f17b710fSchristos } 568f17b710fSchristos 569f17b710fSchristos // --------------------------------------------------------------------- 570f17b710fSchristos // test support stuff -- part 2 571f17b710fSchristos // --------------------------------------------------------------------- 572f17b710fSchristos 573f17b710fSchristos 574a6f3f22fSchristos void 5754c290c01Schristos test_Helpers2(void) 5764c290c01Schristos { 577f17b710fSchristos struct timeval limit = timeval_init(0, 2); 578f17b710fSchristos struct timeval x, y; 579f17b710fSchristos long i; 580f17b710fSchristos 581f17b710fSchristos for (x.tv_sec = -2; x.tv_sec < 3; x.tv_sec++) { 582f17b710fSchristos for (x.tv_usec = 1; 583f17b710fSchristos x.tv_usec < 1000000; 584f17b710fSchristos x.tv_usec += 499999) { 585a6f3f22fSchristos for (i = -4; i < 5; ++i) { 586f17b710fSchristos y = x; 587f17b710fSchristos y.tv_usec += i; 588f17b710fSchristos if (i >= -2 && i <= 2) { 589f17b710fSchristos TEST_ASSERT_TRUE(AssertTimevalClose(x, y, limit));//ASSERT_PRED_FORMAT2(isClose, x, y); 590f17b710fSchristos } 591f17b710fSchristos else { 592a6f3f22fSchristos TEST_ASSERT_FALSE(AssertTimevalClose(x, y, limit)); 593f17b710fSchristos } 594f17b710fSchristos } 595f17b710fSchristos } 596f17b710fSchristos } 5974c290c01Schristos 5984c290c01Schristos return; 599f17b710fSchristos } 600f17b710fSchristos 601f17b710fSchristos // and the global predicate instances we're using here 602f17b710fSchristos 603f17b710fSchristos //static l_fp lfpClose = l_fp_init(0, 1); //static AssertFpClose FpClose(0, 1); 604f17b710fSchristos //static struct timeval timevalClose = timeval_init(0, 1); //static AssertTimevalClose TimevalClose(0, 1); 605f17b710fSchristos 606f17b710fSchristos //---------------------------------------------------------------------- 607f17b710fSchristos // conversion to l_fp 608f17b710fSchristos //---------------------------------------------------------------------- 609f17b710fSchristos 610a6f3f22fSchristos void 6114c290c01Schristos test_ToLFPbittest(void) 6124c290c01Schristos { 613f17b710fSchristos l_fp lfpClose = l_fp_init(0, 1); 614f17b710fSchristos 615f17b710fSchristos u_int32 i = 0; 616a6f3f22fSchristos for (i = 0; i < 1000000; ++i) { 617f17b710fSchristos struct timeval a = timeval_init(1, i); 618f17b710fSchristos l_fp E = l_fp_init(1, my_tick_to_tsf(i)); 619f17b710fSchristos l_fp r; 620f17b710fSchristos 621f17b710fSchristos r = tval_intv_to_lfp(a); 622f17b710fSchristos TEST_ASSERT_TRUE(AssertFpClose(E, r, lfpClose)); //ASSERT_PRED_FORMAT2(FpClose, E, r); 623f17b710fSchristos } 6244c290c01Schristos 6254c290c01Schristos return; 626f17b710fSchristos } 627f17b710fSchristos 628f17b710fSchristos 629a6f3f22fSchristos void 6304c290c01Schristos test_ToLFPrelPos(void) 6314c290c01Schristos { 632f17b710fSchristos l_fp lfpClose = l_fp_init(0, 1); 633f17b710fSchristos int i = 0; 6344c290c01Schristos 635a6f3f22fSchristos for (i = 0; i < COUNTOF(fdata); ++i) { 636f17b710fSchristos struct timeval a = timeval_init(1, fdata[i].usec); 637f17b710fSchristos l_fp E = l_fp_init(1, fdata[i].frac); 638f17b710fSchristos l_fp r; 639f17b710fSchristos 640f17b710fSchristos r = tval_intv_to_lfp(a); 641a6f3f22fSchristos TEST_ASSERT_TRUE(AssertFpClose(E, r, lfpClose)); 642f17b710fSchristos } 6434c290c01Schristos 6444c290c01Schristos return; 645f17b710fSchristos } 646f17b710fSchristos 647a6f3f22fSchristos 648a6f3f22fSchristos void 6494c290c01Schristos test_ToLFPrelNeg(void) 6504c290c01Schristos { 651f17b710fSchristos l_fp lfpClose = l_fp_init(0, 1); 652f17b710fSchristos int i = 0; 6534c290c01Schristos 654a6f3f22fSchristos for (i = 0; i < COUNTOF(fdata); ++i) { 655f17b710fSchristos struct timeval a = timeval_init(-1, fdata[i].usec); 656f17b710fSchristos l_fp E = l_fp_init(~0, fdata[i].frac); 657f17b710fSchristos l_fp r; 658f17b710fSchristos 659f17b710fSchristos r = tval_intv_to_lfp(a); 660a6f3f22fSchristos TEST_ASSERT_TRUE(AssertFpClose(E, r, lfpClose)); 661f17b710fSchristos } 6624c290c01Schristos 6634c290c01Schristos return; 664f17b710fSchristos } 665f17b710fSchristos 666a6f3f22fSchristos 667a6f3f22fSchristos void 6684c290c01Schristos test_ToLFPabs(void) 6694c290c01Schristos { 670f17b710fSchristos l_fp lfpClose = l_fp_init(0, 1); 671f17b710fSchristos int i = 0; 6724c290c01Schristos 673a6f3f22fSchristos for (i = 0; i < COUNTOF(fdata); ++i) { 674f17b710fSchristos struct timeval a = timeval_init(1, fdata[i].usec); 675f17b710fSchristos l_fp E = l_fp_init(1 + JAN_1970, fdata[i].frac); 676f17b710fSchristos l_fp r; 677f17b710fSchristos 678f17b710fSchristos r = tval_stamp_to_lfp(a); 679a6f3f22fSchristos TEST_ASSERT_TRUE(AssertFpClose(E, r, lfpClose)); 680f17b710fSchristos } 6814c290c01Schristos 6824c290c01Schristos return; 683f17b710fSchristos } 684f17b710fSchristos 685f17b710fSchristos //---------------------------------------------------------------------- 686f17b710fSchristos // conversion from l_fp 687f17b710fSchristos //---------------------------------------------------------------------- 688f17b710fSchristos 689a6f3f22fSchristos void 6904c290c01Schristos test_FromLFPbittest(void) 6914c290c01Schristos { 692f17b710fSchristos struct timeval timevalClose = timeval_init(0, 1); 693f17b710fSchristos // Not *exactly* a bittest, because 2**32 tests would take a 694f17b710fSchristos // really long time even on very fast machines! So we do test 695f17b710fSchristos // every 1000 fractional units. 696f17b710fSchristos u_int32 tsf = 0; 6974c290c01Schristos 698f17b710fSchristos for (tsf = 0; tsf < ~((u_int32)(1000)); tsf += 1000) { 699f17b710fSchristos struct timeval E = timeval_init(1, my_tsf_to_tick(tsf)); 700f17b710fSchristos l_fp a = l_fp_init(1, tsf); 701f17b710fSchristos struct timeval r; 702f17b710fSchristos 703f17b710fSchristos r = lfp_intv_to_tval(a); 704f17b710fSchristos // The conversion might be off by one microsecond when 705f17b710fSchristos // comparing to calculated value. 706a6f3f22fSchristos TEST_ASSERT_TRUE(AssertTimevalClose(E, r, timevalClose)); 707f17b710fSchristos } 7084c290c01Schristos 7094c290c01Schristos return; 710f17b710fSchristos } 711f17b710fSchristos 712a6f3f22fSchristos 713a6f3f22fSchristos void 7144c290c01Schristos test_FromLFPrelPos(void) 7154c290c01Schristos { 716f17b710fSchristos struct timeval timevalClose = timeval_init(0, 1); 717f17b710fSchristos int i = 0; 7184c290c01Schristos 719a6f3f22fSchristos for (i = 0; i < COUNTOF(fdata); ++i) { 720f17b710fSchristos l_fp a = l_fp_init(1, fdata[i].frac); 721f17b710fSchristos struct timeval E = timeval_init(1, fdata[i].usec); 722f17b710fSchristos struct timeval r; 723f17b710fSchristos 724f17b710fSchristos r = lfp_intv_to_tval(a); 725a6f3f22fSchristos TEST_ASSERT_TRUE(AssertTimevalClose(E, r, timevalClose)); 726f17b710fSchristos } 7274c290c01Schristos 7284c290c01Schristos return; 729f17b710fSchristos } 730f17b710fSchristos 731a6f3f22fSchristos 732a6f3f22fSchristos void 7334c290c01Schristos test_FromLFPrelNeg(void) 7344c290c01Schristos { 735f17b710fSchristos struct timeval timevalClose = timeval_init(0, 1); 736f17b710fSchristos int i = 0; 7374c290c01Schristos 738a6f3f22fSchristos for (i = 0; i < COUNTOF(fdata); ++i) { 739f17b710fSchristos l_fp a = l_fp_init(~0, fdata[i].frac); 740f17b710fSchristos struct timeval E = timeval_init(-1, fdata[i].usec); 741f17b710fSchristos struct timeval r; 742f17b710fSchristos 743f17b710fSchristos r = lfp_intv_to_tval(a); 744a6f3f22fSchristos TEST_ASSERT_TRUE(AssertTimevalClose(E, r, timevalClose)); 745f17b710fSchristos } 7464c290c01Schristos 7474c290c01Schristos return; 748f17b710fSchristos } 749f17b710fSchristos 750a6f3f22fSchristos 751f17b710fSchristos // usec -> frac -> usec roundtrip, using a prime start and increment 752a6f3f22fSchristos void 7534c290c01Schristos test_LFProundtrip(void) 7544c290c01Schristos { 755f17b710fSchristos int32_t t = -1; 756f17b710fSchristos u_int32 i = 5; 7574c290c01Schristos 758f17b710fSchristos for (t = -1; t < 2; ++t) 759f17b710fSchristos for (i = 5; i < 1000000; i += 11) { 760f17b710fSchristos struct timeval E = timeval_init(t, i); 761f17b710fSchristos l_fp a; 762f17b710fSchristos struct timeval r; 763f17b710fSchristos 764f17b710fSchristos a = tval_intv_to_lfp(E); 765f17b710fSchristos r = lfp_intv_to_tval(a); 766f17b710fSchristos TEST_ASSERT_EQUAL_timeval(E, r); 767f17b710fSchristos } 7684c290c01Schristos 7694c290c01Schristos return; 770f17b710fSchristos } 771f17b710fSchristos 772f17b710fSchristos //---------------------------------------------------------------------- 773f17b710fSchristos // string formatting 774f17b710fSchristos //---------------------------------------------------------------------- 775f17b710fSchristos 776a6f3f22fSchristos void 7774c290c01Schristos test_ToString(void) 7784c290c01Schristos { 779f17b710fSchristos static const struct { 780f17b710fSchristos time_t sec; 781f17b710fSchristos long usec; 782f17b710fSchristos const char * repr; 783f17b710fSchristos } data [] = { 784f17b710fSchristos { 0, 0, "0.000000" }, 785f17b710fSchristos { 2, 0, "2.000000" }, 786f17b710fSchristos {-2, 0, "-2.000000" }, 787f17b710fSchristos { 0, 1, "0.000001" }, 788f17b710fSchristos { 0,-1, "-0.000001" }, 789f17b710fSchristos { 1,-1, "0.999999" }, 790f17b710fSchristos {-1, 1, "-0.999999" }, 791f17b710fSchristos {-1,-1, "-1.000001" }, 792f17b710fSchristos }; 793f17b710fSchristos int i; 7944c290c01Schristos 795f17b710fSchristos for (i = 0; i < COUNTOF(data); ++i) { 796f17b710fSchristos struct timeval a = timeval_init(data[i].sec, data[i].usec); 797a6f3f22fSchristos const char * E = data[i].repr; 798f17b710fSchristos const char * r = tvaltoa(a); 799f17b710fSchristos 800f17b710fSchristos TEST_ASSERT_EQUAL_STRING(E, r); 801f17b710fSchristos } 8024c290c01Schristos 8034c290c01Schristos return; 804f17b710fSchristos } 805f17b710fSchristos 806f17b710fSchristos // -*- EOF -*- 807