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