mirror of
https://github.com/reactos/reactos.git
synced 2024-08-30 15:18:33 +00:00
![Amine Khaldi](/assets/img/avatar_default.png)
* Don't reply on _set_errno() which shouldn't be exported. svn path=/trunk/; revision=63399
220 lines
5.5 KiB
C
220 lines
5.5 KiB
C
/*
|
|
* PROJECT: ReactOS api tests
|
|
* LICENSE: GPL - See COPYING in the top level directory
|
|
* PURPOSE: Test for wcstombs_s
|
|
*/
|
|
|
|
#include <apitest.h>
|
|
|
|
#define WIN32_NO_STATUS
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <specstrings.h>
|
|
|
|
#define ok_errno(x) ok_hex(errno, (x))
|
|
|
|
#undef ok_char
|
|
#define ok_char(x,y) ok_int((unsigned)(unsigned char)(x),(unsigned)(unsigned char)(y))
|
|
#define ok_wchar(x,y) ok_int((unsigned)(unsigned short)(x),(unsigned)(unsigned short)(y))
|
|
|
|
_Check_return_wat_
|
|
_CRTIMP
|
|
errno_t
|
|
__cdecl
|
|
wcstombs_s(
|
|
_Out_opt_ size_t * pcchConverted,
|
|
_Out_writes_bytes_to_opt_(cjDstSize, *pcchConverted)
|
|
char * pmbsDst,
|
|
_In_ size_t cjDstSize,
|
|
_In_z_ const wchar_t * pwszSrc,
|
|
_In_ size_t cjMaxCount);
|
|
|
|
|
|
START_TEST(wcstombs_s)
|
|
{
|
|
errno_t ret;
|
|
size_t cchConverted;
|
|
char mbsbuffer[10];
|
|
|
|
*_errno() = 0;
|
|
cchConverted = 0xf00bac;
|
|
mbsbuffer[5] = 0xFF;
|
|
ret = wcstombs_s(&cchConverted, mbsbuffer, 6, L"hallo", 5);
|
|
ok_long(ret, 0);
|
|
ok_size_t(cchConverted, 6);
|
|
ok_char(mbsbuffer[5], 0);
|
|
ok_str(mbsbuffer, "hallo");
|
|
ok_errno(0);
|
|
|
|
*_errno() = 0;
|
|
cchConverted = 0xf00bac;
|
|
mbsbuffer[0] = 0xFF;
|
|
ret = wcstombs_s(&cchConverted, mbsbuffer, 1, L"", 0);
|
|
ok_long(ret, 0);
|
|
ok_size_t(cchConverted, 1);
|
|
ok_wchar(mbsbuffer[0], 0);
|
|
ok_errno(0);
|
|
|
|
*_errno() = 0;
|
|
cchConverted = 0xf00bac;
|
|
mbsbuffer[0] = 0xFF;
|
|
mbsbuffer[1] = 0xFF;
|
|
mbsbuffer[2] = 0xFF;
|
|
mbsbuffer[3] = 0xFF;
|
|
mbsbuffer[4] = 0xFF;
|
|
mbsbuffer[5] = 0xFF;
|
|
ret = wcstombs_s(&cchConverted, mbsbuffer, 5, L"hallo", 5);
|
|
ok_long(ret, ERANGE);
|
|
ok_size_t(cchConverted, 0);
|
|
ok_char(mbsbuffer[5], 0xFF);
|
|
ok_char(mbsbuffer[4], L'o');
|
|
ok_char(mbsbuffer[3], L'l');
|
|
ok_char(mbsbuffer[2], L'l');
|
|
ok_char(mbsbuffer[1], L'a');
|
|
ok_char(mbsbuffer[0], 0);
|
|
ok_errno(ERANGE);
|
|
|
|
*_errno() = 0;
|
|
cchConverted = 0xf00bac;
|
|
mbsbuffer[0] = 0xFF;
|
|
mbsbuffer[1] = 0xFF;
|
|
mbsbuffer[2] = 0xFF;
|
|
mbsbuffer[3] = 0xFF;
|
|
mbsbuffer[4] = 0xFF;
|
|
mbsbuffer[5] = 0xFF;
|
|
ret = wcstombs_s(&cchConverted, mbsbuffer, 3, L"hallo", 5);
|
|
ok_long(ret, ERANGE);
|
|
ok_size_t(cchConverted, 0);
|
|
ok_char(mbsbuffer[5], 0xFF);
|
|
ok_char(mbsbuffer[4], 0xFF);
|
|
ok_char(mbsbuffer[3], 0xFF);
|
|
ok_char(mbsbuffer[2], L'l');
|
|
ok_char(mbsbuffer[1], L'a');
|
|
ok_char(mbsbuffer[0], 0);
|
|
ok_errno(ERANGE);
|
|
|
|
*_errno() = 0;
|
|
ret = wcstombs_s(0, 0, 0, 0, 0);
|
|
ok_long(ret, EINVAL);
|
|
ok_errno(EINVAL);
|
|
|
|
*_errno() = 0;
|
|
cchConverted = 0xf00bac;
|
|
ret = wcstombs_s(&cchConverted, 0, 0, 0, 0);
|
|
ok_long(ret, EINVAL);
|
|
ok_size_t(cchConverted, 0);
|
|
ok_errno(EINVAL);
|
|
|
|
*_errno() = 0;
|
|
mbsbuffer[0] = L'x';
|
|
ret = wcstombs_s(0, mbsbuffer, 0, 0, 0);
|
|
ok_long(ret, EINVAL);
|
|
ok_char(mbsbuffer[0], L'x');
|
|
ok_errno(EINVAL);
|
|
|
|
*_errno() = 0;
|
|
ret = wcstombs_s(0, mbsbuffer, 10, L"hallo", 5);
|
|
ok_long(ret, 0);
|
|
ok_errno(0);
|
|
|
|
*_errno() = 0;
|
|
ret = wcstombs_s(0, mbsbuffer, 0, L"hallo", 5);
|
|
ok_long(ret, EINVAL);
|
|
ok_errno(EINVAL);
|
|
|
|
*_errno() = 0;
|
|
cchConverted = 0xf00bac;
|
|
ret = wcstombs_s(&cchConverted, 0, 10, L"hallo", 5);
|
|
ok_long(ret, EINVAL);
|
|
ok_size_t(cchConverted, 0xf00bac);
|
|
ok_errno(EINVAL);
|
|
|
|
*_errno() = 0;
|
|
cchConverted = 0xf00bac;
|
|
ret = wcstombs_s(&cchConverted, 0, 0, L"hallo", 5);
|
|
ok_long(ret, 0);
|
|
ok_size_t(cchConverted, 6);
|
|
ok_errno(0);
|
|
|
|
*_errno() = 0;
|
|
cchConverted = 0xf00bac;
|
|
ret = wcstombs_s(&cchConverted, mbsbuffer, 10, 0, 5);
|
|
ok_long(ret, EINVAL);
|
|
ok_size_t(cchConverted, 0);
|
|
ok_errno(EINVAL);
|
|
|
|
*_errno() = 0;
|
|
cchConverted = 0xf00bac;
|
|
ret = wcstombs_s(&cchConverted, mbsbuffer, 10, L"hallo", 0);
|
|
ok_long(ret, 0);
|
|
ok_size_t(cchConverted, 1);
|
|
ok_errno(0);
|
|
|
|
*_errno() = 0;
|
|
cchConverted = 0xf00bac;
|
|
mbsbuffer[0] = 0xAB;
|
|
mbsbuffer[1] = 0xCD;
|
|
mbsbuffer[2] = 0xAB;
|
|
mbsbuffer[3] = 0xCD;
|
|
mbsbuffer[4] = 0xAB;
|
|
mbsbuffer[5] = 0xCD;
|
|
ret = wcstombs_s(&cchConverted, mbsbuffer, 10, L"hallo", 2);
|
|
ok_long(ret, 0);
|
|
ok_size_t(cchConverted, 3);
|
|
ok_char(mbsbuffer[5], 0xCD);
|
|
ok_char(mbsbuffer[4], 0xAB);
|
|
ok_char(mbsbuffer[3], 0xCD);
|
|
ok_char(mbsbuffer[2], 0);
|
|
ok_char(mbsbuffer[1], L'a');
|
|
ok_char(mbsbuffer[0], L'h');
|
|
ok_errno(0);
|
|
|
|
*_errno() = 0;
|
|
cchConverted = 0xf00bac;
|
|
ret = wcstombs_s(&cchConverted, mbsbuffer, 10, 0, 0);
|
|
ok_long(ret, 0);
|
|
ok_size_t(cchConverted, 1);
|
|
ok_errno(0);
|
|
|
|
*_errno() = 0;
|
|
cchConverted = 0xf00bac;
|
|
ret = wcstombs_s(&cchConverted, mbsbuffer, 10, L"hallo", 7);
|
|
ok_long(ret, 0);
|
|
ok_size_t(cchConverted, 6);
|
|
ok_errno(0);
|
|
|
|
*_errno() = 0;
|
|
cchConverted = 0xf00bac;
|
|
ret = wcstombs_s(&cchConverted, 0, 0, L"hallo", 7);
|
|
ok_long(ret, 0);
|
|
ok_size_t(cchConverted, 6);
|
|
ok_errno(0);
|
|
|
|
*_errno() = 0;
|
|
cchConverted = 0xf00bac;
|
|
mbsbuffer[0] = 0xAB;
|
|
mbsbuffer[1] = 0xCD;
|
|
mbsbuffer[2] = 0xAB;
|
|
mbsbuffer[3] = 0xCD;
|
|
mbsbuffer[4] = 0xAB;
|
|
mbsbuffer[5] = 0xCD;
|
|
ret = wcstombs_s(&cchConverted, mbsbuffer, 5, L"hallo", _TRUNCATE);
|
|
ok_long(ret, STRUNCATE);
|
|
ok_size_t(cchConverted, 5);
|
|
ok_char(mbsbuffer[5], 0xCD);
|
|
ok_char(mbsbuffer[4], 0);
|
|
ok_char(mbsbuffer[3], L'l');
|
|
ok_char(mbsbuffer[2], L'l');
|
|
ok_char(mbsbuffer[1], L'a');
|
|
ok_char(mbsbuffer[0], L'h');
|
|
ok_errno(0);
|
|
|
|
*_errno() = 0;
|
|
cchConverted = 0xf00bac;
|
|
ret = wcstombs_s(&cchConverted, mbsbuffer, 10, L"hallo", -1);
|
|
ok_long(ret, 0);
|
|
ok_size_t(cchConverted, 6);
|
|
ok_errno(0);
|
|
|
|
}
|