[CRT_APITEST] Implement wctomb() testcase (#2701)
[reactos.git] / modules / rostests / apitests / crt / wctomb.c
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 Bișoc George <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 unsigned int cdecl ___lc_codepage_func(void);
18
19 START_TEST(wctomb)
20 {
21 int Length;
22 char *chDest;
23 char *loc;
24 unsigned int codepage = ___lc_codepage_func();
25 wchar_t wchSrc[2] = {L'R', 0414}; // 0414 corresponds to a Russian character in Windows-1251
26
27 chDest = AllocateGuarded(sizeof(*chDest));
28 if (!chDest)
29 {
30 skip("Buffer allocation failed!\n");
31 return;
32 }
33
34 /* Output the current locale of the system and codepage for comparison between ReactOS and Windows */
35 loc = setlocale(LC_ALL, NULL);
36 printf("The current codepage of your system tested is (%u) and locale (%s).\n\n", codepage, loc);
37
38 /* Do not give output to the caller */
39 Length = wctomb(NULL, 0);
40 ok(Length == 0, "Expected no characters to be converted (because the output argument is refused) but got %d\n.", Length);
41
42 /* Do the same but expect a valid wide character argument this time */
43 Length = wctomb(NULL, wchSrc[0]);
44 ok(Length == 0, "Expected no characters to be converted (because the output argument is refused) but got %d\n.", Length);
45
46 /* Don't return anything to the output even if conversion is impossible */
47 Length = wctomb(NULL, wchSrc[1]);
48 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);
49 ok(Length == 0, "Expected no characters to be converted (because the output argument is refused) but got %d\n.", Length);
50
51 /* Attempt to convert a character not possible in current locale */
52 Length = wctomb(chDest, wchSrc[1]);
53 ok(Length == -1, "The conversion is not possible in current locale but got %d as returned value.\n", Length);
54 ok(errno == EILSEQ, "EILSEQ is expected in an illegal sequence conversion but got %d.\n", errno);
55
56 /* Return a null wide character to the destination argument */
57 Length = wctomb(chDest, 0);
58 ok(Length == 1, "Expected one character to be converted (the null character) but got %d.\n", Length);
59 ok_int(chDest[0], '\0');
60
61 /* Get the converted output and validate what we should get */
62 Length = wctomb(chDest, wchSrc[0]);
63 ok(Length == 1, "Expected one character to be converted but got %d.\n", Length);
64 ok_int(chDest[0], 'R');
65
66 FreeGuarded(chDest);
67 }