1 /*
2  * PROJECT:         ReactOS API tests
3  * LICENSE:         GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4  * PURPOSE:         Tests for __i64tod/u64tod/i64tos/u64tos on ARM
5  * COPYRIGHT:       Copyright 2021 Stanislav Motylkov <x86corez@gmail.com>
6  */
7 
8 #include <apitest.h>
9 
10 typedef struct _I64TOD_TEST_DATA
11 {
12     long long given;
13     union
14     {
15         double value;
16         unsigned long long raw;
17     } expected;
18 } I64TOD_TEST_DATA;
19 
20 typedef struct _U64TOD_TEST_DATA
21 {
22     unsigned long long given;
23     union
24     {
25         double value;
26         unsigned long long raw;
27     } expected;
28 } U64TOD_TEST_DATA;
29 
30 typedef struct _I64TOS_TEST_DATA
31 {
32     long long given;
33     union
34     {
35         float value;
36         unsigned int raw;
37     } expected;
38 } I64TOS_TEST_DATA;
39 
40 typedef struct _U64TOS_TEST_DATA
41 {
42     unsigned long long given;
43     union
44     {
45         float value;
46         unsigned int raw;
47     } expected;
48 } U64TOS_TEST_DATA;
49 
50 START_TEST(__64tof)
51 {
52     I64TOD_TEST_DATA i64tod[] =
53     {
54         { 1383034209LL, 1383034209.0 }, /* test 32bit number */
55         { -1383034209LL, -1383034209.0 }, /* test negative 32bit number */
56         { 354056757614LL, 354056757614.0 }, /* test 64bit int */
57         { -354056757614LL, -354056757614.0 }, /* test negative 64bit int */
58         { 18446744073709550000LL, -1616.0 }, /* test 20bit in float */
59         { 0x8000000000000000LL, -9223372036854775800.0 }, /* test big 64bit int */
60         { 0xFFFFFFFFFFFFFFFFLL, -1.0 }, /* test -1 */
61         { 0LL, +0.0 }, /* test 0 */
62     };
63     U64TOD_TEST_DATA u64tod[] =
64     {
65         { 1383034209ULL, 1383034209.0 }, /* test 32bit number */
66         { 354056757614ULL, 354056757614.0 }, /* test 64bit int */
67         { 18445937028656326656ULL, 18445937028656326656.0 }, /* test unsigned 64bit */
68         { 18446744073709550000ULL, 18446744073709550000.0 }, /* test 20bit in float */
69         { 18446744073709551615ULL, 18446744073709552000.0 }, /* test big 64bit number */
70         { 0ULL, +0.0 }, /* test 0 */
71     };
72     I64TOS_TEST_DATA i64tos[] =
73     {
74         { 1383034LL, 1383034.0f }, /* test 32bit number */
75         { -1383034LL, -1383034.0f }, /* test negative 32bit number */
76         { 354056765440LL, 354056765440.0f }, /* test 64bit int */
77         { -354056765440LL, -354056765440.0f }, /* test negative 64bit int */
78         { 18446744073709550000LL, -1616.0f }, /* test 20bit in float */
79         { 0x8000000000000000LL, -9223372036854775800.0f }, /* test big 64bit int */
80         { 0xFFFFFFFFFFFFFFFFLL, -1.0f }, /* test -1 */
81         { 0LL, +0.0f }, /* test 0 */
82     };
83     U64TOS_TEST_DATA u64tos[] =
84     {
85         { 1383034ULL, 1383034.0f }, /* test 32bit number */
86         { 354056765440ULL, 354056765440.0f }, /* test 64bit int */
87         { 18445937032174764032ULL, 18445937032174764032.0f }, /* test unsigned 64bit */
88         { 18446744073709550000ULL, 18446744073709550000.0f }, /* test 20bit in float */
89         { 18446744073709551615ULL, 18446744073709552000.0f }, /* test big 64bit number */
90         { 0ULL, +0.0f }, /* test 0 */
91     };
92 
93     unsigned int i;
94 
95     for (i = 0; i < _countof(i64tod); ++i)
96     {
97         double actual;
98 
99         actual = (double)i64tod[i].given;
100         ok(actual == i64tod[i].expected.value, "(i64tod) %d: Expected %lf, but %lld -> %lf\n",
101            i, i64tod[i].expected.value, i64tod[i].given, actual);
102     }
103 
104     for (i = 0; i < _countof(u64tod); ++i)
105     {
106         double actual;
107 
108         actual = (double)u64tod[i].given;
109         ok(actual == u64tod[i].expected.value, "(u64tod) %d: Expected %lf, but %llu -> %lf\n",
110            i, u64tod[i].expected.value, u64tod[i].given, actual);
111     }
112 
113     for (i = 0; i < _countof(i64tos); ++i)
114     {
115         float actual;
116 
117         actual = (float)i64tos[i].given;
118         ok(actual == i64tos[i].expected.value, "(i64tos) %d: Expected %f, but %lld -> %f\n",
119            i, i64tos[i].expected.value, i64tos[i].given, actual);
120     }
121 
122     for (i = 0; i < _countof(u64tos); ++i)
123     {
124         float actual;
125 
126         actual = (float)u64tos[i].given;
127         ok(actual == u64tos[i].expected.value, "(u64tos) %d: Expected %f, but %llu -> %f\n",
128            i, u64tos[i].expected.value, u64tos[i].given, actual);
129     }
130 }
131