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