From b3dff9df153a960f23411381aad41f918e51edff Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 11 Jun 2025 14:58:35 +0300 Subject: [PATCH] [CRT_APITEST] Add tests for _finite(f) --- modules/rostests/apitests/crt/_finite.c | 116 ++++++++++++++++++ modules/rostests/apitests/crt/math_helpers.h | 12 ++ .../rostests/apitests/msvcrt/CMakeLists.txt | 1 + modules/rostests/apitests/msvcrt/testlist.c | 2 + .../rostests/apitests/ucrtbase/CMakeLists.txt | 1 + modules/rostests/apitests/ucrtbase/testlist.c | 2 + 6 files changed, 134 insertions(+) create mode 100644 modules/rostests/apitests/crt/_finite.c diff --git a/modules/rostests/apitests/crt/_finite.c b/modules/rostests/apitests/crt/_finite.c new file mode 100644 index 00000000000..3d2855ef147 --- /dev/null +++ b/modules/rostests/apitests/crt/_finite.c @@ -0,0 +1,116 @@ +/* + * PROJECT: ReactOS API tests + * LICENSE: MIT (https://spdx.org/licenses/MIT) + * PURPOSE: Tests for _finite / _finitef + * COPYRIGHT: Copyright 2025 Timo Kreuzer + */ + +#if !defined(_CRTBLD) && !defined(_M_IX86) +#define _CRTBLD // we don't want inline _finitef! +#endif +#include "math_helpers.h" + +static TESTENTRY_DBL_INT s_finite_tests[] = +{ + /* Special values */ + { 0x0000000000000000 /* 0.000000000000000e+000 */, 1 }, + { 0x0000000000000001 /* 0.000000000000000e+000 */, 1 }, + { 0x000fffffffffffff /* 0.000000000000000e+000 */, 1 }, + { 0x8000000000000000 /* -0.000000000000000e+000 */, 1 }, + { 0x8000000000000001 /* -0.000000000000000e+000 */, 1 }, + { 0x800fffffffffffff /* -0.000000000000000e+000 */, 1 }, + { 0x7ff0000000000000 /* 1.#INF00000000000e+000 */, 0 }, + { 0x7ff0000000000001 /* 1.#QNAN0000000000e+000 */, 0 }, + { 0x7ff7ffffffffffff /* 1.#QNAN0000000000e+000 */, 0 }, + { 0x7ff8000000000000 /* 1.#QNAN0000000000e+000 */, 0 }, + { 0x7ff8000000000001 /* 1.#QNAN0000000000e+000 */, 0 }, + { 0x7fffffffffffffff /* 1.#QNAN0000000000e+000 */, 0 }, + { 0xfff0000000000000 /* -1.#INF00000000000e+000 */, 0 }, + { 0xfff0000000000001 /* -1.#QNAN0000000000e+000 */, 0 }, + { 0xfff7ffffffffffff /* -1.#QNAN0000000000e+000 */, 0 }, + { 0xfff8000000000000 /* -1.#IND00000000000e+000 */, 0 }, + { 0xfff8000000000001 /* -1.#QNAN0000000000e+000 */, 0 }, + { 0xffffffffffffffff /* -1.#QNAN0000000000e+000 */, 0 }, + + /* Some random doubles */ + { 0x386580c747a3402b /* 5.055340589883462e-037 */, 1 }, + { 0xb74298e6627fb9ed /* -1.667860443847725e-042 */, 1 }, + { 0x0ef25f06e414aa2d /* 1.128498317470960e-236 */, 1 }, + { 0x24002a37167638b5 /* 2.780001692929186e-135 */, 1 }, + { 0x44258d1be62a0d22 /* 1.987747995999515e+020 */, 1 }, + { 0x9ed4e46a65aad464 /* -3.715074250469020e-160 */, 1 }, + { 0xc5afcd6f4ae4bf41 /* -4.921195330852160e+027 */, 1 }, + { 0x330fac896cbb01d2 /* 9.624395081137827e-063 */, 1 }, + { 0xc18026ab4c845405 /* -3.387120956461338e+007 */, 1 }, + { 0x2f42a7dc898a741a /* 4.916804395045249e-081 */, 1 }, +}; + + +void Test__finite(void) +{ + int i; + + for (i = 0; i < _countof(s_finite_tests); i++) + { + double x = u64_to_dbl(s_finite_tests[i].x); + int r = _finite(x); + ok(r == s_finite_tests[i].result, "Wrong result for %f [0x%016I64x]. Expected %d, got %d\n", x, s_finite_tests[i].x, s_finite_tests[i].result, r); + } +} + +#ifndef _M_IX86 +static TESTENTRY_FLT s_finitef_tests[] = +{ + /* Special values */ + { 0x00000000 /* 0.000000 */, 1 }, + { 0x00000001 /* 0.000000 */, 1 }, + { 0x007FFFFF /* 0.000000 */, 1 }, + { 0x80000000 /* -0.000000 */, 1 }, + { 0x80000001 /* -0.000000 */, 1 }, + { 0x807FFFFF /* -0.000000 */, 1 }, + { 0x7f800000 /* 1.#INF00 */, 0 }, + { 0x7f800001 /* 1.#SNAN0 */, 0 }, + { 0x7fBFffff /* 1.#SNAN0 */, 0 }, + { 0x7fC00000 /* 1.#QNAN0 */, 0 }, + { 0x7fC80001 /* 1.#QNAN0 */, 0 }, + { 0x7fFfffff /* 1.#QNAN0 */, 0 }, + { 0xff800000 /* -1.#INF00 */, 0 }, + { 0xff800001 /* -1.#SNAN0 */, 0 }, + { 0xffBfffff /* -1.#SNAN0 */, 0 }, + { 0xffC00000 /* -1.#IND00 */, 0 }, + { 0xfff80001 /* -1.#QNAN0 */, 0 }, + { 0xffffffff /* -1.#QNAN0 */, 0 }, + + /* Some random floats */ + { 0x386580c7 /* 5.471779e-005 */, 1 }, + { 0x47a3402b /* 8.358434e+004 */, 1 }, + { 0xb74298e6 /* -1.159890e-005 */, 1 }, + { 0x627fb9ed /* 1.179329e+021 */, 1 }, + { 0x0ef25f06 /* 5.974911e-030 */, 1 }, + { 0xe414aa2d /* -1.096952e+022 */, 1 }, + { 0x24002a37 /* 2.779133e-017 */, 1 }, + { 0x167638b5 /* 1.988962e-025 */, 1 }, + { 0x44258d1b /* 6.622048e+002 */, 1 }, + { 0xe62a0d22 /* -2.007611e+023 */, 1 }, +}; + +void Test__finitef(void) +{ + int i; + + for (i = 0; i < _countof(s_finitef_tests); i++) + { + float x = u32_to_flt(s_finitef_tests[i].x); + int r = _finitef(x); + ok(r == s_finitef_tests[i].result, "Wrong result for %f [0x%08lx]. Expected %d, got %d\n", x, s_finitef_tests[i].x, s_finitef_tests[i].result, r); + } +} +#endif // !_MIX86 + +START_TEST(_finite) +{ + Test__finite(); +#ifndef _M_IX86 + Test__finitef(); +#endif // !_MIX86 +} diff --git a/modules/rostests/apitests/crt/math_helpers.h b/modules/rostests/apitests/crt/math_helpers.h index 49bb0d8352e..21f7f9f57b5 100644 --- a/modules/rostests/apitests/crt/math_helpers.h +++ b/modules/rostests/apitests/crt/math_helpers.h @@ -63,6 +63,18 @@ typedef struct _TESTENTRY_FLT unsigned long result; } TESTENTRY_FLT; +typedef struct _TESTENTRY_DBL_INT +{ + unsigned long long x; + int result; +} TESTENTRY_DBL_INT; + +typedef struct _TESTENTRY_FLT_INT +{ + unsigned long x; + int result; +} TESTENTRY_FLT_INT; + typedef struct _PRECISE_VALUE { double rounded; diff --git a/modules/rostests/apitests/msvcrt/CMakeLists.txt b/modules/rostests/apitests/msvcrt/CMakeLists.txt index 2832d5fdf66..f46e129ea2e 100644 --- a/modules/rostests/apitests/msvcrt/CMakeLists.txt +++ b/modules/rostests/apitests/msvcrt/CMakeLists.txt @@ -8,6 +8,7 @@ endif() list(APPEND SOURCE_CRT_TESTS ../crt/fpcontrol.c + ../crt/_finite.c ../crt/_mbsncmp.c ../crt/_mbsstr.c ../crt/_snprintf.c diff --git a/modules/rostests/apitests/msvcrt/testlist.c b/modules/rostests/apitests/msvcrt/testlist.c index 92cc41b2dea..9b91c4f8d57 100644 --- a/modules/rostests/apitests/msvcrt/testlist.c +++ b/modules/rostests/apitests/msvcrt/testlist.c @@ -3,6 +3,7 @@ #define STANDALONE #include +extern void func__finite(void); extern void func__mbsncmp(void); extern void func__mbsstr(void); extern void func__snprintf(void); @@ -57,6 +58,7 @@ extern void func_splitpath(void); const struct test winetest_testlist[] = { + { "_finite", func__finite }, { "_mbsncmp", func__mbsncmp }, { "_mbsstr", func__mbsstr }, { "_snprintf", func__snprintf }, diff --git a/modules/rostests/apitests/ucrtbase/CMakeLists.txt b/modules/rostests/apitests/ucrtbase/CMakeLists.txt index 74ec6120547..1111278bfa2 100644 --- a/modules/rostests/apitests/ucrtbase/CMakeLists.txt +++ b/modules/rostests/apitests/ucrtbase/CMakeLists.txt @@ -11,6 +11,7 @@ add_definitions( ) list(APPEND SOURCE + ../crt/_finite.c ../crt/acos.c ../crt/asin.c ../crt/atan.c diff --git a/modules/rostests/apitests/ucrtbase/testlist.c b/modules/rostests/apitests/ucrtbase/testlist.c index cae500ea054..df43b4df5c2 100644 --- a/modules/rostests/apitests/ucrtbase/testlist.c +++ b/modules/rostests/apitests/ucrtbase/testlist.c @@ -3,6 +3,7 @@ #define STANDALONE #include +extern void func__finite(void); extern void func_acos(void); extern void func_asin(void); extern void func_atan(void); @@ -19,6 +20,7 @@ extern void func_tan(void); const struct test winetest_testlist[] = { + { "_finite", func__finite }, { "acos", func_acos }, { "asin", func_asin }, { "atan", func_atan },