[CRT_APITEST]
[reactos.git] / rostests / apitests / crt / wcstombs_s.c
1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for wcstombs_s
5 */
6
7 #define WIN32_NO_STATUS
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <wine/test.h>
11 #include <specstrings.h>
12
13 #define ok_errno(x) ok_hex(errno, (x))
14
15 #undef ok_char
16 #define ok_char(x,y) ok_int((unsigned)(unsigned char)(x),(unsigned)(unsigned char)(y))
17 #define ok_wchar(x,y) ok_int((unsigned)(unsigned short)(x),(unsigned)(unsigned short)(y))
18
19 _Check_return_wat_
20 _CRTIMP
21 errno_t
22 __cdecl
23 wcstombs_s(
24 _Out_opt_ size_t * pcchConverted,
25 _Out_writes_bytes_to_opt_(cjDstSize, *pcchConverted)
26 char * pmbsDst,
27 _In_ size_t cjDstSize,
28 _In_z_ const wchar_t * pwszSrc,
29 _In_ size_t cjMaxCount);
30
31
32 START_TEST(wcstombs_s)
33 {
34 errno_t ret;
35 size_t cchConverted;
36 char mbsbuffer[10];
37
38 _set_errno(0);
39 cchConverted = 0xf00bac;
40 mbsbuffer[5] = 0xFF;
41 ret = wcstombs_s(&cchConverted, mbsbuffer, 6, L"hallo", 5);
42 ok_long(ret, 0);
43 ok_size_t(cchConverted, 6);
44 ok_char(mbsbuffer[5], 0);
45 ok_str(mbsbuffer, "hallo");
46 ok_errno(0);
47
48 _set_errno(0);
49 cchConverted = 0xf00bac;
50 mbsbuffer[0] = 0xFF;
51 ret = wcstombs_s(&cchConverted, mbsbuffer, 1, L"", 0);
52 ok_long(ret, 0);
53 ok_size_t(cchConverted, 1);
54 ok_wchar(mbsbuffer[0], 0);
55 ok_errno(0);
56
57 _set_errno(0);
58 cchConverted = 0xf00bac;
59 mbsbuffer[0] = 0xFF;
60 mbsbuffer[1] = 0xFF;
61 mbsbuffer[2] = 0xFF;
62 mbsbuffer[3] = 0xFF;
63 mbsbuffer[4] = 0xFF;
64 mbsbuffer[5] = 0xFF;
65 ret = wcstombs_s(&cchConverted, mbsbuffer, 5, L"hallo", 5);
66 ok_long(ret, ERANGE);
67 ok_size_t(cchConverted, 0);
68 ok_char(mbsbuffer[5], 0xFF);
69 ok_char(mbsbuffer[4], L'o');
70 ok_char(mbsbuffer[3], L'l');
71 ok_char(mbsbuffer[2], L'l');
72 ok_char(mbsbuffer[1], L'a');
73 ok_char(mbsbuffer[0], 0);
74 ok_errno(ERANGE);
75
76 _set_errno(0);
77 cchConverted = 0xf00bac;
78 mbsbuffer[0] = 0xFF;
79 mbsbuffer[1] = 0xFF;
80 mbsbuffer[2] = 0xFF;
81 mbsbuffer[3] = 0xFF;
82 mbsbuffer[4] = 0xFF;
83 mbsbuffer[5] = 0xFF;
84 ret = wcstombs_s(&cchConverted, mbsbuffer, 3, L"hallo", 5);
85 ok_long(ret, ERANGE);
86 ok_size_t(cchConverted, 0);
87 ok_char(mbsbuffer[5], 0xFF);
88 ok_char(mbsbuffer[4], 0xFF);
89 ok_char(mbsbuffer[3], 0xFF);
90 ok_char(mbsbuffer[2], L'l');
91 ok_char(mbsbuffer[1], L'a');
92 ok_char(mbsbuffer[0], 0);
93 ok_errno(ERANGE);
94
95 _set_errno(0);
96 ret = wcstombs_s(0, 0, 0, 0, 0);
97 ok_long(ret, EINVAL);
98 ok_errno(EINVAL);
99
100 _set_errno(0);
101 cchConverted = 0xf00bac;
102 ret = wcstombs_s(&cchConverted, 0, 0, 0, 0);
103 ok_long(ret, EINVAL);
104 ok_size_t(cchConverted, 0);
105 ok_errno(EINVAL);
106
107 _set_errno(0);
108 mbsbuffer[0] = L'x';
109 ret = wcstombs_s(0, mbsbuffer, 0, 0, 0);
110 ok_long(ret, EINVAL);
111 ok_char(mbsbuffer[0], L'x');
112 ok_errno(EINVAL);
113
114 _set_errno(0);
115 ret = wcstombs_s(0, mbsbuffer, 10, L"hallo", 5);
116 ok_long(ret, 0);
117 ok_errno(0);
118
119 _set_errno(0);
120 ret = wcstombs_s(0, mbsbuffer, 0, L"hallo", 5);
121 ok_long(ret, EINVAL);
122 ok_errno(EINVAL);
123
124 _set_errno(0);
125 cchConverted = 0xf00bac;
126 ret = wcstombs_s(&cchConverted, 0, 10, L"hallo", 5);
127 ok_long(ret, EINVAL);
128 ok_size_t(cchConverted, 0xf00bac);
129 ok_errno(EINVAL);
130
131 _set_errno(0);
132 cchConverted = 0xf00bac;
133 ret = wcstombs_s(&cchConverted, 0, 0, L"hallo", 5);
134 ok_long(ret, 0);
135 ok_size_t(cchConverted, 6);
136 ok_errno(0);
137
138 _set_errno(0);
139 cchConverted = 0xf00bac;
140 ret = wcstombs_s(&cchConverted, mbsbuffer, 10, 0, 5);
141 ok_long(ret, EINVAL);
142 ok_size_t(cchConverted, 0);
143 ok_errno(EINVAL);
144
145 _set_errno(0);
146 cchConverted = 0xf00bac;
147 ret = wcstombs_s(&cchConverted, mbsbuffer, 10, L"hallo", 0);
148 ok_long(ret, 0);
149 ok_size_t(cchConverted, 1);
150 ok_errno(0);
151
152 _set_errno(0);
153 cchConverted = 0xf00bac;
154 mbsbuffer[0] = 0xAB;
155 mbsbuffer[1] = 0xCD;
156 mbsbuffer[2] = 0xAB;
157 mbsbuffer[3] = 0xCD;
158 mbsbuffer[4] = 0xAB;
159 mbsbuffer[5] = 0xCD;
160 ret = wcstombs_s(&cchConverted, mbsbuffer, 10, L"hallo", 2);
161 ok_long(ret, 0);
162 ok_size_t(cchConverted, 3);
163 ok_char(mbsbuffer[5], 0xCD);
164 ok_char(mbsbuffer[4], 0xAB);
165 ok_char(mbsbuffer[3], 0xCD);
166 ok_char(mbsbuffer[2], 0);
167 ok_char(mbsbuffer[1], L'a');
168 ok_char(mbsbuffer[0], L'h');
169 ok_errno(0);
170
171 _set_errno(0);
172 cchConverted = 0xf00bac;
173 ret = wcstombs_s(&cchConverted, mbsbuffer, 10, 0, 0);
174 ok_long(ret, 0);
175 ok_size_t(cchConverted, 1);
176 ok_errno(0);
177
178 _set_errno(0);
179 cchConverted = 0xf00bac;
180 ret = wcstombs_s(&cchConverted, mbsbuffer, 10, L"hallo", 7);
181 ok_long(ret, 0);
182 ok_size_t(cchConverted, 6);
183 ok_errno(0);
184
185 _set_errno(0);
186 cchConverted = 0xf00bac;
187 ret = wcstombs_s(&cchConverted, 0, 0, L"hallo", 7);
188 ok_long(ret, 0);
189 ok_size_t(cchConverted, 6);
190 ok_errno(0);
191
192 _set_errno(0);
193 cchConverted = 0xf00bac;
194 mbsbuffer[0] = 0xAB;
195 mbsbuffer[1] = 0xCD;
196 mbsbuffer[2] = 0xAB;
197 mbsbuffer[3] = 0xCD;
198 mbsbuffer[4] = 0xAB;
199 mbsbuffer[5] = 0xCD;
200 ret = wcstombs_s(&cchConverted, mbsbuffer, 5, L"hallo", _TRUNCATE);
201 ok_long(ret, STRUNCATE);
202 ok_size_t(cchConverted, 5);
203 ok_char(mbsbuffer[5], 0xCD);
204 ok_char(mbsbuffer[4], 0);
205 ok_char(mbsbuffer[3], L'l');
206 ok_char(mbsbuffer[2], L'l');
207 ok_char(mbsbuffer[1], L'a');
208 ok_char(mbsbuffer[0], L'h');
209 ok_errno(0);
210
211 _set_errno(0);
212 cchConverted = 0xf00bac;
213 ret = wcstombs_s(&cchConverted, mbsbuffer, 10, L"hallo", -1);
214 ok_long(ret, 0);
215 ok_size_t(cchConverted, 6);
216 ok_errno(0);
217
218 }