xref: /netbsd-src/external/bsd/ntp/dist/tests/libntp/strtolfp.c (revision eabc0478de71e4e011a5b4e0392741e01d491794)
1*eabc0478Schristos /*	$NetBSD: strtolfp.c,v 1.3 2024/08/18 20:47:27 christos Exp $	*/
2067f5680Schristos 
3f17b710fSchristos #include "config.h"
4f17b710fSchristos 
5f17b710fSchristos #include "ntp_stdlib.h"
6f17b710fSchristos #include "ntp_calendar.h"
7f17b710fSchristos 
8f17b710fSchristos #include "unity.h"
9f17b710fSchristos #include "lfptest.h"
10f17b710fSchristos 
11f17b710fSchristos /* This file tests both atolfp and mstolfp */
12f17b710fSchristos 
134c290c01Schristos void setUp(void);
14a6f3f22fSchristos void test_PositiveInteger(void);
15a6f3f22fSchristos void test_NegativeInteger(void);
16a6f3f22fSchristos void test_PositiveFraction(void);
17a6f3f22fSchristos void test_NegativeFraction(void);
18a6f3f22fSchristos void test_PositiveMsFraction(void);
19a6f3f22fSchristos void test_NegativeMsFraction(void);
20a6f3f22fSchristos void test_InvalidChars(void);
21a6f3f22fSchristos 
22a6f3f22fSchristos 
234c290c01Schristos void
244c290c01Schristos setUp(void)
254c290c01Schristos {
264c290c01Schristos 	init_lib();
274c290c01Schristos 
284c290c01Schristos 	return;
294c290c01Schristos }
304c290c01Schristos 
31*eabc0478Schristos static const char* fmtLFP(const l_fp *e, const l_fp *a)
32*eabc0478Schristos {
33*eabc0478Schristos     static char buf[100];
34*eabc0478Schristos     snprintf(buf, sizeof(buf), "e=$%08x.%08x, a=$%08x.%08x",
35*eabc0478Schristos 	     e->l_ui, e->l_uf, a->l_ui, a->l_uf);
36*eabc0478Schristos     return buf;
37*eabc0478Schristos }
384c290c01Schristos 
39f17b710fSchristos void test_PositiveInteger(void) {
40f17b710fSchristos 	const char *str = "500";
41f17b710fSchristos 	const char *str_ms = "500000";
42f17b710fSchristos 
43a6f3f22fSchristos 	l_fp expected = {{500},0};
44f17b710fSchristos 	l_fp actual, actual_ms;
45f17b710fSchristos 
46f17b710fSchristos 	TEST_ASSERT_TRUE(atolfp(str, &actual));
47f17b710fSchristos 	TEST_ASSERT_TRUE(mstolfp(str_ms, &actual_ms));
48f17b710fSchristos 
49*eabc0478Schristos 	TEST_ASSERT_TRUE_MESSAGE(IsEqual(expected, actual), fmtLFP(&expected, &actual));
50*eabc0478Schristos 	TEST_ASSERT_TRUE_MESSAGE(IsEqual(expected, actual_ms), fmtLFP(&expected, &actual_ms));
51f17b710fSchristos }
52f17b710fSchristos 
53f17b710fSchristos void test_NegativeInteger(void) {
54f17b710fSchristos 	const char *str = "-300";
55f17b710fSchristos 	const char *str_ms = "-300000";
56f17b710fSchristos 
57f17b710fSchristos 	l_fp expected;
58f17b710fSchristos 	expected.l_i = -300;
59f17b710fSchristos 	expected.l_uf = 0;
60f17b710fSchristos 
61f17b710fSchristos 	l_fp actual, actual_ms;
62f17b710fSchristos 
63f17b710fSchristos 	TEST_ASSERT_TRUE(atolfp(str, &actual));
64f17b710fSchristos 	TEST_ASSERT_TRUE(mstolfp(str_ms, &actual_ms));
65f17b710fSchristos 
66*eabc0478Schristos 	TEST_ASSERT_TRUE_MESSAGE(IsEqual(expected, actual), fmtLFP(&expected, &actual));
67*eabc0478Schristos 	TEST_ASSERT_TRUE_MESSAGE(IsEqual(expected, actual_ms), fmtLFP(&expected, &actual_ms));
68f17b710fSchristos }
69f17b710fSchristos 
70f17b710fSchristos void test_PositiveFraction(void) {
71f17b710fSchristos 	const char *str = "+500.5";
72f17b710fSchristos 	const char *str_ms = "500500.0";
73f17b710fSchristos 
74a6f3f22fSchristos 	l_fp expected = {{500}, HALF};
75f17b710fSchristos 	l_fp actual, actual_ms;
76f17b710fSchristos 
77f17b710fSchristos 	TEST_ASSERT_TRUE(atolfp(str, &actual));
78f17b710fSchristos 	TEST_ASSERT_TRUE(mstolfp(str_ms, &actual_ms));
79f17b710fSchristos 
80*eabc0478Schristos 	TEST_ASSERT_TRUE_MESSAGE(IsEqual(expected, actual), fmtLFP(&expected, &actual));
81*eabc0478Schristos 	TEST_ASSERT_TRUE_MESSAGE(IsEqual(expected, actual_ms), fmtLFP(&expected, &actual_ms));
82f17b710fSchristos }
83f17b710fSchristos 
84f17b710fSchristos void test_NegativeFraction(void) {
85f17b710fSchristos 	const char *str = "-300.75";
86f17b710fSchristos 	const char *str_ms = "-300750";
87f17b710fSchristos 
88f17b710fSchristos 	l_fp expected;
89f17b710fSchristos 	expected.l_i = -301;
90f17b710fSchristos 	expected.l_uf = QUARTER;
91f17b710fSchristos 
92f17b710fSchristos 	l_fp actual, actual_ms;
93f17b710fSchristos 
94f17b710fSchristos 	TEST_ASSERT_TRUE(atolfp(str, &actual));
95f17b710fSchristos 	TEST_ASSERT_TRUE(mstolfp(str_ms, &actual_ms));
96f17b710fSchristos 
97*eabc0478Schristos 	TEST_ASSERT_TRUE_MESSAGE(IsEqual(expected, actual), fmtLFP(&expected, &actual));
98*eabc0478Schristos 	TEST_ASSERT_TRUE_MESSAGE(IsEqual(expected, actual_ms), fmtLFP(&expected, &actual_ms));
99f17b710fSchristos }
100f17b710fSchristos 
101f17b710fSchristos void test_PositiveMsFraction(void) {
102f17b710fSchristos 	const char *str = "300.00025";
103f17b710fSchristos 	const char *str_ms = "300000.25";
104f17b710fSchristos 
105a6f3f22fSchristos 	l_fp expected = {{300}, QUARTER_PROMILLE_APPRX};
106f17b710fSchristos 	l_fp actual, actual_ms;
107f17b710fSchristos 
108f17b710fSchristos 
109f17b710fSchristos 	TEST_ASSERT_TRUE(atolfp(str, &actual));
110f17b710fSchristos 	TEST_ASSERT_TRUE(mstolfp(str_ms, &actual_ms));
111f17b710fSchristos 
112*eabc0478Schristos 	TEST_ASSERT_TRUE_MESSAGE(IsEqual(expected, actual), fmtLFP(&expected, &actual));
113*eabc0478Schristos 	TEST_ASSERT_TRUE_MESSAGE(IsEqual(expected, actual_ms), fmtLFP(&expected, &actual_ms));
114f17b710fSchristos }
115f17b710fSchristos 
116f17b710fSchristos void test_NegativeMsFraction(void) {
117f17b710fSchristos 	const char *str = "-199.99975";
118f17b710fSchristos 	const char *str_ms = "-199999.75";
119f17b710fSchristos 
120f17b710fSchristos 	l_fp expected;
121f17b710fSchristos 	expected.l_i = -200;
122f17b710fSchristos 	expected.l_uf = QUARTER_PROMILLE_APPRX;
123f17b710fSchristos 
124f17b710fSchristos 	l_fp actual, actual_ms;
125f17b710fSchristos 
126f17b710fSchristos 	TEST_ASSERT_TRUE(atolfp(str, &actual));
127f17b710fSchristos 	TEST_ASSERT_TRUE(mstolfp(str_ms, &actual_ms));
128f17b710fSchristos 
129*eabc0478Schristos 	TEST_ASSERT_TRUE_MESSAGE(IsEqual(expected, actual), fmtLFP(&expected, &actual));
130*eabc0478Schristos 	TEST_ASSERT_TRUE_MESSAGE(IsEqual(expected, actual_ms), fmtLFP(&expected, &actual_ms));
131f17b710fSchristos }
132f17b710fSchristos 
133f17b710fSchristos void test_InvalidChars(void) {
134f17b710fSchristos 	const char *str = "500.4a2";
135f17b710fSchristos 	l_fp actual, actual_ms;
136f17b710fSchristos 
137f17b710fSchristos 	TEST_ASSERT_FALSE(atolfp(str, &actual));
138f17b710fSchristos 	TEST_ASSERT_FALSE(mstolfp(str, &actual_ms));
139f17b710fSchristos }
140f17b710fSchristos 
141