mirror of
https://github.com/reactos/reactos.git
synced 2024-11-18 21:13:52 +00:00
199 lines
8.1 KiB
C
199 lines
8.1 KiB
C
|
/*
|
||
|
* 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);
|
||
|
}
|
||
|
}
|