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