1*cdfa2a7eSchristos /* $NetBSD: hextolfp.c,v 1.2 2020/05/25 20:47:36 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
11a6f3f22fSchristos void test_PositiveInteger(void);
12a6f3f22fSchristos void test_NegativeInteger(void);
13a6f3f22fSchristos void test_PositiveFraction(void);
14a6f3f22fSchristos void test_NegativeFraction(void);
15a6f3f22fSchristos void test_IllegalNumberOfInteger(void);
16a6f3f22fSchristos void test_IllegalChar(void);
17f17b710fSchristos
18a6f3f22fSchristos
19a6f3f22fSchristos void
test_PositiveInteger(void)20a6f3f22fSchristos test_PositiveInteger(void) {
21f17b710fSchristos const char *str = "00001000.00000000";
22f17b710fSchristos l_fp actual;
23f17b710fSchristos
24a6f3f22fSchristos l_fp expected = {{4096}, 0}; /* 16^3, no fraction part. */
25f17b710fSchristos
26f17b710fSchristos TEST_ASSERT_TRUE(hextolfp(str, &actual));
27f17b710fSchristos TEST_ASSERT_TRUE(IsEqual(expected, actual));
28f17b710fSchristos }
29f17b710fSchristos
30a6f3f22fSchristos void
test_NegativeInteger(void)31a6f3f22fSchristos test_NegativeInteger(void) {
32a6f3f22fSchristos const char *str = "ffffffff.00000000"; /* -1 decimal */
33f17b710fSchristos l_fp actual;
34f17b710fSchristos
35a6f3f22fSchristos l_fp expected = {{-1}, 0};
36f17b710fSchristos
37f17b710fSchristos TEST_ASSERT_TRUE(hextolfp(str, &actual));
38f17b710fSchristos TEST_ASSERT_TRUE(IsEqual(expected, actual));
39f17b710fSchristos }
40f17b710fSchristos
41a6f3f22fSchristos void
test_PositiveFraction(void)42a6f3f22fSchristos test_PositiveFraction(void) {
43a6f3f22fSchristos const char *str = "00002000.80000000"; /* 8196.5 decimal */
44f17b710fSchristos l_fp actual;
45f17b710fSchristos
46a6f3f22fSchristos l_fp expected = {{8192}, HALF};
47f17b710fSchristos
48f17b710fSchristos TEST_ASSERT_TRUE(hextolfp(str, &actual));
49f17b710fSchristos TEST_ASSERT_TRUE(IsEqual(expected, actual));
50f17b710fSchristos }
51f17b710fSchristos
52a6f3f22fSchristos void
test_NegativeFraction(void)53a6f3f22fSchristos test_NegativeFraction(void) {
54a6f3f22fSchristos const char *str = "ffffffff.40000000"; /* -1 + 0.25 decimal */
55f17b710fSchristos l_fp actual;
56f17b710fSchristos
57a6f3f22fSchristos l_fp expected = {{-1}, QUARTER}; /* -1 + 0.25 */
58f17b710fSchristos
59f17b710fSchristos TEST_ASSERT_TRUE(hextolfp(str, &actual));
60f17b710fSchristos TEST_ASSERT_TRUE(IsEqual(expected, actual));
61f17b710fSchristos }
62f17b710fSchristos
63a6f3f22fSchristos void
test_IllegalNumberOfInteger(void)64a6f3f22fSchristos test_IllegalNumberOfInteger(void) {
65a6f3f22fSchristos const char *str = "1000000.00000000"; /* Missing one digit in integral part. */
66f17b710fSchristos l_fp actual;
67f17b710fSchristos
68f17b710fSchristos TEST_ASSERT_FALSE(hextolfp(str, &actual));
69f17b710fSchristos }
70f17b710fSchristos
71a6f3f22fSchristos void
test_IllegalChar(void)72a6f3f22fSchristos test_IllegalChar(void) {
73a6f3f22fSchristos const char *str = "10000000.0000h000"; /* Illegal character h. */
74f17b710fSchristos l_fp actual;
75f17b710fSchristos
76f17b710fSchristos TEST_ASSERT_FALSE(hextolfp(str, &actual));
77f17b710fSchristos }
78