Home | History | Annotate | Line # | Download | only in libntp
timespecops.c revision 1.1.1.3
      1  1.1.1.2  christos /*	$NetBSD: timespecops.c,v 1.1.1.3 2015/10/23 17:47:45 christos Exp $	*/
      2  1.1.1.2  christos 
      3      1.1  christos #include "config.h"
      4      1.1  christos 
      5      1.1  christos #include "ntp_types.h"
      6      1.1  christos #include "ntp_fp.h"
      7      1.1  christos #include "timespecops.h"
      8      1.1  christos 
      9      1.1  christos #include "unity.h"
     10      1.1  christos 
     11  1.1.1.3  christos #include <math.h>
     12      1.1  christos #include <string.h>
     13      1.1  christos 
     14  1.1.1.3  christos 
     15      1.1  christos #define TEST_ASSERT_EQUAL_timespec(a, b) { \
     16      1.1  christos     TEST_ASSERT_EQUAL_MESSAGE(a.tv_sec, b.tv_sec, "Field tv_sec"); \
     17      1.1  christos     TEST_ASSERT_EQUAL_MESSAGE(a.tv_nsec, b.tv_nsec, "Field tv_nsec");	\
     18      1.1  christos }
     19      1.1  christos 
     20  1.1.1.3  christos 
     21      1.1  christos #define TEST_ASSERT_EQUAL_l_fp(a, b) { \
     22      1.1  christos     TEST_ASSERT_EQUAL_MESSAGE(a.l_i, b.l_i, "Field l_i"); \
     23      1.1  christos     TEST_ASSERT_EQUAL_UINT_MESSAGE(a.l_uf, b.l_uf, "Field l_uf");	\
     24      1.1  christos }
     25      1.1  christos 
     26      1.1  christos 
     27      1.1  christos static u_int32 my_tick_to_tsf(u_int32 ticks);
     28      1.1  christos static u_int32 my_tsf_to_tick(u_int32 tsf);
     29      1.1  christos 
     30  1.1.1.3  christos 
     31      1.1  christos // that's it...
     32      1.1  christos struct lfpfracdata {
     33      1.1  christos 	long	nsec;
     34      1.1  christos 	u_int32 frac;
     35      1.1  christos };
     36      1.1  christos 
     37  1.1.1.3  christos 
     38  1.1.1.3  christos void test_Helpers1(void);
     39  1.1.1.3  christos void test_Normalise(void);
     40  1.1.1.3  christos void test_SignNoFrac(void);
     41  1.1.1.3  christos void test_SignWithFrac(void);
     42  1.1.1.3  christos void test_CmpFracEQ(void);
     43  1.1.1.3  christos void test_CmpFracGT(void);
     44  1.1.1.3  christos void test_CmpFracLT(void);
     45  1.1.1.3  christos void test_AddFullNorm(void);
     46  1.1.1.3  christos void test_AddFullOflow1(void);
     47  1.1.1.3  christos void test_AddNsecNorm(void);
     48  1.1.1.3  christos void test_AddNsecOflow1(void);
     49  1.1.1.3  christos void test_SubFullNorm(void);
     50  1.1.1.3  christos void test_SubFullOflow(void);
     51  1.1.1.3  christos void test_SubNsecNorm(void);
     52  1.1.1.3  christos void test_SubNsecOflow(void);
     53  1.1.1.3  christos void test_Neg(void);
     54  1.1.1.3  christos void test_AbsNoFrac(void);
     55  1.1.1.3  christos void test_AbsWithFrac(void);
     56  1.1.1.3  christos void test_Helpers2(void);
     57  1.1.1.3  christos void test_ToLFPbittest(void);
     58  1.1.1.3  christos void test_ToLFPrelPos(void);
     59  1.1.1.3  christos void test_ToLFPrelNeg(void);
     60  1.1.1.3  christos void test_ToLFPabs(void);
     61  1.1.1.3  christos void test_FromLFPbittest(void);
     62  1.1.1.3  christos void test_FromLFPrelPos(void);
     63  1.1.1.3  christos void test_FromLFPrelNeg(void);
     64  1.1.1.3  christos void test_LFProundtrip(void);
     65  1.1.1.3  christos void test_ToString(void);
     66  1.1.1.3  christos 
     67  1.1.1.3  christos typedef int bool;
     68  1.1.1.3  christos 
     69  1.1.1.3  christos const bool timespec_isValid(struct timespec V);
     70  1.1.1.3  christos struct timespec timespec_init(time_t hi, long lo);
     71  1.1.1.3  christos l_fp l_fp_init(int32 i, u_int32 f);
     72  1.1.1.3  christos bool AssertFpClose(const l_fp m, const l_fp n, const l_fp limit);
     73  1.1.1.3  christos bool AssertTimespecClose(const struct timespec m, const struct timespec n, const struct timespec limit);
     74  1.1.1.3  christos 
     75  1.1.1.3  christos 
     76      1.1  christos //******************************************MY CUSTOM FUNCTIONS*******************************
     77      1.1  christos 
     78      1.1  christos 
     79      1.1  christos 
     80  1.1.1.3  christos const bool
     81  1.1.1.3  christos timespec_isValid(struct timespec V) {
     82  1.1.1.3  christos 	return V.tv_nsec >= 0 && V.tv_nsec < 1000000000;
     83  1.1.1.3  christos }
     84  1.1.1.3  christos 
     85  1.1.1.3  christos 
     86  1.1.1.3  christos struct timespec
     87  1.1.1.3  christos timespec_init(time_t hi, long lo) {
     88      1.1  christos 	struct timespec V;
     89      1.1  christos 	V.tv_sec = hi;
     90      1.1  christos 	V.tv_nsec = lo;
     91      1.1  christos 	return V;
     92      1.1  christos }
     93      1.1  christos 
     94  1.1.1.3  christos 
     95  1.1.1.3  christos l_fp
     96  1.1.1.3  christos l_fp_init(int32 i, u_int32 f) {
     97      1.1  christos 	l_fp temp;
     98      1.1  christos 	temp.l_i  = i;
     99      1.1  christos 	temp.l_uf = f;
    100      1.1  christos 
    101      1.1  christos 	return temp;
    102      1.1  christos }
    103      1.1  christos 
    104  1.1.1.3  christos 
    105  1.1.1.3  christos bool
    106  1.1.1.3  christos AssertFpClose(const l_fp m, const l_fp n, const l_fp limit) {
    107      1.1  christos 	l_fp diff;
    108      1.1  christos 
    109      1.1  christos 	if (L_ISGEQ(&m, &n)) {
    110      1.1  christos 		diff = m;
    111      1.1  christos 		L_SUB(&diff, &n);
    112      1.1  christos 	} else {
    113      1.1  christos 		diff = n;
    114      1.1  christos 		L_SUB(&diff, &m);
    115      1.1  christos 	}
    116      1.1  christos 	if (L_ISGEQ(&limit, &diff)){
    117      1.1  christos 		return TRUE;
    118      1.1  christos 	}
    119      1.1  christos 	else {
    120  1.1.1.3  christos 		printf("m_expr which is %s \nand\nn_expr which is %s\nare not close; diff=%susec\n", lfptoa(&m, 10), lfptoa(&n, 10), lfptoa(&diff, 10));
    121      1.1  christos 		return FALSE;
    122      1.1  christos 	}
    123      1.1  christos }
    124      1.1  christos 
    125      1.1  christos 
    126  1.1.1.3  christos bool
    127  1.1.1.3  christos AssertTimespecClose(const struct timespec m, const struct timespec n, const struct timespec limit) {
    128      1.1  christos 	struct timespec diff;
    129      1.1  christos 
    130      1.1  christos 	diff = abs_tspec(sub_tspec(m, n));
    131      1.1  christos 	if (cmp_tspec(limit, diff) >= 0)
    132      1.1  christos 		return TRUE;
    133      1.1  christos 	else
    134      1.1  christos 	{
    135  1.1.1.3  christos 		printf("m_expr which is %ld.%lu \nand\nn_expr which is %ld.%lu\nare not close; diff=%ld.%lunsec\n", m.tv_sec, m.tv_nsec, n.tv_sec, n.tv_nsec, diff.tv_sec, diff.tv_nsec);
    136      1.1  christos 		return FALSE;
    137      1.1  christos 	}
    138      1.1  christos }
    139      1.1  christos 
    140      1.1  christos //-----------------------------------------------
    141      1.1  christos 
    142      1.1  christos static const struct lfpfracdata fdata[] = {
    143      1.1  christos 	{	  0, 0x00000000 }, {   2218896, 0x00916ae6 },
    144      1.1  christos 	{  16408100, 0x0433523d }, { 125000000, 0x20000000 },
    145      1.1  christos 	{ 250000000, 0x40000000 }, { 287455871, 0x4996b53d },
    146      1.1  christos 	{ 375000000, 0x60000000 }, { 500000000, 0x80000000 },
    147      1.1  christos 	{ 518978897, 0x84dbcd0e }, { 563730222, 0x90509fb3 },
    148      1.1  christos 	{ 563788007, 0x9054692c }, { 583289882, 0x95527c57 },
    149      1.1  christos 	{ 607074509, 0x9b693c2a }, { 625000000, 0xa0000000 },
    150      1.1  christos 	{ 645184059, 0xa52ac851 }, { 676497788, 0xad2ef583 },
    151      1.1  christos 	{ 678910895, 0xadcd1abb }, { 679569625, 0xadf84663 },
    152      1.1  christos 	{ 690926741, 0xb0e0932d }, { 705656483, 0xb4a5e73d },
    153      1.1  christos 	{ 723553854, 0xb93ad34c }, { 750000000, 0xc0000000 },
    154      1.1  christos 	{ 763550253, 0xc3780785 }, { 775284917, 0xc6791284 },
    155      1.1  christos 	{ 826190764, 0xd3813ce8 }, { 875000000, 0xe0000000 },
    156      1.1  christos 	{ 956805507, 0xf4f134a9 }, { 982570733, 0xfb89c16c }
    157      1.1  christos 	};
    158      1.1  christos 
    159      1.1  christos 
    160  1.1.1.3  christos u_int32
    161  1.1.1.3  christos my_tick_to_tsf(u_int32 ticks) {
    162      1.1  christos 	// convert nanoseconds to l_fp fractional units, using double
    163      1.1  christos 	// precision float calculations or, if available, 64bit integer
    164      1.1  christos 	// arithmetic. This should give the precise fraction, rounded to
    165      1.1  christos 	// the nearest representation.
    166      1.1  christos #ifdef HAVE_U_INT64
    167      1.1  christos 	return (u_int32)((( ((u_int64)(ticks)) << 32) + 500000000) / 1000000000);
    168      1.1  christos #else
    169      1.1  christos 	return (u_int32)((double(ticks)) * 4.294967296 + 0.5);
    170      1.1  christos #endif
    171      1.1  christos 	// And before you ask: if ticks >= 1000000000, the result is
    172      1.1  christos 	// truncated nonsense, so don't use it out-of-bounds.
    173      1.1  christos }
    174      1.1  christos 
    175  1.1.1.3  christos 
    176  1.1.1.3  christos u_int32
    177  1.1.1.3  christos my_tsf_to_tick(u_int32 tsf) {
    178      1.1  christos 	// Inverse operation: converts fraction to microseconds.
    179      1.1  christos #ifdef HAVE_U_INT64
    180      1.1  christos 	return (u_int32)(( ((u_int64)(tsf)) * 1000000000 + 0x80000000) >> 32);
    181      1.1  christos #else
    182      1.1  christos 	return (u_int32)(double(tsf) / 4.294967296 + 0.5);
    183      1.1  christos #endif
    184      1.1  christos 	// Beware: The result might be 10^9 due to rounding!
    185      1.1  christos }
    186      1.1  christos 
    187      1.1  christos 
    188      1.1  christos 
    189      1.1  christos // ---------------------------------------------------------------------
    190      1.1  christos // test support stuff -- part 1
    191      1.1  christos // ---------------------------------------------------------------------
    192      1.1  christos 
    193  1.1.1.3  christos void
    194  1.1.1.3  christos test_Helpers1(void) {
    195      1.1  christos 	struct timespec x;
    196      1.1  christos 
    197      1.1  christos 	for (x.tv_sec = -2; x.tv_sec < 3; x.tv_sec++) {
    198      1.1  christos 		x.tv_nsec = -1;
    199      1.1  christos 		TEST_ASSERT_FALSE(timespec_isValid(x));
    200      1.1  christos 		x.tv_nsec = 0;
    201      1.1  christos 		TEST_ASSERT_TRUE(timespec_isValid(x));
    202      1.1  christos 		x.tv_nsec = 999999999;
    203      1.1  christos 		TEST_ASSERT_TRUE(timespec_isValid(x));
    204      1.1  christos 		x.tv_nsec = 1000000000;
    205      1.1  christos 		TEST_ASSERT_FALSE(timespec_isValid(x));
    206      1.1  christos 	}
    207      1.1  christos }
    208      1.1  christos 
    209      1.1  christos 
    210      1.1  christos //----------------------------------------------------------------------
    211      1.1  christos // test normalisation
    212      1.1  christos //----------------------------------------------------------------------
    213      1.1  christos 
    214  1.1.1.3  christos void
    215  1.1.1.3  christos test_Normalise(void) {
    216      1.1  christos 	long ns;
    217      1.1  christos 	for ( ns = -2000000000; ns <= 2000000000; ns += 10000000) {
    218      1.1  christos 		struct timespec x = timespec_init(0, ns);
    219      1.1  christos 
    220      1.1  christos 		x = normalize_tspec(x);
    221      1.1  christos 		TEST_ASSERT_TRUE(timespec_isValid(x));
    222      1.1  christos 	}
    223      1.1  christos }
    224      1.1  christos 
    225      1.1  christos //----------------------------------------------------------------------
    226      1.1  christos // test classification
    227      1.1  christos //----------------------------------------------------------------------
    228      1.1  christos 
    229  1.1.1.3  christos void
    230  1.1.1.3  christos test_SignNoFrac(void) {
    231      1.1  christos 	// sign test, no fraction
    232      1.1  christos 	int i;
    233      1.1  christos 	for (i = -4; i <= 4; ++i) {
    234      1.1  christos 		struct timespec a = timespec_init(i, 0);
    235      1.1  christos 		int E = (i > 0) - (i < 0);
    236      1.1  christos 		int r = test_tspec(a);
    237      1.1  christos 
    238      1.1  christos 		TEST_ASSERT_EQUAL(E, r);
    239      1.1  christos 	}
    240      1.1  christos }
    241      1.1  christos 
    242  1.1.1.3  christos 
    243  1.1.1.3  christos void
    244  1.1.1.3  christos test_SignWithFrac(void) {
    245      1.1  christos 	// sign test, with fraction
    246      1.1  christos 	int i;
    247      1.1  christos 	for (i = -4; i <= 4; ++i) {
    248      1.1  christos 		struct timespec a = timespec_init(i, 10);
    249      1.1  christos 		int E = (i >= 0) - (i < 0);
    250      1.1  christos 		int r = test_tspec(a);
    251      1.1  christos 		TEST_ASSERT_EQUAL(E, r);
    252      1.1  christos 	}
    253      1.1  christos }
    254      1.1  christos 
    255      1.1  christos //----------------------------------------------------------------------
    256      1.1  christos // test compare
    257      1.1  christos //----------------------------------------------------------------------
    258  1.1.1.3  christos void
    259  1.1.1.3  christos test_CmpFracEQ(void) {
    260      1.1  christos 	// fractions are equal
    261  1.1.1.3  christos 	int i, j;
    262      1.1  christos 	for (i = -4; i <= 4; ++i)
    263      1.1  christos 		for (j = -4; j <= 4; ++j) {
    264      1.1  christos 			struct timespec a = timespec_init( i , 200);
    265      1.1  christos 			struct timespec b = timespec_init( j , 200);
    266      1.1  christos 			int   E = (i > j) - (i < j);
    267      1.1  christos 			int   r = cmp_tspec_denorm(a, b);
    268      1.1  christos 			TEST_ASSERT_EQUAL(E, r);
    269      1.1  christos 		}
    270      1.1  christos }
    271      1.1  christos 
    272  1.1.1.3  christos 
    273  1.1.1.3  christos void
    274  1.1.1.3  christos test_CmpFracGT(void) {
    275      1.1  christos 	// fraction a bigger fraction b
    276  1.1.1.3  christos 	int i, j;
    277      1.1  christos 	for (i = -4; i <= 4; ++i)
    278      1.1  christos 		for (j = -4; j <= 4; ++j) {
    279      1.1  christos 			struct timespec a = timespec_init(i, 999999800);
    280      1.1  christos 			struct timespec b = timespec_init(j, 200);
    281      1.1  christos 			int   E = (i >= j) - (i < j);
    282      1.1  christos 			int   r = cmp_tspec_denorm(a, b);
    283      1.1  christos 			TEST_ASSERT_EQUAL(E, r);
    284      1.1  christos 		}
    285      1.1  christos }
    286      1.1  christos 
    287  1.1.1.3  christos 
    288  1.1.1.3  christos void
    289  1.1.1.3  christos test_CmpFracLT(void) {
    290      1.1  christos 	// fraction a less fraction b
    291  1.1.1.3  christos 	int i, j;
    292      1.1  christos 	for (i = -4; i <= 4; ++i)
    293      1.1  christos 		for (j = -4; j <= 4; ++j) {
    294      1.1  christos 			struct timespec a = timespec_init(i, 200);
    295      1.1  christos 			struct timespec b = timespec_init(j, 999999800);
    296      1.1  christos 			int   E = (i > j) - (i <= j);
    297      1.1  christos 			int   r = cmp_tspec_denorm(a, b);
    298      1.1  christos 			TEST_ASSERT_EQUAL(E, r);
    299      1.1  christos 		}
    300      1.1  christos }
    301      1.1  christos 
    302      1.1  christos //----------------------------------------------------------------------
    303      1.1  christos // Test addition (sum)
    304      1.1  christos //----------------------------------------------------------------------
    305      1.1  christos 
    306  1.1.1.3  christos void
    307  1.1.1.3  christos test_AddFullNorm(void) {
    308  1.1.1.3  christos 	int i, j;
    309      1.1  christos 	for (i = -4; i <= 4; ++i)
    310      1.1  christos 		for (j = -4; j <= 4; ++j) {
    311      1.1  christos 			struct timespec a = timespec_init(i, 200);
    312      1.1  christos 			struct timespec b = timespec_init(j, 400);
    313      1.1  christos 			struct timespec E = timespec_init(i + j, 200 + 400);
    314      1.1  christos 			struct timespec c;
    315      1.1  christos 
    316      1.1  christos 			c = add_tspec(a, b);
    317      1.1  christos 			TEST_ASSERT_EQUAL_timespec(E, c);
    318      1.1  christos 		}
    319      1.1  christos }
    320      1.1  christos 
    321  1.1.1.3  christos 
    322  1.1.1.3  christos void
    323  1.1.1.3  christos test_AddFullOflow1(void) {
    324  1.1.1.3  christos 	int i, j;
    325      1.1  christos 	for (i = -4; i <= 4; ++i)
    326      1.1  christos 		for (j = -4; j <= 4; ++j) {
    327      1.1  christos 			struct timespec a = timespec_init(i, 200);
    328      1.1  christos 			struct timespec b = timespec_init(j, 999999900);
    329      1.1  christos 			struct timespec E = timespec_init(i + j + 1, 100);
    330      1.1  christos 			struct timespec c;
    331      1.1  christos 
    332      1.1  christos 			c = add_tspec(a, b);
    333      1.1  christos 			TEST_ASSERT_EQUAL_timespec(E, c);
    334      1.1  christos 		}
    335      1.1  christos }
    336      1.1  christos 
    337  1.1.1.3  christos 
    338  1.1.1.3  christos void
    339  1.1.1.3  christos test_AddNsecNorm(void) {
    340      1.1  christos 	int i;
    341      1.1  christos 	for (i = -4; i <= 4; ++i) {
    342      1.1  christos 		struct timespec a = timespec_init(i, 200);
    343      1.1  christos 		struct timespec E = timespec_init(i, 600);
    344      1.1  christos 		struct timespec c;
    345      1.1  christos 
    346      1.1  christos 		c = add_tspec_ns(a, 600 - 200);
    347      1.1  christos 		TEST_ASSERT_EQUAL_timespec(E, c);
    348      1.1  christos 	}
    349      1.1  christos }
    350      1.1  christos 
    351  1.1.1.3  christos 
    352  1.1.1.3  christos void
    353  1.1.1.3  christos test_AddNsecOflow1(void) {
    354      1.1  christos 	int i;
    355      1.1  christos 	for (i = -4; i <= 4; ++i) {
    356      1.1  christos 		struct timespec a = timespec_init(i, 200);
    357      1.1  christos 		struct timespec E = timespec_init(i + 1, 100);
    358      1.1  christos 		struct timespec c;
    359      1.1  christos 
    360      1.1  christos 		c = add_tspec_ns(a, NANOSECONDS - 100);
    361      1.1  christos 		TEST_ASSERT_EQUAL_timespec(E, c);
    362      1.1  christos 	}
    363      1.1  christos }
    364      1.1  christos 
    365      1.1  christos //----------------------------------------------------------------------
    366      1.1  christos // test subtraction (difference)
    367      1.1  christos //----------------------------------------------------------------------
    368      1.1  christos 
    369  1.1.1.3  christos void
    370  1.1.1.3  christos test_SubFullNorm(void) {
    371  1.1.1.3  christos 	int i, j;
    372      1.1  christos 	for (i = -4; i <= 4; ++i)
    373      1.1  christos 		for (j = -4; j <= 4; ++j) {
    374      1.1  christos 			struct timespec a = timespec_init( i , 600);
    375      1.1  christos 			struct timespec b = timespec_init( j , 400);
    376      1.1  christos 			struct timespec E = timespec_init(i-j, 200);
    377      1.1  christos 			struct timespec c;
    378      1.1  christos 
    379      1.1  christos 			c = sub_tspec(a, b);
    380      1.1  christos 			TEST_ASSERT_EQUAL_timespec(E, c);
    381      1.1  christos 		}
    382      1.1  christos }
    383      1.1  christos 
    384  1.1.1.3  christos 
    385  1.1.1.3  christos void
    386  1.1.1.3  christos test_SubFullOflow(void) {
    387  1.1.1.3  christos 	int i, j;
    388      1.1  christos 	for (i = -4; i <= 4; ++i)
    389      1.1  christos 		for (j = -4; j <= 4; ++j) {
    390  1.1.1.3  christos 			struct timespec a = timespec_init(i, 100);
    391  1.1.1.3  christos 			struct timespec b = timespec_init(j, 999999900);
    392  1.1.1.3  christos 			struct timespec E = timespec_init(i - j - 1, 200);
    393      1.1  christos 			struct timespec c;
    394      1.1  christos 
    395      1.1  christos 			c = sub_tspec(a, b);
    396      1.1  christos 			TEST_ASSERT_EQUAL_timespec(E, c);
    397      1.1  christos 		}
    398      1.1  christos }
    399      1.1  christos 
    400  1.1.1.3  christos 
    401  1.1.1.3  christos void
    402  1.1.1.3  christos test_SubNsecNorm(void) {
    403      1.1  christos 	int i;
    404      1.1  christos 	for (i = -4; i <= 4; ++i) {
    405      1.1  christos 		struct timespec a = timespec_init(i, 600);
    406      1.1  christos 		struct timespec E = timespec_init(i, 200);
    407      1.1  christos 		struct timespec c;
    408      1.1  christos 
    409      1.1  christos 		c = sub_tspec_ns(a, 600 - 200);
    410      1.1  christos 		TEST_ASSERT_EQUAL_timespec(E, c);
    411      1.1  christos 	}
    412      1.1  christos }
    413      1.1  christos 
    414  1.1.1.3  christos 
    415  1.1.1.3  christos void
    416  1.1.1.3  christos test_SubNsecOflow(void) {
    417      1.1  christos 	int i;
    418      1.1  christos 	for (i = -4; i <= 4; ++i) {
    419      1.1  christos 		struct timespec a = timespec_init( i , 100);
    420      1.1  christos 		struct timespec E = timespec_init(i-1, 200);
    421      1.1  christos 		struct timespec c;
    422      1.1  christos 
    423      1.1  christos 		c = sub_tspec_ns(a, NANOSECONDS - 100);
    424      1.1  christos 		TEST_ASSERT_EQUAL_timespec(E, c);
    425      1.1  christos 	}
    426      1.1  christos }
    427      1.1  christos 
    428      1.1  christos //----------------------------------------------------------------------
    429      1.1  christos // test negation
    430      1.1  christos //----------------------------------------------------------------------
    431      1.1  christos 
    432  1.1.1.3  christos 
    433  1.1.1.3  christos void
    434  1.1.1.3  christos test_Neg(void) {
    435      1.1  christos 	int i;
    436      1.1  christos 	for (i = -4; i <= 4; ++i) {
    437      1.1  christos 		struct timespec a = timespec_init(i, 100);
    438      1.1  christos 		struct timespec b;
    439      1.1  christos 		struct timespec c;
    440      1.1  christos 
    441      1.1  christos 		b = neg_tspec(a);
    442      1.1  christos 		c = add_tspec(a, b);
    443      1.1  christos 		TEST_ASSERT_EQUAL(0, test_tspec(c));
    444      1.1  christos 	}
    445      1.1  christos }
    446      1.1  christos 
    447      1.1  christos //----------------------------------------------------------------------
    448      1.1  christos // test abs value
    449      1.1  christos //----------------------------------------------------------------------
    450      1.1  christos 
    451  1.1.1.3  christos void
    452  1.1.1.3  christos test_AbsNoFrac(void) {
    453      1.1  christos 	int i;
    454      1.1  christos 	for (i = -4; i <= 4; ++i) {
    455      1.1  christos 		struct timespec a = timespec_init(i , 0);
    456      1.1  christos 		struct timespec b;
    457      1.1  christos 
    458      1.1  christos 		b = abs_tspec(a);
    459      1.1  christos 		TEST_ASSERT_EQUAL((i != 0), test_tspec(b));
    460      1.1  christos 	}
    461      1.1  christos }
    462      1.1  christos 
    463  1.1.1.3  christos 
    464  1.1.1.3  christos void
    465  1.1.1.3  christos test_AbsWithFrac(void) {
    466      1.1  christos 	int i;
    467      1.1  christos 	for (i = -4; i <= 4; ++i) {
    468      1.1  christos 		struct timespec a = timespec_init(i, 100);
    469      1.1  christos 		struct timespec b;
    470      1.1  christos 
    471      1.1  christos 		b = abs_tspec(a);
    472      1.1  christos 		TEST_ASSERT_EQUAL(1, test_tspec(b));
    473      1.1  christos 	}
    474      1.1  christos }
    475      1.1  christos 
    476      1.1  christos // ---------------------------------------------------------------------
    477      1.1  christos // test support stuff -- part 2
    478      1.1  christos // ---------------------------------------------------------------------
    479      1.1  christos 
    480  1.1.1.3  christos void
    481  1.1.1.3  christos test_Helpers2(void) {
    482  1.1.1.3  christos 	struct timespec limit = timespec_init(0, 2);
    483      1.1  christos 
    484      1.1  christos 	struct timespec x, y;
    485      1.1  christos 	long i;
    486      1.1  christos 
    487      1.1  christos 	for (x.tv_sec = -2; x.tv_sec < 3; x.tv_sec++)
    488      1.1  christos 		for (x.tv_nsec = 1;
    489      1.1  christos 		     x.tv_nsec < 1000000000;
    490      1.1  christos 		     x.tv_nsec += 499999999) {
    491  1.1.1.3  christos 			for (i = -4; i < 5; ++i) {
    492      1.1  christos 				y = x;
    493      1.1  christos 				y.tv_nsec += i;
    494      1.1  christos 				if (i >= -2 && i <= 2){
    495  1.1.1.3  christos 					TEST_ASSERT_TRUE(AssertTimespecClose(x, y, limit));
    496      1.1  christos 				}
    497      1.1  christos 				else
    498      1.1  christos 				{
    499  1.1.1.3  christos 					TEST_ASSERT_FALSE(AssertTimespecClose(x, y, limit));
    500      1.1  christos 				}
    501      1.1  christos 			}
    502      1.1  christos 		}
    503      1.1  christos }
    504      1.1  christos 
    505      1.1  christos //----------------------------------------------------------------------
    506      1.1  christos // conversion to l_fp
    507      1.1  christos //----------------------------------------------------------------------
    508      1.1  christos 
    509  1.1.1.3  christos void
    510  1.1.1.3  christos test_ToLFPbittest(void) {
    511  1.1.1.3  christos 	l_fp lfpClose =  l_fp_init(0, 1);
    512      1.1  christos 	u_int32 i;
    513      1.1  christos 	for (i = 0; i < 1000000000; i+=1000) {
    514      1.1  christos 		struct timespec a = timespec_init(1, i);
    515      1.1  christos 		l_fp E= l_fp_init(1, my_tick_to_tsf(i));
    516      1.1  christos 		l_fp r;
    517      1.1  christos 
    518      1.1  christos 		r = tspec_intv_to_lfp(a);
    519  1.1.1.3  christos 		TEST_ASSERT_TRUE(AssertFpClose(E, r, lfpClose));
    520      1.1  christos 	}
    521      1.1  christos }
    522      1.1  christos 
    523  1.1.1.3  christos 
    524  1.1.1.3  christos void
    525  1.1.1.3  christos test_ToLFPrelPos(void) {
    526      1.1  christos 	int i;
    527  1.1.1.3  christos 	for (i = 0; i < COUNTOF(fdata); ++i) {
    528      1.1  christos 		struct timespec a = timespec_init(1, fdata[i].nsec);
    529      1.1  christos 		l_fp E = l_fp_init(1, fdata[i].frac);
    530      1.1  christos 		l_fp r;
    531      1.1  christos 
    532      1.1  christos 		r = tspec_intv_to_lfp(a);
    533      1.1  christos 		TEST_ASSERT_EQUAL_l_fp(E, r);
    534      1.1  christos 	}
    535      1.1  christos }
    536      1.1  christos 
    537  1.1.1.3  christos 
    538  1.1.1.3  christos void
    539  1.1.1.3  christos test_ToLFPrelNeg(void) {
    540      1.1  christos 	int i;
    541  1.1.1.3  christos 	for (i = 0; i < COUNTOF(fdata); ++i) {
    542      1.1  christos 		struct timespec a = timespec_init(-1, fdata[i].nsec);
    543      1.1  christos 		l_fp E = l_fp_init(~0, fdata[i].frac);
    544      1.1  christos 		l_fp r;
    545      1.1  christos 
    546      1.1  christos 		r = tspec_intv_to_lfp(a);
    547      1.1  christos 		TEST_ASSERT_EQUAL_l_fp(E, r);
    548      1.1  christos 	}
    549      1.1  christos }
    550      1.1  christos 
    551  1.1.1.3  christos 
    552  1.1.1.3  christos void
    553  1.1.1.3  christos test_ToLFPabs(void) {
    554      1.1  christos 	int i;
    555  1.1.1.3  christos 	for (i = 0; i < COUNTOF(fdata); ++i) {
    556      1.1  christos 		struct timespec a = timespec_init(1, fdata[i].nsec);
    557      1.1  christos 		l_fp E = l_fp_init(1 + JAN_1970, fdata[i].frac);
    558      1.1  christos 		l_fp r;
    559      1.1  christos 
    560      1.1  christos 		r = tspec_stamp_to_lfp(a);
    561      1.1  christos 		TEST_ASSERT_EQUAL_l_fp(E, r);
    562      1.1  christos 	}
    563      1.1  christos }
    564      1.1  christos 
    565      1.1  christos //----------------------------------------------------------------------
    566      1.1  christos // conversion from l_fp
    567      1.1  christos //----------------------------------------------------------------------
    568  1.1.1.3  christos 
    569  1.1.1.3  christos void
    570  1.1.1.3  christos test_FromLFPbittest(void) {
    571  1.1.1.3  christos 	struct timespec limit = timespec_init(0, 2);
    572      1.1  christos 
    573      1.1  christos 	// Not *exactly* a bittest, because 2**32 tests would take a
    574      1.1  christos 	// really long time even on very fast machines! So we do test
    575      1.1  christos 	// every 1000 fractional units.
    576      1.1  christos 	u_int32 tsf;
    577      1.1  christos 	for (tsf = 0; tsf < ~((u_int32)(1000)); tsf += 1000) {
    578      1.1  christos 		struct timespec E = timespec_init(1, my_tsf_to_tick(tsf));
    579      1.1  christos 		l_fp a = l_fp_init(1, tsf);
    580      1.1  christos 		struct timespec r;
    581      1.1  christos 
    582      1.1  christos 		r = lfp_intv_to_tspec(a);
    583      1.1  christos 		// The conversion might be off by one nanosecond when
    584      1.1  christos 		// comparing to calculated value.
    585  1.1.1.3  christos 		TEST_ASSERT_TRUE(AssertTimespecClose(E, r, limit));
    586      1.1  christos 	}
    587      1.1  christos }
    588      1.1  christos 
    589  1.1.1.3  christos 
    590  1.1.1.3  christos void
    591  1.1.1.3  christos test_FromLFPrelPos(void) {
    592  1.1.1.3  christos 	struct timespec limit = timespec_init(0, 2);
    593      1.1  christos 	int i;
    594  1.1.1.3  christos 	for (i = 0; i < COUNTOF(fdata); ++i) {
    595      1.1  christos 		l_fp a = l_fp_init(1, fdata[i].frac);
    596      1.1  christos 		struct timespec E = timespec_init(1, fdata[i].nsec);
    597      1.1  christos 		struct timespec r;
    598      1.1  christos 
    599      1.1  christos 		r = lfp_intv_to_tspec(a);
    600  1.1.1.3  christos 		TEST_ASSERT_TRUE(AssertTimespecClose(E, r, limit));
    601      1.1  christos 	}
    602      1.1  christos }
    603      1.1  christos 
    604  1.1.1.3  christos 
    605  1.1.1.3  christos void
    606  1.1.1.3  christos test_FromLFPrelNeg(void) {
    607  1.1.1.3  christos 	struct timespec limit = timespec_init(0, 2);
    608      1.1  christos 	int i;
    609  1.1.1.3  christos 	for (i = 0; i < COUNTOF(fdata); ++i) {
    610      1.1  christos 		l_fp a = l_fp_init(~0, fdata[i].frac);
    611      1.1  christos 		struct timespec E = timespec_init(-1, fdata[i].nsec);
    612      1.1  christos 		struct timespec r;
    613      1.1  christos 
    614      1.1  christos 		r = lfp_intv_to_tspec(a);
    615  1.1.1.3  christos 		TEST_ASSERT_TRUE(AssertTimespecClose(E, r, limit));
    616      1.1  christos 	}
    617      1.1  christos }
    618      1.1  christos 
    619      1.1  christos 
    620      1.1  christos // nsec -> frac -> nsec roundtrip, using a prime start and increment
    621  1.1.1.3  christos void
    622  1.1.1.3  christos test_LFProundtrip(void) {
    623      1.1  christos 	int32_t t;
    624      1.1  christos 	u_int32 i;
    625      1.1  christos 	for (t = -1; t < 2; ++t)
    626  1.1.1.3  christos 		for (i = 4999; i < 1000000000; i += 10007) {
    627      1.1  christos 			struct timespec E = timespec_init(t, i);
    628      1.1  christos 			l_fp a;
    629      1.1  christos 			struct timespec r;
    630      1.1  christos 
    631      1.1  christos 			a = tspec_intv_to_lfp(E);
    632      1.1  christos 			r = lfp_intv_to_tspec(a);
    633      1.1  christos 			TEST_ASSERT_EQUAL_timespec(E, r);
    634      1.1  christos 		}
    635      1.1  christos }
    636      1.1  christos 
    637      1.1  christos //----------------------------------------------------------------------
    638      1.1  christos // string formatting
    639      1.1  christos //----------------------------------------------------------------------
    640      1.1  christos 
    641  1.1.1.3  christos void
    642  1.1.1.3  christos test_ToString(void) {
    643      1.1  christos 	static const struct {
    644      1.1  christos 		time_t		sec;
    645      1.1  christos 		long		nsec;
    646      1.1  christos 		const char *	repr;
    647      1.1  christos 	} data [] = {
    648      1.1  christos 		{ 0, 0,	 "0.000000000" },
    649      1.1  christos 		{ 2, 0,	 "2.000000000" },
    650      1.1  christos 		{-2, 0, "-2.000000000" },
    651      1.1  christos 		{ 0, 1,	 "0.000000001" },
    652      1.1  christos 		{ 0,-1,	"-0.000000001" },
    653      1.1  christos 		{ 1,-1,	 "0.999999999" },
    654      1.1  christos 		{-1, 1, "-0.999999999" },
    655      1.1  christos 		{-1,-1, "-1.000000001" },
    656      1.1  christos 	};
    657      1.1  christos 	int i;
    658  1.1.1.3  christos 	for (i = 0; i < COUNTOF(data); ++i) {
    659      1.1  christos 		struct timespec a = timespec_init(data[i].sec, data[i].nsec);
    660      1.1  christos 		const char * E = data[i].repr;
    661      1.1  christos 		const char * r = tspectoa(a);
    662      1.1  christos 		TEST_ASSERT_EQUAL_STRING(E, r);
    663      1.1  christos 	}
    664      1.1  christos }
    665      1.1  christos 
    666      1.1  christos // -*- EOF -*-
    667