xref: /netbsd-src/external/bsd/ntp/dist/tests/libntp/timevalops.c (revision eabc0478de71e4e011a5b4e0392741e01d491794)
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