[CRT_APITEST] Add tests for __dtoi64/dtou64/stoi64/stou64 on ARM (#3848)

CORE-17703 CORE-17604
This commit is contained in:
Roman Masanin 2021-07-27 00:31:29 +03:00 committed by Stanislav Motylkov
parent e448094e74
commit 99ba98468f
No known key found for this signature in database
GPG key ID: AFE513258CBA9E92
3 changed files with 201 additions and 0 deletions

View file

@ -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@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);
}
}

View file

@ -1374,6 +1374,7 @@ elseif(ARCH STREQUAL "amd64")
elseif(ARCH STREQUAL "arm")
list(APPEND SOURCE_MSVCRT
__rt_div.c
__fto64.c
)
endif()

View file

@ -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 },