xref: /reactos/modules/rostests/apitests/crt/wctomb.c (revision 5140a990)
1 /*
2  * PROJECT:         ReactOS API tests
3  * LICENSE:         GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4  * PURPOSE:         Tests for wctomb
5  * COPYRIGHT:       Copyright 2020 George Bișoc <george.bisoc@reactos.org>
6  */
7 
8 #include <apitest.h>
9 #include <apitest_guard.h>
10 
11 #define WIN32_NO_STATUS
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <errno.h>
15 #include <locale.h>
16 
17 #ifdef TEST_STATIC_CRT
18 #define todo_static todo_if(1)
19 #else
20 #define todo_static
21 #endif
22 
23 START_TEST(wctomb)
24 {
25     int Length;
26     char *chDest;
27     char *loc;
28     unsigned int codepage = ___lc_codepage_func();
29     wchar_t wchSrc[2] = {L'R', 0414}; // 0414 corresponds to a Russian character in Windows-1251
30 
31     chDest = AllocateGuarded(sizeof(*chDest));
32     if (!chDest)
33     {
34         skip("Buffer allocation failed!\n");
35         return;
36     }
37 
38     /* Output the current locale of the system and codepage for comparison between ReactOS and Windows */
39     loc = setlocale(LC_ALL, NULL);
40     printf("The current codepage of your system tested is (%u) and locale (%s).\n\n", codepage, loc);
41 
42     /* Do not give output to the caller */
43     Length = wctomb(NULL, 0);
44     todo_static ok(Length == 0, "Expected no characters to be converted (because the output argument is refused) but got %d.\n", Length);
45 
46     /* Do the same but expect a valid wide character argument this time */
47     Length = wctomb(NULL, wchSrc[0]);
48     todo_static ok(Length == 0, "Expected no characters to be converted (because the output argument is refused) but got %d.\n", Length);
49 
50     /* Don't return anything to the output even if conversion is impossible */
51     Length = wctomb(NULL, wchSrc[1]);
52     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);
53     todo_static ok(Length == 0, "Expected no characters to be converted (because the output argument is refused) but got %d.\n", Length);
54 
55     /* Attempt to convert a character not possible in current locale */
56     Length = wctomb(chDest, wchSrc[1]);
57     todo_static ok(Length == -1, "The conversion is not possible in current locale but got %d as returned value.\n", Length);
58     todo_static ok(errno == EILSEQ, "EILSEQ is expected in an illegal sequence conversion but got %d.\n", errno);
59 
60     /* Return a null wide character to the destination argument */
61     Length = wctomb(chDest, 0);
62     ok(Length == 1, "Expected one character to be converted (the null character) but got %d.\n", Length);
63     ok_int(chDest[0], '\0');
64 
65     /* Get the converted output and validate what we should get */
66     Length = wctomb(chDest, wchSrc[0]);
67     ok(Length == 1, "Expected one character to be converted but got %d.\n", Length);
68     ok_int(chDest[0], 'R');
69 
70     FreeGuarded(chDest);
71 }
72