https://git.reactos.org/?p=reactos.git;a=commitdiff;h=99ba98468f468be8c9e25…
commit 99ba98468f468be8c9e25eb94e184e363cc62100
Author: Roman Masanin <36927roma(a)gmail.com>
AuthorDate: Tue Jul 27 00:31:29 2021 +0300
Commit: Stanislav Motylkov <x86corez(a)gmail.com>
CommitDate: Fri Jul 30 14:20:23 2021 +0300
[CRT_APITEST] Add tests for __dtoi64/dtou64/stoi64/stou64 on ARM (#3848)
CORE-17703 CORE-17604
---
modules/rostests/apitests/crt/__fto64.c | 198 +++++++++++++++++++++
.../rostests/apitests/crt/msvcrt_crt_apitest.cmake | 1 +
modules/rostests/apitests/crt/testlist.c | 2 +
3 files changed, 201 insertions(+)
diff --git a/modules/rostests/apitests/crt/__fto64.c
b/modules/rostests/apitests/crt/__fto64.c
new file mode 100644
index 00000000000..9b958aff1d2
--- /dev/null
+++ b/modules/rostests/apitests/crt/__fto64.c
@@ -0,0 +1,198 @@
+/*
+ * PROJECT: ReactOS API tests
+ * LICENSE: GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later)
+ * PURPOSE: Tests for __dtoi64/dtou64/stoi64/stou64 on ARM
+ * COPYRIGHT: Copyright 2021 Roman Masanin <36927roma(a)gmail.com>
+ */
+
+#include <apitest.h>
+
+typedef struct _DTOI64_TEST_DATA
+{
+ union
+ {
+ double value;
+ unsigned long long raw;
+ } given;
+ long long expected;
+} DTOI64_TEST_DATA;
+
+typedef struct _DTOU64_TEST_DATA
+{
+ union
+ {
+ double value;
+ unsigned long long raw;
+ } given;
+ unsigned long long expected;
+} DTOU64_TEST_DATA;
+
+typedef struct _STOI64_TEST_DATA
+{
+ union
+ {
+ float value;
+ unsigned int raw;
+ } given;
+ long long expected;
+} STOI64_TEST_DATA;
+
+typedef struct _STOU64_TEST_DATA
+{
+ union
+ {
+ float value;
+ unsigned int raw;
+ } given;
+ unsigned long long expected;
+} STOU64_TEST_DATA;
+
+START_TEST(__fto64)
+{
+ DTOI64_TEST_DATA dtoi64[] =
+ {
+ { 1383034209.0, 1383034209LL }, /* test 32bit number */
+ { -1383034209.0, -1383034209LL }, /* test negative 32bit number */
+ { 1383034209.1383034209, 1383034209LL }, /* test rounding 32bit */
+ { -1383034209.1383034209, -1383034209LL }, /* test negative rounding 32bit */
+ { 1383034209.83034209, 1383034209LL }, /* test rounding up 32bit */
+ { -1383034209.83034209, -1383034209LL }, /* test negative rounding up 32bit */
+ { 354056757614.0, 354056757614LL }, /* test 64bit int */
+ { -354056757614.0, -354056757614LL }, /* test negative 64bit int */
+ { 354056757614.83034209, 354056757614LL }, /* test 64bit rounding */
+ { 18445937028656326656.0, 0x8000000000000000LL }, /* test unsigned 64bit */
+ { 1.0000001, 1LL },
+ { 0.0000001, 0LL },
+ { -0.0000001, 0LL },
+
+ /* special values tests */
+
+ { -0.0, 0LL }, /* test -0 */
+ { +0.0, 0LL }, /* test +0 */
+ { .given.raw = 0x7FF0000000000000ULL, 0x8000000000000000LL }, /* test +INFINITY
*/
+ { .given.raw = 0xFFF0000000000000ULL, 0x8000000000000000LL }, /* test -INFINITY
*/
+ { .given.raw = 0x7FF0000000000001ULL, 0x8000000000000000LL }, /* test NaN1 */
+ { .given.raw = 0x7FF8000000000001ULL, 0x8000000000000000LL }, /* test NaN2 */
+ { .given.raw = 0x7FFFFFFFFFFFFFFFULL, 0x8000000000000000LL }, /* test NaN3 */
+ { .given.raw = 0x7FF80000000000F1ULL, 0x8000000000000000LL }, /* test NaN4 */
+ };
+ DTOU64_TEST_DATA dtou64[] =
+ {
+ { 1383034209.0, 1383034209ULL }, /* test 32bit number */
+ { -1383034209.0, 18446744073709551615ULL }, /* test negative 32bit number */
+ { 1383034209.1383034209, 1383034209ULL }, /* test rounding 32bit */
+ { -1383034209.1383034209, 18446744073709551615ULL }, /* test negative rounding
32bit */
+ { 1383034209.83034209, 1383034209ULL }, /* test rounding up 32bit */
+ { -1383034209.83034209, 18446744073709551615ULL }, /* test negative rounding up
32bit */
+ { 354056757614.0, 354056757614ULL }, /* test 64bit int */
+ { -354056757614.0, 18446744073709551615ULL }, /* test negative 64bit int */
+ { 354056757614.83034209, 354056757614ULL }, /* test 64bit rounding */
+ { 18445937028656326656.0, 18445937028656326656ULL }, /* test unsigned 64bit */
+ { 1.0000001, 1ULL },
+ { 0.0000001, 0ULL },
+ { -0.0000001, 0ULL },
+
+ /* special values tests */
+
+ { -0.0, 0ULL }, /* test -0 */
+ { +0.0, 0ULL }, /* test +0 */
+ { .given.raw = 0x7FF0000000000000ULL, 18446744073709551615ULL }, /* test
+INFINITY */
+ { .given.raw = 0xFFF0000000000000ULL, 18446744073709551615ULL }, /* test
-INFINITY */
+ { .given.raw = 0x7FF0000000000001ULL, 18446744073709551615ULL }, /* test NaN1 */
+ { .given.raw = 0x7FF8000000000001ULL, 18446744073709551615ULL }, /* test NaN2 */
+ { .given.raw = 0x7FFFFFFFFFFFFFFFULL, 18446744073709551615ULL }, /* test NaN3 */
+ { .given.raw = 0x7FF80000000000F1ULL, 18446744073709551615ULL }, /* test NaN4 */
+ };
+ STOI64_TEST_DATA stoi64[] =
+ {
+ { 1383034.0f, 1383034LL }, /* test 32bit number */
+ { -1383034.0f, -1383034LL }, /* test negative 32bit number */
+ { 1383034.1383034209f, 1383034LL }, /* test rounding 32bit */
+ { -1383034.1383034209f, -1383034LL }, /* test negative rounding 32bit */
+ { 1383034.83034209f, 1383034LL }, /* test rounding up 32bit */
+ { -1383034.83034209f, -1383034LL }, /* test negative rounding up 32bit */
+ { 354056765440.0f, 354056765440LL }, /* test 64bit int */
+ { -354056765440.0f, -354056765440LL }, /* test negative 64bit int */
+ { 3000000.75f, 3000000LL }, /* test 64bit rounding */
+ { 18445937032174764032.0f, 0x8000000000000000LL }, /* test unsigned 64bit */
+ { 1.0000001f, 1LL },
+ { 0.0000001f, 0LL },
+ { -0.0000001f, 0LL },
+
+ /* special values tests */
+
+ { -0.0f, 0LL }, /* test -0 */
+ { +0.0f, 0LL }, /* test +0 */
+ { .given.raw = 0x7F800000U, 0x8000000000000000LL }, /* test +INFINITY */
+ { .given.raw = 0xFF800000U, 0x8000000000000000LL }, /* test -INFINITY */
+ { .given.raw = 0x7F800001U, 0x8000000000000000LL }, /* test NaN1 */
+ { .given.raw = 0x7FC00001U, 0x8000000000000000LL }, /* test NaN2 */
+ { .given.raw = 0x7F8FFFFFU, 0x8000000000000000LL }, /* test NaN3 */
+ { .given.raw = 0x7F8000F1U, 0x8000000000000000LL }, /* test NaN4 */
+ };
+ STOU64_TEST_DATA stou64[] =
+ {
+ { 1383034.0f, 1383034ULL }, /* test 32bit number */
+ { -1383034.0f, 18446744073709551615ULL }, /* test negative 32bit number */
+ { 1383034.1383034209f, 1383034ULL }, /* test rounding 32bit */
+ { -1383034.1383034209f, 18446744073709551615ULL }, /* test negative rounding
32bit */
+ { 1383034.83034209f, 1383034ULL }, /* test rounding up 32bit */
+ { -1383034.83034209f, 18446744073709551615ULL }, /* test negative rounding up
32bit */
+ { 354056765440.0f, 354056765440ULL }, /* test 64bit int */
+ { -354056765440.0f, 18446744073709551615ULL }, /* test negative 64bit int */
+ { 3000000.75f, 3000000ULL }, /* test 64bit rounding */
+ { 18445937032174764032.0f, 18445937032174764032ULL }, /* test unsigned 64bit */
+ { 1.0000001f, 1ULL },
+ { 0.0000001f, 0ULL },
+ { -0.0000001f, 0ULL },
+
+ /* special values tests */
+
+ { -0.0f, 0LL }, /* test -0 */
+ { +0.0f, 0LL }, /* test +0 */
+ {.given.raw = 0x7F800000U, 18446744073709551615ULL }, /* test +INFINITY */
+ {.given.raw = 0xFF800000U, 18446744073709551615ULL }, /* test -INFINITY */
+ {.given.raw = 0x7F800001U, 18446744073709551615ULL }, /* test NaN1 */
+ {.given.raw = 0x7FC00001U, 18446744073709551615ULL }, /* test NaN2 */
+ {.given.raw = 0x7F8FFFFFU, 18446744073709551615ULL }, /* test NaN3 */
+ {.given.raw = 0x7F8000F1U, 18446744073709551615ULL }, /* test NaN4 */
+ };
+
+ unsigned int i;
+
+ for (i = 0; i < _countof(dtoi64); ++i)
+ {
+ long long actual;
+
+ actual = (long long)dtoi64[i].given.value;
+ ok(actual == dtoi64[i].expected, "(dtoi64) %d: Expected %lld, but %lf ->
%lld\n",
+ i, dtoi64[i].expected, dtoi64[i].given.value, actual);
+ }
+
+ for (i = 0; i < _countof(dtou64); ++i)
+ {
+ unsigned long long actual;
+
+ actual = (unsigned long long)dtou64[i].given.value;
+ ok(actual == dtou64[i].expected, "(dtou64) %d: Expected %llu, but %lf ->
%llu\n",
+ i, dtou64[i].expected, dtou64[i].given.value, actual);
+ }
+
+ for (i = 0; i < _countof(stoi64); ++i)
+ {
+ long long actual;
+
+ actual = (long long)stoi64[i].given.value;
+ ok(actual == stoi64[i].expected, "(stoi64) %d: Expected %lld, but %f ->
%lld\n",
+ i, stoi64[i].expected, stoi64[i].given.value, actual);
+ }
+
+ for (i = 0; i < _countof(stou64); ++i)
+ {
+ unsigned long long actual;
+
+ actual = (unsigned long long)stou64[i].given.value;
+ ok(actual == stou64[i].expected, "(stou64) %d: Expected %llu, but %f ->
%llu\n",
+ i, stou64[i].expected, stou64[i].given.value, actual);
+ }
+}
diff --git a/modules/rostests/apitests/crt/msvcrt_crt_apitest.cmake
b/modules/rostests/apitests/crt/msvcrt_crt_apitest.cmake
index 2375f59472a..5c5bb587fbb 100644
--- a/modules/rostests/apitests/crt/msvcrt_crt_apitest.cmake
+++ b/modules/rostests/apitests/crt/msvcrt_crt_apitest.cmake
@@ -1374,6 +1374,7 @@ elseif(ARCH STREQUAL "amd64")
elseif(ARCH STREQUAL "arm")
list(APPEND SOURCE_MSVCRT
__rt_div.c
+ __fto64.c
)
endif()
diff --git a/modules/rostests/apitests/crt/testlist.c
b/modules/rostests/apitests/crt/testlist.c
index ca76ebbf593..4c36c86eee4 100644
--- a/modules/rostests/apitests/crt/testlist.c
+++ b/modules/rostests/apitests/crt/testlist.c
@@ -5,6 +5,7 @@
#if defined(TEST_MSVCRT)
extern void func___rt_div(void);
+extern void func___fto64(void);
extern void func__vscprintf(void);
extern void func__vscwprintf(void);
extern void func_atexit(void);
@@ -62,6 +63,7 @@ const struct test winetest_testlist[] =
{ "__getmainargs", func___getmainargs },
#elif defined(_M_ARM)
{ "__rt_div", func___rt_div },
+ { "__fto64", func___fto64 },
#endif
{ "_vscprintf", func__vscprintf },
{ "_vscwprintf", func__vscwprintf },