https://git.reactos.org/?p=reactos.git;a=commitdiff;h=2943ea2cfebfceba6de71f09dfa3eda4a1a452dc

commit 2943ea2cfebfceba6de71f09dfa3eda4a1a452dc
Author:     Timo Kreuzer <timo.kreu...@reactos.org>
AuthorDate: Fri Aug 6 00:10:44 2021 +0200
Commit:     Timo Kreuzer <timo.kreu...@reactos.org>
CommitDate: Fri Aug 26 00:44:46 2022 +0200

    [CRT_APITEST] Add tests for ceil/floor
---
 modules/rostests/apitests/crt/ceil.c               | 109 ++++++++++++++++++++
 modules/rostests/apitests/crt/fabs.c               |   4 +-
 modules/rostests/apitests/crt/floor.c              | 111 +++++++++++++++++++++
 .../rostests/apitests/crt/msvcrt_crt_apitest.cmake |   4 +-
 .../rostests/apitests/crt/static_crt_apitest.cmake |   4 +-
 modules/rostests/apitests/crt/testlist.c           |   8 +-
 6 files changed, 233 insertions(+), 7 deletions(-)

diff --git a/modules/rostests/apitests/crt/ceil.c 
b/modules/rostests/apitests/crt/ceil.c
new file mode 100644
index 00000000000..b63d5097949
--- /dev/null
+++ b/modules/rostests/apitests/crt/ceil.c
@@ -0,0 +1,109 @@
+/*
+ * PROJECT:     ReactOS API tests
+ * LICENSE:     MIT (https://spdx.org/licenses/MIT)
+ * PURPOSE:     Tests for ceil / ceilf
+ * COPYRIGHT:   Copyright 2021 Timo Kreuzer <timo.kreu...@reactos.org>
+ */
+
+#if !defined(_CRTBLD) && !defined(_M_IX86)
+#define _CRTBLD // we don't want inline ceilf!
+#endif
+#include "math_helpers.h"
+
+#ifdef _MSC_VER
+#pragma function(ceil)
+// ceilf is not available as an intrinsic
+#endif
+
+static TESTENTRY_DBL s_ceil_tests[] =
+{
+    /* Special values */
+    { 0x0000000000000000 /*  0.000000000000000e+000 */, 0x0000000000000000 /*  
0.000000000000000e+000 */ },
+    { 0x8000000000000000 /* -0.000000000000000e+000 */, 0x8000000000000000 /*  
0.000000000000000e+000 */ },
+    { 0x7ff0000000000000 /*  1.#INF00000000000e+000 */, 0x7ff0000000000000 /*  
1.#INF00000000000e+000 */ },
+    { 0x7ff0000000000001 /*  1.#QNAN0000000000e+000 */, 0x7ff8000000000001 /*  
1.#QNAN0000000000e+000 */ },
+    { 0x7ff7ffffffffffff /*  1.#QNAN0000000000e+000 */, 0x7fffffffffffffff /*  
1.#QNAN0000000000e+000 */ },
+    { 0x7ff8000000000000 /*  1.#QNAN0000000000e+000 */, 0x7ff8000000000000 /*  
1.#QNAN0000000000e+000 */ },
+    { 0x7ff8000000000001 /*  1.#QNAN0000000000e+000 */, 0x7ff8000000000001 /*  
1.#QNAN0000000000e+000 */ },
+    { 0x7fffffffffffffff /*  1.#QNAN0000000000e+000 */, 0x7fffffffffffffff /*  
1.#QNAN0000000000e+000 */ },
+    { 0xfff0000000000000 /* -1.#INF00000000000e+000 */, 0xfff0000000000000 /* 
-1.#INF00000000000e+000 */ },
+    { 0xfff0000000000001 /* -1.#QNAN0000000000e+000 */, 0xfff8000000000001 /* 
-1.#QNAN0000000000e+000 */ },
+    { 0xfff7ffffffffffff /* -1.#QNAN0000000000e+000 */, 0xffffffffffffffff /* 
-1.#QNAN0000000000e+000 */ },
+    { 0xfff8000000000000 /* -1.#IND00000000000e+000 */, 0xfff8000000000000 /* 
-1.#IND00000000000e+000 */ },
+    { 0xfff8000000000001 /* -1.#QNAN0000000000e+000 */, 0xfff8000000000001 /* 
-1.#QNAN0000000000e+000 */ },
+    { 0xffffffffffffffff /* -1.#QNAN0000000000e+000 */, 0xffffffffffffffff /* 
-1.#QNAN0000000000e+000 */ },
+
+    /* Some random floats */
+    { 0x84be2329aed66ce1 /* -7.916792434840887e-286 */, 0x8000000000000000 /* 
-0.000000000000000e+000 */ },
+    { 0xf1499052ebe9bbf1 /* -5.202012813127544e+237 */, 0xf1499052ebe9bbf1 /* 
-5.202012813127544e+237 */ },
+    { 0x3cdba6b3993e0c87 /*  1.534948721304537e-015 */, 0x3ff0000000000000 /*  
1.000000000000000e+000 */ },
+    { 0x1c0d5e24de47b706 /*  1.484236768428990e-173 */, 0x3ff0000000000000 /*  
1.000000000000000e+000 */ },
+    { 0xc84d12b3a68bbb43 /* -1.978609508743937e+040 */, 0xc84d12b3a68bbb43 /* 
-1.978609508743937e+040 */ },
+    { 0x7d5a031f1f253809 /*  6.645271626742043e+295 */, 0x7d5a031f1f253809 /*  
6.645271626742043e+295 */ },
+    { 0xfccbd45d3b45f596 /* -1.388583322422121e+293 */, 0xfccbd45d3b45f596 /* 
-1.388583322422121e+293 */ },
+    { 0x0a890d1332aedb1c /*  6.517185427488806e-258 */, 0x3ff0000000000000 /*  
1.000000000000000e+000 */ },
+    { 0xee509a20fd367840 /* -2.400484647490954e+223 */, 0xee509a20fd367840 /* 
-2.400484647490954e+223 */ },
+    { 0xf6324912dc497d9e /* -2.249167320514119e+261 */, 0xf6324912dc497d9e /* 
-2.249167320514119e+261 */ },
+};
+
+
+void Test_ceil(void)
+{
+    int i;
+
+    for (i = 0; i < _countof(s_ceil_tests); i++)
+    {
+        double x = u64_to_dbl(s_ceil_tests[i].x);
+        double z = ceil(x);
+        ok_eq_dbl_exact("ceil", s_ceil_tests[i].x, z, s_ceil_tests[i].result);
+    }
+}
+
+static TESTENTRY_FLT s_ceilf_tests[] =
+{
+    /* Special values */
+    { 0x00000000 /*  0.000000e+000 */, 0x00000000 /*  0.000000e+000 */ },
+    { 0x80000000 /* -0.000000e+000 */, 0x80000000 /*  0.000000e+000 */ },
+    { 0x00000000 /*  0.000000e+000 */, 0x00000000 /*  0.000000e+000 */ },
+    { 0x00000001 /*  1.401298e-045 */, 0x3f800000 /*  1.000000e+000 */ },
+    { 0xffffffff /* -1.#QNAN0e+000 */, 0xffffffff /* -1.#QNAN0e+000 */ },
+    { 0x00000000 /*  0.000000e+000 */, 0x00000000 /*  0.000000e+000 */ },
+    { 0x00000001 /*  1.401298e-045 */, 0x3f800000 /*  1.000000e+000 */ },
+    { 0xffffffff /* -1.#QNAN0e+000 */, 0xffffffff /* -1.#QNAN0e+000 */ },
+    { 0x00000000 /*  0.000000e+000 */, 0x00000000 /*  0.000000e+000 */ },
+    { 0x00000001 /*  1.401298e-045 */, 0x3f800000 /*  1.000000e+000 */ },
+    { 0xffffffff /* -1.#QNAN0e+000 */, 0xffffffff /* -1.#QNAN0e+000 */ },
+    { 0x00000000 /*  0.000000e+000 */, 0x00000000 /*  0.000000e+000 */ },
+    { 0x00000001 /*  1.401298e-045 */, 0x3f800000 /*  1.000000e+000 */ },
+    { 0xffffffff /* -1.#QNAN0e+000 */, 0xffffffff /* -1.#QNAN0e+000 */ },
+
+    /* Some random floats */
+    { 0xf2144fad /* -2.937607e+030 */, 0xf2144fad /* -2.937607e+030 */ },
+    { 0xd0664044 /* -1.545189e+010 */, 0xd0664044 /* -1.545189e+010 */ },
+    { 0xb730c46b /* -1.053615e-005 */, 0x80000000 /* -0.000000e+000 */ },
+    { 0x22a13b32 /*  4.370181e-018 */, 0x3f800000 /*  1.000000e+000 */ },
+    { 0x9d9122f6 /* -3.841733e-021 */, 0x80000000 /* -0.000000e+000 */ },
+    { 0xda1f8be1 /* -1.122708e+016 */, 0xda1f8be1 /* -1.122708e+016 */ },
+    { 0x0299cab0 /*  2.259767e-037 */, 0x3f800000 /*  1.000000e+000 */ },
+    { 0x499d72b9 /*  1.289815e+006 */, 0x499d72c0 /*  1.289816e+006 */ },
+    { 0xc57e802c /* -4.072011e+003 */, 0xc57e8000 /* -4.072000e+003 */ },
+    { 0x80e9d599 /* -2.147430e-038 */, 0x80000000 /* -0.000000e+000 */ },
+};
+
+void Test_ceilf(void)
+{
+    int i;
+
+    for (i = 0; i < _countof(s_ceilf_tests); i++)
+    {
+        float x = u32_to_flt(s_ceilf_tests[i].x);
+        float z = ceilf(x);
+        ok_eq_flt_exact("ceilf", s_ceilf_tests[i].x, z, 
s_ceilf_tests[i].result);
+    }
+}
+
+START_TEST(ceil)
+{
+    Test_ceil();
+    Test_ceilf();
+}
diff --git a/modules/rostests/apitests/crt/fabs.c 
b/modules/rostests/apitests/crt/fabs.c
index eec1f761757..d4b2c8f51d9 100644
--- a/modules/rostests/apitests/crt/fabs.c
+++ b/modules/rostests/apitests/crt/fabs.c
@@ -5,8 +5,8 @@
  * COPYRIGHT:   Copyright 2021 Timo Kreuzer <timo.kreu...@reactos.org>
  */
 
