From c108de809465a747055461ac444d25427e53e80b Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 24 Oct 2025 12:34:32 +0300 Subject: [PATCH] [CRT_APITEST] Implement tests for _strlwr, _strupr, _wcslwr, _wcsupr --- modules/rostests/apitests/crt/_strlwr.c | 45 +++++++++++++++++++ modules/rostests/apitests/crt/_strupr.c | 41 +++++++++++++++++ modules/rostests/apitests/crt/_wcslwr.c | 41 +++++++++++++++++ modules/rostests/apitests/crt/_wcsupr.c | 45 +++++++++++++++++++ .../rostests/apitests/msvcrt/CMakeLists.txt | 4 ++ modules/rostests/apitests/msvcrt/testlist.c | 8 ++++ .../rostests/apitests/ntdll/CMakeLists.txt | 4 ++ modules/rostests/apitests/ntdll/testlist.c | 8 ++++ 8 files changed, 196 insertions(+) create mode 100644 modules/rostests/apitests/crt/_strlwr.c create mode 100644 modules/rostests/apitests/crt/_strupr.c create mode 100644 modules/rostests/apitests/crt/_wcslwr.c create mode 100644 modules/rostests/apitests/crt/_wcsupr.c diff --git a/modules/rostests/apitests/crt/_strlwr.c b/modules/rostests/apitests/crt/_strlwr.c new file mode 100644 index 00000000000..e2b4ce1252f --- /dev/null +++ b/modules/rostests/apitests/crt/_strlwr.c @@ -0,0 +1,45 @@ +/* + * PROJECT: ReactOS API tests + * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) + * PURPOSE: Tests for _strlwr + * COPYRIGHT: Copyright 2025 Timo Kreuzer (timo.kreuzer@reactos.org) + */ + +#define WIN32_NO_STATUS +#include +#include +#include + +typedef char* (__cdecl *PFN_strlwr)(char* _String); +static PFN_strlwr p_strlwr; + +static BOOL Init(void) +{ + HMODULE hdll = LoadLibraryA(TEST_DLL_NAME); + p_strlwr = (PFN_strlwr)GetProcAddress(hdll, "_strlwr"); + ok(p_strlwr != NULL, "Failed to load _strlwr from %s\n", TEST_DLL_NAME); + return (p_strlwr != NULL); +} + +START_TEST(_strlwr) +{ + char *result; + +#ifndef TEST_STATIC_CRT + if (!Init()) + { + skip("Skipping tests, because _strlwr is not available\n"); + return; + } +#endif + + // The NT version of _strlwr does not have a NULL check + StartSeh() + result = p_strlwr(NULL); + ok_ptr(result, NULL); +#ifdef TEST_NTDLL + EndSeh(STATUS_ACCESS_VIOLATION); +#else + EndSeh((is_reactos() || GetNTVersion() >= _WIN32_WINNT_VISTA) ? STATUS_SUCCESS : STATUS_ACCESS_VIOLATION); +#endif +} diff --git a/modules/rostests/apitests/crt/_strupr.c b/modules/rostests/apitests/crt/_strupr.c new file mode 100644 index 00000000000..07e8410b58c --- /dev/null +++ b/modules/rostests/apitests/crt/_strupr.c @@ -0,0 +1,41 @@ +/* + * PROJECT: ReactOS API tests + * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) + * PURPOSE: Tests for _strupr + * COPYRIGHT: Copyright 2025 Timo Kreuzer (timo.kreuzer@reactos.org) + */ + +#define WIN32_NO_STATUS +#include +#include +#include + +typedef char* (__cdecl *PFN_strupr)(char* _String); +static PFN_strupr p_strupr; + +static BOOL Init(void) +{ + HMODULE hdll = LoadLibraryA(TEST_DLL_NAME); + p_strupr = (PFN_strupr)GetProcAddress(hdll, "_strupr"); + ok(p_strupr != NULL, "Failed to load _strupr from %s\n", TEST_DLL_NAME); + return (p_strupr != NULL); +} + +START_TEST(_strupr) +{ + char *result; + +#ifndef TEST_STATIC_CRT + if (!Init()) + { + skip("Skipping tests, because _strupr is not available\n"); + return; + } +#endif + + // The NT version of _strupr has a NULL check (as opposed to _strlwr) + StartSeh() + result = p_strupr(NULL); + ok_ptr(result, NULL); + EndSeh((is_reactos() || GetNTVersion() >= _WIN32_WINNT_VISTA) ? STATUS_SUCCESS : STATUS_ACCESS_VIOLATION); +} diff --git a/modules/rostests/apitests/crt/_wcslwr.c b/modules/rostests/apitests/crt/_wcslwr.c new file mode 100644 index 00000000000..eecc516a734 --- /dev/null +++ b/modules/rostests/apitests/crt/_wcslwr.c @@ -0,0 +1,41 @@ +/* + * PROJECT: ReactOS API tests + * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) + * PURPOSE: Tests for _wcslwr + * COPYRIGHT: Copyright 2025 Timo Kreuzer (timo.kreuzer@reactos.org) + */ + +#define WIN32_NO_STATUS +#include +#include +#include + +typedef wchar_t* (__cdecl *PFN_wcslwr)(wchar_t* _String); +static PFN_wcslwr p_wcslwr; + +static BOOL Init(void) +{ + HMODULE hdll = LoadLibraryA(TEST_DLL_NAME); + p_wcslwr = (PFN_wcslwr)GetProcAddress(hdll, "_wcslwr"); + ok(p_wcslwr != NULL, "Failed to load _wcslwr from %s\n", TEST_DLL_NAME); + return (p_wcslwr != NULL); +} + +START_TEST(_wcslwr) +{ + wchar_t *result; + +#ifndef TEST_STATIC_CRT + if (!Init()) + { + skip("Skipping tests, because _wcslwr is not available\n"); + return; + } +#endif + + // The NT version of _wcslwr has a NULL check (as opposed to _wcsupr) + StartSeh() + result = p_wcslwr(NULL); + ok_ptr(result, NULL); + EndSeh((is_reactos() || GetNTVersion() >= _WIN32_WINNT_VISTA) ? STATUS_SUCCESS : STATUS_ACCESS_VIOLATION); +} diff --git a/modules/rostests/apitests/crt/_wcsupr.c b/modules/rostests/apitests/crt/_wcsupr.c new file mode 100644 index 00000000000..68e50329edd --- /dev/null +++ b/modules/rostests/apitests/crt/_wcsupr.c @@ -0,0 +1,45 @@ +/* + * PROJECT: ReactOS API tests + * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) + * PURPOSE: Tests for _wcsupr + * COPYRIGHT: Copyright 2025 Timo Kreuzer (timo.kreuzer@reactos.org) + */ + +#define WIN32_NO_STATUS +#include +#include +#include + +typedef wchar_t* (__cdecl *PFN_wcsupr)(wchar_t* _String); +static PFN_wcsupr p_wcsupr; + +static BOOL Init(void) +{ + HMODULE hdll = LoadLibraryA(TEST_DLL_NAME); + p_wcsupr = (PFN_wcsupr)GetProcAddress(hdll, "_wcsupr"); + ok(p_wcsupr != NULL, "Failed to load _wcsupr from %s\n", TEST_DLL_NAME); + return (p_wcsupr != NULL); +} + +START_TEST(_wcsupr) +{ + wchar_t *result; + +#ifndef TEST_STATIC_CRT + if (!Init()) + { + skip("Skipping tests, because _wcsupr is not available\n"); + return; + } +#endif + + // The NT version of _wcsupr does not have a NULL check + StartSeh() + result = p_wcsupr(NULL); + ok_ptr(result, NULL); +#ifdef TEST_NTDLL + EndSeh(STATUS_ACCESS_VIOLATION); +#else + EndSeh((is_reactos() || GetNTVersion() >= _WIN32_WINNT_VISTA) ? STATUS_SUCCESS : STATUS_ACCESS_VIOLATION); +#endif +} diff --git a/modules/rostests/apitests/msvcrt/CMakeLists.txt b/modules/rostests/apitests/msvcrt/CMakeLists.txt index 97baa30b341..3c682572ea5 100644 --- a/modules/rostests/apitests/msvcrt/CMakeLists.txt +++ b/modules/rostests/apitests/msvcrt/CMakeLists.txt @@ -17,13 +17,17 @@ list(APPEND SOURCE_CRT_TESTS ../crt/_snprintf.c ../crt/_snwprintf.c ../crt/_stricmp.c + ../crt/_strlwr.c ../crt/_strnicmp.c + ../crt/_strupr.c ../crt/_vscprintf.c ../crt/_vscwprintf.c ../crt/_vsnprintf.c ../crt/_vsnwprintf.c ../crt/_wcsicmp.c + ../crt/_wcslwr.c ../crt/_wcsnicmp.c + ../crt/_wcsupr.c ../crt/_wsystem.c ../crt/acos.c ../crt/asin.c diff --git a/modules/rostests/apitests/msvcrt/testlist.c b/modules/rostests/apitests/msvcrt/testlist.c index b13cd69d1c2..f0fa1ec8526 100644 --- a/modules/rostests/apitests/msvcrt/testlist.c +++ b/modules/rostests/apitests/msvcrt/testlist.c @@ -11,13 +11,17 @@ extern void func__mbsstr(void); extern void func__snprintf(void); extern void func__snwprintf(void); extern void func__stricmp(void); +extern void func__strlwr(void); extern void func__strnicmp(void); +extern void func__strupr(void); extern void func__vscprintf(void); extern void func__vscwprintf(void); extern void func__vsnprintf(void); extern void func__vsnwprintf(void); extern void func__wcsicmp(void); +extern void func__wcslwr(void); extern void func__wcsnicmp(void); +extern void func__wcsupr(void); extern void func__wsystem(void); extern void func_acos(void); extern void func_asin(void); @@ -73,13 +77,17 @@ const struct test winetest_testlist[] = { "_snprintf", func__snprintf }, { "_snwprintf", func__snwprintf }, { "_stricmp", func__stricmp }, + { "_strlwr", func__strlwr }, { "_strnicmp", func__strnicmp }, + { "_strupr", func__strupr }, { "_vscprintf", func__vscprintf }, { "_vscwprintf", func__vscwprintf }, { "_vsnprintf", func__vsnprintf }, { "_vsnwprintf", func__vsnwprintf }, { "_wcsicmp", func__wcsicmp }, + { "_wcslwr", func__wcslwr }, { "_wcsnicmp", func__wcsnicmp }, + { "_wcsupr", func__wcsupr }, { "_wsystem", func__wsystem }, { "acos", func_acos }, { "asin", func_asin }, diff --git a/modules/rostests/apitests/ntdll/CMakeLists.txt b/modules/rostests/apitests/ntdll/CMakeLists.txt index 02545dc669b..54e954ba069 100644 --- a/modules/rostests/apitests/ntdll/CMakeLists.txt +++ b/modules/rostests/apitests/ntdll/CMakeLists.txt @@ -11,12 +11,16 @@ list(APPEND SOURCE_CRT_TESTS ../crt/_snprintf.c ../crt/_snwprintf.c ../crt/_stricmp.c + ../crt/_strlwr.c ../crt/_strnicmp.c + ../crt/_strupr.c ../crt/_vscwprintf.c ../crt/_vsnprintf.c ../crt/_vsnwprintf.c ../crt/_wcsicmp.c + ../crt/_wcslwr.c ../crt/_wcsnicmp.c + ../crt/_wcsupr.c ../crt/mbstowcs.c ../crt/setjmp.c ../crt/sprintf.c diff --git a/modules/rostests/apitests/ntdll/testlist.c b/modules/rostests/apitests/ntdll/testlist.c index 3801defbb99..6566b6f5538 100644 --- a/modules/rostests/apitests/ntdll/testlist.c +++ b/modules/rostests/apitests/ntdll/testlist.c @@ -5,12 +5,16 @@ extern void func__snprintf(void); extern void func__snwprintf(void); extern void func__stricmp(void); +extern void func__strlwr(void); extern void func__strnicmp(void); +extern void func__strupr(void); extern void func__vscwprintf(void); extern void func__vsnprintf(void); extern void func__vsnwprintf(void); extern void func__wcsicmp(void); +extern void func__wcslwr(void); extern void func__wcsnicmp(void); +extern void func__wcsupr(void); extern void func_mbstowcs(void); extern void func_setjmp(void); extern void func_sprintf(void); @@ -134,12 +138,16 @@ const struct test winetest_testlist[] = { "_snprintf", func__snprintf }, { "_snwprintf", func__snwprintf }, { "_stricmp", func__stricmp }, + { "_strlwr", func__strlwr }, { "_strnicmp", func__strnicmp }, + { "_strupr", func__strupr }, { "_vscwprintf", func__vscwprintf }, { "_vsnprintf", func__vsnprintf }, { "_vsnwprintf", func__vsnwprintf }, { "_wcsicmp", func__wcsicmp }, + { "_wcslwr", func__wcslwr }, { "_wcsnicmp", func__wcsnicmp }, + { "_wcsupr", func__wcsupr }, { "mbstowcs", func_mbstowcs }, { "setjmp", func_setjmp }, { "sprintf", func_sprintf },