1 /********************************************************************
3 * Copyright (c) 2001-2008, International Business Machines Corporation and
4 * others. All Rights Reserved.
5 ********************************************************************/
6 /********************************************************************************
10 * Modification History:
12 * Ram String transformations test
13 *********************************************************************************
15 /****************************************************************************/
20 #include "unicode/utypes.h"
21 #include "unicode/ustring.h"
22 #include "unicode/ures.h"
29 #define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
31 void addUCharTransformTest(TestNode
** root
);
33 static void Test_UChar_UTF32_API(void);
34 static void Test_UChar_UTF8_API(void);
35 static void Test_FromUTF8(void);
36 static void Test_FromUTF8Lenient(void);
37 static void Test_UChar_WCHART_API(void);
38 static void Test_widestrs(void);
39 static void Test_WCHART_LongString(void);
42 addUCharTransformTest(TestNode
** root
)
44 addTest(root
, &Test_UChar_UTF32_API
, "custrtrn/Test_UChar_UTF32_API");
45 addTest(root
, &Test_UChar_UTF8_API
, "custrtrn/Test_UChar_UTF8_API");
46 addTest(root
, &Test_FromUTF8
, "custrtrn/Test_FromUTF8");
47 addTest(root
, &Test_FromUTF8Lenient
, "custrtrn/Test_FromUTF8Lenient");
48 addTest(root
, &Test_UChar_WCHART_API
, "custrtrn/Test_UChar_WCHART_API");
49 addTest(root
, &Test_widestrs
, "custrtrn/Test_widestrs");
50 addTest(root
, &Test_WCHART_LongString
, "custrtrn/Test_WCHART_LongString");
53 static const UChar32 src32
[]={
54 0x00A8, 0x3003, 0x3005, 0x2015, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x000D, 0x000A,
55 0x2019, 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x000D, 0x000A,
56 0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x000D, 0x000A,
57 0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2236, 0x2227, 0x7FC1, 0x8956, 0x000D, 0x000A,
58 0x9D2C, 0x9D0E, 0x9EC4, 0x5CA1, 0x6C96, 0x837B, 0x5104, 0x5C4B, 0x000D, 0x000A,
59 0x61B6, 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378, 0x57F7, 0x000D, 0x000A,
60 0x57F4, 0x57F9, 0x57FA, 0x57FC, 0x5800, 0x5802, 0x5805, 0x5806, 0x000D, 0x000A,
61 0x580A, 0x581E, 0x6BB5, 0x6BB7, 0x6BBA, 0x6BBC, 0x9CE2, 0x977C, 0x000D, 0x000A,
62 0x6BBF, 0x6BC1, 0x6BC5, 0x6BC6, 0x6BCB, 0x6BCD, 0x6BCF, 0x6BD2, 0x000D, 0x000A,
63 0x6BD3, 0x6BD4, 0x6BD6, 0x6BD7, 0x6BD8, 0x6BDB, 0x6BEB, 0x6BEC, 0x000D, 0x000A,
64 0x6C05, 0x6C08, 0x6C0F, 0x6C11, 0x6C13, 0x6C23, 0x6C34, 0x0041, 0x000D, 0x000A,
65 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x000D, 0x000A,
66 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x000D, 0x000A,
67 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A,
68 0x005B, 0x9792, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x000D, 0x000A,
69 0x9CD4, 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x000D, 0x000A,
70 0x9785, 0x9791, 0x00BD, 0x0390, 0x0385, 0x0386, 0x0388, 0x0389, 0x000D, 0x000A,
71 0x038E, 0x038F, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x000D, 0x000A,
72 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x038A, 0x038C, 0x039C, 0x000D, 0x000A,
73 /* test non-BMP code points */
75 0x0002A69C, 0x0002A69D, 0x0002A69E, 0x0002A69F, 0x0002A6A0, 0x0002A6A5, 0x0002A6A6, 0x0002A6A7, 0x0002A6A8, 0x0002A6AB,
76 0x0002A6AC, 0x0002A6AD, 0x0002A6AE, 0x0002A6AF, 0x0002A6B0, 0x0002A6B1, 0x0002A6B3, 0x0002A6B5, 0x0002A6B6, 0x0002A6B7,
77 0x0002A6B8, 0x0002A6B9, 0x0002A6BA, 0x0002A6BB, 0x0002A6BC, 0x0002A6BD, 0x0002A6BE, 0x0002A6BF, 0x0002A6C0, 0x0002A6C1,
78 0x0002A6C2, 0x0002A6C3, 0x0002A6C4, 0x0002A6C8, 0x0002A6CA, 0x0002A6CB, 0x0002A6CD, 0x0002A6CE, 0x0002A6CF, 0x0002A6D0,
79 0x0002A6D1, 0x0002A6D2, 0x0002A6D3, 0x0002A6D4, 0x0002A6D5,
81 0x4DB3, 0x4DB4, 0x4DB5, 0x4E00, 0x4E00, 0x4E01, 0x4E02, 0x4E03, 0x000D, 0x000A,
82 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x33E0, 0x33E6, 0x000D, 0x000A,
83 0x4E05, 0x4E07, 0x4E04, 0x4E08, 0x4E08, 0x4E09, 0x4E0A, 0x4E0B, 0x000D, 0x000A,
84 0x4E0C, 0x0021, 0x0022, 0x0023, 0x0024, 0xFF40, 0xFF41, 0xFF42, 0x000D, 0x000A,
85 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0x000D, 0x000A,0x0000
88 static const UChar src16
[] = {
89 0x00A8, 0x3003, 0x3005, 0x2015, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x000D, 0x000A,
90 0x2019, 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x000D, 0x000A,
91 0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x000D, 0x000A,
92 0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2236, 0x2227, 0x7FC1, 0x8956, 0x000D, 0x000A,
93 0x9D2C, 0x9D0E, 0x9EC4, 0x5CA1, 0x6C96, 0x837B, 0x5104, 0x5C4B, 0x000D, 0x000A,
94 0x61B6, 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378, 0x57F7, 0x000D, 0x000A,
95 0x57F4, 0x57F9, 0x57FA, 0x57FC, 0x5800, 0x5802, 0x5805, 0x5806, 0x000D, 0x000A,
96 0x580A, 0x581E, 0x6BB5, 0x6BB7, 0x6BBA, 0x6BBC, 0x9CE2, 0x977C, 0x000D, 0x000A,
97 0x6BBF, 0x6BC1, 0x6BC5, 0x6BC6, 0x6BCB, 0x6BCD, 0x6BCF, 0x6BD2, 0x000D, 0x000A,
98 0x6BD3, 0x6BD4, 0x6BD6, 0x6BD7, 0x6BD8, 0x6BDB, 0x6BEB, 0x6BEC, 0x000D, 0x000A,
99 0x6C05, 0x6C08, 0x6C0F, 0x6C11, 0x6C13, 0x6C23, 0x6C34, 0x0041, 0x000D, 0x000A,
100 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x000D, 0x000A,
101 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x000D, 0x000A,
102 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A,
103 0x005B, 0x9792, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x000D, 0x000A,
104 0x9CD4, 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x000D, 0x000A,
105 0x9785, 0x9791, 0x00BD, 0x0390, 0x0385, 0x0386, 0x0388, 0x0389, 0x000D, 0x000A,
106 0x038E, 0x038F, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x000D, 0x000A,
107 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x038A, 0x038C, 0x039C, 0x000D, 0x000A,
109 /* test non-BMP code points */
110 0xD869, 0xDE99, 0xD869, 0xDE9C, 0xD869, 0xDE9D, 0xD869, 0xDE9E, 0xD869, 0xDE9F,
111 0xD869, 0xDEA0, 0xD869, 0xDEA5, 0xD869, 0xDEA6, 0xD869, 0xDEA7, 0xD869, 0xDEA8,
112 0xD869, 0xDEAB, 0xD869, 0xDEAC, 0xD869, 0xDEAD, 0xD869, 0xDEAE, 0xD869, 0xDEAF,
113 0xD869, 0xDEB0, 0xD869, 0xDEB1, 0xD869, 0xDEB3, 0xD869, 0xDEB5, 0xD869, 0xDEB6,
114 0xD869, 0xDEB7, 0xD869, 0xDEB8, 0xD869, 0xDEB9, 0xD869, 0xDEBA, 0xD869, 0xDEBB,
115 0xD869, 0xDEBC, 0xD869, 0xDEBD, 0xD869, 0xDEBE, 0xD869, 0xDEBF, 0xD869, 0xDEC0,
116 0xD869, 0xDEC1, 0xD869, 0xDEC2, 0xD869, 0xDEC3, 0xD869, 0xDEC4, 0xD869, 0xDEC8,
117 0xD869, 0xDECA, 0xD869, 0xDECB, 0xD869, 0xDECD, 0xD869, 0xDECE, 0xD869, 0xDECF,
118 0xD869, 0xDED0, 0xD869, 0xDED1, 0xD869, 0xDED2, 0xD869, 0xDED3, 0xD869, 0xDED4,
121 0x4DB3, 0x4DB4, 0x4DB5, 0x4E00, 0x4E00, 0x4E01, 0x4E02, 0x4E03, 0x000D, 0x000A,
122 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x33E0, 0x33E6, 0x000D, 0x000A,
123 0x4E05, 0x4E07, 0x4E04, 0x4E08, 0x4E08, 0x4E09, 0x4E0A, 0x4E0B, 0x000D, 0x000A,
124 0x4E0C, 0x0021, 0x0022, 0x0023, 0x0024, 0xFF40, 0xFF41, 0xFF42, 0x000D, 0x000A,
125 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0x000D, 0x000A,0x0000
129 static void Test_UChar_UTF32_API(void){
131 UErrorCode err
= U_ZERO_ERROR
;
134 UChar
* uTarget
=uTemp
;
135 const UChar32
* u32Src
= src32
;
136 int32_t u32SrcLen
= sizeof(src32
)/4;
137 int32_t uTargetLength
= 0;
139 const UChar
* uSrc
= src16
;
140 int32_t uSrcLen
= sizeof(src16
)/2;
141 UChar32
* u32Target
= u32Temp
;
142 uint32_t u32TargetLength
=0;
143 int32_t u32DestLen
=0;
144 UBool failed
= FALSE
;
148 u_strToUTF32(u32Target
,u32TargetLength
, &u32DestLen
, uSrc
, uSrcLen
,&err
);
149 if(err
== U_BUFFER_OVERFLOW_ERROR
){
151 u32Target
= (UChar32
*) malloc (sizeof(uint32_t) * (u32DestLen
+1));
152 u32TargetLength
= u32DestLen
+1;
154 u_strToUTF32(u32Target
,u32TargetLength
, &u32DestLen
, uSrc
, uSrcLen
,&err
);
157 log_err("Should have gotten U_BUFFER_OVERFLOW_ERROR");
160 /*for(i=0; i< u32DestLen; i++){
161 printf("0x%08X, ",uTarget[i]);
166 for(i
=0; i
< u32SrcLen
; i
++){
167 if(u32Target
[i
] != src32
[i
]){
168 log_verbose("u_strToUTF32() failed expected: \\U%08X got: \\U%08X at index: %i \n", src32
[i
], u32Target
[i
],i
);
173 log_err("u_strToUTF32() failed \n");
177 u_strFromUTF32(uTarget
,uTargetLength
,&uDestLen
,u32Src
,u32SrcLen
,&err
);
178 if(err
== U_BUFFER_OVERFLOW_ERROR
){
180 uTarget
= (UChar
*) malloc( sizeof(UChar
) * (uDestLen
+1));
181 uTargetLength
= uDestLen
+1;
182 u_strFromUTF32(uTarget
,uTargetLength
,&uDestLen
,u32Src
,u32SrcLen
,&err
);
185 /*for(i=0; i< uDestLen; i++){
186 printf("0x%04X, ",uTarget[i]);
192 for(i
=0; i
< uDestLen
; i
++){
193 if(uTarget
[i
] != src16
[i
]){
194 log_verbose("u_strFromUTF32() failed expected: \\U%08X got: \\U%08X at index: %i \n", src16
[i
] ,uTarget
[i
],i
);
199 log_err("u_strToUTF32() failed \n");
213 u_strToUTF32(NULL
,u32TargetLength
, &u32DestLen
, uSrc
, uSrcLen
,&err
);
214 if(err
== U_BUFFER_OVERFLOW_ERROR
){
216 u32Target
= (UChar32
*) malloc (sizeof(uint32_t) * (u32DestLen
+1));
217 u32TargetLength
= u32DestLen
+1;
219 u_strToUTF32(u32Target
,u32TargetLength
, &u32DestLen
, uSrc
, uSrcLen
,&err
);
222 log_err("Should have gotten U_BUFFER_OVERFLOW_ERROR");
226 for(i
=0; i
< u32SrcLen
; i
++){
227 if(u32Target
[i
] != src32
[i
]){
228 log_verbose("u_strToUTF32() failed expected: \\U%08X got: \\U%08X \n", src32
[i
], u32Target
[i
]);
233 log_err("u_strToUTF32() failed \n");
237 u_strFromUTF32(NULL
,uTargetLength
,&uDestLen
,u32Src
,u32SrcLen
,&err
);
238 if(err
== U_BUFFER_OVERFLOW_ERROR
){
240 uTarget
= (UChar
*) malloc( sizeof(UChar
) * (uDestLen
+1));
241 uTargetLength
= uDestLen
+1;
242 u_strFromUTF32(uTarget
,uTargetLength
,&uDestLen
,u32Src
,u32SrcLen
,&err
);
246 for(i
=0; i
< uDestLen
; i
++){
247 if(uTarget
[i
] != src16
[i
]){
248 log_verbose("u_strFromUTF32() failed expected: \\U%08X got: \\U%08X \n", src16
[i
] ,uTarget
[i
]);
253 log_err("u_strToUTF32() failed \n");
262 static void Test_UChar_UTF8_API(void){
264 UErrorCode err
= U_ZERO_ERROR
;
267 UChar
* uTarget
=uTemp
;
269 int32_t u8SrcLen
= 0;
270 int32_t uTargetLength
= 0;
272 const UChar
* uSrc
= src16
;
273 int32_t uSrcLen
= sizeof(src16
)/2;
274 char* u8Target
= u8Temp
;
275 int32_t u8TargetLength
=0;
276 int32_t u8DestLen
=0;
277 UBool failed
= FALSE
;
279 int32_t numSubstitutions
;
284 u_strToUTF8(u8Target
,u8TargetLength
, &u8DestLen
, uSrc
, uSrcLen
,&err
);
285 if(err
== U_BUFFER_OVERFLOW_ERROR
&& u8Temp
[0] == 0x12){
287 u8Target
= (char*) malloc (sizeof(uint8_t) * (u8DestLen
+1));
288 u8TargetLength
= u8DestLen
;
290 u8Target
[u8TargetLength
] = (char)0xfe;
292 u_strToUTF8(u8Target
,u8TargetLength
, &u8DestLen
, uSrc
, uSrcLen
,&err
);
293 if(U_FAILURE(err
) || u8DestLen
!= u8TargetLength
|| u8Target
[u8TargetLength
] != (char)0xfe){
294 log_err("u_strToUTF8 failed after preflight. Error: %s\n", u_errorName(err
));
300 log_err("Should have gotten U_BUFFER_OVERFLOW_ERROR");
303 /*for(i=0; i< u8DestLen; i++){
304 printf("0x%04X, ",u8Target[i]);
309 /*for(i=0; i< u8DestLen; i++){
310 if(u8Target[i] != src8[i]){
311 log_verbose("u_strToUTF8() failed expected: \\U%08X got: \\U%08X \n", src8[i], u8Target[i]);
316 log_err("u_strToUTF8() failed \n");
319 u8SrcLen
= u8DestLen
;
323 u_strFromUTF8(uTarget
,uTargetLength
,&uDestLen
,u8Src
,u8SrcLen
,&err
);
324 if(err
== U_BUFFER_OVERFLOW_ERROR
&& uTemp
[0] == 0x1234){
326 uTarget
= (UChar
*) malloc( sizeof(UChar
) * (uDestLen
+1));
327 uTargetLength
= uDestLen
;
329 uTarget
[uTargetLength
] = 0xfff0;
331 u_strFromUTF8(uTarget
,uTargetLength
,&uDestLen
,u8Src
,u8SrcLen
,&err
);
334 log_err("error: u_strFromUTF8(preflight) should have gotten U_BUFFER_OVERFLOW_ERROR\n");
336 /*for(i=0; i< uDestLen; i++){
337 printf("0x%04X, ",uTarget[i]);
343 if(U_FAILURE(err
) || uDestLen
!= uTargetLength
|| uTarget
[uTargetLength
] != 0xfff0) {
346 for(i
=0; i
< uSrcLen
; i
++){
347 if(uTarget
[i
] != src16
[i
]){
348 log_verbose("u_strFromUTF8() failed expected: \\u%04X got: \\u%04X at index: %i \n", src16
[i
] ,uTarget
[i
],i
);
353 log_err("error: u_strFromUTF8(after preflighting) failed\n");
366 u_strToUTF8(NULL
,u8TargetLength
, &u8DestLen
, uSrc
, uSrcLen
,&err
);
367 if(err
== U_BUFFER_OVERFLOW_ERROR
){
369 u8Target
= (char*) malloc (sizeof(uint8_t) * (u8DestLen
+1));
370 u8TargetLength
= u8DestLen
;
372 u_strToUTF8(u8Target
,u8TargetLength
, &u8DestLen
, uSrc
, uSrcLen
,&err
);
376 log_err("Should have gotten U_BUFFER_OVERFLOW_ERROR");
379 /*for(i=0; i< u8DestLen; i++){
380 printf("0x%04X, ",u8Target[i]);
385 /*for(i=0; i< u8DestLen; i++){
386 if(u8Target[i] != src8[i]){
387 log_verbose("u_strToUTF8() failed expected: \\U%08X got: \\U%08X \n", src8[i], u8Target[i]);
392 log_err("u_strToUTF8() failed \n");
395 u8SrcLen
= u8DestLen
;
398 u_strFromUTF8(NULL
,uTargetLength
,&uDestLen
,u8Src
,u8SrcLen
,&err
);
399 if(err
== U_BUFFER_OVERFLOW_ERROR
){
401 uTarget
= (UChar
*) malloc( sizeof(UChar
) * (uDestLen
+1));
402 uTargetLength
= uDestLen
;
404 u_strFromUTF8(uTarget
,uTargetLength
,&uDestLen
,u8Src
,u8SrcLen
,&err
);
407 log_err("Should have gotten U_BUFFER_OVERFLOW_ERROR");
409 /*for(i=0; i< uDestLen; i++){
410 printf("0x%04X, ",uTarget[i]);
416 for(i
=0; i
< uSrcLen
; i
++){
417 if(uTarget
[i
] != src16
[i
]){
418 log_verbose("u_strFromUTF8() failed expected: \\u%04X got: \\u%04X at index: %i \n", src16
[i
] ,uTarget
[i
],i
);
423 log_err("u_strToUTF8() failed \n");
430 /* test UTF-8 with single surrogates - illegal in Unicode 3.2 */
433 withLead16
[]={ 0x1800, 0xd89a, 0x0061 },
434 withTrail16
[]={ 0x1800, 0xdcba, 0x0061, 0 },
435 withTrail16SubFFFD
[]={ 0x1800, 0xfffd, 0x0061, 0 }, /* sub==U+FFFD */
436 withTrail16Sub50005
[]={ 0x1800, 0xd900, 0xdc05, 0x0061, 0 }; /* sub==U+50005 */
438 withLead8
[]={ 0xe1, 0xa0, 0x80, 0xed, 0xa2, 0x9a, 0x61 },
439 withTrail8
[]={ 0xe1, 0xa0, 0x80, 0xed, 0xb2, 0xba, 0x61, 0 },
440 withTrail8Sub1A
[]={ 0xe1, 0xa0, 0x80, 0x1a, 0x61, 0 }, /* sub==U+001A */
441 withTrail8SubFFFD
[]={ 0xe1, 0xa0, 0x80, 0xef, 0xbf, 0xbd, 0x61, 0 }; /* sub==U+FFFD */
446 (err
=U_ZERO_ERROR
, u_strToUTF8(out8
, LENGTHOF(out8
), NULL
, withLead16
, LENGTHOF(withLead16
), &err
), err
!=U_INVALID_CHAR_FOUND
) ||
447 (err
=U_ZERO_ERROR
, u_strToUTF8(out8
, LENGTHOF(out8
), NULL
, withTrail16
, -1, &err
), err
!=U_INVALID_CHAR_FOUND
) ||
448 (err
=U_ZERO_ERROR
, u_strFromUTF8(out16
, LENGTHOF(out16
), NULL
, (const char *)withLead8
, LENGTHOF(withLead8
), &err
), err
!=U_INVALID_CHAR_FOUND
) ||
449 (err
=U_ZERO_ERROR
, u_strFromUTF8(out16
, LENGTHOF(out16
), NULL
, (const char *)withTrail8
, -1, &err
), err
!=U_INVALID_CHAR_FOUND
)
451 log_err("error: u_strTo/FromUTF8(string with single surrogate) fails to report error\n");
454 /* test error handling with substitution characters */
456 /* from UTF-8 with length */
461 u_strFromUTF8WithSub(out16
, LENGTHOF(out16
), &uDestLen
,
462 (const char *)withTrail8
, uprv_strlen((const char *)withTrail8
),
463 0x50005, &numSubstitutions
,
465 if(U_FAILURE(err
) || uDestLen
!=u_strlen(withTrail16Sub50005
) ||
466 0!=u_memcmp(withTrail16Sub50005
, out16
, uDestLen
+1) ||
467 numSubstitutions
!=1) {
468 log_err("error: u_strFromUTF8WithSub(length) failed\n");
471 /* from UTF-8 with NUL termination */
476 u_strFromUTF8WithSub(out16
, LENGTHOF(out16
), &uDestLen
,
477 (const char *)withTrail8
, -1,
478 0xfffd, &numSubstitutions
,
480 if(U_FAILURE(err
) || uDestLen
!=u_strlen(withTrail16SubFFFD
) ||
481 0!=u_memcmp(withTrail16SubFFFD
, out16
, uDestLen
+1) ||
482 numSubstitutions
!=1) {
483 log_err("error: u_strFromUTF8WithSub(NUL termination) failed\n");
486 /* preflight from UTF-8 with NUL termination */
491 u_strFromUTF8WithSub(out16
, 1, &uDestLen
,
492 (const char *)withTrail8
, -1,
493 0x50005, &numSubstitutions
,
495 if(err
!=U_BUFFER_OVERFLOW_ERROR
|| uDestLen
!=u_strlen(withTrail16Sub50005
) || numSubstitutions
!=1) {
496 log_err("error: u_strFromUTF8WithSub(preflight/NUL termination) failed\n");
499 /* to UTF-8 with length */
504 u_strToUTF8WithSub(out8
, LENGTHOF(out8
), &u8DestLen
,
505 withTrail16
, u_strlen(withTrail16
),
506 0xfffd, &numSubstitutions
,
508 if(U_FAILURE(err
) || u8DestLen
!=uprv_strlen((const char *)withTrail8SubFFFD
) ||
509 0!=uprv_memcmp((const char *)withTrail8SubFFFD
, out8
, u8DestLen
+1) ||
510 numSubstitutions
!=1) {
511 log_err("error: u_strToUTF8WithSub(length) failed\n");
514 /* to UTF-8 with NUL termination */
519 u_strToUTF8WithSub(out8
, LENGTHOF(out8
), &u8DestLen
,
521 0x1a, &numSubstitutions
,
523 if(U_FAILURE(err
) || u8DestLen
!=uprv_strlen((const char *)withTrail8Sub1A
) ||
524 0!=uprv_memcmp((const char *)withTrail8Sub1A
, out8
, u8DestLen
+1) ||
525 numSubstitutions
!=1) {
526 log_err("error: u_strToUTF8WithSub(NUL termination) failed\n");
529 /* preflight to UTF-8 with NUL termination */
534 u_strToUTF8WithSub(out8
, 1, &u8DestLen
,
536 0xfffd, &numSubstitutions
,
538 if(err
!=U_BUFFER_OVERFLOW_ERROR
|| u8DestLen
!=uprv_strlen((const char *)withTrail8SubFFFD
) ||
539 numSubstitutions
!=1) {
540 log_err("error: u_strToUTF8WithSub(preflight/NUL termination) failed\n");
543 /* test that numSubstitutions==0 if there are no substitutions */
545 /* from UTF-8 with length (just first 3 bytes which are valid) */
550 u_strFromUTF8WithSub(out16
, LENGTHOF(out16
), &uDestLen
,
551 (const char *)withTrail8
, 3,
552 0x50005, &numSubstitutions
,
554 if(U_FAILURE(err
) || uDestLen
!=1 ||
555 0!=u_memcmp(withTrail16Sub50005
, out16
, uDestLen
) ||
556 numSubstitutions
!=0) {
557 log_err("error: u_strFromUTF8WithSub(no subs) failed\n");
560 /* to UTF-8 with length (just first UChar which is valid) */
565 u_strToUTF8WithSub(out8
, LENGTHOF(out8
), &u8DestLen
,
567 0xfffd, &numSubstitutions
,
569 if(U_FAILURE(err
) || u8DestLen
!=3 ||
570 0!=uprv_memcmp((const char *)withTrail8SubFFFD
, out8
, u8DestLen
) ||
571 numSubstitutions
!=0) {
572 log_err("error: u_strToUTF8WithSub(no subs) failed\n");
575 /* test that numSubstitutions==0 if subchar==U_SENTINEL (no subchar) */
577 /* from UTF-8 with length (just first 3 bytes which are valid) */
582 u_strFromUTF8WithSub(out16
, LENGTHOF(out16
), &uDestLen
,
583 (const char *)withTrail8
, 3,
584 U_SENTINEL
, &numSubstitutions
,
586 if(U_FAILURE(err
) || uDestLen
!=1 ||
587 0!=u_memcmp(withTrail16Sub50005
, out16
, uDestLen
) ||
588 numSubstitutions
!=0) {
589 log_err("error: u_strFromUTF8WithSub(no subchar) failed\n");
592 /* to UTF-8 with length (just first UChar which is valid) */
597 u_strToUTF8WithSub(out8
, LENGTHOF(out8
), &u8DestLen
,
599 U_SENTINEL
, &numSubstitutions
,
601 if(U_FAILURE(err
) || u8DestLen
!=3 ||
602 0!=uprv_memcmp((const char *)withTrail8SubFFFD
, out8
, u8DestLen
) ||
603 numSubstitutions
!=0) {
604 log_err("error: u_strToUTF8WithSub(no subchar) failed\n");
609 /* compare if two strings are equal, but match 0xfffd in the second string with anything in the first */
611 equalAnyFFFD(const UChar
*s
, const UChar
*t
, int32_t length
) {
617 if(c1
!=c2
&& c2
!=0xfffd) {
625 /* test u_strFromUTF8Lenient() */
627 Test_FromUTF8(void) {
629 * Test case from icu-support list 20071130 "u_strFromUTF8() returns U_INVALID_CHAR_FOUND(10)"
631 static const uint8_t bytes
[]={ 0xe0, 0xa5, 0x9c, 0 };
635 UErrorCode errorCode
;
637 /* 3 bytes input, one UChar output (U+095C) */
638 errorCode
=U_ZERO_ERROR
;
640 destPointer
=u_strFromUTF8(NULL
, 0, &destLength
, (const char *)bytes
, 3, &errorCode
);
641 if(errorCode
!=U_BUFFER_OVERFLOW_ERROR
|| destPointer
!=NULL
|| destLength
!=1) {
642 log_err("error: u_strFromUTF8(preflight srcLength=3) fails: destLength=%ld - %s\n",
643 (long)destLength
, u_errorName(errorCode
));
646 /* 4 bytes input, two UChars output (U+095C U+0000) */
647 errorCode
=U_ZERO_ERROR
;
649 destPointer
=u_strFromUTF8(NULL
, 0, &destLength
, (const char *)bytes
, 4, &errorCode
);
650 if(errorCode
!=U_BUFFER_OVERFLOW_ERROR
|| destPointer
!=NULL
|| destLength
!=2) {
651 log_err("error: u_strFromUTF8(preflight srcLength=4) fails: destLength=%ld - %s\n",
652 (long)destLength
, u_errorName(errorCode
));
655 /* NUL-terminated 3 bytes input, one UChar output (U+095C) */
656 errorCode
=U_ZERO_ERROR
;
658 destPointer
=u_strFromUTF8(NULL
, 0, &destLength
, (const char *)bytes
, -1, &errorCode
);
659 if(errorCode
!=U_BUFFER_OVERFLOW_ERROR
|| destPointer
!=NULL
|| destLength
!=1) {
660 log_err("error: u_strFromUTF8(preflight srcLength=-1) fails: destLength=%ld - %s\n",
661 (long)destLength
, u_errorName(errorCode
));
664 /* 3 bytes input, one UChar output (U+095C), transform not just preflight */
665 errorCode
=U_ZERO_ERROR
;
668 destPointer
=u_strFromUTF8(dest
, LENGTHOF(dest
), &destLength
, (const char *)bytes
, 3, &errorCode
);
669 if(U_FAILURE(errorCode
) || destPointer
!=dest
|| destLength
!=1 || dest
[0]!=0x95c || dest
[1]!=0) {
670 log_err("error: u_strFromUTF8(transform srcLength=3) fails: destLength=%ld - %s\n",
671 (long)destLength
, u_errorName(errorCode
));
675 /* test u_strFromUTF8Lenient() */
677 Test_FromUTF8Lenient(void) {
679 * Multiple input strings, each NUL-terminated.
680 * Terminate with a string starting with 0xff.
682 static const uint8_t bytes
[]={
683 /* well-formed UTF-8 */
684 0x61, 0xc3, 0x9f, 0xe0, 0xa0, 0x80, 0xf0, 0xa0, 0x80, 0x80,
685 0x62, 0xc3, 0xa0, 0xe0, 0xa0, 0x81, 0xf0, 0xa0, 0x80, 0x81, 0,
687 /* various malformed sequences */
688 0xc3, 0xc3, 0x9f, 0xc3, 0xa0, 0xe0, 0x80, 0x8a, 0xf0, 0x41, 0x42, 0x43, 0,
690 /* truncated input */
698 /* non-ASCII characters in the last few bytes */
699 0x61, 0xc3, 0x9f, 0xe0, 0xa0, 0x80, 0,
700 0x61, 0xe0, 0xa0, 0x80, 0xc3, 0x9f, 0,
709 /* Multiple output strings, each NUL-terminated. 0xfffd matches anything. */
710 static const UChar uchars
[]={
711 0x61, 0xdf, 0x800, 0xd840, 0xdc00,
712 0x62, 0xe0, 0x801, 0xd840, 0xdc01, 0,
714 0xfffd, 0x9f, 0xe0, 0xa, 0xfffd, 0xfffd, 0,
723 0x61, 0xdf, 0x800, 0,
724 0x61, 0x800, 0xdf, 0,
733 const UChar
*pu
, *pDest
;
734 int32_t srcLength
, destLength0
, destLength
;
736 UErrorCode errorCode
;
738 /* verify checking for some illegal arguments */
741 errorCode
=U_ZERO_ERROR
;
742 pDest
=u_strFromUTF8Lenient(dest
, 1, &destLength
, NULL
, -1, &errorCode
);
743 if(errorCode
!=U_ILLEGAL_ARGUMENT_ERROR
|| dest
[0]!=0x1234) {
744 log_err("u_strFromUTF8Lenient(src=NULL) failed\n");
749 errorCode
=U_ZERO_ERROR
;
750 pDest
=u_strFromUTF8Lenient(NULL
, 1, &destLength
, (const char *)bytes
, -1, &errorCode
);
751 if(errorCode
!=U_ILLEGAL_ARGUMENT_ERROR
) {
752 log_err("u_strFromUTF8Lenient(dest=NULL[1]) failed\n");
757 errorCode
=U_MEMORY_ALLOCATION_ERROR
;
758 pDest
=u_strFromUTF8Lenient(dest
, 1, &destLength
, (const char *)bytes
, -1, &errorCode
);
759 if(errorCode
!=U_MEMORY_ALLOCATION_ERROR
|| dest
[0]!=0x1234) {
760 log_err("u_strFromUTF8Lenient(U_MEMORY_ALLOCATION_ERROR) failed\n");
765 errorCode
=U_MEMORY_ALLOCATION_ERROR
;
766 pDest
=u_strFromUTF8Lenient(dest
, 1, &destLength
, (const char *)bytes
, -1, NULL
);
767 if(dest
[0]!=0x1234) {
768 log_err("u_strFromUTF8Lenient(pErrorCode=NULL) failed\n");
771 /* test normal behavior */
772 number
=0; /* string number for log_err() */
774 for(pb
=(const char *)bytes
, pu
=uchars
;
776 pb
+=srcLength
+1, pu
+=destLength0
+1, ++number
778 srcLength
=uprv_strlen(pb
);
779 destLength0
=u_strlen(pu
);
781 /* preflighting with NUL-termination */
784 errorCode
=U_ZERO_ERROR
;
785 pDest
=u_strFromUTF8Lenient(NULL
, 0, &destLength
, pb
, -1, &errorCode
);
786 if (errorCode
!= (destLength0
==0 ? U_STRING_NOT_TERMINATED_WARNING
: U_BUFFER_OVERFLOW_ERROR
) ||
787 pDest
!=NULL
|| dest
[0]!=0x1234 || destLength
!=destLength0
789 log_err("u_strFromUTF8Lenient(%d preflighting with NUL-termination) failed\n", number
);
792 /* preflighting/some capacity with NUL-termination */
794 dest
[destLength0
-1]=0x1234;
796 errorCode
=U_ZERO_ERROR
;
797 pDest
=u_strFromUTF8Lenient(dest
, destLength0
-1, &destLength
, pb
, -1, &errorCode
);
798 if (errorCode
!=U_BUFFER_OVERFLOW_ERROR
||
799 dest
[destLength0
-1]!=0x1234 || destLength
!=destLength0
801 log_err("u_strFromUTF8Lenient(%d preflighting/some capacity with NUL-termination) failed\n", number
);
805 /* conversion with NUL-termination, much capacity */
806 dest
[0]=dest
[destLength0
]=0x1234;
808 errorCode
=U_ZERO_ERROR
;
809 pDest
=u_strFromUTF8Lenient(dest
, LENGTHOF(dest
), &destLength
, pb
, -1, &errorCode
);
810 if (errorCode
!=U_ZERO_ERROR
||
811 pDest
!=dest
|| dest
[destLength0
]!=0 ||
812 destLength
!=destLength0
|| !equalAnyFFFD(dest
, pu
, destLength
)
814 log_err("u_strFromUTF8Lenient(%d conversion with NUL-termination, much capacity) failed\n", number
);
817 /* conversion with NUL-termination, exact capacity */
818 dest
[0]=dest
[destLength0
]=0x1234;
820 errorCode
=U_ZERO_ERROR
;
821 pDest
=u_strFromUTF8Lenient(dest
, destLength0
, &destLength
, pb
, -1, &errorCode
);
822 if (errorCode
!=U_STRING_NOT_TERMINATED_WARNING
||
823 pDest
!=dest
|| dest
[destLength0
]!=0x1234 ||
824 destLength
!=destLength0
|| !equalAnyFFFD(dest
, pu
, destLength
)
826 log_err("u_strFromUTF8Lenient(%d conversion with NUL-termination, exact capacity) failed\n", number
);
829 /* preflighting with length */
832 errorCode
=U_ZERO_ERROR
;
833 pDest
=u_strFromUTF8Lenient(NULL
, 0, &destLength
, pb
, srcLength
, &errorCode
);
834 if (errorCode
!= (destLength0
==0 ? U_STRING_NOT_TERMINATED_WARNING
: U_BUFFER_OVERFLOW_ERROR
) ||
835 pDest
!=NULL
|| dest
[0]!=0x1234 || destLength
!=srcLength
837 log_err("u_strFromUTF8Lenient(%d preflighting with length) failed\n", number
);
840 /* preflighting/some capacity with length */
842 dest
[srcLength
-1]=0x1234;
844 errorCode
=U_ZERO_ERROR
;
845 pDest
=u_strFromUTF8Lenient(dest
, srcLength
-1, &destLength
, pb
, srcLength
, &errorCode
);
846 if (errorCode
!=U_BUFFER_OVERFLOW_ERROR
||
847 dest
[srcLength
-1]!=0x1234 || destLength
!=srcLength
849 log_err("u_strFromUTF8Lenient(%d preflighting/some capacity with length) failed\n", number
);
853 /* conversion with length, much capacity */
854 dest
[0]=dest
[destLength0
]=0x1234;
856 errorCode
=U_ZERO_ERROR
;
857 pDest
=u_strFromUTF8Lenient(dest
, LENGTHOF(dest
), &destLength
, pb
, srcLength
, &errorCode
);
858 if (errorCode
!=U_ZERO_ERROR
||
859 pDest
!=dest
|| dest
[destLength0
]!=0 ||
860 destLength
!=destLength0
|| !equalAnyFFFD(dest
, pu
, destLength
)
862 log_err("u_strFromUTF8Lenient(%d conversion with length, much capacity) failed\n", number
);
865 /* conversion with length, srcLength capacity */
866 dest
[0]=dest
[srcLength
]=dest
[destLength0
]=0x1234;
868 errorCode
=U_ZERO_ERROR
;
869 pDest
=u_strFromUTF8Lenient(dest
, srcLength
, &destLength
, pb
, srcLength
, &errorCode
);
870 if(srcLength
==destLength0
) {
871 if (errorCode
!=U_STRING_NOT_TERMINATED_WARNING
||
872 pDest
!=dest
|| dest
[destLength0
]!=0x1234 ||
873 destLength
!=destLength0
|| !equalAnyFFFD(dest
, pu
, destLength
)
875 log_err("u_strFromUTF8Lenient(%d conversion with length, srcLength capacity/not terminated) failed\n", number
);
878 if (errorCode
!=U_ZERO_ERROR
||
879 pDest
!=dest
|| dest
[destLength0
]!=0 ||
880 destLength
!=destLength0
|| !equalAnyFFFD(dest
, pu
, destLength
)
882 log_err("u_strFromUTF8Lenient(%d conversion with length, srcLength capacity/terminated) failed\n", number
);
888 static const uint16_t src16j
[] = {
889 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x000D, 0x000A,
890 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x000D, 0x000A,
891 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A,
892 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A,
894 /* Test only ASCII */
897 static const uint16_t src16WithNulls
[] = {
898 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0000,
899 0x0048, 0x0049, 0x004A, 0x000D, 0x000A, 0x0000,
900 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0000,
901 0x0050, 0x0051, 0x0052, 0x000D, 0x000A, 0x0000,
902 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0000,
903 0x0058, 0x0059, 0x005A, 0x000D, 0x000A, 0x0000,
904 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0000,
905 0x0058, 0x0059, 0x005A, 0x000D, 0x000A, 0x0000,
906 /* test only ASCII */
908 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD,
909 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
910 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00C1,
911 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB,
912 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5,
913 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
914 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9,
918 static void Test_UChar_WCHART_API(void){
919 #if (defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32)) || (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION)
920 UErrorCode err
= U_ZERO_ERROR
;
921 const UChar
* uSrc
= src16j
;
922 int32_t uSrcLen
= sizeof(src16j
)/2;
923 wchar_t* wDest
= NULL
;
924 int32_t wDestLen
= 0;
926 UBool failed
= FALSE
;
928 int32_t uDestLen
= 0;
931 /* Bad UErrorCode arguments. Make sure that the API doesn't crash, and that Purify doesn't complain. */
932 if (u_strFromWCS(NULL
,0,NULL
,NULL
,0,NULL
) != NULL
) {
933 log_err("u_strFromWCS() should return NULL with a bad argument\n");
935 if (u_strToWCS(NULL
,0,NULL
,NULL
,0,NULL
) != NULL
) {
936 log_err("u_strToWCS() should return NULL with a bad argument\n");
939 /* Bad UErrorCode arguments. */
941 u_strFromWCS(NULL
,0,NULL
,NULL
,0,&err
);
942 if (err
!= U_ILLEGAL_ARGUMENT_ERROR
) {
943 log_err("u_strFromWCS() didn't fail as expected with bad arguments. Error: %s \n", u_errorName(err
));
946 u_strToWCS(NULL
,0,NULL
,NULL
,0,&err
);
947 if (err
!= U_ILLEGAL_ARGUMENT_ERROR
) {
948 log_err("u_strToWCS() didn't fail as expected with bad arguments. Error: %s \n", u_errorName(err
));
953 u_strToWCS(wDest
,wDestLen
,&reqLen
,uSrc
,uSrcLen
-1,&err
);
955 if(err
== U_BUFFER_OVERFLOW_ERROR
){
957 wDest
=(wchar_t*) malloc(sizeof(wchar_t) * (reqLen
+1));
959 u_strToWCS(wDest
,wDestLen
,&reqLen
,uSrc
,uSrcLen
-1,&err
);
963 u_strFromWCS(uDest
, uDestLen
,&reqLen
,wDest
,reqLen
,&err
);
966 if(err
== U_BUFFER_OVERFLOW_ERROR
){
968 uDest
= (UChar
*) malloc(sizeof(UChar
) * (reqLen
+1));
969 uDestLen
= reqLen
+ 1;
970 u_strFromWCS(uDest
, uDestLen
,&reqLen
,wDest
,reqLen
,&err
);
971 }else if(U_FAILURE(err
)){
973 log_err("u_strFromWCS() failed. Error: %s \n", u_errorName(err
));
977 for(i
=0; i
< uSrcLen
; i
++){
978 if(uDest
[i
] != src16j
[i
]){
979 log_verbose("u_str*WCS() failed for unterminated string expected: \\u%04X got: \\u%04X at index: %i \n", src16j
[i
] ,uDest
[i
],i
);
988 log_err("u_strToWCS() failed \n");
994 /* test with embeded nulls */
995 uSrc
= src16WithNulls
;
996 uSrcLen
= sizeof(src16WithNulls
)/2;
1002 u_strToWCS(wDest
,wDestLen
,&reqLen
,uSrc
,uSrcLen
-1,&err
);
1004 if(err
== U_BUFFER_OVERFLOW_ERROR
){
1006 wDest
=(wchar_t*) malloc(sizeof(wchar_t) * (reqLen
+1));
1007 wDestLen
= reqLen
+1;
1008 u_strToWCS(wDest
,wDestLen
,&reqLen
,uSrc
,uSrcLen
-1,&err
);
1012 u_strFromWCS(uDest
, uDestLen
,&reqLen
,wDest
,reqLen
,&err
);
1014 if(err
== U_BUFFER_OVERFLOW_ERROR
){
1016 uDest
= (UChar
*) malloc(sizeof(UChar
) * (reqLen
+1));
1017 uDestLen
= reqLen
+ 1;
1018 u_strFromWCS(uDest
, uDestLen
,&reqLen
,wDest
,reqLen
,&err
);
1022 for(i
=0; i
< uSrcLen
; i
++){
1023 if(uDest
[i
] != src16WithNulls
[i
]){
1024 log_verbose("u_str*WCS() failed for string with nulls expected: \\u%04X got: \\u%04X at index: %i \n", src16WithNulls
[i
] ,uDest
[i
],i
);
1033 log_err("u_strToWCS() failed \n");
1043 uSrcLen
= sizeof(src16j
)/2;
1050 u_strToWCS(wDest
,wDestLen
,&reqLen
,uSrc
,-1,&err
);
1052 if(err
== U_BUFFER_OVERFLOW_ERROR
){
1054 wDest
=(wchar_t*) malloc(sizeof(wchar_t) * (reqLen
+1));
1055 wDestLen
= reqLen
+1;
1056 u_strToWCS(wDest
,wDestLen
,&reqLen
,uSrc
,-1,&err
);
1060 u_strFromWCS(uDest
, uDestLen
,&reqLen
,wDest
,-1,&err
);
1062 if(err
== U_BUFFER_OVERFLOW_ERROR
){
1064 uDest
= (UChar
*) malloc(sizeof(UChar
) * (reqLen
+1));
1065 uDestLen
= reqLen
+ 1;
1066 u_strFromWCS(uDest
, uDestLen
,&reqLen
,wDest
,-1,&err
);
1070 for(i
=0; i
< uSrcLen
; i
++){
1071 if(uDest
[i
] != src16j
[i
]){
1072 log_verbose("u_str*WCS() failed for null terminated string expected: \\u%04X got: \\u%04X at index: %i \n", src16j
[i
] ,uDest
[i
],i
);
1081 log_err("u_strToWCS() failed \n");
1088 * Test u_terminateWChars().
1089 * All u_terminateXYZ() use the same implementation macro;
1090 * we test this function to improve API coverage.
1097 wDestLen
=u_terminateWChars(buffer
, LENGTHOF(buffer
), 3, &err
);
1098 if(err
!=U_ZERO_ERROR
|| wDestLen
!=3 || buffer
[3]!=0) {
1099 log_err("u_terminateWChars(buffer, all, 3, zero) failed: %s length %d [3]==U+%04x\n",
1100 u_errorName(err
), wDestLen
, buffer
[3]);
1105 wDestLen
=u_terminateWChars(buffer
, 3, 3, &err
);
1106 if(err
!=U_STRING_NOT_TERMINATED_WARNING
|| wDestLen
!=3 || buffer
[3]!=0x20ac) {
1107 log_err("u_terminateWChars(buffer, 3, 3, zero) failed: %s length %d [3]==U+%04x\n",
1108 u_errorName(err
), wDestLen
, buffer
[3]);
1111 err
=U_STRING_NOT_TERMINATED_WARNING
;
1113 wDestLen
=u_terminateWChars(buffer
, LENGTHOF(buffer
), 3, &err
);
1114 if(err
!=U_ZERO_ERROR
|| wDestLen
!=3 || buffer
[3]!=0) {
1115 log_err("u_terminateWChars(buffer, all, 3, not-terminated) failed: %s length %d [3]==U+%04x\n",
1116 u_errorName(err
), wDestLen
, buffer
[3]);
1121 wDestLen
=u_terminateWChars(buffer
, 2, 3, &err
);
1122 if(err
!=U_BUFFER_OVERFLOW_ERROR
|| wDestLen
!=3 || buffer
[3]!=0x20ac) {
1123 log_err("u_terminateWChars(buffer, 2, 3, zero) failed: %s length %d [3]==U+%04x\n",
1124 u_errorName(err
), wDestLen
, buffer
[3]);
1128 log_info("Not testing u_str*WCS because (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION) and wchar is neither utf16 nor utf32");
1132 static void Test_widestrs()
1134 #if (defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32)) || (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION)
1137 int32_t wcap
= sizeof(ws
) / sizeof(*ws
);
1139 int32_t rtcap
= sizeof(rts
) / sizeof(*rts
);
1143 const char *errname
;
1144 UChar ustr
[] = {'h', 'e', 'l', 'l', 'o', 0};
1145 int32_t ul
= sizeof(ustr
)/sizeof(*ustr
) -1;
1151 wcs
= u_strToWCS(ws
, wcap
, &wl
, ustr
, ul
, &err
);
1152 if (U_FAILURE(err
)) {
1153 errname
= u_errorName(err
);
1154 log_err("test_widestrs: u_strToWCS error: %s!\n",errname
);
1157 log_err("u_strToWCS: ustr = %s, ul = %d, ws = %S, wl = %d!\n", u_austrcpy(astr
, ustr
), ul
, ws
, wl
);
1160 wl
= (int32_t)uprv_wcslen(wcs
);
1161 cp
= u_strFromWCS(rts
, rtcap
, &rtl
, wcs
, wl
, &err
);
1162 if (U_FAILURE(err
)) {
1163 errname
= u_errorName(err
);
1164 fprintf(stderr
, "test_widestrs: ucnv_wcstombs error: %s!\n",errname
);
1167 log_err("u_strFromWCS: wcs = %S, wl = %d,rts = %s, rtl = %d!\n", wcs
, wl
, u_austrcpy(astr
, rts
), rtl
);
1170 log_info("Not testing u_str*WCS because (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION) and wchar is neither utf16 nor utf32");
1175 Test_WCHART_LongString(){
1176 #if (defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32)) || (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION)
1177 UErrorCode status
= U_ZERO_ERROR
;
1178 const char* testdatapath
=loadTestData(&status
);
1179 UResourceBundle
*theBundle
= ures_open(testdatapath
, "testtypes", &status
);
1181 const UChar
* str
= ures_getStringByKey(theBundle
, "testinclude",&strLen
,&status
);
1182 const UChar
* uSrc
= str
;
1183 int32_t uSrcLen
= strLen
;
1184 int32_t wDestLen
=0, reqLen
=0, i
=0;
1185 int32_t uDestLen
=0;
1186 wchar_t* wDest
= NULL
;
1187 UChar
* uDest
= NULL
;
1188 UBool failed
= FALSE
;
1190 if(U_FAILURE(status
)){
1191 log_data_err("Could not get testinclude resource from testtypes bundle. Error: %s\n",u_errorName(status
));
1196 u_strToWCS(wDest
,wDestLen
,&reqLen
,uSrc
,-1,&status
);
1198 if(status
== U_BUFFER_OVERFLOW_ERROR
){
1199 status
=U_ZERO_ERROR
;
1200 wDest
=(wchar_t*) malloc(sizeof(wchar_t) * (reqLen
+1));
1201 wDestLen
= reqLen
+1;
1202 u_strToWCS(wDest
,wDestLen
,&reqLen
,uSrc
,-1,&status
);
1206 u_strFromWCS(uDest
, uDestLen
,&reqLen
,wDest
,-1,&status
);
1208 if(status
== U_BUFFER_OVERFLOW_ERROR
){
1209 status
=U_ZERO_ERROR
;
1210 uDest
= (UChar
*) malloc(sizeof(UChar
) * (reqLen
+1));
1211 uDestLen
= reqLen
+ 1;
1212 u_strFromWCS(uDest
, uDestLen
,&reqLen
,wDest
,-1,&status
);
1216 for(i
=0; i
< uSrcLen
; i
++){
1217 if(uDest
[i
] != str
[i
]){
1218 log_verbose("u_str*WCS() failed for null terminated string expected: \\u%04X got: \\u%04X at index: %i \n", src16j
[i
] ,uDest
[i
],i
);
1223 if(U_FAILURE(status
)){
1227 log_err("u_strToWCS() failed \n");
1231 /* close the bundle */
1232 ures_close(theBundle
);
1234 log_info("Not testing u_str*WCS because (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION) and wchar is neither utf16 nor utf32");