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