1 /*        $NetBSD: vi64ops.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 "vint64ops.h"
7 
8 #include "unity.h"
9 
10 
11 int IsEqual(const vint64 expected, const vint64 actual);
12 void test_ParseVUI64_pos(void);
13 void test_ParseVUI64_neg(void);
14 void test_ParseVUI64_case(void);
15 
16 
17 // technically bool
18 int
IsEqual(const vint64 expected,const vint64 actual)19 IsEqual(const vint64 expected, const vint64 actual) {
20           if (0 == memcmp(&expected, &actual, sizeof(vint64))) {
21                     printf( "%x.", expected.D_s.hi);
22                     printf("%x", expected.D_s.lo);
23                     printf(" but was ");
24                     printf("%x.", actual.D_s.hi);
25                     printf("%x\n", actual.D_s.lo);
26                     return TRUE;
27           } else {
28                     printf("expected: ");
29                     printf( "%d.", expected.D_s.hi);
30                     printf("%d", expected.D_s.lo);
31                     printf(" but was ");
32                     printf("%d", actual.D_s.lo);
33                     printf("%d", actual.D_s.lo);
34                     return FALSE;
35           }
36 }
37 
38 // ----------------------------------------------------------------------
39 // test number parser
40 void
test_ParseVUI64_pos(void)41 test_ParseVUI64_pos(void) {
42           vint64 act, exp;
43           char *sp;
44           char *ep;
45 
46           sp         = "1234x";
47           exp.D_s.hi = 0;
48           exp.D_s.lo = 1234;
49           act        = strtouv64(sp, &ep, 0);
50 
51           TEST_ASSERT_TRUE(IsEqual(exp, act));
52           TEST_ASSERT_EQUAL(*ep, 'x');
53 }
54 
55 
56 void
test_ParseVUI64_neg(void)57 test_ParseVUI64_neg(void) {
58           vint64 act, exp;
59           char *sp;
60           char *ep;
61 
62           sp         = "-1234x";
63           exp.D_s.hi = ~0;
64           exp.D_s.lo = -1234;
65           act        = strtouv64(sp, &ep, 0);
66           TEST_ASSERT_TRUE(IsEqual(exp, act));
67           TEST_ASSERT_EQUAL(*ep, 'x');
68 }
69 
70 void
test_ParseVUI64_case(void)71 test_ParseVUI64_case(void) {
72           vint64 act, exp;
73           char *sp;
74           char *ep;
75 
76           sp         = "0123456789AbCdEf";
77           exp.D_s.hi = 0x01234567;
78           exp.D_s.lo = 0x89ABCDEF;
79           act        = strtouv64(sp, &ep, 16);
80           TEST_ASSERT_TRUE(IsEqual(exp, act));
81           TEST_ASSERT_EQUAL(*ep, '\0');
82 }
83