2002-02-21 18:43:36 +00:00
|
|
|
/*
|
|
|
|
*******************************************************************************
|
|
|
|
*
|
2002-03-13 19:22:05 +00:00
|
|
|
* Copyright (C) 2002, International Business Machines
|
2002-02-21 18:43:36 +00:00
|
|
|
* Corporation and others. All Rights Reserved.
|
|
|
|
*
|
|
|
|
*******************************************************************************
|
|
|
|
* file name: cstrcase.c
|
|
|
|
* encoding: US-ASCII
|
|
|
|
* tab size: 8 (not used)
|
|
|
|
* indentation:4
|
|
|
|
*
|
|
|
|
* created on: 2002feb21
|
|
|
|
* created by: Markus W. Scherer
|
|
|
|
*
|
|
|
|
* Test file for string casing C API functions.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "unicode/utypes.h"
|
|
|
|
#include "unicode/uchar.h"
|
|
|
|
#include "unicode/ustring.h"
|
|
|
|
#include "unicode/uloc.h"
|
|
|
|
#include "unicode/ubrk.h"
|
|
|
|
#include "cmemory.h"
|
|
|
|
#include "cintltst.h"
|
|
|
|
#include "cucdtst.h"
|
|
|
|
|
|
|
|
/* test string case mapping functions --------------------------------------- */
|
|
|
|
|
|
|
|
U_CFUNC void
|
|
|
|
TestCaseLower() {
|
|
|
|
static const UChar
|
|
|
|
|
|
|
|
beforeLower[]= { 0x61, 0x42, 0x49, 0x3a3, 0xdf, 0x3a3, 0x2f, 0xd93f, 0xdfff },
|
|
|
|
lowerRoot[]= { 0x61, 0x62, 0x69, 0x3c3, 0xdf, 0x3c2, 0x2f, 0xd93f, 0xdfff },
|
|
|
|
lowerTurkish[]={ 0x61, 0x62, 0x131, 0x3c3, 0xdf, 0x3c2, 0x2f, 0xd93f, 0xdfff };
|
|
|
|
|
|
|
|
UChar buffer[32];
|
|
|
|
int32_t length;
|
|
|
|
UErrorCode errorCode;
|
|
|
|
|
|
|
|
/* lowercase with root locale and separate buffers */
|
|
|
|
buffer[0]=0xabcd;
|
|
|
|
errorCode=U_ZERO_ERROR;
|
|
|
|
length=u_strToLower(buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
|
|
|
|
beforeLower, sizeof(beforeLower)/U_SIZEOF_UCHAR,
|
|
|
|
"",
|
|
|
|
&errorCode);
|
|
|
|
if( U_FAILURE(errorCode) ||
|
|
|
|
length!=(sizeof(lowerRoot)/U_SIZEOF_UCHAR) ||
|
|
|
|
uprv_memcmp(lowerRoot, buffer, length*U_SIZEOF_UCHAR)!=0 ||
|
|
|
|
buffer[length]!=0
|
|
|
|
) {
|
2002-04-02 03:15:12 +00:00
|
|
|
log_err("error in u_strToLower(root locale)=%ld error=%s string matches: %s\t\nlowerRoot=%s\t\nbuffer=%s\n",
|
2002-02-21 18:43:36 +00:00
|
|
|
length,
|
|
|
|
u_errorName(errorCode),
|
2002-04-02 03:15:12 +00:00
|
|
|
uprv_memcmp(lowerRoot, buffer, length*U_SIZEOF_UCHAR)==0 &&
|
|
|
|
buffer[length]==0 ? "yes" : "no",
|
2002-04-02 03:36:54 +00:00
|
|
|
aescstrdup(lowerRoot,-1),
|
|
|
|
aescstrdup(buffer,-1));
|
2002-02-21 18:43:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* lowercase with turkish locale and in the same buffer */
|
|
|
|
uprv_memcpy(buffer, beforeLower, sizeof(beforeLower));
|
|
|
|
buffer[sizeof(beforeLower)/U_SIZEOF_UCHAR]=0;
|
|
|
|
errorCode=U_ZERO_ERROR;
|
|
|
|
length=u_strToLower(buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
|
|
|
|
buffer, -1, /* implicit srcLength */
|
|
|
|
"tr",
|
|
|
|
&errorCode);
|
|
|
|
if( U_FAILURE(errorCode) ||
|
|
|
|
length!=(sizeof(lowerTurkish)/U_SIZEOF_UCHAR) ||
|
|
|
|
uprv_memcmp(lowerTurkish, buffer, length*U_SIZEOF_UCHAR)!=0 ||
|
|
|
|
buffer[length]!=0
|
|
|
|
) {
|
|
|
|
log_err("error in u_strToLower(turkish locale)=%ld error=%s string matches: %s\n",
|
|
|
|
length,
|
|
|
|
u_errorName(errorCode),
|
|
|
|
uprv_memcmp(lowerTurkish, buffer, length*U_SIZEOF_UCHAR)==0 && buffer[length]==0 ? "yes" : "no");
|
|
|
|
}
|
|
|
|
|
|
|
|
/* test preflighting */
|
|
|
|
buffer[0]=buffer[2]=0xabcd;
|
|
|
|
errorCode=U_ZERO_ERROR;
|
|
|
|
length=u_strToLower(buffer, 2, /* set destCapacity=2 */
|
|
|
|
beforeLower, sizeof(beforeLower)/U_SIZEOF_UCHAR,
|
|
|
|
"",
|
|
|
|
&errorCode);
|
|
|
|
if( errorCode!=U_BUFFER_OVERFLOW_ERROR ||
|
|
|
|
length!=(sizeof(lowerRoot)/U_SIZEOF_UCHAR) ||
|
|
|
|
uprv_memcmp(lowerRoot, buffer, 2*U_SIZEOF_UCHAR)!=0 ||
|
|
|
|
buffer[2]!=0xabcd
|
|
|
|
) {
|
|
|
|
log_err("error in u_strToLower(root locale preflighting)=%ld error=%s string matches: %s\n",
|
|
|
|
length,
|
|
|
|
u_errorName(errorCode),
|
|
|
|
uprv_memcmp(lowerRoot, buffer, 2*U_SIZEOF_UCHAR)==0 && buffer[2]==0xabcd ? "yes" : "no");
|
|
|
|
}
|
|
|
|
|
|
|
|
/* test error handling */
|
|
|
|
errorCode=U_ZERO_ERROR;
|
|
|
|
length=u_strToLower(NULL, sizeof(buffer)/U_SIZEOF_UCHAR,
|
|
|
|
beforeLower, sizeof(beforeLower)/U_SIZEOF_UCHAR,
|
|
|
|
"",
|
|
|
|
&errorCode);
|
|
|
|
if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
|
|
|
|
log_err("error in u_strToLower(root locale dest=NULL)=%ld error=%s\n",
|
|
|
|
length,
|
|
|
|
u_errorName(errorCode));
|
|
|
|
}
|
|
|
|
|
|
|
|
buffer[0]=0xabcd;
|
|
|
|
errorCode=U_ZERO_ERROR;
|
|
|
|
length=u_strToLower(buffer, -1,
|
|
|
|
beforeLower, sizeof(beforeLower)/U_SIZEOF_UCHAR,
|
|
|
|
"",
|
|
|
|
&errorCode);
|
|
|
|
if( errorCode!=U_ILLEGAL_ARGUMENT_ERROR ||
|
|
|
|
buffer[0]!=0xabcd
|
|
|
|
) {
|
|
|
|
log_err("error in u_strToLower(root locale destCapacity=-1)=%ld error=%s buffer[0]==0x%lx\n",
|
|
|
|
length,
|
|
|
|
u_errorName(errorCode),
|
|
|
|
buffer[0]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
U_CFUNC void
|
|
|
|
TestCaseUpper() {
|
|
|
|
static const UChar
|
|
|
|
|
|
|
|
beforeUpper[]= { 0x61, 0x42, 0x69, 0x3c2, 0xdf, 0x3c3, 0x2f, 0xfb03, 0xd93f, 0xdfff },
|
|
|
|
upperRoot[]= { 0x41, 0x42, 0x49, 0x3a3, 0x53, 0x53, 0x3a3, 0x2f, 0x46, 0x46, 0x49, 0xd93f, 0xdfff },
|
|
|
|
upperTurkish[]={ 0x41, 0x42, 0x130, 0x3a3, 0x53, 0x53, 0x3a3, 0x2f, 0x46, 0x46, 0x49, 0xd93f, 0xdfff };
|
|
|
|
|
|
|
|
UChar buffer[32];
|
|
|
|
int32_t length;
|
|
|
|
UErrorCode errorCode;
|
|
|
|
|
|
|
|
/* uppercase with root locale and in the same buffer */
|
|
|
|
uprv_memcpy(buffer, beforeUpper, sizeof(beforeUpper));
|
|
|
|
errorCode=U_ZERO_ERROR;
|
|
|
|
length=u_strToUpper(buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
|
|
|
|
buffer, sizeof(beforeUpper)/U_SIZEOF_UCHAR,
|
|
|
|
"",
|
|
|
|
&errorCode);
|
|
|
|
if( U_FAILURE(errorCode) ||
|
|
|
|
length!=(sizeof(upperRoot)/U_SIZEOF_UCHAR) ||
|
|
|
|
uprv_memcmp(upperRoot, buffer, length*U_SIZEOF_UCHAR)!=0 ||
|
|
|
|
buffer[length]!=0
|
|
|
|
) {
|
|
|
|
log_err("error in u_strToUpper(root locale)=%ld error=%s string matches: %s\n",
|
|
|
|
length,
|
|
|
|
u_errorName(errorCode),
|
|
|
|
uprv_memcmp(upperRoot, buffer, length*U_SIZEOF_UCHAR)==0 && buffer[length]==0 ? "yes" : "no");
|
|
|
|
}
|
|
|
|
|
|
|
|
/* uppercase with turkish locale and separate buffers */
|
|
|
|
buffer[0]=0xabcd;
|
|
|
|
errorCode=U_ZERO_ERROR;
|
|
|
|
length=u_strToUpper(buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
|
|
|
|
beforeUpper, sizeof(beforeUpper)/U_SIZEOF_UCHAR,
|
|
|
|
"tr",
|
|
|
|
&errorCode);
|
|
|
|
if( U_FAILURE(errorCode) ||
|
|
|
|
length!=(sizeof(upperTurkish)/U_SIZEOF_UCHAR) ||
|
|
|
|
uprv_memcmp(upperTurkish, buffer, length*U_SIZEOF_UCHAR)!=0 ||
|
|
|
|
buffer[length]!=0
|
|
|
|
) {
|
|
|
|
log_err("error in u_strToUpper(turkish locale)=%ld error=%s string matches: %s\n",
|
|
|
|
length,
|
|
|
|
u_errorName(errorCode),
|
|
|
|
uprv_memcmp(upperTurkish, buffer, length*U_SIZEOF_UCHAR)==0 && buffer[length]==0 ? "yes" : "no");
|
|
|
|
}
|
|
|
|
|
|
|
|
/* test preflighting */
|
|
|
|
errorCode=U_ZERO_ERROR;
|
|
|
|
length=u_strToUpper(NULL, 0,
|
|
|
|
beforeUpper, sizeof(beforeUpper)/U_SIZEOF_UCHAR,
|
|
|
|
"tr",
|
|
|
|
&errorCode);
|
|
|
|
if( errorCode!=U_BUFFER_OVERFLOW_ERROR ||
|
|
|
|
length!=(sizeof(upperTurkish)/U_SIZEOF_UCHAR)
|
|
|
|
) {
|
|
|
|
log_err("error in u_strToUpper(turkish locale pure preflighting)=%ld error=%s\n",
|
|
|
|
length,
|
|
|
|
u_errorName(errorCode));
|
|
|
|
}
|
|
|
|
|
|
|
|
/* test error handling */
|
|
|
|
buffer[0]=0xabcd;
|
|
|
|
errorCode=U_ZERO_ERROR;
|
|
|
|
length=u_strToUpper(buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
|
|
|
|
NULL, sizeof(beforeUpper)/U_SIZEOF_UCHAR,
|
|
|
|
"tr",
|
|
|
|
&errorCode);
|
|
|
|
if( errorCode!=U_ILLEGAL_ARGUMENT_ERROR ||
|
|
|
|
buffer[0]!=0xabcd
|
|
|
|
) {
|
|
|
|
log_err("error in u_strToUpper(turkish locale src=NULL)=%ld error=%s buffer[0]==0x%lx\n",
|
|
|
|
length,
|
|
|
|
u_errorName(errorCode),
|
|
|
|
buffer[0]);
|
|
|
|
}
|
|
|
|
|
|
|
|
buffer[0]=0xabcd;
|
|
|
|
errorCode=U_ZERO_ERROR;
|
|
|
|
length=u_strToUpper(buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
|
|
|
|
beforeUpper, -2,
|
|
|
|
"tr",
|
|
|
|
&errorCode);
|
|
|
|
if( errorCode!=U_ILLEGAL_ARGUMENT_ERROR ||
|
|
|
|
buffer[0]!=0xabcd
|
|
|
|
) {
|
|
|
|
log_err("error in u_strToUpper(turkish locale srcLength=-2)=%ld error=%s buffer[0]==0x%lx\n",
|
|
|
|
length,
|
|
|
|
u_errorName(errorCode),
|
|
|
|
buffer[0]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
U_CFUNC void
|
|
|
|
TestCaseTitle() {
|
|
|
|
static const UChar
|
|
|
|
|
|
|
|
beforeTitle[]= { 0x61, 0x42, 0x20, 0x69, 0x3c2, 0x20, 0xdf, 0x3c3, 0x2f, 0xfb03, 0xd93f, 0xdfff },
|
|
|
|
titleWord[]= { 0x41, 0x62, 0x20, 0x49, 0x3c2, 0x20, 0x53, 0x73, 0x3c3, 0x2f, 0x46, 0x66, 0x69, 0xd93f, 0xdfff },
|
|
|
|
titleChar[]= { 0x41, 0x42, 0x20, 0x49, 0x3a3, 0x20, 0x53, 0x73, 0x3a3, 0x2f, 0x46, 0x66, 0x69, 0xd93f, 0xdfff };
|
|
|
|
|
|
|
|
UChar buffer[32];
|
|
|
|
UBreakIterator *titleIterChars;
|
|
|
|
int32_t length;
|
|
|
|
UErrorCode errorCode;
|
|
|
|
|
|
|
|
errorCode=U_ZERO_ERROR;
|
|
|
|
titleIterChars=ubrk_open(UBRK_CHARACTER, "", beforeTitle, sizeof(beforeTitle)/U_SIZEOF_UCHAR, &errorCode);
|
|
|
|
if(U_FAILURE(errorCode)) {
|
|
|
|
log_err("error: ubrk_open(UBRK_CHARACTER)->%s\n", u_errorName(errorCode));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* titlecase with standard break iterator and in the same buffer */
|
|
|
|
uprv_memcpy(buffer, beforeTitle, sizeof(beforeTitle));
|
|
|
|
errorCode=U_ZERO_ERROR;
|
|
|
|
length=u_strToTitle(buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
|
|
|
|
buffer, sizeof(beforeTitle)/U_SIZEOF_UCHAR,
|
|
|
|
NULL, "",
|
|
|
|
&errorCode);
|
|
|
|
if( U_FAILURE(errorCode) ||
|
|
|
|
length!=(sizeof(titleWord)/U_SIZEOF_UCHAR) ||
|
|
|
|
uprv_memcmp(titleWord, buffer, length*U_SIZEOF_UCHAR)!=0 ||
|
|
|
|
buffer[length]!=0
|
|
|
|
) {
|
|
|
|
log_err("error in u_strToTitle(standard iterator)=%ld error=%s string matches: %s\n",
|
|
|
|
length,
|
|
|
|
u_errorName(errorCode),
|
|
|
|
uprv_memcmp(titleWord, buffer, length*U_SIZEOF_UCHAR)==0 && buffer[length]==0 ? "yes" : "no");
|
|
|
|
}
|
|
|
|
|
|
|
|
/* titlecase with UBRK_CHARACTERS and separate buffers */
|
|
|
|
buffer[0]=0xabcd;
|
|
|
|
errorCode=U_ZERO_ERROR;
|
|
|
|
length=u_strToTitle(buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
|
|
|
|
beforeTitle, sizeof(beforeTitle)/U_SIZEOF_UCHAR,
|
|
|
|
titleIterChars, "",
|
|
|
|
&errorCode);
|
|
|
|
if( U_FAILURE(errorCode) ||
|
|
|
|
length!=(sizeof(titleChar)/U_SIZEOF_UCHAR) ||
|
|
|
|
uprv_memcmp(titleChar, buffer, length*U_SIZEOF_UCHAR)!=0 ||
|
|
|
|
buffer[length]!=0
|
|
|
|
) {
|
|
|
|
log_err("error in u_strToTitle(UBRK_CHARACTERS)=%ld error=%s string matches: %s\n",
|
|
|
|
length,
|
|
|
|
u_errorName(errorCode),
|
|
|
|
uprv_memcmp(titleChar, buffer, length*U_SIZEOF_UCHAR)==0 && buffer[length]==0 ? "yes" : "no");
|
|
|
|
}
|
|
|
|
|
|
|
|
/* test preflighting */
|
|
|
|
errorCode=U_ZERO_ERROR;
|
|
|
|
length=u_strToTitle(NULL, 0,
|
|
|
|
beforeTitle, sizeof(beforeTitle)/U_SIZEOF_UCHAR,
|
|
|
|
titleIterChars, "",
|
|
|
|
&errorCode);
|
|
|
|
if( errorCode!=U_BUFFER_OVERFLOW_ERROR ||
|
|
|
|
length!=(sizeof(titleChar)/U_SIZEOF_UCHAR)
|
|
|
|
) {
|
|
|
|
log_err("error in u_strToTitle(UBRK_CHARACTERS pure preflighting)=%ld error=%s\n",
|
|
|
|
length,
|
|
|
|
u_errorName(errorCode));
|
|
|
|
}
|
|
|
|
|
|
|
|
/* test error handling */
|
|
|
|
buffer[0]=0xabcd;
|
|
|
|
errorCode=U_ZERO_ERROR;
|
|
|
|
length=u_strToTitle(buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
|
|
|
|
NULL, sizeof(beforeTitle)/U_SIZEOF_UCHAR,
|
|
|
|
titleIterChars, "",
|
|
|
|
&errorCode);
|
|
|
|
if( errorCode!=U_ILLEGAL_ARGUMENT_ERROR ||
|
|
|
|
buffer[0]!=0xabcd
|
|
|
|
) {
|
|
|
|
log_err("error in u_strToTitle(UBRK_CHARACTERS src=NULL)=%ld error=%s buffer[0]==0x%lx\n",
|
|
|
|
length,
|
|
|
|
u_errorName(errorCode),
|
|
|
|
buffer[0]);
|
|
|
|
}
|
|
|
|
|
|
|
|
buffer[0]=0xabcd;
|
|
|
|
errorCode=U_ZERO_ERROR;
|
|
|
|
length=u_strToTitle(buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
|
|
|
|
beforeTitle, -2,
|
|
|
|
titleIterChars, "",
|
|
|
|
&errorCode);
|
|
|
|
if( errorCode!=U_ILLEGAL_ARGUMENT_ERROR ||
|
|
|
|
buffer[0]!=0xabcd
|
|
|
|
) {
|
|
|
|
log_err("error in u_strToTitle(UBRK_CHARACTERS srcLength=-2)=%ld error=%s buffer[0]==0x%lx\n",
|
|
|
|
length,
|
|
|
|
u_errorName(errorCode),
|
|
|
|
buffer[0]);
|
|
|
|
}
|
2002-04-06 01:24:38 +00:00
|
|
|
|
|
|
|
ubrk_close(titleIterChars);
|
2002-02-21 18:43:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* test case folding and case-insensitive string compare -------------------- */
|
|
|
|
|
|
|
|
U_CFUNC void
|
|
|
|
TestCaseFolding() {
|
|
|
|
static const UChar32
|
|
|
|
simple[]={
|
|
|
|
/* input, default, exclude special i */
|
|
|
|
0x61, 0x61, 0x61,
|
2002-06-03 03:33:44 +00:00
|
|
|
0x49, 0x69, 0x131,
|
|
|
|
0x130, 0x69, 0x69,
|
|
|
|
0x131, 0x131, 0x131,
|
2002-02-21 18:43:36 +00:00
|
|
|
0xdf, 0xdf, 0xdf,
|
|
|
|
0xfb03, 0xfb03, 0xfb03,
|
2002-06-03 03:33:44 +00:00
|
|
|
0x1040e,0x10436,0x10436,
|
2002-02-21 18:43:36 +00:00
|
|
|
0x5ffff,0x5ffff,0x5ffff
|
|
|
|
};
|
|
|
|
|
|
|
|
static const UChar
|
2002-06-03 03:33:44 +00:00
|
|
|
mixed[]= { 0x61, 0x42, 0x130, 0x49, 0x131, 0x3d0, 0xdf, 0xfb03, 0xd93f, 0xdfff },
|
|
|
|
foldedDefault[]= { 0x61, 0x62, 0x69, 0x307, 0x69, 0x131, 0x3b2, 0x73, 0x73, 0x66, 0x66, 0x69, 0xd93f, 0xdfff },
|
|
|
|
foldedExcludeSpecialI[]={ 0x61, 0x62, 0x69, 0x131, 0x131, 0x3b2, 0x73, 0x73, 0x66, 0x66, 0x69, 0xd93f, 0xdfff };
|
2002-02-21 18:43:36 +00:00
|
|
|
|
|
|
|
UVersionInfo unicodeVersion={ 0, 0, 17, 89 }, unicode_3_1={ 3, 1, 0, 0 };
|
|
|
|
|
|
|
|
const UChar32 *p;
|
|
|
|
int32_t i;
|
|
|
|
|
|
|
|
UChar buffer[32];
|
|
|
|
int32_t length;
|
|
|
|
UErrorCode errorCode;
|
|
|
|
UBool isUnicode_3_1;
|
|
|
|
|
|
|
|
/* if unicodeVersion()>=3.1 then test exclude-special-i cases as well */
|
|
|
|
u_getUnicodeVersion(unicodeVersion);
|
|
|
|
isUnicode_3_1= uprv_memcmp(unicodeVersion, unicode_3_1, 4)>=0;
|
|
|
|
|
|
|
|
/* test simple case folding */
|
|
|
|
p=simple;
|
|
|
|
for(i=0; i<sizeof(simple)/12; p+=3, ++i) {
|
|
|
|
if(u_foldCase(p[0], U_FOLD_CASE_DEFAULT)!=p[1]) {
|
|
|
|
log_err("error: u_foldCase(0x%04lx, default)=0x%04lx instead of 0x%04lx\n",
|
|
|
|
p[0], u_foldCase(p[0], U_FOLD_CASE_DEFAULT), p[1]);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(isUnicode_3_1 && u_foldCase(p[0], U_FOLD_CASE_EXCLUDE_SPECIAL_I)!=p[2]) {
|
|
|
|
log_err("error: u_foldCase(0x%04lx, exclude special i)=0x%04lx instead of 0x%04lx\n",
|
|
|
|
p[0], u_foldCase(p[0], U_FOLD_CASE_EXCLUDE_SPECIAL_I), p[2]);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* test full string case folding with default option and separate buffers */
|
|
|
|
buffer[0]=0xabcd;
|
|
|
|
errorCode=U_ZERO_ERROR;
|
|
|
|
length=u_strFoldCase(buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
|
|
|
|
mixed, sizeof(mixed)/U_SIZEOF_UCHAR,
|
|
|
|
U_FOLD_CASE_DEFAULT,
|
|
|
|
&errorCode);
|
|
|
|
if( U_FAILURE(errorCode) ||
|
|
|
|
length!=(sizeof(foldedDefault)/U_SIZEOF_UCHAR) ||
|
|
|
|
uprv_memcmp(foldedDefault, buffer, length*U_SIZEOF_UCHAR)!=0 ||
|
|
|
|
buffer[length]!=0
|
|
|
|
) {
|
|
|
|
log_err("error in u_strFoldCase(default)=%ld error=%s string matches: %s\n",
|
|
|
|
length,
|
|
|
|
u_errorName(errorCode),
|
|
|
|
uprv_memcmp(foldedDefault, buffer, length*U_SIZEOF_UCHAR)==0 && buffer[length]==0 ? "yes" : "no");
|
|
|
|
}
|
|
|
|
|
|
|
|
/* exclude special i */
|
|
|
|
if(isUnicode_3_1) {
|
|
|
|
buffer[0]=0xabcd;
|
|
|
|
errorCode=U_ZERO_ERROR;
|
|
|
|
length=u_strFoldCase(buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
|
|
|
|
mixed, sizeof(mixed)/U_SIZEOF_UCHAR,
|
|
|
|
U_FOLD_CASE_EXCLUDE_SPECIAL_I,
|
|
|
|
&errorCode);
|
|
|
|
if( U_FAILURE(errorCode) ||
|
|
|
|
length!=(sizeof(foldedExcludeSpecialI)/U_SIZEOF_UCHAR) ||
|
|
|
|
uprv_memcmp(foldedExcludeSpecialI, buffer, length*U_SIZEOF_UCHAR)!=0 ||
|
|
|
|
buffer[length]!=0
|
|
|
|
) {
|
|
|
|
log_err("error in u_strFoldCase(exclude special i)=%ld error=%s string matches: %s\n",
|
|
|
|
length,
|
|
|
|
u_errorName(errorCode),
|
|
|
|
uprv_memcmp(foldedExcludeSpecialI, buffer, length*U_SIZEOF_UCHAR)==0 && buffer[length]==0 ? "yes" : "no");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* test full string case folding with default option and in the same buffer */
|
|
|
|
uprv_memcpy(buffer, mixed, sizeof(mixed));
|
|
|
|
buffer[sizeof(mixed)/U_SIZEOF_UCHAR]=0;
|
|
|
|
errorCode=U_ZERO_ERROR;
|
|
|
|
length=u_strFoldCase(buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
|
|
|
|
buffer, -1, /* implicit srcLength */
|
|
|
|
U_FOLD_CASE_DEFAULT,
|
|
|
|
&errorCode);
|
|
|
|
if( U_FAILURE(errorCode) ||
|
|
|
|
length!=(sizeof(foldedDefault)/U_SIZEOF_UCHAR) ||
|
|
|
|
uprv_memcmp(foldedDefault, buffer, length*U_SIZEOF_UCHAR)!=0 ||
|
|
|
|
buffer[length]!=0
|
|
|
|
) {
|
|
|
|
log_err("error in u_strFoldCase(default same buffer)=%ld error=%s string matches: %s\n",
|
|
|
|
length,
|
|
|
|
u_errorName(errorCode),
|
|
|
|
uprv_memcmp(foldedDefault, buffer, length*U_SIZEOF_UCHAR)==0 && buffer[length]==0 ? "yes" : "no");
|
|
|
|
}
|
|
|
|
|
|
|
|
/* test full string case folding, exclude special i, in the same buffer */
|
|
|
|
if(isUnicode_3_1) {
|
|
|
|
uprv_memcpy(buffer, mixed, sizeof(mixed));
|
|
|
|
errorCode=U_ZERO_ERROR;
|
|
|
|
length=u_strFoldCase(buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
|
|
|
|
buffer, sizeof(mixed)/U_SIZEOF_UCHAR,
|
|
|
|
U_FOLD_CASE_EXCLUDE_SPECIAL_I,
|
|
|
|
&errorCode);
|
|
|
|
if( U_FAILURE(errorCode) ||
|
|
|
|
length!=(sizeof(foldedExcludeSpecialI)/U_SIZEOF_UCHAR) ||
|
|
|
|
uprv_memcmp(foldedExcludeSpecialI, buffer, length*U_SIZEOF_UCHAR)!=0 ||
|
|
|
|
buffer[length]!=0
|
|
|
|
) {
|
|
|
|
log_err("error in u_strFoldCase(exclude special i same buffer)=%ld error=%s string matches: %s\n",
|
|
|
|
length,
|
|
|
|
u_errorName(errorCode),
|
|
|
|
uprv_memcmp(foldedExcludeSpecialI, buffer, length*U_SIZEOF_UCHAR)==0 && buffer[length]==0 ? "yes" : "no");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* test preflighting */
|
|
|
|
buffer[0]=buffer[2]=0xabcd;
|
|
|
|
errorCode=U_ZERO_ERROR;
|
|
|
|
length=u_strFoldCase(buffer, 2, /* set destCapacity=2 */
|
|
|
|
mixed, sizeof(mixed)/U_SIZEOF_UCHAR,
|
|
|
|
U_FOLD_CASE_DEFAULT,
|
|
|
|
&errorCode);
|
|
|
|
if( errorCode!=U_BUFFER_OVERFLOW_ERROR ||
|
|
|
|
length!=(sizeof(foldedDefault)/U_SIZEOF_UCHAR) ||
|
|
|
|
uprv_memcmp(foldedDefault, buffer, 2*U_SIZEOF_UCHAR)!=0 ||
|
|
|
|
buffer[2]!=0xabcd
|
|
|
|
) {
|
|
|
|
log_err("error in u_strFoldCase(default preflighting)=%ld error=%s string matches: %s\n",
|
|
|
|
length,
|
|
|
|
u_errorName(errorCode),
|
|
|
|
uprv_memcmp(foldedDefault, buffer, 2*U_SIZEOF_UCHAR)==0 && buffer[2]==0xabcd ? "yes" : "no");
|
|
|
|
}
|
|
|
|
|
|
|
|
errorCode=U_ZERO_ERROR;
|
|
|
|
length=u_strFoldCase(NULL, 0,
|
|
|
|
mixed, sizeof(mixed)/U_SIZEOF_UCHAR,
|
|
|
|
U_FOLD_CASE_DEFAULT,
|
|
|
|
&errorCode);
|
|
|
|
if( errorCode!=U_BUFFER_OVERFLOW_ERROR ||
|
|
|
|
length!=(sizeof(foldedDefault)/U_SIZEOF_UCHAR)
|
|
|
|
) {
|
|
|
|
log_err("error in u_strFoldCase(default pure preflighting)=%ld error=%s\n",
|
|
|
|
length,
|
|
|
|
u_errorName(errorCode));
|
|
|
|
}
|
|
|
|
|
|
|
|
/* test error handling */
|
|
|
|
errorCode=U_ZERO_ERROR;
|
|
|
|
length=u_strFoldCase(NULL, sizeof(buffer)/U_SIZEOF_UCHAR,
|
|
|
|
mixed, sizeof(mixed)/U_SIZEOF_UCHAR,
|
|
|
|
U_FOLD_CASE_DEFAULT,
|
|
|
|
&errorCode);
|
|
|
|
if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
|
|
|
|
log_err("error in u_strFoldCase(default dest=NULL)=%ld error=%s\n",
|
|
|
|
length,
|
|
|
|
u_errorName(errorCode));
|
|
|
|
}
|
|
|
|
|
|
|
|
buffer[0]=0xabcd;
|
|
|
|
errorCode=U_ZERO_ERROR;
|
|
|
|
length=u_strFoldCase(buffer, -1,
|
|
|
|
mixed, sizeof(mixed)/U_SIZEOF_UCHAR,
|
|
|
|
U_FOLD_CASE_DEFAULT,
|
|
|
|
&errorCode);
|
|
|
|
if( errorCode!=U_ILLEGAL_ARGUMENT_ERROR ||
|
|
|
|
buffer[0]!=0xabcd
|
|
|
|
) {
|
|
|
|
log_err("error in u_strFoldCase(default destCapacity=-1)=%ld error=%s buffer[0]==0x%lx\n",
|
|
|
|
length,
|
|
|
|
u_errorName(errorCode),
|
|
|
|
buffer[0]);
|
|
|
|
}
|
|
|
|
|
|
|
|
buffer[0]=0xabcd;
|
|
|
|
errorCode=U_ZERO_ERROR;
|
|
|
|
length=u_strFoldCase(buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
|
|
|
|
NULL, sizeof(mixed)/U_SIZEOF_UCHAR,
|
|
|
|
U_FOLD_CASE_EXCLUDE_SPECIAL_I,
|
|
|
|
&errorCode);
|
|
|
|
if( errorCode!=U_ILLEGAL_ARGUMENT_ERROR ||
|
|
|
|
buffer[0]!=0xabcd
|
|
|
|
) {
|
|
|
|
log_err("error in u_strFoldCase(exclude special i src=NULL)=%ld error=%s buffer[0]==0x%lx\n",
|
|
|
|
length,
|
|
|
|
u_errorName(errorCode),
|
|
|
|
buffer[0]);
|
|
|
|
}
|
|
|
|
|
|
|
|
buffer[0]=0xabcd;
|
|
|
|
errorCode=U_ZERO_ERROR;
|
|
|
|
length=u_strFoldCase(buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
|
|
|
|
mixed, -2,
|
|
|
|
U_FOLD_CASE_EXCLUDE_SPECIAL_I,
|
|
|
|
&errorCode);
|
|
|
|
if( errorCode!=U_ILLEGAL_ARGUMENT_ERROR ||
|
|
|
|
buffer[0]!=0xabcd
|
|
|
|
) {
|
|
|
|
log_err("error in u_strFoldCase(exclude special i srcLength=-2)=%ld error=%s buffer[0]==0x%lx\n",
|
|
|
|
length,
|
|
|
|
u_errorName(errorCode),
|
|
|
|
buffer[0]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
U_CFUNC void
|
|
|
|
TestCaseCompare() {
|
|
|
|
static const UChar
|
|
|
|
|
|
|
|
mixed[]= { 0x61, 0x42, 0x131, 0x3a3, 0xdf, 0xfb03, 0xd93f, 0xdfff, 0 },
|
2002-06-03 03:33:44 +00:00
|
|
|
otherDefault[]= { 0x41, 0x62, 0x131, 0x3c3, 0x73, 0x53, 0x46, 0x66, 0x49, 0xd93f, 0xdfff, 0 },
|
2002-02-21 18:43:36 +00:00
|
|
|
otherExcludeSpecialI[]={ 0x41, 0x62, 0x131, 0x3c3, 0x53, 0x73, 0x66, 0x46, 0x69, 0xd93f, 0xdfff, 0 },
|
2002-06-03 03:33:44 +00:00
|
|
|
different[]= { 0x41, 0x62, 0x131, 0x3c3, 0x73, 0x53, 0x46, 0x66, 0x49, 0xd93f, 0xdffd, 0 };
|
2002-02-21 18:43:36 +00:00
|
|
|
|
|
|
|
UVersionInfo unicodeVersion={ 0, 0, 17, 89 }, unicode_3_1={ 3, 1, 0, 0 };
|
|
|
|
|
2002-05-24 23:23:56 +00:00
|
|
|
int32_t result, lenMixed, lenOtherDefault, lenOtherExcludeSpecialI, lenDifferent;
|
|
|
|
UErrorCode errorCode;
|
2002-02-21 18:43:36 +00:00
|
|
|
UBool isUnicode_3_1;
|
|
|
|
|
2002-05-24 23:23:56 +00:00
|
|
|
errorCode=U_ZERO_ERROR;
|
|
|
|
|
|
|
|
lenMixed=u_strlen(mixed);
|
|
|
|
lenOtherDefault=u_strlen(otherDefault);
|
|
|
|
lenOtherExcludeSpecialI=u_strlen(otherExcludeSpecialI);
|
|
|
|
lenDifferent=u_strlen(different);
|
|
|
|
|
2002-02-21 18:43:36 +00:00
|
|
|
/* if unicodeVersion()>=3.1 then test exclude-special-i cases as well */
|
|
|
|
u_getUnicodeVersion(unicodeVersion);
|
|
|
|
isUnicode_3_1= uprv_memcmp(unicodeVersion, unicode_3_1, 4)>=0;
|
|
|
|
|
|
|
|
/* test u_strcasecmp() */
|
|
|
|
result=u_strcasecmp(mixed, otherDefault, U_FOLD_CASE_DEFAULT);
|
|
|
|
if(result!=0) {
|
|
|
|
log_err("error: u_strcasecmp(mixed, other, default)=%ld instead of 0\n", result);
|
|
|
|
}
|
2002-05-24 23:23:56 +00:00
|
|
|
result=u_strCaseCompare(mixed, -1, otherDefault, -1, U_FOLD_CASE_DEFAULT, &errorCode);
|
|
|
|
if(result!=0) {
|
|
|
|
log_err("error: u_strCaseCompare(mixed, other, default)=%ld instead of 0\n", result);
|
|
|
|
}
|
2002-02-21 18:43:36 +00:00
|
|
|
|
|
|
|
/* test u_strcasecmp() - exclude special i */
|
|
|
|
result=u_strcasecmp(mixed, otherExcludeSpecialI, U_FOLD_CASE_EXCLUDE_SPECIAL_I);
|
|
|
|
if(result!=0) {
|
|
|
|
log_err("error: u_strcasecmp(mixed, other, exclude special i)=%ld instead of 0\n", result);
|
|
|
|
}
|
2002-05-24 23:23:56 +00:00
|
|
|
result=u_strCaseCompare(mixed, lenMixed, otherExcludeSpecialI, lenOtherExcludeSpecialI, U_FOLD_CASE_EXCLUDE_SPECIAL_I, &errorCode);
|
|
|
|
if(result!=0) {
|
|
|
|
log_err("error: u_strCaseCompare(mixed, other, exclude special i)=%ld instead of 0\n", result);
|
|
|
|
}
|
2002-02-21 18:43:36 +00:00
|
|
|
|
|
|
|
/* test u_strcasecmp() */
|
|
|
|
result=u_strcasecmp(mixed, different, U_FOLD_CASE_DEFAULT);
|
|
|
|
if(result<=0) {
|
|
|
|
log_err("error: u_strcasecmp(mixed, different, default)=%ld instead of positive\n", result);
|
|
|
|
}
|
2002-05-24 23:23:56 +00:00
|
|
|
result=u_strCaseCompare(mixed, -1, different, lenDifferent, U_FOLD_CASE_DEFAULT, &errorCode);
|
|
|
|
if(result<=0) {
|
|
|
|
log_err("error: u_strCaseCompare(mixed, different, default)=%ld instead of positive\n", result);
|
|
|
|
}
|
2002-02-21 18:43:36 +00:00
|
|
|
|
|
|
|
/* test u_strncasecmp() - stop before the sharp s (U+00df) */
|
|
|
|
result=u_strncasecmp(mixed, different, 4, U_FOLD_CASE_DEFAULT);
|
|
|
|
if(result!=0) {
|
|
|
|
log_err("error: u_strncasecmp(mixed, different, 4, default)=%ld instead of 0\n", result);
|
|
|
|
}
|
2002-05-24 23:23:56 +00:00
|
|
|
result=u_strCaseCompare(mixed, 4, different, 4, U_FOLD_CASE_DEFAULT, &errorCode);
|
|
|
|
if(result!=0) {
|
|
|
|
log_err("error: u_strCaseCompare(mixed, 4, different, 4, default)=%ld instead of 0\n", result);
|
|
|
|
}
|
2002-02-21 18:43:36 +00:00
|
|
|
|
|
|
|
/* test u_strncasecmp() - stop in the middle of the sharp s (U+00df) */
|
|
|
|
result=u_strncasecmp(mixed, different, 5, U_FOLD_CASE_DEFAULT);
|
|
|
|
if(result<=0) {
|
|
|
|
log_err("error: u_strncasecmp(mixed, different, 5, default)=%ld instead of positive\n", result);
|
|
|
|
}
|
2002-05-24 23:23:56 +00:00
|
|
|
result=u_strCaseCompare(mixed, 5, different, 5, U_FOLD_CASE_DEFAULT, &errorCode);
|
|
|
|
if(result<=0) {
|
|
|
|
log_err("error: u_strCaseCompare(mixed, 5, different, 5, default)=%ld instead of positive\n", result);
|
|
|
|
}
|
2002-02-21 18:43:36 +00:00
|
|
|
|
|
|
|
/* test u_memcasecmp() - stop before the sharp s (U+00df) */
|
|
|
|
result=u_memcasecmp(mixed, different, 4, U_FOLD_CASE_DEFAULT);
|
|
|
|
if(result!=0) {
|
|
|
|
log_err("error: u_memcasecmp(mixed, different, 4, default)=%ld instead of 0\n", result);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* test u_memcasecmp() - stop in the middle of the sharp s (U+00df) */
|
|
|
|
result=u_memcasecmp(mixed, different, 5, U_FOLD_CASE_DEFAULT);
|
|
|
|
if(result<=0) {
|
|
|
|
log_err("error: u_memcasecmp(mixed, different, 5, default)=%ld instead of positive\n", result);
|
|
|
|
}
|
|
|
|
}
|