-/* Don't use the inline ceilf, unless required */
-#if defined(TEST_STATIC_CRT) || defined(_M_ARM)
+/* Don't use the inline fabsf, unless required */
+#if !defined(_CRTBLD) && defined(_M_ARM)
 #define _CRTBLD
 #endif
 #include "math_helpers.h"
diff --git a/modules/rostests/apitests/crt/floor.c 
b/modules/rostests/apitests/crt/floor.c
new file mode 100644
index 00000000000..beb6cb9ec7c
--- /dev/null
+++ b/modules/rostests/apitests/crt/floor.c
@@ -0,0 +1,111 @@
+/*
+ * PROJECT:     ReactOS API tests
+ * LICENSE:     MIT (https://spdx.org/licenses/MIT)
+ * PURPOSE:     Tests for floor / floorf
+ * COPYRIGHT:   Copyright 2021 Timo Kreuzer <timo.kreu...@reactos.org>
+ */
+
+#if !defined(_CRTBLD) && !defined(_M_IX86)
+#define _CRTBLD // we don't want inline floorf!
+#endif
+#include "math_helpers.h"
+
+#ifdef _MSC_VER
+#pragma function(floor)
+#ifdef _M_AMD64
+#pragma function(floorf)
+#endif
+#endif
+
+static TESTENTRY_DBL s_floor_tests[] =
+{
+    /* Special values */
+    { 0x0000000000000000 /*  0.000000000000000e+000 */, 0x0000000000000000 /*  
0.000000000000000e+000 */ },
+    { 0x8000000000000000 /* -0.000000000000000e+000 */, 0x8000000000000000 /* 
-0.000000000000000e+000 */ },
+    { 0x7ff0000000000000 /*  1.#INF00000000000e+000 */, 0x7ff0000000000000 /*  
1.#INF00000000000e+000 */ },
+    { 0x7ff0000000000001 /*  1.#QNAN0000000000e+000 */, 0x7ff8000000000001 /*  
1.#QNAN0000000000e+000 */ },
+    { 0x7ff7ffffffffffff /*  1.#QNAN0000000000e+000 */, 0x7fffffffffffffff /*  
1.#QNAN0000000000e+000 */ },
+    { 0x7ff8000000000000 /*  1.#QNAN0000000000e+000 */, 0x7ff8000000000000 /*  
1.#QNAN0000000000e+000 */ },
+    { 0x7ff8000000000001 /*  1.#QNAN0000000000e+000 */, 0x7ff8000000000001 /*  
1.#QNAN0000000000e+000 */ },
+    { 0x7fffffffffffffff /*  1.#QNAN0000000000e+000 */, 0x7fffffffffffffff /*  
1.#QNAN0000000000e+000 */ },
+    { 0xfff0000000000000 /* -1.#INF00000000000e+000 */, 0xfff0000000000000 /* 
-1.#INF00000000000e+000 */ },
+    { 0xfff0000000000001 /* -1.#QNAN0000000000e+000 */, 0xfff8000000000001 /* 
-1.#QNAN0000000000e+000 */ },
+    { 0xfff7ffffffffffff /* -1.#QNAN0000000000e+000 */, 0xffffffffffffffff /* 
-1.#QNAN0000000000e+000 */ },
+    { 0xfff8000000000000 /* -1.#IND00000000000e+000 */, 0xfff8000000000000 /* 
-1.#IND00000000000e+000 */ },
+    { 0xfff8000000000001 /* -1.#QNAN0000000000e+000 */, 0xfff8000000000001 /* 
-1.#QNAN0000000000e+000 */ },
+    { 0xffffffffffffffff /* -1.#QNAN0000000000e+000 */, 0xffffffffffffffff /* 
-1.#QNAN0000000000e+000 */ },
+
+    /* Some random doubles */
+    { 0x386580c747a3402b /*  5.055340589883462e-037 */, 0x0000000000000000 /*  
0.000000000000000e+000 */ },
+    { 0xb74298e6627fb9ed /* -1.667860443847725e-042 */, 0xbff0000000000000 /* 
-1.000000000000000e+000 */ },
+    { 0x0ef25f06e414aa2d /*  1.128498317470960e-236 */, 0x0000000000000000 /*  
0.000000000000000e+000 */ },
+    { 0x24002a37167638b5 /*  2.780001692929186e-135 */, 0x0000000000000000 /*  
0.000000000000000e+000 */ },
+    { 0x44258d1be62a0d22 /*  1.987747995999515e+020 */, 0x44258d1be62a0d22 /*  
1.987747995999515e+020 */ },
+    { 0x9ed4e46a65aad464 /* -3.715074250469020e-160 */, 0xbff0000000000000 /* 
-1.000000000000000e+000 */ },
+    { 0xc5afcd6f4ae4bf41 /* -4.921195330852160e+027 */, 0xc5afcd6f4ae4bf41 /* 
-4.921195330852160e+027 */ },
+    { 0x330fac896cbb01d2 /*  9.624395081137827e-063 */, 0x0000000000000000 /*  
0.000000000000000e+000 */ },
+    { 0xc18026ab4c845405 /* -3.387120956461338e+007 */, 0xc18026ab50000000 /* 
-3.387121000000000e+007 */ },
+    { 0x2f42a7dc898a741a /*  4.916804395045249e-081 */, 0x0000000000000000 /*  
0.000000000000000e+000 */ },
+};
+
+
+void Test_floor(void)
+{
+    int i;
+
+    for (i = 0; i < _countof(s_floor_tests); i++)
+    {
+        double x = u64_to_dbl(s_floor_tests[i].x);
+        double z = floor(x);
+        ok_eq_dbl_exact("floor", s_floor_tests[i].x, z, 
s_floor_tests[i].result);
+    }
+}
+
+static TESTENTRY_FLT s_floorf_tests[] =
+{
+    /* Special values */
+    { 0x00000000 /*  0.000000e+000 */, 0x00000000 /*  0.000000e+000 */ },
+    { 0x00000000 /*  0.000000e+000 */, 0x00000000 /*  0.000000e+000 */ },
+    { 0x00000000 /*  0.000000e+000 */, 0x00000000 /*  0.000000e+000 */ },
+    { 0x00000001 /*  1.401298e-045 */, 0x00000000 /*  0.000000e+000 */ },
+    { 0xffffffff /* -1.#QNAN0e+000 */, 0xffffffff /* -1.#QNAN0e+000 */ },
+    { 0x00000000 /*  0.000000e+000 */, 0x00000000 /*  0.000000e+000 */ },
+    { 0x00000001 /*  1.401298e-045 */, 0x00000000 /*  0.000000e+000 */ },
+    { 0xffffffff /* -1.#QNAN0e+000 */, 0xffffffff /* -1.#QNAN0e+000 */ },
+    { 0x00000000 /*  0.000000e+000 */, 0x00000000 /*  0.000000e+000 */ },
+    { 0x00000001 /*  1.401298e-045 */, 0x00000000 /*  0.000000e+000 */ },
+    { 0xffffffff /* -1.#QNAN0e+000 */, 0xffffffff /* -1.#QNAN0e+000 */ },
+    { 0x00000000 /*  0.000000e+000 */, 0x00000000 /*  0.000000e+000 */ },
+    { 0x00000001 /*  1.401298e-045 */, 0x00000000 /*  0.000000e+000 */ },
+    { 0xffffffff /* -1.#QNAN0e+000 */, 0xffffffff /* -1.#QNAN0e+000 */ },
+
+    /* Some random floats */
+    { 0x386580c7 /*  5.471779e-005 */, 0x00000000 /*  0.000000e+000 */ },
+    { 0x47a3402b /*  8.358434e+004 */, 0x47a34000 /*  8.358400e+004 */ },
+    { 0xb74298e6 /* -1.159890e-005 */, 0xbf800000 /* -1.000000e+000 */ },
+    { 0x627fb9ed /*  1.179329e+021 */, 0x627fb9ed /*  1.179329e+021 */ },
+    { 0x0ef25f06 /*  5.974911e-030 */, 0x00000000 /*  0.000000e+000 */ },
+    { 0xe414aa2d /* -1.096952e+022 */, 0xe414aa2d /* -1.096952e+022 */ },
+    { 0x24002a37 /*  2.779133e-017 */, 0x00000000 /*  0.000000e+000 */ },
+    { 0x167638b5 /*  1.988962e-025 */, 0x00000000 /*  0.000000e+000 */ },
+    { 0x44258d1b /*  6.622048e+002 */, 0x44258000 /*  6.620000e+002 */ },
+    { 0xe62a0d22 /* -2.007611e+023 */, 0xe62a0d22 /* -2.007611e+023 */ },
+};
+
+void Test_floorf(void)
+{
+    int i;
+
+    for (i = 0; i < _countof(s_floorf_tests); i++)
+    {
+        float x = u32_to_flt(s_floorf_tests[i].x);
+        float z = floorf(x);
+        ok_eq_flt_exact("floorf", s_floorf_tests[i].x, z, 
s_floorf_tests[i].result);
+    }
+}
+
+START_TEST(floor)
+{
+    Test_floor();
+    Test_floorf();
+}
diff --git a/modules/rostests/apitests/crt/msvcrt_crt_apitest.cmake 
b/modules/rostests/apitests/crt/msvcrt_crt_apitest.cmake
index 87fe0a611a2..4677f90fbfa 100644
--- a/modules/rostests/apitests/crt/msvcrt_crt_apitest.cmake
+++ b/modules/rostests/apitests/crt/msvcrt_crt_apitest.cmake
@@ -1017,7 +1017,7 @@ list(APPEND SOURCE_MSVCRT
 #    bsearch_s
 #    btowc.c
 #    calloc.c
-#    ceil.c
+    ceil.c
 #    clearerr.c
 #    clearerr_s
 #    clock.c
@@ -1038,7 +1038,7 @@ list(APPEND SOURCE_MSVCRT
 #    fgets.c
 #    fgetwc.c
 #    fgetws.c
-#    floor.c
+    floor.c
 #    fmod.c
 #    fopen.c
 #    fopen_s.c
diff --git a/modules/rostests/apitests/crt/static_crt_apitest.cmake 
b/modules/rostests/apitests/crt/static_crt_apitest.cmake
index a6c905d9396..eb84fd5b145 100644
--- a/modules/rostests/apitests/crt/static_crt_apitest.cmake
+++ b/modules/rostests/apitests/crt/static_crt_apitest.cmake
@@ -7,7 +7,9 @@ list(APPEND SOURCE_STATIC
     _vsnprintf.c
     _vsnwprintf.c
     atexit.c
+    ceil.c
     fabs.c
+    floor.c
     fpcontrol.c
     mbstowcs.c
     mbtowc.c
@@ -37,7 +39,7 @@ elseif(ARCH STREQUAL "arm")
 endif()
 
 add_executable(static_crt_apitest EXCLUDE_FROM_ALL testlist.c ${SOURCE_STATIC})
-target_compile_definitions(static_crt_apitest PRIVATE TEST_STATIC_CRT 
wine_dbgstr_an=wine_dbgstr_an_ wine_dbgstr_wn=wine_dbgstr_wn_)
+target_compile_definitions(static_crt_apitest PRIVATE TEST_STATIC_CRT _CRTBLD 
wine_dbgstr_an=wine_dbgstr_an_ wine_dbgstr_wn=wine_dbgstr_wn_)
 target_link_libraries(static_crt_apitest crt wine ${PSEH_LIB})
 set_module_type(static_crt_apitest win32cui)
 add_importlibs(static_crt_apitest kernel32 ntdll)
diff --git a/modules/rostests/apitests/crt/testlist.c 
b/modules/rostests/apitests/crt/testlist.c
index e85222f671c..fd746d39011 100644
--- a/modules/rostests/apitests/crt/testlist.c
+++ b/modules/rostests/apitests/crt/testlist.c
@@ -18,8 +18,10 @@ extern void func___64tof(void);
 #if defined(TEST_NTDLL)
 extern void func__vscwprintf(void);
 #endif
-extern void func_fpcontrol(void);
+extern void func_ceil(void);
 extern void func_fabs(void);
+extern void func_floor(void);
+extern void func_fpcontrol(void);
 extern void func_fputc(void);
 extern void func_fputwc(void);
 extern void func__snprintf(void);
@@ -62,10 +64,12 @@ const struct test winetest_testlist[] =
     // ...
 #endif
 #if defined(TEST_STATIC_CRT) || defined(TEST_MSVCRT)
+    { "ceil", func_ceil },
+    { "fabs", func_fabs },
+    { "floor", func_floor },
 #ifdef _M_AMD64 // x86 / arm need fixing
     { "fpcontrol", func_fpcontrol },
 #endif
-    { "fabs", func_fabs },
 #if defined(_M_ARM)
     { "__rt_div", func___rt_div },
     { "__fto64", func___fto64 },

Reply via email to