xref: /netbsd-src/external/bsd/ntp/dist/tests/libntp/strtolfp.c (revision eabc0478de71e4e011a5b4e0392741e01d491794)
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