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