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