cstrcase.c revision b13da9df870a61b11249bf741347908dbea0edd8
1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*******************************************************************************
3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   Copyright (C) 2002-2007, 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)) {
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("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
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* test case folding and case-insensitive string compare -------------------- */
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestCaseFolding(void) {
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * CaseFolding.txt says about i and its cousins:
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *   0049; C; 0069; # LATIN CAPITAL LETTER I
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *   0049; T; 0131; # LATIN CAPITAL LETTER I
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *   0130; F; 0069 0307; # LATIN CAPITAL LETTER I WITH DOT ABOVE
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *   0130; T; 0069; # LATIN CAPITAL LETTER I WITH DOT ABOVE
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * That's all.
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * See CaseFolding.txt and the Unicode Standard for how to apply the case foldings.
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar32
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    simple[]={
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* input, default, exclude special i */
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x61,   0x61,  0x61,
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x49,   0x69,  0x131,
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x130,  0x130, 0x69,
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x131,  0x131, 0x131,
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xdf,   0xdf,  0xdf,
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xfb03, 0xfb03, 0xfb03,
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x1040e,0x10436,0x10436,
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x5ffff,0x5ffff,0x5ffff
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    mixed[]=                { 0x61, 0x42, 0x130,       0x49,  0x131, 0x3d0, 0xdf,       0xfb03,           0xd93f, 0xdfff },
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    foldedDefault[]=        { 0x61, 0x62, 0x69, 0x307, 0x69,  0x131, 0x3b2, 0x73, 0x73, 0x66, 0x66, 0x69, 0xd93f, 0xdfff },
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    foldedExcludeSpecialI[]={ 0x61, 0x62, 0x69,        0x131, 0x131, 0x3b2, 0x73, 0x73, 0x66, 0x66, 0x69, 0xd93f, 0xdfff };
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UVersionInfo unicodeVersion={ 0, 0, 17, 89 }, unicode_3_1={ 3, 1, 0, 0 };
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar32 *p;
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar buffer[32];
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t length;
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool isUnicode_3_1;
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* if unicodeVersion()>=3.1 then test exclude-special-i cases as well */
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_getUnicodeVersion(unicodeVersion);
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    isUnicode_3_1= uprv_memcmp(unicodeVersion, unicode_3_1, 4)>=0;
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test simple case folding */
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    p=simple;
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<sizeof(simple)/12; p+=3, ++i) {
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(u_foldCase(p[0], U_FOLD_CASE_DEFAULT)!=p[1]) {
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error: u_foldCase(0x%04lx, default)=0x%04lx instead of 0x%04lx\n",
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    p[0], u_foldCase(p[0], U_FOLD_CASE_DEFAULT), p[1]);
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(isUnicode_3_1 && u_foldCase(p[0], U_FOLD_CASE_EXCLUDE_SPECIAL_I)!=p[2]) {
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error: u_foldCase(0x%04lx, exclude special i)=0x%04lx instead of 0x%04lx\n",
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    p[0], u_foldCase(p[0], U_FOLD_CASE_EXCLUDE_SPECIAL_I), p[2]);
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test full string case folding with default option and separate buffers */
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[0]=0xabcd;
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_strFoldCase(buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        mixed, sizeof(mixed)/U_SIZEOF_UCHAR,
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        U_FOLD_CASE_DEFAULT,
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        &errorCode);
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( U_FAILURE(errorCode) ||
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length!=(sizeof(foldedDefault)/U_SIZEOF_UCHAR) ||
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uprv_memcmp(foldedDefault, buffer, length*U_SIZEOF_UCHAR)!=0 ||
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        buffer[length]!=0
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ) {
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in u_strFoldCase(default)=%ld error=%s string matches: %s\n",
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            length,
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_errorName(errorCode),
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uprv_memcmp(foldedDefault, buffer, length*U_SIZEOF_UCHAR)==0 && buffer[length]==0 ? "yes" : "no");
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* exclude special i */
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(isUnicode_3_1) {
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        buffer[0]=0xabcd;
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length=u_strFoldCase(buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            mixed, sizeof(mixed)/U_SIZEOF_UCHAR,
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            U_FOLD_CASE_EXCLUDE_SPECIAL_I,
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            &errorCode);
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if( U_FAILURE(errorCode) ||
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            length!=(sizeof(foldedExcludeSpecialI)/U_SIZEOF_UCHAR) ||
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uprv_memcmp(foldedExcludeSpecialI, buffer, length*U_SIZEOF_UCHAR)!=0 ||
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            buffer[length]!=0
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ) {
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error in u_strFoldCase(exclude special i)=%ld error=%s string matches: %s\n",
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                length,
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                u_errorName(errorCode),
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                uprv_memcmp(foldedExcludeSpecialI, buffer, length*U_SIZEOF_UCHAR)==0 && buffer[length]==0 ? "yes" : "no");
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test full string case folding with default option and in the same buffer */
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uprv_memcpy(buffer, mixed, sizeof(mixed));
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[sizeof(mixed)/U_SIZEOF_UCHAR]=0;
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_strFoldCase(buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        buffer, -1, /* implicit srcLength */
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        U_FOLD_CASE_DEFAULT,
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        &errorCode);
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( U_FAILURE(errorCode) ||
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length!=(sizeof(foldedDefault)/U_SIZEOF_UCHAR) ||
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uprv_memcmp(foldedDefault, buffer, length*U_SIZEOF_UCHAR)!=0 ||
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        buffer[length]!=0
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ) {
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in u_strFoldCase(default same buffer)=%ld error=%s string matches: %s\n",
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            length,
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_errorName(errorCode),
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uprv_memcmp(foldedDefault, buffer, length*U_SIZEOF_UCHAR)==0 && buffer[length]==0 ? "yes" : "no");
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test full string case folding, exclude special i, in the same buffer */
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(isUnicode_3_1) {
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uprv_memcpy(buffer, mixed, sizeof(mixed));
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length=u_strFoldCase(buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            buffer, sizeof(mixed)/U_SIZEOF_UCHAR,
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            U_FOLD_CASE_EXCLUDE_SPECIAL_I,
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            &errorCode);
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if( U_FAILURE(errorCode) ||
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            length!=(sizeof(foldedExcludeSpecialI)/U_SIZEOF_UCHAR) ||
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uprv_memcmp(foldedExcludeSpecialI, buffer, length*U_SIZEOF_UCHAR)!=0 ||
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            buffer[length]!=0
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ) {
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error in u_strFoldCase(exclude special i same buffer)=%ld error=%s string matches: %s\n",
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                length,
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                u_errorName(errorCode),
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                uprv_memcmp(foldedExcludeSpecialI, buffer, length*U_SIZEOF_UCHAR)==0 && buffer[length]==0 ? "yes" : "no");
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test preflighting */
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[0]=buffer[2]=0xabcd;
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_strFoldCase(buffer, 2, /* set destCapacity=2 */
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        mixed, sizeof(mixed)/U_SIZEOF_UCHAR,
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        U_FOLD_CASE_DEFAULT,
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        &errorCode);
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( errorCode!=U_BUFFER_OVERFLOW_ERROR ||
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length!=(sizeof(foldedDefault)/U_SIZEOF_UCHAR) ||
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uprv_memcmp(foldedDefault, buffer, 2*U_SIZEOF_UCHAR)!=0 ||
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        buffer[2]!=0xabcd
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ) {
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in u_strFoldCase(default preflighting)=%ld error=%s string matches: %s\n",
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            length,
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_errorName(errorCode),
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uprv_memcmp(foldedDefault, buffer, 2*U_SIZEOF_UCHAR)==0 && buffer[2]==0xabcd ? "yes" : "no");
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_strFoldCase(NULL, 0,
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        mixed, sizeof(mixed)/U_SIZEOF_UCHAR,
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        U_FOLD_CASE_DEFAULT,
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        &errorCode);
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( errorCode!=U_BUFFER_OVERFLOW_ERROR ||
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length!=(sizeof(foldedDefault)/U_SIZEOF_UCHAR)
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ) {
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in u_strFoldCase(default pure preflighting)=%ld error=%s\n",
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            length,
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_errorName(errorCode));
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test error handling */
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_strFoldCase(NULL, sizeof(buffer)/U_SIZEOF_UCHAR,
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        mixed, sizeof(mixed)/U_SIZEOF_UCHAR,
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        U_FOLD_CASE_DEFAULT,
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        &errorCode);
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in u_strFoldCase(default dest=NULL)=%ld error=%s\n",
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            length,
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_errorName(errorCode));
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[0]=0xabcd;
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_strFoldCase(buffer, -1,
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        mixed, sizeof(mixed)/U_SIZEOF_UCHAR,
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        U_FOLD_CASE_DEFAULT,
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        &errorCode);
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( errorCode!=U_ILLEGAL_ARGUMENT_ERROR ||
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        buffer[0]!=0xabcd
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ) {
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in u_strFoldCase(default destCapacity=-1)=%ld error=%s buffer[0]==0x%lx\n",
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            length,
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_errorName(errorCode),
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            buffer[0]);
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[0]=0xabcd;
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_strFoldCase(buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        NULL, sizeof(mixed)/U_SIZEOF_UCHAR,
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        U_FOLD_CASE_EXCLUDE_SPECIAL_I,
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        &errorCode);
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( errorCode!=U_ILLEGAL_ARGUMENT_ERROR ||
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        buffer[0]!=0xabcd
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ) {
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in u_strFoldCase(exclude special i src=NULL)=%ld error=%s buffer[0]==0x%lx\n",
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            length,
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_errorName(errorCode),
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            buffer[0]);
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[0]=0xabcd;
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_strFoldCase(buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        mixed, -2,
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        U_FOLD_CASE_EXCLUDE_SPECIAL_I,
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        &errorCode);
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( errorCode!=U_ILLEGAL_ARGUMENT_ERROR ||
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        buffer[0]!=0xabcd
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ) {
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in u_strFoldCase(exclude special i srcLength=-2)=%ld error=%s buffer[0]==0x%lx\n",
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            length,
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_errorName(errorCode),
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            buffer[0]);
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestCaseCompare(void) {
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    mixed[]=               { 0x61, 0x42, 0x131, 0x3a3, 0xdf,       0xfb03,           0xd93f, 0xdfff, 0 },
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    otherDefault[]=        { 0x41, 0x62, 0x131, 0x3c3, 0x73, 0x53, 0x46, 0x66, 0x49, 0xd93f, 0xdfff, 0 },
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    otherExcludeSpecialI[]={ 0x41, 0x62, 0x131, 0x3c3, 0x53, 0x73, 0x66, 0x46, 0x69, 0xd93f, 0xdfff, 0 },
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    different[]=           { 0x41, 0x62, 0x131, 0x3c3, 0x73, 0x53, 0x46, 0x66, 0x49, 0xd93f, 0xdffd, 0 };
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UVersionInfo unicodeVersion={ 0, 0, 17, 89 }, unicode_3_1={ 3, 1, 0, 0 };
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t result, lenMixed, lenOtherDefault, lenOtherExcludeSpecialI, lenDifferent;
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool isUnicode_3_1;
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    lenMixed=u_strlen(mixed);
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    lenOtherDefault=u_strlen(otherDefault);
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    lenOtherExcludeSpecialI=u_strlen(otherExcludeSpecialI);
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    lenDifferent=u_strlen(different);
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* if unicodeVersion()>=3.1 then test exclude-special-i cases as well */
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_getUnicodeVersion(unicodeVersion);
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    isUnicode_3_1= uprv_memcmp(unicodeVersion, unicode_3_1, 4)>=0;
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test u_strcasecmp() */
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result=u_strcasecmp(mixed, otherDefault, U_FOLD_CASE_DEFAULT);
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(result!=0) {
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error: u_strcasecmp(mixed, other, default)=%ld instead of 0\n", result);
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result=u_strCaseCompare(mixed, -1, otherDefault, -1, U_FOLD_CASE_DEFAULT, &errorCode);
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(result!=0) {
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error: u_strCaseCompare(mixed, other, default)=%ld instead of 0\n", result);
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test u_strcasecmp() - exclude special i */
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result=u_strcasecmp(mixed, otherExcludeSpecialI, U_FOLD_CASE_EXCLUDE_SPECIAL_I);
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(result!=0) {
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error: u_strcasecmp(mixed, other, exclude special i)=%ld instead of 0\n", result);
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result=u_strCaseCompare(mixed, lenMixed, otherExcludeSpecialI, lenOtherExcludeSpecialI, U_FOLD_CASE_EXCLUDE_SPECIAL_I, &errorCode);
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(result!=0) {
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error: u_strCaseCompare(mixed, other, exclude special i)=%ld instead of 0\n", result);
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test u_strcasecmp() */
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result=u_strcasecmp(mixed, different, U_FOLD_CASE_DEFAULT);
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(result<=0) {
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error: u_strcasecmp(mixed, different, default)=%ld instead of positive\n", result);
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result=u_strCaseCompare(mixed, -1, different, lenDifferent, U_FOLD_CASE_DEFAULT, &errorCode);
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(result<=0) {
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error: u_strCaseCompare(mixed, different, default)=%ld instead of positive\n", result);
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test u_strncasecmp() - stop before the sharp s (U+00df) */
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result=u_strncasecmp(mixed, different, 4, U_FOLD_CASE_DEFAULT);
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(result!=0) {
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error: u_strncasecmp(mixed, different, 4, default)=%ld instead of 0\n", result);
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result=u_strCaseCompare(mixed, 4, different, 4, U_FOLD_CASE_DEFAULT, &errorCode);
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(result!=0) {
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error: u_strCaseCompare(mixed, 4, different, 4, default)=%ld instead of 0\n", result);
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test u_strncasecmp() - stop in the middle of the sharp s (U+00df) */
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result=u_strncasecmp(mixed, different, 5, U_FOLD_CASE_DEFAULT);
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(result<=0) {
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error: u_strncasecmp(mixed, different, 5, default)=%ld instead of positive\n", result);
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result=u_strCaseCompare(mixed, 5, different, 5, U_FOLD_CASE_DEFAULT, &errorCode);
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(result<=0) {
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error: u_strCaseCompare(mixed, 5, different, 5, default)=%ld instead of positive\n", result);
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test u_memcasecmp() - stop before the sharp s (U+00df) */
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result=u_memcasecmp(mixed, different, 4, U_FOLD_CASE_DEFAULT);
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(result!=0) {
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error: u_memcasecmp(mixed, different, 4, default)=%ld instead of 0\n", result);
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test u_memcasecmp() - stop in the middle of the sharp s (U+00df) */
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result=u_memcasecmp(mixed, different, 5, U_FOLD_CASE_DEFAULT);
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(result<=0) {
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error: u_memcasecmp(mixed, different, 5, default)=%ld instead of positive\n", result);
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* test UCaseMap ------------------------------------------------------------ */
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * API test for UCaseMap;
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * test cases for actual case mappings using UCaseMap see
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * intltest utility/UnicodeStringTest/StringCaseTest/TestCasing
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestUCaseMap(void) {
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        aBc[] ={ 0x61, 0x42, 0x63, 0 },
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        abc[] ={ 0x61, 0x62, 0x63, 0 },
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ABCg[]={ 0x41, 0x42, 0x43, 0x67, 0 },
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        defg[]={ 0x64, 0x65, 0x66, 0x67, 0 };
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char utf8Out[8];
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCaseMap *csm;
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *locale;
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t options;
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t length;
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    csm=ucasemap_open("tur", 0xa5, &errorCode);
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucasemap_open(\"tur\") failed - %s\n", u_errorName(errorCode));
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    locale=ucasemap_getLocale(csm);
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(0!=strcmp(locale, "tr")) {
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucasemap_getLocale(ucasemap_open(\"tur\"))==%s!=\"tr\"\n", locale);
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* overly long locale IDs get truncated to their language code to avoid unnecessary allocation */
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucasemap_setLocale(csm, "I-kLInGOn-the-quick-brown-fox-jumps-over-the-lazy-dog", &errorCode);
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    locale=ucasemap_getLocale(csm);
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(0!=strcmp(locale, "i-klingon")) {
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucasemap_getLocale(ucasemap_setLocale(\"I-kLInGOn-the-quick-br...\"))==%s!=\"i-klingon\"\n", locale);
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    options=ucasemap_getOptions(csm);
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(options!=0xa5) {
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucasemap_getOptions(ucasemap_open(0xa5))==0x%lx!=0xa5\n", (long)options);
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucasemap_setOptions(csm, 0x333333, &errorCode);
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    options=ucasemap_getOptions(csm);
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(options!=0x333333) {
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucasemap_getOptions(ucasemap_setOptions(0x333333))==0x%lx!=0x333333\n", (long)options);
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test case mapping API; not all permutations necessary due to shared implementation code */
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* NUL terminated source */
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=ucasemap_utf8ToLower(csm, utf8Out, (int32_t)sizeof(utf8Out), aBc, -1, &errorCode);
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=3 || 0!=strcmp(abc, utf8Out)) {
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucasemap_utf8ToLower(aBc\\0) failed\n");
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* incoming failure code */
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_PARSE_ERROR;
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcpy(utf8Out, defg);
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=ucasemap_utf8ToLower(csm, utf8Out, (int32_t)sizeof(utf8Out), aBc, -1, &errorCode);
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_PARSE_ERROR || 0!=strcmp(defg, utf8Out)) {
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucasemap_utf8ToLower(failure) failed\n");
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* overlapping input & output */
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcpy(utf8Out, aBc);
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=ucasemap_utf8ToUpper(csm, utf8Out, 2, utf8Out+1, 2, &errorCode);
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || 0!=strcmp(aBc, utf8Out)) {
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucasemap_utf8ToUpper(overlap 1) failed\n");
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* overlap in the other direction */
726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcpy(utf8Out, aBc);
728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=ucasemap_utf8ToUpper(csm, utf8Out+1, 2, utf8Out, 2, &errorCode);
729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || 0!=strcmp(aBc, utf8Out)) {
730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucasemap_utf8ToUpper(overlap 2) failed\n");
731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* NULL destination */
734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcpy(utf8Out, defg);
736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=ucasemap_utf8ToLower(csm, NULL, (int32_t)sizeof(utf8Out), aBc, -1, &errorCode);
737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || 0!=strcmp(defg, utf8Out)) {
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucasemap_utf8ToLower(dest=NULL) failed\n");
739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* destCapacity<0 */
742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcpy(utf8Out, defg);
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=ucasemap_utf8ToLower(csm, utf8Out, -2, aBc, -1, &errorCode);
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || 0!=strcmp(defg, utf8Out)) {
746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucasemap_utf8ToLower(destCapacity<0) failed\n");
747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* NULL source */
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcpy(utf8Out, defg);
752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=ucasemap_utf8ToLower(csm, utf8Out, (int32_t)sizeof(utf8Out), NULL, -1, &errorCode);
753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || 0!=strcmp(defg, utf8Out)) {
754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucasemap_utf8ToLower(src=NULL) failed\n");
755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* srcLength<-1 */
758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcpy(utf8Out, defg);
760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=ucasemap_utf8ToLower(csm, utf8Out, (int32_t)sizeof(utf8Out), aBc, -2, &errorCode);
761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || 0!=strcmp(defg, utf8Out)) {
762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucasemap_utf8ToLower(srcLength<-1) failed\n");
763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* buffer overflow */
766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcpy(utf8Out, defg);
768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=ucasemap_utf8ToUpper(csm, utf8Out, 2, aBc, 3, &errorCode);
769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=3 || 0!=strcmp(defg+2, utf8Out+2)) {
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucasemap_utf8ToUpper(overflow) failed\n");
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* dest not terminated (leaves g from defg alone) */
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcpy(utf8Out, defg);
776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=ucasemap_utf8ToUpper(csm, utf8Out, 3, aBc, 3, &errorCode);
777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_STRING_NOT_TERMINATED_WARNING || length!=3 || 0!=strcmp(ABCg, utf8Out)) {
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucasemap_utf8ToUpper(overflow) failed\n");
779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* C API coverage for case folding. More thorough test via C++ intltest's StringCaseTest::TestCasing(). */
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    utf8Out[0]=0;
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=ucasemap_utf8FoldCase(csm, utf8Out, (int32_t)sizeof(utf8Out), aBc, 3, &errorCode);
785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=3 || 0!=strcmp(abc, utf8Out)) {
786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucasemap_utf8FoldCase(aBc) failed\n");
787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucasemap_close(csm);
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Try titlecasing with options. */
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestUCaseMapToTitle(void) {
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* "a 'CaT. A 'dOg! 'eTc." where '=U+02BB */
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Note: The sentence BreakIterator does not recognize a '.'
800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * as a sentence terminator if it is followed by lowercase.
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * That is why the example has the '!'.
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar
804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    beforeTitle[]=      { 0x61, 0x20, 0x2bb, 0x43, 0x61, 0x54, 0x2e, 0x20, 0x41, 0x20, 0x2bb, 0x64, 0x4f, 0x67, 0x21, 0x20, 0x2bb, 0x65, 0x54, 0x63, 0x2e },
806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    titleWord[]=        { 0x41, 0x20, 0x2bb, 0x43, 0x61, 0x74, 0x2e, 0x20, 0x41, 0x20, 0x2bb, 0x44, 0x6f, 0x67, 0x21, 0x20, 0x2bb, 0x45, 0x74, 0x63, 0x2e },
807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    titleWordNoAdjust[]={ 0x41, 0x20, 0x2bb, 0x63, 0x61, 0x74, 0x2e, 0x20, 0x41, 0x20, 0x2bb, 0x64, 0x6f, 0x67, 0x21, 0x20, 0x2bb, 0x65, 0x74, 0x63, 0x2e },
808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    titleSentNoLower[]= { 0x41, 0x20, 0x2bb, 0x43, 0x61, 0x54, 0x2e, 0x20, 0x41, 0x20, 0x2bb, 0x64, 0x4f, 0x67, 0x21, 0x20, 0x2bb, 0x45, 0x54, 0x63, 0x2e };
809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar buffer[32];
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCaseMap *csm;
812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBreakIterator *sentenceIter;
813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UBreakIterator *iter;
814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t length;
815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    csm=ucasemap_open("", 0, &errorCode);
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucasemap_open(\"\") failed - %s\n", u_errorName(errorCode));
821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter=ucasemap_getBreakIterator(csm);
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(iter!=NULL) {
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucasemap_getBreakIterator() returns %p!=NULL before setting any iterator or titlecasing\n", iter);
827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Use default UBreakIterator: Word breaks. */
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=ucasemap_toTitle(csm, buffer, LENGTHOF(buffer), beforeTitle, LENGTHOF(beforeTitle), &errorCode);
831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( U_FAILURE(errorCode) ||
832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length!=LENGTHOF(titleWord) ||
833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0!=u_memcmp(buffer, titleWord, length) ||
834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        buffer[length]!=0
835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ) {
836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucasemap_toTitle(default iterator)=%ld failed - %s\n", (long)length, u_errorName(errorCode));
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter=ucasemap_getBreakIterator(csm);
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(iter==NULL) {
841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucasemap_getBreakIterator() returns NULL after titlecasing\n");
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Try U_TITLECASE_NO_BREAK_ADJUSTMENT. */
845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucasemap_setOptions(csm, U_TITLECASE_NO_BREAK_ADJUSTMENT, &errorCode);
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error: ucasemap_setOptions(U_TITLECASE_NO_BREAK_ADJUSTMENT) failed - %s\n", u_errorName(errorCode));
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=ucasemap_toTitle(csm, buffer, LENGTHOF(buffer), beforeTitle, LENGTHOF(beforeTitle), &errorCode);
852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( U_FAILURE(errorCode) ||
853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length!=LENGTHOF(titleWordNoAdjust) ||
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0!=u_memcmp(buffer, titleWordNoAdjust, length) ||
855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        buffer[length]!=0
856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ) {
857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucasemap_toTitle(default iterator, no break adjustment)=%ld failed - %s\n", (long)length, u_errorName(errorCode));
858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Set a sentence break iterator. */
861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sentenceIter=ubrk_open(UBRK_SENTENCE, "", NULL, 0, &errorCode);
863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error: ubrk_open(UBRK_SENTENCE) failed - %s\n", u_errorName(errorCode));
865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucasemap_close(csm);
866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucasemap_setBreakIterator(csm, sentenceIter, &errorCode);
869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error: ucasemap_setBreakIterator(sentence iterator) failed - %s\n", u_errorName(errorCode));
871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubrk_close(sentenceIter);
872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucasemap_close(csm);
873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter=ucasemap_getBreakIterator(csm);
876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(iter!=sentenceIter) {
877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucasemap_getBreakIterator() returns %p!=%p after setting the iterator\n", iter, sentenceIter);
878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucasemap_setOptions(csm, U_TITLECASE_NO_LOWERCASE, &errorCode);
881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error: ucasemap_setOptions(U_TITLECASE_NO_LOWERCASE) failed - %s\n", u_errorName(errorCode));
883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Use the sentence break iterator with the option. Preflight first. */
887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=ucasemap_toTitle(csm, NULL, 0, beforeTitle, LENGTHOF(beforeTitle), &errorCode);
888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( errorCode!=U_BUFFER_OVERFLOW_ERROR ||
889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length!=LENGTHOF(titleSentNoLower)
890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ) {
891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucasemap_toTitle(preflight sentence break iterator, no lowercasing)=%ld failed - %s\n", (long)length, u_errorName(errorCode));
892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[0]=0;
896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=ucasemap_toTitle(csm, buffer, LENGTHOF(buffer), beforeTitle, LENGTHOF(beforeTitle), &errorCode);
897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( U_FAILURE(errorCode) ||
898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length!=LENGTHOF(titleSentNoLower) ||
899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0!=u_memcmp(buffer, titleSentNoLower, length) ||
900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        buffer[length]!=0
901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ) {
902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucasemap_toTitle(sentence break iterator, no lowercasing)=%ld failed - %s\n", (long)length, u_errorName(errorCode));
903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* UTF-8 C API coverage. More thorough test via C++ intltest's StringCaseTest::TestCasing(). */
906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char utf8BeforeTitle[64], utf8TitleSentNoLower[64], utf8[64];
908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t utf8BeforeTitleLength, utf8TitleSentNoLowerLength;
909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strToUTF8(utf8BeforeTitle, (int32_t)sizeof(utf8BeforeTitle), &utf8BeforeTitleLength, beforeTitle, LENGTHOF(beforeTitle), &errorCode);
912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strToUTF8(utf8TitleSentNoLower, (int32_t)sizeof(utf8TitleSentNoLower), &utf8TitleSentNoLowerLength, titleSentNoLower, LENGTHOF(titleSentNoLower), &errorCode);
913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length=ucasemap_utf8ToTitle(csm, utf8, (int32_t)sizeof(utf8), utf8BeforeTitle, utf8BeforeTitleLength, &errorCode);
915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if( U_FAILURE(errorCode) ||
916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            length!=utf8TitleSentNoLowerLength ||
917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            0!=uprv_memcmp(utf8, utf8TitleSentNoLower, length) ||
918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            utf8[length]!=0
919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ) {
920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ucasemap_utf8ToTitle(sentence break iterator, no lowercasing)=%ld failed - %s\n", (long)length, u_errorName(errorCode));
921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucasemap_close(csm);
925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addCaseTest(TestNode** root);
930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addCaseTest(TestNode** root) {
932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* cstrcase.c functions, declared in cucdtst.h */
933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestCaseLower, "tsutil/cstrcase/TestCaseLower");
934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestCaseUpper, "tsutil/cstrcase/TestCaseUpper");
935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestCaseTitle, "tsutil/cstrcase/TestCaseTitle");
937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestCaseFolding, "tsutil/cstrcase/TestCaseFolding");
939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestCaseCompare, "tsutil/cstrcase/TestCaseCompare");
940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestUCaseMap, "tsutil/cstrcase/TestUCaseMap");
941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestUCaseMapToTitle, "tsutil/cstrcase/TestUCaseMapToTitle");
943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
945