https://git.reactos.org/?p=reactos.git;a=commitdiff;h=3cb0bdaa0bd427cba21a8…
commit 3cb0bdaa0bd427cba21a8288ad0a4d37b2743037
Author: Bișoc George <fraizeraust99(a)gmail.com>
AuthorDate: Fri May 1 16:01:11 2020 +0200
Commit: GitHub <noreply(a)github.com>
CommitDate: Fri May 1 16:01:11 2020 +0200
[CRT_APITEST] Implement wctomb() testcase (#2701)
---
.../rostests/apitests/crt/crtdll_crt_apitest.cmake | 2 +-
.../rostests/apitests/crt/msvcrt_crt_apitest.cmake | 2 +-
.../rostests/apitests/crt/ntdll_crt_apitest.cmake | 1 +
modules/rostests/apitests/crt/testlist.c | 2 +
modules/rostests/apitests/crt/wctomb.c | 67 ++++++++++++++++++++++
5 files changed, 72 insertions(+), 2 deletions(-)
diff --git a/modules/rostests/apitests/crt/crtdll_crt_apitest.cmake
b/modules/rostests/apitests/crt/crtdll_crt_apitest.cmake
index 768168681e8..f40c603c480 100644
--- a/modules/rostests/apitests/crt/crtdll_crt_apitest.cmake
+++ b/modules/rostests/apitests/crt/crtdll_crt_apitest.cmake
@@ -519,7 +519,7 @@ list(APPEND SOURCE_CRTDLL
wcstombs.c
wcstoul.c
# wcsxfrm.c
-# wctomb.c
+ wctomb.c
# wprintf.c
# wscanf.c
)
diff --git a/modules/rostests/apitests/crt/msvcrt_crt_apitest.cmake
b/modules/rostests/apitests/crt/msvcrt_crt_apitest.cmake
index 2e3aaf9f3fc..e53d3b4f6fc 100644
--- a/modules/rostests/apitests/crt/msvcrt_crt_apitest.cmake
+++ b/modules/rostests/apitests/crt/msvcrt_crt_apitest.cmake
@@ -1255,7 +1255,7 @@ list(APPEND SOURCE_MSVCRT
wcstoul.c
# wcsxfrm.c
# wctob
-# wctomb.c
+ wctomb.c
# wctomb_s
# wprintf.c
# wprintf_s.c
diff --git a/modules/rostests/apitests/crt/ntdll_crt_apitest.cmake
b/modules/rostests/apitests/crt/ntdll_crt_apitest.cmake
index 41322e1c338..7f923043068 100644
--- a/modules/rostests/apitests/crt/ntdll_crt_apitest.cmake
+++ b/modules/rostests/apitests/crt/ntdll_crt_apitest.cmake
@@ -123,6 +123,7 @@ list(APPEND SOURCE_NTDLL
# wcstol.c
wcstombs.c
wcstoul.c
+ wctomb.c
)
if(ARCH STREQUAL "i386")
diff --git a/modules/rostests/apitests/crt/testlist.c
b/modules/rostests/apitests/crt/testlist.c
index 3afeb450484..20587372301 100644
--- a/modules/rostests/apitests/crt/testlist.c
+++ b/modules/rostests/apitests/crt/testlist.c
@@ -26,6 +26,7 @@ extern void func_strtoul(void);
extern void func_wcsnlen(void);
extern void func_wcstombs(void);
extern void func_wcstoul(void);
+extern void func_wctomb(void);
extern void func___getmainargs(void);
extern void func_static_construct(void);
@@ -44,6 +45,7 @@ const struct test winetest_testlist[] =
{ "strlen", func_strlen },
{ "strtoul", func_strtoul },
{ "wcstoul", func_wcstoul },
+ { "wctomb", func_wctomb },
{ "wcstombs", func_wcstombs },
#if defined(TEST_CRTDLL) || defined(TEST_MSVCRT) || defined(TEST_STATIC_CRT)
// ...
diff --git a/modules/rostests/apitests/crt/wctomb.c
b/modules/rostests/apitests/crt/wctomb.c
new file mode 100644
index 00000000000..b72d6156329
--- /dev/null
+++ b/modules/rostests/apitests/crt/wctomb.c
@@ -0,0 +1,67 @@
+/*
+ * PROJECT: ReactOS API tests
+ * LICENSE: GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later)
+ * PURPOSE: Tests for wctomb
+ * COPYRIGHT: Copyright 2020 Bișoc George <george.bisoc(a)reactos.org>
+ */
+
+#include <apitest.h>
+#include <apitest_guard.h>
+
+#define WIN32_NO_STATUS
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <locale.h>
+
+unsigned int cdecl ___lc_codepage_func(void);
+
+START_TEST(wctomb)
+{
+ int Length;
+ char *chDest;
+ char *loc;
+ unsigned int codepage = ___lc_codepage_func();
+ wchar_t wchSrc[2] = {L'R', 0414}; // 0414 corresponds to a Russian character
in Windows-1251
+
+ chDest = AllocateGuarded(sizeof(*chDest));
+ if (!chDest)
+ {
+ skip("Buffer allocation failed!\n");
+ return;
+ }
+
+ /* Output the current locale of the system and codepage for comparison between
ReactOS and Windows */
+ loc = setlocale(LC_ALL, NULL);
+ printf("The current codepage of your system tested is (%u) and locale
(%s).\n\n", codepage, loc);
+
+ /* Do not give output to the caller */
+ Length = wctomb(NULL, 0);
+ ok(Length == 0, "Expected no characters to be converted (because the output
argument is refused) but got %d\n.", Length);
+
+ /* Do the same but expect a valid wide character argument this time */
+ Length = wctomb(NULL, wchSrc[0]);
+ ok(Length == 0, "Expected no characters to be converted (because the output
argument is refused) but got %d\n.", Length);
+
+ /* Don't return anything to the output even if conversion is impossible */
+ Length = wctomb(NULL, wchSrc[1]);
+ ok(errno == 0, "The error number (errno) should be 0 even though an invalid
character in current locale is given but got %d.\n", errno);
+ ok(Length == 0, "Expected no characters to be converted (because the output
argument is refused) but got %d\n.", Length);
+
+ /* Attempt to convert a character not possible in current locale */
+ Length = wctomb(chDest, wchSrc[1]);
+ ok(Length == -1, "The conversion is not possible in current locale but got %d as
returned value.\n", Length);
+ ok(errno == EILSEQ, "EILSEQ is expected in an illegal sequence conversion but
got %d.\n", errno);
+
+ /* Return a null wide character to the destination argument */
+ Length = wctomb(chDest, 0);
+ ok(Length == 1, "Expected one character to be converted (the null character) but
got %d.\n", Length);
+ ok_int(chDest[0], '\0');
+
+ /* Get the converted output and validate what we should get */
+ Length = wctomb(chDest, wchSrc[0]);
+ ok(Length == 1, "Expected one character to be converted but got %d.\n",
Length);
+ ok_int(chDest[0], 'R');
+
+ FreeGuarded(chDest);
+}