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