1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 // <codecvt>
10
11 // template <class Elem, unsigned long Maxcode = 0x10ffff,
12 // codecvt_mode Mode = (codecvt_mode)0>
13 // class codecvt_utf16
14 // : public codecvt<Elem, char, mbstate_t>
15 // {
16 // // unspecified
17 // };
18
19 // int length(stateT& state, const externT* from, const externT* from_end,
20 // size_t max) const;
21
22 #include <codecvt>
23 #include <cassert>
24
25 #include "test_macros.h"
26
main(int,char **)27 int main(int, char**)
28 {
29 {
30 typedef std::codecvt_utf16<wchar_t> C;
31 C c;
32 char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};
33 std::mbstate_t m;
34 int r = c.length(m, n, n+4, 2);
35 assert(r == 4);
36
37 n[0] = char(0x10);
38 n[1] = char(0x05);
39 r = c.length(m, n, n+2, 2);
40 assert(r == 2);
41
42 n[0] = char(0x04);
43 n[1] = char(0x53);
44 r = c.length(m, n, n+2, 2);
45 assert(r == 2);
46
47 n[0] = char(0x00);
48 n[1] = char(0x56);
49 r = c.length(m, n, n+2, 2);
50 assert(r == 2);
51 }
52 {
53 typedef std::codecvt_utf16<wchar_t, 0x1000> C;
54 C c;
55 char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};
56 std::mbstate_t m;
57 int r = c.length(m, n, n+4, 2);
58 assert(r == 0);
59
60 n[0] = char(0x10);
61 n[1] = char(0x05);
62 r = c.length(m, n, n+2, 2);
63 assert(r == 0);
64
65 n[0] = char(0x04);
66 n[1] = char(0x53);
67 r = c.length(m, n, n+2, 2);
68 assert(r == 2);
69
70 n[0] = char(0x00);
71 n[1] = char(0x56);
72 r = c.length(m, n, n+2, 2);
73 assert(r == 2);
74 }
75 {
76 typedef std::codecvt_utf16<wchar_t, 0x10ffff, std::consume_header> C;
77 C c;
78 char n[6] = {char(0xFE), char(0xFF), char(0xD8), char(0xC0), char(0xDC), char(0x03)};
79 std::mbstate_t m;
80 int r = c.length(m, n, n+6, 2);
81 assert(r == 6);
82
83 n[0] = char(0x10);
84 n[1] = char(0x05);
85 r = c.length(m, n, n+2, 2);
86 assert(r == 2);
87
88 n[0] = char(0x04);
89 n[1] = char(0x53);
90 r = c.length(m, n, n+2, 2);
91 assert(r == 2);
92
93 n[0] = char(0x00);
94 n[1] = char(0x56);
95 r = c.length(m, n, n+2, 2);
96 assert(r == 2);
97 }
98 {
99 typedef std::codecvt_utf16<wchar_t, 0x10ffff, std::little_endian> C;
100 C c;
101 char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};
102 std::mbstate_t m;
103 int r = c.length(m, n, n+4, 2);
104 assert(r == 4);
105
106 n[1] = char(0x10);
107 n[0] = char(0x05);
108 r = c.length(m, n, n+2, 2);
109 assert(r == 2);
110
111 n[1] = char(0x04);
112 n[0] = char(0x53);
113 r = c.length(m, n, n+2, 2);
114 assert(r == 2);
115
116 n[1] = char(0x00);
117 n[0] = char(0x56);
118 r = c.length(m, n, n+2, 2);
119 assert(r == 2);
120 }
121 {
122 typedef std::codecvt_utf16<wchar_t, 0x1000, std::little_endian> C;
123 C c;
124 char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};
125 std::mbstate_t m;
126 int r = c.length(m, n, n+4, 2);
127 assert(r == 0);
128
129 n[1] = char(0x10);
130 n[0] = char(0x05);
131 r = c.length(m, n, n+2, 2);
132 assert(r == 0);
133
134 n[1] = char(0x04);
135 n[0] = char(0x53);
136 r = c.length(m, n, n+2, 2);
137 assert(r == 2);
138
139 n[1] = char(0x00);
140 n[0] = char(0x56);
141 r = c.length(m, n, n+2, 2);
142 assert(r == 2);
143 }
144 {
145 typedef std::codecvt_utf16<wchar_t, 0x10ffff, std::codecvt_mode(
146 std::consume_header |
147 std::little_endian)> C;
148 C c;
149 char n[6] = {char(0xFF), char(0xFE), char(0xC0), char(0xD8), char(0x03), char(0xDC)};
150 std::mbstate_t m;
151 int r = c.length(m, n, n+6, 2);
152 assert(r == 6);
153
154 n[1] = char(0x10);
155 n[0] = char(0x05);
156 r = c.length(m, n, n+2, 2);
157 assert(r == 2);
158
159 n[1] = char(0x04);
160 n[0] = char(0x53);
161 r = c.length(m, n, n+2, 2);
162 assert(r == 2);
163
164 n[1] = char(0x00);
165 n[0] = char(0x56);
166 r = c.length(m, n, n+2, 2);
167 assert(r == 2);
168 }
169 {
170 typedef std::codecvt_utf16<char32_t> C;
171 C c;
172 char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};
173 std::mbstate_t m;
174 int r = c.length(m, n, n+4, 2);
175 assert(r == 4);
176
177 n[0] = char(0x10);
178 n[1] = char(0x05);
179 r = c.length(m, n, n+2, 2);
180 assert(r == 2);
181
182 n[0] = char(0x04);
183 n[1] = char(0x53);
184 r = c.length(m, n, n+2, 2);
185 assert(r == 2);
186
187 n[0] = char(0x00);
188 n[1] = char(0x56);
189 r = c.length(m, n, n+2, 2);
190 assert(r == 2);
191 }
192 {
193 typedef std::codecvt_utf16<char32_t, 0x1000> C;
194 C c;
195 char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};
196 std::mbstate_t m;
197 int r = c.length(m, n, n+4, 2);
198 assert(r == 0);
199
200 n[0] = char(0x10);
201 n[1] = char(0x05);
202 r = c.length(m, n, n+2, 2);
203 assert(r == 0);
204
205 n[0] = char(0x04);
206 n[1] = char(0x53);
207 r = c.length(m, n, n+2, 2);
208 assert(r == 2);
209
210 n[0] = char(0x00);
211 n[1] = char(0x56);
212 r = c.length(m, n, n+2, 2);
213 assert(r == 2);
214 }
215 {
216 typedef std::codecvt_utf16<char32_t, 0x10ffff, std::consume_header> C;
217 C c;
218 char n[6] = {char(0xFE), char(0xFF), char(0xD8), char(0xC0), char(0xDC), char(0x03)};
219 std::mbstate_t m;
220 int r = c.length(m, n, n+6, 2);
221 assert(r == 6);
222
223 n[0] = char(0x10);
224 n[1] = char(0x05);
225 r = c.length(m, n, n+2, 2);
226 assert(r == 2);
227
228 n[0] = char(0x04);
229 n[1] = char(0x53);
230 r = c.length(m, n, n+2, 2);
231 assert(r == 2);
232
233 n[0] = char(0x00);
234 n[1] = char(0x56);
235 r = c.length(m, n, n+2, 2);
236 assert(r == 2);
237 }
238 {
239 typedef std::codecvt_utf16<char32_t, 0x10ffff, std::little_endian> C;
240 C c;
241 char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};
242 std::mbstate_t m;
243 int r = c.length(m, n, n+4, 2);
244 assert(r == 4);
245
246 n[1] = char(0x10);
247 n[0] = char(0x05);
248 r = c.length(m, n, n+2, 2);
249 assert(r == 2);
250
251 n[1] = char(0x04);
252 n[0] = char(0x53);
253 r = c.length(m, n, n+2, 2);
254 assert(r == 2);
255
256 n[1] = char(0x00);
257 n[0] = char(0x56);
258 r = c.length(m, n, n+2, 2);
259 assert(r == 2);
260 }
261 {
262 typedef std::codecvt_utf16<char32_t, 0x1000, std::little_endian> C;
263 C c;
264 char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};
265 std::mbstate_t m;
266 int r = c.length(m, n, n+4, 2);
267 assert(r == 0);
268
269 n[1] = char(0x10);
270 n[0] = char(0x05);
271 r = c.length(m, n, n+2, 2);
272 assert(r == 0);
273
274 n[1] = char(0x04);
275 n[0] = char(0x53);
276 r = c.length(m, n, n+2, 2);
277 assert(r == 2);
278
279 n[1] = char(0x00);
280 n[0] = char(0x56);
281 r = c.length(m, n, n+2, 2);
282 assert(r == 2);
283 }
284 {
285 typedef std::codecvt_utf16<char32_t, 0x10ffff, std::codecvt_mode(
286 std::consume_header |
287 std::little_endian)> C;
288 C c;
289 char n[6] = {char(0xFF), char(0xFE), char(0xC0), char(0xD8), char(0x03), char(0xDC)};
290 std::mbstate_t m;
291 int r = c.length(m, n, n+6, 2);
292 assert(r == 6);
293
294 n[1] = char(0x10);
295 n[0] = char(0x05);
296 r = c.length(m, n, n+2, 2);
297 assert(r == 2);
298
299 n[1] = char(0x04);
300 n[0] = char(0x53);
301 r = c.length(m, n, n+2, 2);
302 assert(r == 2);
303
304 n[1] = char(0x00);
305 n[0] = char(0x56);
306 r = c.length(m, n, n+2, 2);
307 assert(r == 2);
308 }
309
310 {
311 typedef std::codecvt_utf16<char16_t> C;
312 C c;
313 char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};
314 std::mbstate_t m;
315 int r = c.length(m, n, n+4, 2);
316 assert(r == 0);
317
318 n[0] = char(0x10);
319 n[1] = char(0x05);
320 r = c.length(m, n, n+2, 2);
321 assert(r == 2);
322
323 n[0] = char(0x04);
324 n[1] = char(0x53);
325 r = c.length(m, n, n+2, 2);
326 assert(r == 2);
327
328 n[0] = char(0x00);
329 n[1] = char(0x56);
330 r = c.length(m, n, n+2, 2);
331 assert(r == 2);
332 }
333 {
334 typedef std::codecvt_utf16<char16_t, 0x1000> C;
335 C c;
336 char n[4] = {char(0xD8), char(0xC0), char(0xDC), char(0x03)};
337 std::mbstate_t m;
338 int r = c.length(m, n, n+4, 2);
339 assert(r == 0);
340
341 n[0] = char(0x10);
342 n[1] = char(0x05);
343 r = c.length(m, n, n+2, 2);
344 assert(r == 0);
345
346 n[0] = char(0x04);
347 n[1] = char(0x53);
348 r = c.length(m, n, n+2, 2);
349 assert(r == 2);
350
351 n[0] = char(0x00);
352 n[1] = char(0x56);
353 r = c.length(m, n, n+2, 2);
354 assert(r == 2);
355 }
356 {
357 typedef std::codecvt_utf16<char16_t, 0x10ffff, std::consume_header> C;
358 C c;
359 char n[6] = {char(0xFE), char(0xFF), char(0xD8), char(0xC0), char(0xDC), char(0x03)};
360 std::mbstate_t m;
361 int r = c.length(m, n, n+6, 2);
362 assert(r == 2);
363
364 n[0] = char(0x10);
365 n[1] = char(0x05);
366 r = c.length(m, n, n+2, 2);
367 assert(r == 2);
368
369 n[0] = char(0x04);
370 n[1] = char(0x53);
371 r = c.length(m, n, n+2, 2);
372 assert(r == 2);
373
374 n[0] = char(0x00);
375 n[1] = char(0x56);
376 r = c.length(m, n, n+2, 2);
377 assert(r == 2);
378 }
379 {
380 typedef std::codecvt_utf16<char16_t, 0x10ffff, std::little_endian> C;
381 C c;
382 char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};
383 std::mbstate_t m;
384 int r = c.length(m, n, n+4, 2);
385 assert(r == 0);
386
387 n[1] = char(0x10);
388 n[0] = char(0x05);
389 r = c.length(m, n, n+2, 2);
390 assert(r == 2);
391
392 n[1] = char(0x04);
393 n[0] = char(0x53);
394 r = c.length(m, n, n+2, 2);
395 assert(r == 2);
396
397 n[1] = char(0x00);
398 n[0] = char(0x56);
399 r = c.length(m, n, n+2, 2);
400 assert(r == 2);
401 }
402 {
403 typedef std::codecvt_utf16<char16_t, 0x1000, std::little_endian> C;
404 C c;
405 char n[4] = {char(0xC0), char(0xD8), char(0x03), char(0xDC)};
406 std::mbstate_t m;
407 int r = c.length(m, n, n+4, 2);
408 assert(r == 0);
409
410 n[1] = char(0x10);
411 n[0] = char(0x05);
412 r = c.length(m, n, n+2, 2);
413 assert(r == 0);
414
415 n[1] = char(0x04);
416 n[0] = char(0x53);
417 r = c.length(m, n, n+2, 2);
418 assert(r == 2);
419
420 n[1] = char(0x00);
421 n[0] = char(0x56);
422 r = c.length(m, n, n+2, 2);
423 assert(r == 2);
424 }
425 {
426 typedef std::codecvt_utf16<char16_t, 0x10ffff, std::codecvt_mode(
427 std::consume_header |
428 std::little_endian)> C;
429 C c;
430 char n[6] = {char(0xFF), char(0xFE), char(0xC0), char(0xD8), char(0x03), char(0xDC)};
431 std::mbstate_t m;
432 int r = c.length(m, n, n+6, 2);
433 assert(r == 2);
434
435 n[1] = char(0x10);
436 n[0] = char(0x05);
437 r = c.length(m, n, n+2, 2);
438 assert(r == 2);
439
440 n[1] = char(0x04);
441 n[0] = char(0x53);
442 r = c.length(m, n, n+2, 2);
443 assert(r == 2);
444
445 n[1] = char(0x00);
446 n[0] = char(0x56);
447 r = c.length(m, n, n+2, 2);
448 assert(r == 2);
449 }
450
451 return 0;
452 }
453