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