]>
Commit | Line | Data |
---|---|---|
b75a7d8f A |
1 | /* |
2 | ******************************************************************************* | |
3 | * | |
729e4ab9 | 4 | * Copyright (C) 2002-2009, International Business Machines |
b75a7d8f A |
5 | * Corporation and others. All Rights Reserved. |
6 | * | |
7 | ******************************************************************************* | |
8 | * file name: cstrcase.c | |
9 | * encoding: US-ASCII | |
10 | * tab size: 8 (not used) | |
11 | * indentation:4 | |
12 | * | |
13 | * created on: 2002feb21 | |
14 | * created by: Markus W. Scherer | |
15 | * | |
16 | * Test file for string casing C API functions. | |
17 | */ | |
18 | ||
73c04bcf | 19 | #include <string.h> |
b75a7d8f A |
20 | #include "unicode/utypes.h" |
21 | #include "unicode/uchar.h" | |
22 | #include "unicode/ustring.h" | |
23 | #include "unicode/uloc.h" | |
24 | #include "unicode/ubrk.h" | |
73c04bcf | 25 | #include "unicode/ucasemap.h" |
b75a7d8f A |
26 | #include "cmemory.h" |
27 | #include "cintltst.h" | |
b75a7d8f | 28 | |
46f4442e A |
29 | #define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) |
30 | ||
b75a7d8f A |
31 | /* test string case mapping functions --------------------------------------- */ |
32 | ||
73c04bcf A |
33 | static void |
34 | TestCaseLower(void) { | |
b75a7d8f A |
35 | static const UChar |
36 | ||
37 | beforeLower[]= { 0x61, 0x42, 0x49, 0x3a3, 0xdf, 0x3a3, 0x2f, 0xd93f, 0xdfff }, | |
38 | lowerRoot[]= { 0x61, 0x62, 0x69, 0x3c3, 0xdf, 0x3c2, 0x2f, 0xd93f, 0xdfff }, | |
39 | lowerTurkish[]={ 0x61, 0x62, 0x131, 0x3c3, 0xdf, 0x3c2, 0x2f, 0xd93f, 0xdfff }; | |
40 | ||
41 | UChar buffer[32]; | |
42 | int32_t length; | |
43 | UErrorCode errorCode; | |
44 | ||
45 | /* lowercase with root locale and separate buffers */ | |
46 | buffer[0]=0xabcd; | |
47 | errorCode=U_ZERO_ERROR; | |
48 | length=u_strToLower(buffer, sizeof(buffer)/U_SIZEOF_UCHAR, | |
49 | beforeLower, sizeof(beforeLower)/U_SIZEOF_UCHAR, | |
50 | "", | |
51 | &errorCode); | |
52 | if( U_FAILURE(errorCode) || | |
53 | length!=(sizeof(lowerRoot)/U_SIZEOF_UCHAR) || | |
54 | uprv_memcmp(lowerRoot, buffer, length*U_SIZEOF_UCHAR)!=0 || | |
55 | buffer[length]!=0 | |
56 | ) { | |
57 | log_err("error in u_strToLower(root locale)=%ld error=%s string matches: %s\t\nlowerRoot=%s\t\nbuffer=%s\n", | |
58 | length, | |
59 | u_errorName(errorCode), | |
60 | uprv_memcmp(lowerRoot, buffer, length*U_SIZEOF_UCHAR)==0 && | |
61 | buffer[length]==0 ? "yes" : "no", | |
62 | aescstrdup(lowerRoot,-1), | |
63 | aescstrdup(buffer,-1)); | |
64 | } | |
65 | ||
66 | /* lowercase with turkish locale and in the same buffer */ | |
67 | uprv_memcpy(buffer, beforeLower, sizeof(beforeLower)); | |
68 | buffer[sizeof(beforeLower)/U_SIZEOF_UCHAR]=0; | |
69 | errorCode=U_ZERO_ERROR; | |
70 | length=u_strToLower(buffer, sizeof(buffer)/U_SIZEOF_UCHAR, | |
71 | buffer, -1, /* implicit srcLength */ | |
72 | "tr", | |
73 | &errorCode); | |
74 | if( U_FAILURE(errorCode) || | |
75 | length!=(sizeof(lowerTurkish)/U_SIZEOF_UCHAR) || | |
76 | uprv_memcmp(lowerTurkish, buffer, length*U_SIZEOF_UCHAR)!=0 || | |
77 | buffer[length]!=0 | |
78 | ) { | |
79 | log_err("error in u_strToLower(turkish locale)=%ld error=%s string matches: %s\n", | |
80 | length, | |
81 | u_errorName(errorCode), | |
82 | uprv_memcmp(lowerTurkish, buffer, length*U_SIZEOF_UCHAR)==0 && buffer[length]==0 ? "yes" : "no"); | |
83 | } | |
84 | ||
85 | /* test preflighting */ | |
86 | buffer[0]=buffer[2]=0xabcd; | |
87 | errorCode=U_ZERO_ERROR; | |
88 | length=u_strToLower(buffer, 2, /* set destCapacity=2 */ | |
89 | beforeLower, sizeof(beforeLower)/U_SIZEOF_UCHAR, | |
90 | "", | |
91 | &errorCode); | |
92 | if( errorCode!=U_BUFFER_OVERFLOW_ERROR || | |
93 | length!=(sizeof(lowerRoot)/U_SIZEOF_UCHAR) || | |
94 | uprv_memcmp(lowerRoot, buffer, 2*U_SIZEOF_UCHAR)!=0 || | |
95 | buffer[2]!=0xabcd | |
96 | ) { | |
97 | log_err("error in u_strToLower(root locale preflighting)=%ld error=%s string matches: %s\n", | |
98 | length, | |
99 | u_errorName(errorCode), | |
100 | uprv_memcmp(lowerRoot, buffer, 2*U_SIZEOF_UCHAR)==0 && buffer[2]==0xabcd ? "yes" : "no"); | |
101 | } | |
102 | ||
103 | /* test error handling */ | |
104 | errorCode=U_ZERO_ERROR; | |
105 | length=u_strToLower(NULL, sizeof(buffer)/U_SIZEOF_UCHAR, | |
106 | beforeLower, sizeof(beforeLower)/U_SIZEOF_UCHAR, | |
107 | "", | |
108 | &errorCode); | |
109 | if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { | |
110 | log_err("error in u_strToLower(root locale dest=NULL)=%ld error=%s\n", | |
111 | length, | |
112 | u_errorName(errorCode)); | |
113 | } | |
114 | ||
115 | buffer[0]=0xabcd; | |
116 | errorCode=U_ZERO_ERROR; | |
117 | length=u_strToLower(buffer, -1, | |
118 | beforeLower, sizeof(beforeLower)/U_SIZEOF_UCHAR, | |
119 | "", | |
120 | &errorCode); | |
121 | if( errorCode!=U_ILLEGAL_ARGUMENT_ERROR || | |
122 | buffer[0]!=0xabcd | |
123 | ) { | |
124 | log_err("error in u_strToLower(root locale destCapacity=-1)=%ld error=%s buffer[0]==0x%lx\n", | |
125 | length, | |
126 | u_errorName(errorCode), | |
127 | buffer[0]); | |
128 | } | |
129 | } | |
130 | ||
73c04bcf A |
131 | static void |
132 | TestCaseUpper(void) { | |
b75a7d8f A |
133 | static const UChar |
134 | ||
135 | beforeUpper[]= { 0x61, 0x42, 0x69, 0x3c2, 0xdf, 0x3c3, 0x2f, 0xfb03, 0xd93f, 0xdfff }, | |
136 | upperRoot[]= { 0x41, 0x42, 0x49, 0x3a3, 0x53, 0x53, 0x3a3, 0x2f, 0x46, 0x46, 0x49, 0xd93f, 0xdfff }, | |
137 | upperTurkish[]={ 0x41, 0x42, 0x130, 0x3a3, 0x53, 0x53, 0x3a3, 0x2f, 0x46, 0x46, 0x49, 0xd93f, 0xdfff }; | |
138 | ||
139 | UChar buffer[32]; | |
140 | int32_t length; | |
141 | UErrorCode errorCode; | |
142 | ||
143 | /* uppercase with root locale and in the same buffer */ | |
144 | uprv_memcpy(buffer, beforeUpper, sizeof(beforeUpper)); | |
145 | errorCode=U_ZERO_ERROR; | |
146 | length=u_strToUpper(buffer, sizeof(buffer)/U_SIZEOF_UCHAR, | |
147 | buffer, sizeof(beforeUpper)/U_SIZEOF_UCHAR, | |
148 | "", | |
149 | &errorCode); | |
150 | if( U_FAILURE(errorCode) || | |
151 | length!=(sizeof(upperRoot)/U_SIZEOF_UCHAR) || | |
152 | uprv_memcmp(upperRoot, buffer, length*U_SIZEOF_UCHAR)!=0 || | |
153 | buffer[length]!=0 | |
154 | ) { | |
155 | log_err("error in u_strToUpper(root locale)=%ld error=%s string matches: %s\n", | |
156 | length, | |
157 | u_errorName(errorCode), | |
158 | uprv_memcmp(upperRoot, buffer, length*U_SIZEOF_UCHAR)==0 && buffer[length]==0 ? "yes" : "no"); | |
159 | } | |
160 | ||
161 | /* uppercase with turkish locale and separate buffers */ | |
162 | buffer[0]=0xabcd; | |
163 | errorCode=U_ZERO_ERROR; | |
164 | length=u_strToUpper(buffer, sizeof(buffer)/U_SIZEOF_UCHAR, | |
165 | beforeUpper, sizeof(beforeUpper)/U_SIZEOF_UCHAR, | |
166 | "tr", | |
167 | &errorCode); | |
168 | if( U_FAILURE(errorCode) || | |
169 | length!=(sizeof(upperTurkish)/U_SIZEOF_UCHAR) || | |
170 | uprv_memcmp(upperTurkish, buffer, length*U_SIZEOF_UCHAR)!=0 || | |
171 | buffer[length]!=0 | |
172 | ) { | |
173 | log_err("error in u_strToUpper(turkish locale)=%ld error=%s string matches: %s\n", | |
174 | length, | |
175 | u_errorName(errorCode), | |
176 | uprv_memcmp(upperTurkish, buffer, length*U_SIZEOF_UCHAR)==0 && buffer[length]==0 ? "yes" : "no"); | |
177 | } | |
178 | ||
179 | /* test preflighting */ | |
180 | errorCode=U_ZERO_ERROR; | |
181 | length=u_strToUpper(NULL, 0, | |
182 | beforeUpper, sizeof(beforeUpper)/U_SIZEOF_UCHAR, | |
183 | "tr", | |
184 | &errorCode); | |
185 | if( errorCode!=U_BUFFER_OVERFLOW_ERROR || | |
186 | length!=(sizeof(upperTurkish)/U_SIZEOF_UCHAR) | |
187 | ) { | |
188 | log_err("error in u_strToUpper(turkish locale pure preflighting)=%ld error=%s\n", | |
189 | length, | |
190 | u_errorName(errorCode)); | |
191 | } | |
192 | ||
193 | /* test error handling */ | |
194 | buffer[0]=0xabcd; | |
195 | errorCode=U_ZERO_ERROR; | |
196 | length=u_strToUpper(buffer, sizeof(buffer)/U_SIZEOF_UCHAR, | |
197 | NULL, sizeof(beforeUpper)/U_SIZEOF_UCHAR, | |
198 | "tr", | |
199 | &errorCode); | |
200 | if( errorCode!=U_ILLEGAL_ARGUMENT_ERROR || | |
201 | buffer[0]!=0xabcd | |
202 | ) { | |
203 | log_err("error in u_strToUpper(turkish locale src=NULL)=%ld error=%s buffer[0]==0x%lx\n", | |
204 | length, | |
205 | u_errorName(errorCode), | |
206 | buffer[0]); | |
207 | } | |
208 | ||
209 | buffer[0]=0xabcd; | |
210 | errorCode=U_ZERO_ERROR; | |
211 | length=u_strToUpper(buffer, sizeof(buffer)/U_SIZEOF_UCHAR, | |
212 | beforeUpper, -2, | |
213 | "tr", | |
214 | &errorCode); | |
215 | if( errorCode!=U_ILLEGAL_ARGUMENT_ERROR || | |
216 | buffer[0]!=0xabcd | |
217 | ) { | |
218 | log_err("error in u_strToUpper(turkish locale srcLength=-2)=%ld error=%s buffer[0]==0x%lx\n", | |
219 | length, | |
220 | u_errorName(errorCode), | |
221 | buffer[0]); | |
222 | } | |
223 | } | |
224 | ||
225 | #if !UCONFIG_NO_BREAK_ITERATION | |
226 | ||
73c04bcf A |
227 | static void |
228 | TestCaseTitle(void) { | |
b75a7d8f A |
229 | static const UChar |
230 | ||
231 | beforeTitle[]= { 0x61, 0x42, 0x20, 0x69, 0x3c2, 0x20, 0xdf, 0x3c3, 0x2f, 0xfb03, 0xd93f, 0xdfff }, | |
232 | titleWord[]= { 0x41, 0x62, 0x20, 0x49, 0x3c2, 0x20, 0x53, 0x73, 0x3c3, 0x2f, 0x46, 0x66, 0x69, 0xd93f, 0xdfff }, | |
233 | titleChar[]= { 0x41, 0x42, 0x20, 0x49, 0x3a3, 0x20, 0x53, 0x73, 0x3a3, 0x2f, 0x46, 0x66, 0x69, 0xd93f, 0xdfff }; | |
234 | ||
235 | UChar buffer[32]; | |
236 | UBreakIterator *titleIterChars; | |
237 | int32_t length; | |
238 | UErrorCode errorCode; | |
239 | ||
240 | errorCode=U_ZERO_ERROR; | |
241 | titleIterChars=ubrk_open(UBRK_CHARACTER, "", beforeTitle, sizeof(beforeTitle)/U_SIZEOF_UCHAR, &errorCode); | |
242 | if(U_FAILURE(errorCode)) { | |
729e4ab9 | 243 | log_err_status(errorCode, "error: ubrk_open(UBRK_CHARACTER)->%s\n", u_errorName(errorCode)); |
b75a7d8f A |
244 | return; |
245 | } | |
246 | ||
247 | /* titlecase with standard break iterator and in the same buffer */ | |
248 | uprv_memcpy(buffer, beforeTitle, sizeof(beforeTitle)); | |
249 | errorCode=U_ZERO_ERROR; | |
250 | length=u_strToTitle(buffer, sizeof(buffer)/U_SIZEOF_UCHAR, | |
251 | buffer, sizeof(beforeTitle)/U_SIZEOF_UCHAR, | |
252 | NULL, "", | |
253 | &errorCode); | |
254 | if( U_FAILURE(errorCode) || | |
255 | length!=(sizeof(titleWord)/U_SIZEOF_UCHAR) || | |
256 | uprv_memcmp(titleWord, buffer, length*U_SIZEOF_UCHAR)!=0 || | |
257 | buffer[length]!=0 | |
258 | ) { | |
259 | log_err("error in u_strToTitle(standard iterator)=%ld error=%s string matches: %s\n", | |
260 | length, | |
261 | u_errorName(errorCode), | |
262 | uprv_memcmp(titleWord, buffer, length*U_SIZEOF_UCHAR)==0 && buffer[length]==0 ? "yes" : "no"); | |
263 | } | |
264 | ||
265 | /* titlecase with UBRK_CHARACTERS and separate buffers */ | |
266 | buffer[0]=0xabcd; | |
267 | errorCode=U_ZERO_ERROR; | |
268 | length=u_strToTitle(buffer, sizeof(buffer)/U_SIZEOF_UCHAR, | |
269 | beforeTitle, sizeof(beforeTitle)/U_SIZEOF_UCHAR, | |
270 | titleIterChars, "", | |
271 | &errorCode); | |
272 | if( U_FAILURE(errorCode) || | |
273 | length!=(sizeof(titleChar)/U_SIZEOF_UCHAR) || | |
274 | uprv_memcmp(titleChar, buffer, length*U_SIZEOF_UCHAR)!=0 || | |
275 | buffer[length]!=0 | |
276 | ) { | |
277 | log_err("error in u_strToTitle(UBRK_CHARACTERS)=%ld error=%s string matches: %s\n", | |
278 | length, | |
279 | u_errorName(errorCode), | |
280 | uprv_memcmp(titleChar, buffer, length*U_SIZEOF_UCHAR)==0 && buffer[length]==0 ? "yes" : "no"); | |
281 | } | |
282 | ||
283 | /* test preflighting */ | |
284 | errorCode=U_ZERO_ERROR; | |
285 | length=u_strToTitle(NULL, 0, | |
286 | beforeTitle, sizeof(beforeTitle)/U_SIZEOF_UCHAR, | |
287 | titleIterChars, "", | |
288 | &errorCode); | |
289 | if( errorCode!=U_BUFFER_OVERFLOW_ERROR || | |
290 | length!=(sizeof(titleChar)/U_SIZEOF_UCHAR) | |
291 | ) { | |
292 | log_err("error in u_strToTitle(UBRK_CHARACTERS pure preflighting)=%ld error=%s\n", | |
293 | length, | |
294 | u_errorName(errorCode)); | |
295 | } | |
296 | ||
297 | /* test error handling */ | |
298 | buffer[0]=0xabcd; | |
299 | errorCode=U_ZERO_ERROR; | |
300 | length=u_strToTitle(buffer, sizeof(buffer)/U_SIZEOF_UCHAR, | |
301 | NULL, sizeof(beforeTitle)/U_SIZEOF_UCHAR, | |
302 | titleIterChars, "", | |
303 | &errorCode); | |
304 | if( errorCode!=U_ILLEGAL_ARGUMENT_ERROR || | |
305 | buffer[0]!=0xabcd | |
306 | ) { | |
307 | log_err("error in u_strToTitle(UBRK_CHARACTERS src=NULL)=%ld error=%s buffer[0]==0x%lx\n", | |
308 | length, | |
309 | u_errorName(errorCode), | |
310 | buffer[0]); | |
311 | } | |
312 | ||
313 | buffer[0]=0xabcd; | |
314 | errorCode=U_ZERO_ERROR; | |
315 | length=u_strToTitle(buffer, sizeof(buffer)/U_SIZEOF_UCHAR, | |
316 | beforeTitle, -2, | |
317 | titleIterChars, "", | |
318 | &errorCode); | |
319 | if( errorCode!=U_ILLEGAL_ARGUMENT_ERROR || | |
320 | buffer[0]!=0xabcd | |
321 | ) { | |
322 | log_err("error in u_strToTitle(UBRK_CHARACTERS srcLength=-2)=%ld error=%s buffer[0]==0x%lx\n", | |
323 | length, | |
324 | u_errorName(errorCode), | |
325 | buffer[0]); | |
326 | } | |
327 | ||
328 | ubrk_close(titleIterChars); | |
329 | } | |
330 | ||
46f4442e A |
331 | static void |
332 | TestCaseDutchTitle(void) { | |
333 | static const UChar | |
334 | ||
335 | beforeTitle[]= { 0x69, 0x6A, 0x73, 0x73, 0x45, 0x6c, 0x20, 0x69, 0x67, 0x6c, 0x4f, 0x6f , 0x20 , 0x49, 0x4A, 0x53, 0x53, 0x45, 0x4C }, | |
336 | titleRoot[]= { 0x49, 0x6A, 0x73, 0x73, 0x65, 0x6c, 0x20, 0x49, 0x67, 0x6c, 0x6f, 0x6f , 0x20 , 0x49, 0x6A, 0x73, 0x73, 0x65, 0x6C }, | |
337 | titleDutch[]= { 0x49, 0x4A, 0x73, 0x73, 0x65, 0x6c, 0x20, 0x49, 0x67, 0x6c, 0x6f, 0x6f , 0x20 , 0x49, 0x4A, 0x73, 0x73, 0x65, 0x6C }; | |
338 | ||
339 | UChar buffer[32]; | |
340 | UBreakIterator *titleIterWord; | |
341 | int32_t length; | |
342 | UErrorCode errorCode; | |
343 | ||
344 | errorCode=U_ZERO_ERROR; | |
345 | titleIterWord=ubrk_open(UBRK_WORD, "", beforeTitle, sizeof(beforeTitle)/U_SIZEOF_UCHAR, &errorCode); | |
346 | if(U_FAILURE(errorCode)) { | |
729e4ab9 | 347 | log_err_status(errorCode, "error: ubrk_open(UBRK_WORD)->%s\n", u_errorName(errorCode)); |
46f4442e A |
348 | return; |
349 | } | |
350 | ||
351 | /* titlecase with default locale */ | |
352 | buffer[0]=0xabcd; | |
353 | errorCode=U_ZERO_ERROR; | |
354 | length=u_strToTitle(buffer, sizeof(buffer)/U_SIZEOF_UCHAR, | |
355 | beforeTitle, sizeof(beforeTitle)/U_SIZEOF_UCHAR, | |
356 | titleIterWord, "", | |
357 | &errorCode); | |
358 | if( U_FAILURE(errorCode) || | |
359 | length!=(sizeof(titleRoot)/U_SIZEOF_UCHAR) || | |
360 | uprv_memcmp(titleRoot, buffer, length*U_SIZEOF_UCHAR)!=0 || | |
361 | buffer[length]!=0 | |
362 | ) { | |
363 | char charsOut[21]; | |
364 | u_UCharsToChars(buffer,charsOut,sizeof(charsOut)); | |
365 | log_err("error in u_strToTitle(UBRK_CHARACTERS)=%ld error=%s root locale string matches: %s\noutput buffer is {%s}\n", | |
366 | length, | |
367 | u_errorName(errorCode), | |
368 | uprv_memcmp(titleRoot, buffer, length*U_SIZEOF_UCHAR)==0 && buffer[length]==0 ? "yes" : "no", charsOut); | |
369 | } | |
370 | /* titlecase with Dutch locale */ | |
371 | buffer[0]=0xabcd; | |
372 | errorCode=U_ZERO_ERROR; | |
373 | length=u_strToTitle(buffer, sizeof(buffer)/U_SIZEOF_UCHAR, | |
374 | beforeTitle, sizeof(beforeTitle)/U_SIZEOF_UCHAR, | |
375 | titleIterWord, "nl", | |
376 | &errorCode); | |
377 | if( U_FAILURE(errorCode) || | |
378 | length!=(sizeof(titleDutch)/U_SIZEOF_UCHAR) || | |
379 | uprv_memcmp(titleDutch, buffer, length*U_SIZEOF_UCHAR)!=0 || | |
380 | buffer[length]!=0 | |
381 | ) { | |
382 | char charsOut[21]; | |
383 | u_UCharsToChars(buffer,charsOut,sizeof(charsOut)); | |
384 | log_err("error in u_strToTitle(UBRK_CHARACTERS)=%ld error=%s dutch locale string matches: %s\noutput buffer is {%s}\n", | |
385 | length, | |
386 | u_errorName(errorCode), | |
387 | uprv_memcmp(titleDutch, buffer, length*U_SIZEOF_UCHAR)==0 && buffer[length]==0 ? "yes" : "no", charsOut); | |
388 | } | |
389 | ||
390 | ubrk_close(titleIterWord); | |
391 | } | |
392 | ||
b75a7d8f A |
393 | #endif |
394 | ||
395 | /* test case folding and case-insensitive string compare -------------------- */ | |
396 | ||
73c04bcf A |
397 | static void |
398 | TestCaseFolding(void) { | |
399 | /* | |
400 | * CaseFolding.txt says about i and its cousins: | |
401 | * 0049; C; 0069; # LATIN CAPITAL LETTER I | |
402 | * 0049; T; 0131; # LATIN CAPITAL LETTER I | |
403 | * | |
404 | * 0130; F; 0069 0307; # LATIN CAPITAL LETTER I WITH DOT ABOVE | |
405 | * 0130; T; 0069; # LATIN CAPITAL LETTER I WITH DOT ABOVE | |
406 | * That's all. | |
407 | * See CaseFolding.txt and the Unicode Standard for how to apply the case foldings. | |
408 | */ | |
b75a7d8f A |
409 | static const UChar32 |
410 | simple[]={ | |
411 | /* input, default, exclude special i */ | |
412 | 0x61, 0x61, 0x61, | |
413 | 0x49, 0x69, 0x131, | |
73c04bcf | 414 | 0x130, 0x130, 0x69, |
b75a7d8f A |
415 | 0x131, 0x131, 0x131, |
416 | 0xdf, 0xdf, 0xdf, | |
417 | 0xfb03, 0xfb03, 0xfb03, | |
418 | 0x1040e,0x10436,0x10436, | |
419 | 0x5ffff,0x5ffff,0x5ffff | |
420 | }; | |
421 | ||
422 | static const UChar | |
423 | mixed[]= { 0x61, 0x42, 0x130, 0x49, 0x131, 0x3d0, 0xdf, 0xfb03, 0xd93f, 0xdfff }, | |
424 | foldedDefault[]= { 0x61, 0x62, 0x69, 0x307, 0x69, 0x131, 0x3b2, 0x73, 0x73, 0x66, 0x66, 0x69, 0xd93f, 0xdfff }, | |
425 | foldedExcludeSpecialI[]={ 0x61, 0x62, 0x69, 0x131, 0x131, 0x3b2, 0x73, 0x73, 0x66, 0x66, 0x69, 0xd93f, 0xdfff }; | |
426 | ||
427 | UVersionInfo unicodeVersion={ 0, 0, 17, 89 }, unicode_3_1={ 3, 1, 0, 0 }; | |
428 | ||
429 | const UChar32 *p; | |
430 | int32_t i; | |
431 | ||
432 | UChar buffer[32]; | |
433 | int32_t length; | |
434 | UErrorCode errorCode; | |
435 | UBool isUnicode_3_1; | |
436 | ||
437 | /* if unicodeVersion()>=3.1 then test exclude-special-i cases as well */ | |
438 | u_getUnicodeVersion(unicodeVersion); | |
439 | isUnicode_3_1= uprv_memcmp(unicodeVersion, unicode_3_1, 4)>=0; | |
440 | ||
441 | /* test simple case folding */ | |
442 | p=simple; | |
443 | for(i=0; i<sizeof(simple)/12; p+=3, ++i) { | |
444 | if(u_foldCase(p[0], U_FOLD_CASE_DEFAULT)!=p[1]) { | |
445 | log_err("error: u_foldCase(0x%04lx, default)=0x%04lx instead of 0x%04lx\n", | |
446 | p[0], u_foldCase(p[0], U_FOLD_CASE_DEFAULT), p[1]); | |
447 | return; | |
448 | } | |
449 | ||
450 | if(isUnicode_3_1 && u_foldCase(p[0], U_FOLD_CASE_EXCLUDE_SPECIAL_I)!=p[2]) { | |
451 | log_err("error: u_foldCase(0x%04lx, exclude special i)=0x%04lx instead of 0x%04lx\n", | |
452 | p[0], u_foldCase(p[0], U_FOLD_CASE_EXCLUDE_SPECIAL_I), p[2]); | |
453 | return; | |
454 | } | |
455 | } | |
456 | ||
457 | /* test full string case folding with default option and separate buffers */ | |
458 | buffer[0]=0xabcd; | |
459 | errorCode=U_ZERO_ERROR; | |
460 | length=u_strFoldCase(buffer, sizeof(buffer)/U_SIZEOF_UCHAR, | |
461 | mixed, sizeof(mixed)/U_SIZEOF_UCHAR, | |
462 | U_FOLD_CASE_DEFAULT, | |
463 | &errorCode); | |
464 | if( U_FAILURE(errorCode) || | |
465 | length!=(sizeof(foldedDefault)/U_SIZEOF_UCHAR) || | |
466 | uprv_memcmp(foldedDefault, buffer, length*U_SIZEOF_UCHAR)!=0 || | |
467 | buffer[length]!=0 | |
468 | ) { | |
469 | log_err("error in u_strFoldCase(default)=%ld error=%s string matches: %s\n", | |
470 | length, | |
471 | u_errorName(errorCode), | |
472 | uprv_memcmp(foldedDefault, buffer, length*U_SIZEOF_UCHAR)==0 && buffer[length]==0 ? "yes" : "no"); | |
473 | } | |
474 | ||
475 | /* exclude special i */ | |
476 | if(isUnicode_3_1) { | |
477 | buffer[0]=0xabcd; | |
478 | errorCode=U_ZERO_ERROR; | |
479 | length=u_strFoldCase(buffer, sizeof(buffer)/U_SIZEOF_UCHAR, | |
480 | mixed, sizeof(mixed)/U_SIZEOF_UCHAR, | |
481 | U_FOLD_CASE_EXCLUDE_SPECIAL_I, | |
482 | &errorCode); | |
483 | if( U_FAILURE(errorCode) || | |
484 | length!=(sizeof(foldedExcludeSpecialI)/U_SIZEOF_UCHAR) || | |
485 | uprv_memcmp(foldedExcludeSpecialI, buffer, length*U_SIZEOF_UCHAR)!=0 || | |
486 | buffer[length]!=0 | |
487 | ) { | |
488 | log_err("error in u_strFoldCase(exclude special i)=%ld error=%s string matches: %s\n", | |
489 | length, | |
490 | u_errorName(errorCode), | |
491 | uprv_memcmp(foldedExcludeSpecialI, buffer, length*U_SIZEOF_UCHAR)==0 && buffer[length]==0 ? "yes" : "no"); | |
492 | } | |
493 | } | |
494 | ||
495 | /* test full string case folding with default option and in the same buffer */ | |
496 | uprv_memcpy(buffer, mixed, sizeof(mixed)); | |
497 | buffer[sizeof(mixed)/U_SIZEOF_UCHAR]=0; | |
498 | errorCode=U_ZERO_ERROR; | |
499 | length=u_strFoldCase(buffer, sizeof(buffer)/U_SIZEOF_UCHAR, | |
500 | buffer, -1, /* implicit srcLength */ | |
501 | U_FOLD_CASE_DEFAULT, | |
502 | &errorCode); | |
503 | if( U_FAILURE(errorCode) || | |
504 | length!=(sizeof(foldedDefault)/U_SIZEOF_UCHAR) || | |
505 | uprv_memcmp(foldedDefault, buffer, length*U_SIZEOF_UCHAR)!=0 || | |
506 | buffer[length]!=0 | |
507 | ) { | |
508 | log_err("error in u_strFoldCase(default same buffer)=%ld error=%s string matches: %s\n", | |
509 | length, | |
510 | u_errorName(errorCode), | |
511 | uprv_memcmp(foldedDefault, buffer, length*U_SIZEOF_UCHAR)==0 && buffer[length]==0 ? "yes" : "no"); | |
512 | } | |
513 | ||
514 | /* test full string case folding, exclude special i, in the same buffer */ | |
515 | if(isUnicode_3_1) { | |
516 | uprv_memcpy(buffer, mixed, sizeof(mixed)); | |
517 | errorCode=U_ZERO_ERROR; | |
518 | length=u_strFoldCase(buffer, sizeof(buffer)/U_SIZEOF_UCHAR, | |
519 | buffer, sizeof(mixed)/U_SIZEOF_UCHAR, | |
520 | U_FOLD_CASE_EXCLUDE_SPECIAL_I, | |
521 | &errorCode); | |
522 | if( U_FAILURE(errorCode) || | |
523 | length!=(sizeof(foldedExcludeSpecialI)/U_SIZEOF_UCHAR) || | |
524 | uprv_memcmp(foldedExcludeSpecialI, buffer, length*U_SIZEOF_UCHAR)!=0 || | |
525 | buffer[length]!=0 | |
526 | ) { | |
527 | log_err("error in u_strFoldCase(exclude special i same buffer)=%ld error=%s string matches: %s\n", | |
528 | length, | |
529 | u_errorName(errorCode), | |
530 | uprv_memcmp(foldedExcludeSpecialI, buffer, length*U_SIZEOF_UCHAR)==0 && buffer[length]==0 ? "yes" : "no"); | |
531 | } | |
532 | } | |
533 | ||
534 | /* test preflighting */ | |
535 | buffer[0]=buffer[2]=0xabcd; | |
536 | errorCode=U_ZERO_ERROR; | |
537 | length=u_strFoldCase(buffer, 2, /* set destCapacity=2 */ | |
538 | mixed, sizeof(mixed)/U_SIZEOF_UCHAR, | |
539 | U_FOLD_CASE_DEFAULT, | |
540 | &errorCode); | |
541 | if( errorCode!=U_BUFFER_OVERFLOW_ERROR || | |
542 | length!=(sizeof(foldedDefault)/U_SIZEOF_UCHAR) || | |
543 | uprv_memcmp(foldedDefault, buffer, 2*U_SIZEOF_UCHAR)!=0 || | |
544 | buffer[2]!=0xabcd | |
545 | ) { | |
546 | log_err("error in u_strFoldCase(default preflighting)=%ld error=%s string matches: %s\n", | |
547 | length, | |
548 | u_errorName(errorCode), | |
549 | uprv_memcmp(foldedDefault, buffer, 2*U_SIZEOF_UCHAR)==0 && buffer[2]==0xabcd ? "yes" : "no"); | |
550 | } | |
551 | ||
552 | errorCode=U_ZERO_ERROR; | |
553 | length=u_strFoldCase(NULL, 0, | |
554 | mixed, sizeof(mixed)/U_SIZEOF_UCHAR, | |
555 | U_FOLD_CASE_DEFAULT, | |
556 | &errorCode); | |
557 | if( errorCode!=U_BUFFER_OVERFLOW_ERROR || | |
558 | length!=(sizeof(foldedDefault)/U_SIZEOF_UCHAR) | |
559 | ) { | |
560 | log_err("error in u_strFoldCase(default pure preflighting)=%ld error=%s\n", | |
561 | length, | |
562 | u_errorName(errorCode)); | |
563 | } | |
564 | ||
565 | /* test error handling */ | |
566 | errorCode=U_ZERO_ERROR; | |
567 | length=u_strFoldCase(NULL, sizeof(buffer)/U_SIZEOF_UCHAR, | |
568 | mixed, sizeof(mixed)/U_SIZEOF_UCHAR, | |
569 | U_FOLD_CASE_DEFAULT, | |
570 | &errorCode); | |
571 | if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { | |
572 | log_err("error in u_strFoldCase(default dest=NULL)=%ld error=%s\n", | |
573 | length, | |
574 | u_errorName(errorCode)); | |
575 | } | |
576 | ||
577 | buffer[0]=0xabcd; | |
578 | errorCode=U_ZERO_ERROR; | |
579 | length=u_strFoldCase(buffer, -1, | |
580 | mixed, sizeof(mixed)/U_SIZEOF_UCHAR, | |
581 | U_FOLD_CASE_DEFAULT, | |
582 | &errorCode); | |
583 | if( errorCode!=U_ILLEGAL_ARGUMENT_ERROR || | |
584 | buffer[0]!=0xabcd | |
585 | ) { | |
586 | log_err("error in u_strFoldCase(default destCapacity=-1)=%ld error=%s buffer[0]==0x%lx\n", | |
587 | length, | |
588 | u_errorName(errorCode), | |
589 | buffer[0]); | |
590 | } | |
591 | ||
592 | buffer[0]=0xabcd; | |
593 | errorCode=U_ZERO_ERROR; | |
594 | length=u_strFoldCase(buffer, sizeof(buffer)/U_SIZEOF_UCHAR, | |
595 | NULL, sizeof(mixed)/U_SIZEOF_UCHAR, | |
596 | U_FOLD_CASE_EXCLUDE_SPECIAL_I, | |
597 | &errorCode); | |
598 | if( errorCode!=U_ILLEGAL_ARGUMENT_ERROR || | |
599 | buffer[0]!=0xabcd | |
600 | ) { | |
601 | log_err("error in u_strFoldCase(exclude special i src=NULL)=%ld error=%s buffer[0]==0x%lx\n", | |
602 | length, | |
603 | u_errorName(errorCode), | |
604 | buffer[0]); | |
605 | } | |
606 | ||
607 | buffer[0]=0xabcd; | |
608 | errorCode=U_ZERO_ERROR; | |
609 | length=u_strFoldCase(buffer, sizeof(buffer)/U_SIZEOF_UCHAR, | |
610 | mixed, -2, | |
611 | U_FOLD_CASE_EXCLUDE_SPECIAL_I, | |
612 | &errorCode); | |
613 | if( errorCode!=U_ILLEGAL_ARGUMENT_ERROR || | |
614 | buffer[0]!=0xabcd | |
615 | ) { | |
616 | log_err("error in u_strFoldCase(exclude special i srcLength=-2)=%ld error=%s buffer[0]==0x%lx\n", | |
617 | length, | |
618 | u_errorName(errorCode), | |
619 | buffer[0]); | |
620 | } | |
621 | } | |
622 | ||
73c04bcf A |
623 | static void |
624 | TestCaseCompare(void) { | |
b75a7d8f A |
625 | static const UChar |
626 | ||
627 | mixed[]= { 0x61, 0x42, 0x131, 0x3a3, 0xdf, 0xfb03, 0xd93f, 0xdfff, 0 }, | |
628 | otherDefault[]= { 0x41, 0x62, 0x131, 0x3c3, 0x73, 0x53, 0x46, 0x66, 0x49, 0xd93f, 0xdfff, 0 }, | |
629 | otherExcludeSpecialI[]={ 0x41, 0x62, 0x131, 0x3c3, 0x53, 0x73, 0x66, 0x46, 0x69, 0xd93f, 0xdfff, 0 }, | |
630 | different[]= { 0x41, 0x62, 0x131, 0x3c3, 0x73, 0x53, 0x46, 0x66, 0x49, 0xd93f, 0xdffd, 0 }; | |
631 | ||
632 | UVersionInfo unicodeVersion={ 0, 0, 17, 89 }, unicode_3_1={ 3, 1, 0, 0 }; | |
633 | ||
634 | int32_t result, lenMixed, lenOtherDefault, lenOtherExcludeSpecialI, lenDifferent; | |
635 | UErrorCode errorCode; | |
636 | UBool isUnicode_3_1; | |
637 | ||
638 | errorCode=U_ZERO_ERROR; | |
639 | ||
640 | lenMixed=u_strlen(mixed); | |
641 | lenOtherDefault=u_strlen(otherDefault); | |
642 | lenOtherExcludeSpecialI=u_strlen(otherExcludeSpecialI); | |
643 | lenDifferent=u_strlen(different); | |
644 | ||
645 | /* if unicodeVersion()>=3.1 then test exclude-special-i cases as well */ | |
646 | u_getUnicodeVersion(unicodeVersion); | |
647 | isUnicode_3_1= uprv_memcmp(unicodeVersion, unicode_3_1, 4)>=0; | |
648 | ||
649 | /* test u_strcasecmp() */ | |
650 | result=u_strcasecmp(mixed, otherDefault, U_FOLD_CASE_DEFAULT); | |
651 | if(result!=0) { | |
652 | log_err("error: u_strcasecmp(mixed, other, default)=%ld instead of 0\n", result); | |
653 | } | |
654 | result=u_strCaseCompare(mixed, -1, otherDefault, -1, U_FOLD_CASE_DEFAULT, &errorCode); | |
655 | if(result!=0) { | |
656 | log_err("error: u_strCaseCompare(mixed, other, default)=%ld instead of 0\n", result); | |
657 | } | |
658 | ||
659 | /* test u_strcasecmp() - exclude special i */ | |
660 | result=u_strcasecmp(mixed, otherExcludeSpecialI, U_FOLD_CASE_EXCLUDE_SPECIAL_I); | |
661 | if(result!=0) { | |
662 | log_err("error: u_strcasecmp(mixed, other, exclude special i)=%ld instead of 0\n", result); | |
663 | } | |
664 | result=u_strCaseCompare(mixed, lenMixed, otherExcludeSpecialI, lenOtherExcludeSpecialI, U_FOLD_CASE_EXCLUDE_SPECIAL_I, &errorCode); | |
665 | if(result!=0) { | |
666 | log_err("error: u_strCaseCompare(mixed, other, exclude special i)=%ld instead of 0\n", result); | |
667 | } | |
668 | ||
669 | /* test u_strcasecmp() */ | |
670 | result=u_strcasecmp(mixed, different, U_FOLD_CASE_DEFAULT); | |
671 | if(result<=0) { | |
672 | log_err("error: u_strcasecmp(mixed, different, default)=%ld instead of positive\n", result); | |
673 | } | |
674 | result=u_strCaseCompare(mixed, -1, different, lenDifferent, U_FOLD_CASE_DEFAULT, &errorCode); | |
675 | if(result<=0) { | |
676 | log_err("error: u_strCaseCompare(mixed, different, default)=%ld instead of positive\n", result); | |
677 | } | |
678 | ||
679 | /* test u_strncasecmp() - stop before the sharp s (U+00df) */ | |
680 | result=u_strncasecmp(mixed, different, 4, U_FOLD_CASE_DEFAULT); | |
681 | if(result!=0) { | |
682 | log_err("error: u_strncasecmp(mixed, different, 4, default)=%ld instead of 0\n", result); | |
683 | } | |
684 | result=u_strCaseCompare(mixed, 4, different, 4, U_FOLD_CASE_DEFAULT, &errorCode); | |
685 | if(result!=0) { | |
686 | log_err("error: u_strCaseCompare(mixed, 4, different, 4, default)=%ld instead of 0\n", result); | |
687 | } | |
688 | ||
689 | /* test u_strncasecmp() - stop in the middle of the sharp s (U+00df) */ | |
690 | result=u_strncasecmp(mixed, different, 5, U_FOLD_CASE_DEFAULT); | |
691 | if(result<=0) { | |
692 | log_err("error: u_strncasecmp(mixed, different, 5, default)=%ld instead of positive\n", result); | |
693 | } | |
694 | result=u_strCaseCompare(mixed, 5, different, 5, U_FOLD_CASE_DEFAULT, &errorCode); | |
695 | if(result<=0) { | |
696 | log_err("error: u_strCaseCompare(mixed, 5, different, 5, default)=%ld instead of positive\n", result); | |
697 | } | |
698 | ||
699 | /* test u_memcasecmp() - stop before the sharp s (U+00df) */ | |
700 | result=u_memcasecmp(mixed, different, 4, U_FOLD_CASE_DEFAULT); | |
701 | if(result!=0) { | |
702 | log_err("error: u_memcasecmp(mixed, different, 4, default)=%ld instead of 0\n", result); | |
703 | } | |
704 | ||
705 | /* test u_memcasecmp() - stop in the middle of the sharp s (U+00df) */ | |
706 | result=u_memcasecmp(mixed, different, 5, U_FOLD_CASE_DEFAULT); | |
707 | if(result<=0) { | |
708 | log_err("error: u_memcasecmp(mixed, different, 5, default)=%ld instead of positive\n", result); | |
709 | } | |
710 | } | |
73c04bcf A |
711 | |
712 | /* test UCaseMap ------------------------------------------------------------ */ | |
713 | ||
714 | /* | |
715 | * API test for UCaseMap; | |
716 | * test cases for actual case mappings using UCaseMap see | |
717 | * intltest utility/UnicodeStringTest/StringCaseTest/TestCasing | |
718 | */ | |
719 | static void | |
720 | TestUCaseMap(void) { | |
721 | static const char | |
722 | aBc[] ={ 0x61, 0x42, 0x63, 0 }, | |
723 | abc[] ={ 0x61, 0x62, 0x63, 0 }, | |
724 | ABCg[]={ 0x41, 0x42, 0x43, 0x67, 0 }, | |
725 | defg[]={ 0x64, 0x65, 0x66, 0x67, 0 }; | |
726 | char utf8Out[8]; | |
727 | ||
728 | UCaseMap *csm; | |
729 | const char *locale; | |
730 | uint32_t options; | |
731 | int32_t length; | |
732 | UErrorCode errorCode; | |
733 | ||
734 | errorCode=U_ZERO_ERROR; | |
735 | csm=ucasemap_open("tur", 0xa5, &errorCode); | |
736 | if(U_FAILURE(errorCode)) { | |
737 | log_err("ucasemap_open(\"tur\") failed - %s\n", u_errorName(errorCode)); | |
738 | return; | |
739 | } | |
740 | locale=ucasemap_getLocale(csm); | |
741 | if(0!=strcmp(locale, "tr")) { | |
742 | log_err("ucasemap_getLocale(ucasemap_open(\"tur\"))==%s!=\"tr\"\n", locale); | |
743 | } | |
744 | /* overly long locale IDs get truncated to their language code to avoid unnecessary allocation */ | |
745 | ucasemap_setLocale(csm, "I-kLInGOn-the-quick-brown-fox-jumps-over-the-lazy-dog", &errorCode); | |
746 | locale=ucasemap_getLocale(csm); | |
747 | if(0!=strcmp(locale, "i-klingon")) { | |
748 | log_err("ucasemap_getLocale(ucasemap_setLocale(\"I-kLInGOn-the-quick-br...\"))==%s!=\"i-klingon\"\n", locale); | |
749 | } | |
750 | ||
751 | errorCode=U_ZERO_ERROR; | |
752 | options=ucasemap_getOptions(csm); | |
753 | if(options!=0xa5) { | |
754 | log_err("ucasemap_getOptions(ucasemap_open(0xa5))==0x%lx!=0xa5\n", (long)options); | |
755 | } | |
756 | ucasemap_setOptions(csm, 0x333333, &errorCode); | |
757 | options=ucasemap_getOptions(csm); | |
758 | if(options!=0x333333) { | |
759 | log_err("ucasemap_getOptions(ucasemap_setOptions(0x333333))==0x%lx!=0x333333\n", (long)options); | |
760 | } | |
761 | ||
762 | /* test case mapping API; not all permutations necessary due to shared implementation code */ | |
763 | ||
764 | /* NUL terminated source */ | |
765 | errorCode=U_ZERO_ERROR; | |
766 | length=ucasemap_utf8ToLower(csm, utf8Out, (int32_t)sizeof(utf8Out), aBc, -1, &errorCode); | |
767 | if(U_FAILURE(errorCode) || length!=3 || 0!=strcmp(abc, utf8Out)) { | |
768 | log_err("ucasemap_utf8ToLower(aBc\\0) failed\n"); | |
769 | } | |
770 | ||
771 | /* incoming failure code */ | |
772 | errorCode=U_PARSE_ERROR; | |
773 | strcpy(utf8Out, defg); | |
774 | length=ucasemap_utf8ToLower(csm, utf8Out, (int32_t)sizeof(utf8Out), aBc, -1, &errorCode); | |
775 | if(errorCode!=U_PARSE_ERROR || 0!=strcmp(defg, utf8Out)) { | |
776 | log_err("ucasemap_utf8ToLower(failure) failed\n"); | |
777 | } | |
778 | ||
779 | /* overlapping input & output */ | |
780 | errorCode=U_ZERO_ERROR; | |
781 | strcpy(utf8Out, aBc); | |
782 | length=ucasemap_utf8ToUpper(csm, utf8Out, 2, utf8Out+1, 2, &errorCode); | |
783 | if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || 0!=strcmp(aBc, utf8Out)) { | |
784 | log_err("ucasemap_utf8ToUpper(overlap 1) failed\n"); | |
785 | } | |
786 | ||
787 | /* overlap in the other direction */ | |
788 | errorCode=U_ZERO_ERROR; | |
789 | strcpy(utf8Out, aBc); | |
790 | length=ucasemap_utf8ToUpper(csm, utf8Out+1, 2, utf8Out, 2, &errorCode); | |
791 | if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || 0!=strcmp(aBc, utf8Out)) { | |
792 | log_err("ucasemap_utf8ToUpper(overlap 2) failed\n"); | |
793 | } | |
794 | ||
795 | /* NULL destination */ | |
796 | errorCode=U_ZERO_ERROR; | |
797 | strcpy(utf8Out, defg); | |
798 | length=ucasemap_utf8ToLower(csm, NULL, (int32_t)sizeof(utf8Out), aBc, -1, &errorCode); | |
799 | if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || 0!=strcmp(defg, utf8Out)) { | |
800 | log_err("ucasemap_utf8ToLower(dest=NULL) failed\n"); | |
801 | } | |
802 | ||
803 | /* destCapacity<0 */ | |
804 | errorCode=U_ZERO_ERROR; | |
805 | strcpy(utf8Out, defg); | |
806 | length=ucasemap_utf8ToLower(csm, utf8Out, -2, aBc, -1, &errorCode); | |
807 | if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || 0!=strcmp(defg, utf8Out)) { | |
808 | log_err("ucasemap_utf8ToLower(destCapacity<0) failed\n"); | |
809 | } | |
810 | ||
811 | /* NULL source */ | |
812 | errorCode=U_ZERO_ERROR; | |
813 | strcpy(utf8Out, defg); | |
814 | length=ucasemap_utf8ToLower(csm, utf8Out, (int32_t)sizeof(utf8Out), NULL, -1, &errorCode); | |
815 | if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || 0!=strcmp(defg, utf8Out)) { | |
816 | log_err("ucasemap_utf8ToLower(src=NULL) failed\n"); | |
817 | } | |
818 | ||
819 | /* srcLength<-1 */ | |
820 | errorCode=U_ZERO_ERROR; | |
821 | strcpy(utf8Out, defg); | |
822 | length=ucasemap_utf8ToLower(csm, utf8Out, (int32_t)sizeof(utf8Out), aBc, -2, &errorCode); | |
823 | if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || 0!=strcmp(defg, utf8Out)) { | |
824 | log_err("ucasemap_utf8ToLower(srcLength<-1) failed\n"); | |
825 | } | |
826 | ||
827 | /* buffer overflow */ | |
828 | errorCode=U_ZERO_ERROR; | |
829 | strcpy(utf8Out, defg); | |
830 | length=ucasemap_utf8ToUpper(csm, utf8Out, 2, aBc, 3, &errorCode); | |
831 | if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=3 || 0!=strcmp(defg+2, utf8Out+2)) { | |
832 | log_err("ucasemap_utf8ToUpper(overflow) failed\n"); | |
833 | } | |
834 | ||
835 | /* dest not terminated (leaves g from defg alone) */ | |
836 | errorCode=U_ZERO_ERROR; | |
837 | strcpy(utf8Out, defg); | |
838 | length=ucasemap_utf8ToUpper(csm, utf8Out, 3, aBc, 3, &errorCode); | |
839 | if(errorCode!=U_STRING_NOT_TERMINATED_WARNING || length!=3 || 0!=strcmp(ABCg, utf8Out)) { | |
840 | log_err("ucasemap_utf8ToUpper(overflow) failed\n"); | |
841 | } | |
842 | ||
46f4442e A |
843 | /* C API coverage for case folding. More thorough test via C++ intltest's StringCaseTest::TestCasing(). */ |
844 | errorCode=U_ZERO_ERROR; | |
845 | utf8Out[0]=0; | |
846 | length=ucasemap_utf8FoldCase(csm, utf8Out, (int32_t)sizeof(utf8Out), aBc, 3, &errorCode); | |
847 | if(U_FAILURE(errorCode) || length!=3 || 0!=strcmp(abc, utf8Out)) { | |
848 | log_err("ucasemap_utf8FoldCase(aBc) failed\n"); | |
849 | } | |
850 | ||
73c04bcf A |
851 | ucasemap_close(csm); |
852 | } | |
853 | ||
46f4442e A |
854 | #if !UCONFIG_NO_BREAK_ITERATION |
855 | ||
856 | /* Try titlecasing with options. */ | |
857 | static void | |
858 | TestUCaseMapToTitle(void) { | |
859 | /* "a 'CaT. A 'dOg! 'eTc." where '=U+02BB */ | |
860 | /* | |
861 | * Note: The sentence BreakIterator does not recognize a '.' | |
862 | * as a sentence terminator if it is followed by lowercase. | |
863 | * That is why the example has the '!'. | |
864 | */ | |
865 | static const UChar | |
866 | ||
867 | beforeTitle[]= { 0x61, 0x20, 0x2bb, 0x43, 0x61, 0x54, 0x2e, 0x20, 0x41, 0x20, 0x2bb, 0x64, 0x4f, 0x67, 0x21, 0x20, 0x2bb, 0x65, 0x54, 0x63, 0x2e }, | |
868 | titleWord[]= { 0x41, 0x20, 0x2bb, 0x43, 0x61, 0x74, 0x2e, 0x20, 0x41, 0x20, 0x2bb, 0x44, 0x6f, 0x67, 0x21, 0x20, 0x2bb, 0x45, 0x74, 0x63, 0x2e }, | |
869 | titleWordNoAdjust[]={ 0x41, 0x20, 0x2bb, 0x63, 0x61, 0x74, 0x2e, 0x20, 0x41, 0x20, 0x2bb, 0x64, 0x6f, 0x67, 0x21, 0x20, 0x2bb, 0x65, 0x74, 0x63, 0x2e }, | |
870 | titleSentNoLower[]= { 0x41, 0x20, 0x2bb, 0x43, 0x61, 0x54, 0x2e, 0x20, 0x41, 0x20, 0x2bb, 0x64, 0x4f, 0x67, 0x21, 0x20, 0x2bb, 0x45, 0x54, 0x63, 0x2e }; | |
871 | ||
872 | UChar buffer[32]; | |
873 | UCaseMap *csm; | |
874 | UBreakIterator *sentenceIter; | |
875 | const UBreakIterator *iter; | |
876 | int32_t length; | |
877 | UErrorCode errorCode; | |
878 | ||
879 | errorCode=U_ZERO_ERROR; | |
880 | csm=ucasemap_open("", 0, &errorCode); | |
881 | if(U_FAILURE(errorCode)) { | |
882 | log_err("ucasemap_open(\"\") failed - %s\n", u_errorName(errorCode)); | |
883 | return; | |
884 | } | |
885 | ||
886 | iter=ucasemap_getBreakIterator(csm); | |
887 | if(iter!=NULL) { | |
888 | log_err("ucasemap_getBreakIterator() returns %p!=NULL before setting any iterator or titlecasing\n", iter); | |
889 | } | |
890 | ||
891 | /* Use default UBreakIterator: Word breaks. */ | |
892 | length=ucasemap_toTitle(csm, buffer, LENGTHOF(buffer), beforeTitle, LENGTHOF(beforeTitle), &errorCode); | |
893 | if( U_FAILURE(errorCode) || | |
894 | length!=LENGTHOF(titleWord) || | |
895 | 0!=u_memcmp(buffer, titleWord, length) || | |
896 | buffer[length]!=0 | |
897 | ) { | |
729e4ab9 | 898 | log_err_status(errorCode, "ucasemap_toTitle(default iterator)=%ld failed - %s\n", (long)length, u_errorName(errorCode)); |
46f4442e | 899 | } |
729e4ab9 A |
900 | if (U_SUCCESS(errorCode)) { |
901 | iter=ucasemap_getBreakIterator(csm); | |
902 | if(iter==NULL) { | |
903 | log_err("ucasemap_getBreakIterator() returns NULL after titlecasing\n"); | |
904 | } | |
46f4442e A |
905 | } |
906 | ||
907 | /* Try U_TITLECASE_NO_BREAK_ADJUSTMENT. */ | |
908 | ucasemap_setOptions(csm, U_TITLECASE_NO_BREAK_ADJUSTMENT, &errorCode); | |
909 | if(U_FAILURE(errorCode)) { | |
729e4ab9 | 910 | log_err_status(errorCode, "error: ucasemap_setOptions(U_TITLECASE_NO_BREAK_ADJUSTMENT) failed - %s\n", u_errorName(errorCode)); |
46f4442e A |
911 | return; |
912 | } | |
913 | ||
914 | length=ucasemap_toTitle(csm, buffer, LENGTHOF(buffer), beforeTitle, LENGTHOF(beforeTitle), &errorCode); | |
915 | if( U_FAILURE(errorCode) || | |
916 | length!=LENGTHOF(titleWordNoAdjust) || | |
917 | 0!=u_memcmp(buffer, titleWordNoAdjust, length) || | |
918 | buffer[length]!=0 | |
919 | ) { | |
920 | log_err("ucasemap_toTitle(default iterator, no break adjustment)=%ld failed - %s\n", (long)length, u_errorName(errorCode)); | |
921 | } | |
922 | ||
923 | /* Set a sentence break iterator. */ | |
924 | errorCode=U_ZERO_ERROR; | |
925 | sentenceIter=ubrk_open(UBRK_SENTENCE, "", NULL, 0, &errorCode); | |
926 | if(U_FAILURE(errorCode)) { | |
927 | log_err("error: ubrk_open(UBRK_SENTENCE) failed - %s\n", u_errorName(errorCode)); | |
928 | ucasemap_close(csm); | |
929 | return; | |
930 | } | |
931 | ucasemap_setBreakIterator(csm, sentenceIter, &errorCode); | |
932 | if(U_FAILURE(errorCode)) { | |
933 | log_err("error: ucasemap_setBreakIterator(sentence iterator) failed - %s\n", u_errorName(errorCode)); | |
934 | ubrk_close(sentenceIter); | |
935 | ucasemap_close(csm); | |
936 | return; | |
937 | } | |
938 | iter=ucasemap_getBreakIterator(csm); | |
939 | if(iter!=sentenceIter) { | |
940 | log_err("ucasemap_getBreakIterator() returns %p!=%p after setting the iterator\n", iter, sentenceIter); | |
941 | } | |
942 | ||
943 | ucasemap_setOptions(csm, U_TITLECASE_NO_LOWERCASE, &errorCode); | |
944 | if(U_FAILURE(errorCode)) { | |
945 | log_err("error: ucasemap_setOptions(U_TITLECASE_NO_LOWERCASE) failed - %s\n", u_errorName(errorCode)); | |
946 | return; | |
947 | } | |
948 | ||
949 | /* Use the sentence break iterator with the option. Preflight first. */ | |
950 | length=ucasemap_toTitle(csm, NULL, 0, beforeTitle, LENGTHOF(beforeTitle), &errorCode); | |
951 | if( errorCode!=U_BUFFER_OVERFLOW_ERROR || | |
952 | length!=LENGTHOF(titleSentNoLower) | |
953 | ) { | |
954 | log_err("ucasemap_toTitle(preflight sentence break iterator, no lowercasing)=%ld failed - %s\n", (long)length, u_errorName(errorCode)); | |
955 | } | |
956 | ||
957 | errorCode=U_ZERO_ERROR; | |
958 | buffer[0]=0; | |
959 | length=ucasemap_toTitle(csm, buffer, LENGTHOF(buffer), beforeTitle, LENGTHOF(beforeTitle), &errorCode); | |
960 | if( U_FAILURE(errorCode) || | |
961 | length!=LENGTHOF(titleSentNoLower) || | |
962 | 0!=u_memcmp(buffer, titleSentNoLower, length) || | |
963 | buffer[length]!=0 | |
964 | ) { | |
965 | log_err("ucasemap_toTitle(sentence break iterator, no lowercasing)=%ld failed - %s\n", (long)length, u_errorName(errorCode)); | |
966 | } | |
967 | ||
968 | /* UTF-8 C API coverage. More thorough test via C++ intltest's StringCaseTest::TestCasing(). */ | |
969 | { | |
970 | char utf8BeforeTitle[64], utf8TitleSentNoLower[64], utf8[64]; | |
971 | int32_t utf8BeforeTitleLength, utf8TitleSentNoLowerLength; | |
972 | ||
973 | errorCode=U_ZERO_ERROR; | |
974 | u_strToUTF8(utf8BeforeTitle, (int32_t)sizeof(utf8BeforeTitle), &utf8BeforeTitleLength, beforeTitle, LENGTHOF(beforeTitle), &errorCode); | |
975 | u_strToUTF8(utf8TitleSentNoLower, (int32_t)sizeof(utf8TitleSentNoLower), &utf8TitleSentNoLowerLength, titleSentNoLower, LENGTHOF(titleSentNoLower), &errorCode); | |
976 | ||
977 | length=ucasemap_utf8ToTitle(csm, utf8, (int32_t)sizeof(utf8), utf8BeforeTitle, utf8BeforeTitleLength, &errorCode); | |
978 | if( U_FAILURE(errorCode) || | |
979 | length!=utf8TitleSentNoLowerLength || | |
980 | 0!=uprv_memcmp(utf8, utf8TitleSentNoLower, length) || | |
981 | utf8[length]!=0 | |
982 | ) { | |
983 | log_err("ucasemap_utf8ToTitle(sentence break iterator, no lowercasing)=%ld failed - %s\n", (long)length, u_errorName(errorCode)); | |
984 | } | |
985 | } | |
986 | ||
987 | ucasemap_close(csm); | |
988 | } | |
989 | ||
990 | #endif | |
991 | ||
73c04bcf A |
992 | void addCaseTest(TestNode** root); |
993 | ||
994 | void addCaseTest(TestNode** root) { | |
995 | /* cstrcase.c functions, declared in cucdtst.h */ | |
996 | addTest(root, &TestCaseLower, "tsutil/cstrcase/TestCaseLower"); | |
997 | addTest(root, &TestCaseUpper, "tsutil/cstrcase/TestCaseUpper"); | |
729e4ab9 | 998 | #if !UCONFIG_NO_BREAK_ITERATION && !UCONFIG_NO_FILE_IO |
73c04bcf | 999 | addTest(root, &TestCaseTitle, "tsutil/cstrcase/TestCaseTitle"); |
46f4442e | 1000 | addTest(root, &TestCaseDutchTitle, "tsutil/cstrcase/TestCaseDutchTitle"); |
73c04bcf A |
1001 | #endif |
1002 | addTest(root, &TestCaseFolding, "tsutil/cstrcase/TestCaseFolding"); | |
1003 | addTest(root, &TestCaseCompare, "tsutil/cstrcase/TestCaseCompare"); | |
1004 | addTest(root, &TestUCaseMap, "tsutil/cstrcase/TestUCaseMap"); | |
729e4ab9 | 1005 | #if !UCONFIG_NO_BREAK_ITERATION && !UCONFIG_NO_FILE_IO |
46f4442e A |
1006 | addTest(root, &TestUCaseMapToTitle, "tsutil/cstrcase/TestUCaseMapToTitle"); |
1007 | #endif | |
73c04bcf | 1008 | } |