2 **********************************************************************
3 * Copyright (C) 1998-2010, International Business Machines Corporation
4 * and others. All Rights Reserved.
5 **********************************************************************
9 * Modification History:
11 * Date Name Description
12 * 07/13/2000 Madhu created
13 *******************************************************************************
16 #include "unicode/ustring.h"
17 #include "unicode/ucnv.h"
23 #define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
25 static void TestAPI(void);
26 void addCStringTest(TestNode
** root
);
28 static void TestInvariant(void);
29 static void TestCompareInvEbcdicAsAscii(void);
31 void addCStringTest(TestNode
** root
) {
32 addTest(root
, &TestAPI
, "tsutil/cstrtest/TestAPI");
33 addTest(root
, &TestInvariant
, "tsutil/cstrtest/TestInvariant");
34 addTest(root
, &TestCompareInvEbcdicAsAscii
, "tsutil/cstrtest/TestCompareInvEbcdicAsAscii");
37 static void TestAPI(void)
40 char src
[30]="HELLO THERE", dest
[30];
41 static const char *const abc
="abcdefghijklmnopqrstuvwxyz", *const ABC
="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
45 log_verbose("Testing uprv_tolower() and uprv_toupper()\n");
46 for(i
=0; i
<=26; ++i
) {
47 dest
[i
]=uprv_tolower(abc
[i
]);
49 if(0!=strcmp(abc
, dest
)) {
50 log_err("uprv_tolower(abc) failed\n");
53 for(i
=0; i
<=26; ++i
) {
54 dest
[i
]=uprv_tolower(ABC
[i
]);
56 if(0!=strcmp(abc
, dest
)) {
57 log_err("uprv_tolower(ABC) failed\n");
60 for(i
=0; i
<=26; ++i
) {
61 dest
[i
]=uprv_toupper(abc
[i
]);
63 if(0!=strcmp(ABC
, dest
)) {
64 log_err("uprv_toupper(abc) failed\n");
67 for(i
=0; i
<=26; ++i
) {
68 dest
[i
]=uprv_toupper(ABC
[i
]);
70 if(0!=strcmp(ABC
, dest
)) {
71 log_err("uprv_toupper(ABC) failed\n");
74 log_verbose("Testing the API in cstring\n");
75 T_CString_toLowerCase(src
);
76 if(uprv_strcmp(src
, "hello there") != 0){
77 log_err("FAIL: *** T_CString_toLowerCase() failed. Expected: \"hello there\", Got: \"%s\"\n", src
);
79 T_CString_toUpperCase(src
);
80 if(uprv_strcmp(src
, "HELLO THERE") != 0){
81 log_err("FAIL: *** T_CString_toUpperCase() failed. Expected: \"HELLO THERE\", Got: \"%s\"\n", src
);
84 intValue
=T_CString_stringToInteger("34556", 10);
85 if(intValue
!= 34556){
86 log_err("FAIL: ****T_CString_stringToInteger(\"34556\", 10) failed. Expected: 34556, Got: %d\n", intValue
);
88 intValue
=T_CString_stringToInteger("100", 16);
90 log_err("FAIL: ****T_CString_stringToInteger(\"100\", 16) failed. Expected: 256, Got: %d\n", intValue
);
92 i
= T_CString_integerToString(src
, 34556, 10);
93 if(uprv_strcmp(src
, "34556") != 0 || i
!= 5){
94 log_err("FAIL: ****integerToString(src, 34566, 10); failed. Expected: \"34556\", Got: %s\n", src
);
96 i
= T_CString_integerToString(src
, 431, 16);
97 if(uprv_stricmp(src
, "1AF") != 0 || i
!= 3){
98 log_err("FAIL: ****integerToString(src, 431, 16); failed. Expected: \"1AF\", Got: %s\n", src
);
100 i
= T_CString_int64ToString(src
, U_INT64_MAX
, 10);
101 if(uprv_strcmp(src
, "9223372036854775807") != 0 || i
!= 19){
102 log_err("FAIL: ****integerToString(src, 9223372036854775807, 10); failed. Got: %s\n", src
);
104 i
= T_CString_int64ToString(src
, U_INT64_MAX
, 16);
105 if(uprv_stricmp(src
, "7FFFFFFFFFFFFFFF") != 0 || i
!= 16){
106 log_err("FAIL: ****integerToString(src, 7FFFFFFFFFFFFFFF, 16); failed. Got: %s\n", src
);
109 uprv_strcpy(src
, "this is lower case");
110 if(T_CString_stricmp(src
, "THIS is lower CASE") != 0){
111 log_err("FAIL: *****T_CString_stricmp() failed.");
113 if((intValue
=T_CString_stricmp(NULL
, "first string is null") )!= -1){
114 log_err("FAIL: T_CString_stricmp() where the first string is null failed. Expected: -1, returned %d\n", intValue
);
116 if((intValue
=T_CString_stricmp("second string is null", NULL
)) != 1){
117 log_err("FAIL: T_CString_stricmp() where the second string is null failed. Expected: 1, returned %d\n", intValue
);
119 if((intValue
=T_CString_stricmp(NULL
, NULL
)) != 0){
120 log_err("FAIL: T_CString_stricmp(NULL, NULL) failed. Expected: 0, returned %d\n", intValue
);;
122 if((intValue
=T_CString_stricmp("", "")) != 0){
123 log_err("FAIL: T_CString_stricmp(\"\", \"\") failed. Expected: 0, returned %d\n", intValue
);;
125 if((intValue
=T_CString_stricmp("", "abc")) != -1){
126 log_err("FAIL: T_CString_stricmp(\"\", \"abc\") failed. Expected: -1, returned %d\n", intValue
);
128 if((intValue
=T_CString_stricmp("abc", "")) != 1){
129 log_err("FAIL: T_CString_stricmp(\"abc\", \"\") failed. Expected: 1, returned %d\n", intValue
);
132 temp
=uprv_strdup("strdup");
133 if(uprv_strcmp(temp
, "strdup") !=0 ){
134 log_err("FAIL: uprv_strdup() failed. Expected: \"strdup\", Got: %s\n", temp
);
136 uprv_free((char *)temp
);
138 uprv_strcpy(src
, "this is lower case");
139 if(T_CString_strnicmp(src
, "THIS", 4 ) != 0){
140 log_err("FAIL: *****T_CString_strnicmp() failed.");
142 if((intValue
=T_CString_strnicmp(NULL
, "first string is null", 10) )!= -1){
143 log_err("FAIL: T_CString_strnicmp() where the first string is null failed. Expected: -1, returned %d\n", intValue
);
145 if((intValue
=T_CString_strnicmp("second string is null", NULL
, 10)) != 1){
146 log_err("FAIL: T_CString_strnicmp() where the second string is null failed. Expected: 1, returned %d\n", intValue
);
148 if((intValue
=T_CString_strnicmp(NULL
, NULL
, 10)) != 0){
149 log_err("FAIL: T_CString_strnicmp(NULL, NULL, 10) failed. Expected: 0, returned %d\n", intValue
);;
151 if((intValue
=T_CString_strnicmp("", "", 10)) != 0){
152 log_err("FAIL: T_CString_strnicmp(\"\", \"\") failed. Expected: 0, returned %d\n", intValue
);;
154 if((intValue
=T_CString_strnicmp("", "abc", 10)) != -1){
155 log_err("FAIL: T_CString_stricmp(\"\", \"abc\", 10) failed. Expected: -1, returned %d\n", intValue
);
157 if((intValue
=T_CString_strnicmp("abc", "", 10)) != 1){
158 log_err("FAIL: T_CString_strnicmp(\"abc\", \"\", 10) failed. Expected: 1, returned %d\n", intValue
);
163 /* test invariant-character handling */
166 /* all invariant graphic chars and some control codes (not \n!) */
167 const char invariantChars
[]=
170 "ABCDEFGHIJKLMNOPQRSTUVWXYZ_"
171 "abcdefghijklmnopqrstuvwxyz";
173 const UChar invariantUChars
[]={
174 9, 0xd, 0x20, 0x22, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
175 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
176 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
177 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5f,
178 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
179 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0
182 const char variantChars
[]="\n!#$@[\\]^`{|}~";
184 const UChar variantUChars
[]={
185 0x0a, 0x21, 0x23, 0x24, 0x40, 0x5b, 0x5c, 0x5d, 0x5e, 0x60, 0x7b, 0x7c, 0x7d, 0x7e, 0
188 const UChar nonASCIIUChars
[]={ 0x80, 0xa0, 0x900, 0xff51 };
195 /* make sure that all invariant characters convert both ways */
196 length
=sizeof(invariantChars
);
197 u_charsToUChars(invariantChars
, us
, length
);
198 if(u_strcmp(us
, invariantUChars
)!=0) {
199 log_err("u_charsToUChars(invariantChars) failed\n");
202 u_UCharsToChars(invariantUChars
, cs
, length
);
203 if(strcmp(cs
, invariantChars
)!=0) {
204 log_err("u_UCharsToChars(invariantUChars) failed\n");
209 * make sure that variant characters convert from source code literals to Unicode
210 * but not back to char *
212 length
=sizeof(variantChars
);
213 u_charsToUChars(variantChars
, us
, length
);
214 if(u_strcmp(us
, variantUChars
)!=0) {
215 log_err("u_charsToUChars(variantChars) failed\n");
220 * Test u_UCharsToChars(variantUChars) only in release mode because it will
221 * cause an assertion failure in debug builds.
223 u_UCharsToChars(variantUChars
, cs
, length
);
224 for(i
=0; i
<length
; ++i
) {
226 log_err("u_UCharsToChars(variantUChars) converted the %d-th character to %02x instead of 00\n", i
, cs
[i
]);
232 * Verify that invariant characters roundtrip from Unicode to the
233 * default converter and back.
237 UErrorCode errorCode
;
239 errorCode
=U_ZERO_ERROR
;
240 cnv
=ucnv_open(NULL
, &errorCode
);
241 if(U_FAILURE(errorCode
)) {
242 log_err("unable to open the default converter\n");
244 length
=ucnv_fromUChars(cnv
, cs
, sizeof(cs
), invariantUChars
, -1, &errorCode
);
245 if(U_FAILURE(errorCode
)) {
246 log_err("ucnv_fromUChars(invariantUChars) failed - %s\n", u_errorName(errorCode
));
247 } else if(length
!=sizeof(invariantChars
)-1 || strcmp(cs
, invariantChars
)!=0) {
248 log_err("ucnv_fromUChars(invariantUChars) failed\n");
251 errorCode
=U_ZERO_ERROR
;
252 length
=ucnv_toUChars(cnv
, us
, LENGTHOF(us
), invariantChars
, -1, &errorCode
);
253 if(U_FAILURE(errorCode
)) {
254 log_err("ucnv_toUChars(invariantChars) failed - %s\n", u_errorName(errorCode
));
255 } else if(length
!=LENGTHOF(invariantUChars
)-1 || u_strcmp(us
, invariantUChars
)!=0) {
256 log_err("ucnv_toUChars(invariantChars) failed\n");
264 if(!uprv_isInvariantString(invariantChars
, -1)) {
265 log_err("uprv_isInvariantString(invariantChars) failed\n");
267 if(!uprv_isInvariantUString(invariantUChars
, -1)) {
268 log_err("uprv_isInvariantUString(invariantUChars) failed\n");
270 if(!uprv_isInvariantString(invariantChars
+strlen(invariantChars
), 1)) {
271 log_err("uprv_isInvariantString(\"\\0\") failed\n");
274 for(i
=0; i
<(sizeof(variantChars
)-1); ++i
) {
275 if(uprv_isInvariantString(variantChars
+i
, 1)) {
276 log_err("uprv_isInvariantString(variantChars[%d]) failed\n", i
);
278 if(uprv_isInvariantUString(variantUChars
+i
, 1)) {
279 log_err("uprv_isInvariantUString(variantUChars[%d]) failed\n", i
);
283 for(i
=0; i
<LENGTHOF(nonASCIIUChars
); ++i
) {
284 if(uprv_isInvariantUString(nonASCIIUChars
+i
, 1)) {
285 log_err("uprv_isInvariantUString(nonASCIIUChars[%d]) failed\n", i
);
290 static int32_t getSign(int32_t n
) {
301 TestCompareInvEbcdicAsAscii() {
302 static const char *const invStrings
[][2]={
303 /* invariant-character strings in ascending ASCII order */
308 { "\xf0\xf0", "00" },
309 { "\xf0\xf0\x81", "00a" },
312 { "\xc1\xf0\xf0", "A00" },
313 { "\xc1\xf0\xf0", "A00" },
314 { "\xc1\xc1", "AA" },
315 { "\xc1\xc1\xf0", "AA0" },
318 { "\x81\xf0\xf0", "a00" },
319 { "\x81\xf0\xf0", "a00" },
320 { "\x81\x81", "aa" },
321 { "\x81\x81\xf0", "aa0" },
322 { "\x81\x81\x81", "aaa" },
323 { "\x81\x81\x82", "aab" }
326 for(i
=1; i
<LENGTHOF(invStrings
); ++i
) {
327 int32_t diff1
, diff2
;
328 /* compare previous vs. current */
329 diff1
=getSign(uprv_compareInvEbcdicAsAscii(invStrings
[i
-1][0], invStrings
[i
][0]));
330 if(diff1
>0 || (diff1
==0 && 0!=uprv_strcmp(invStrings
[i
-1][0], invStrings
[i
][0]))) {
331 log_err("uprv_compareInvEbcdicAsAscii(%s, %s)=%hd is wrong\n",
332 invStrings
[i
-1][1], invStrings
[i
][1], (short)diff1
);
334 /* compare current vs. previous, should be inverse diff */
335 diff2
=getSign(uprv_compareInvEbcdicAsAscii(invStrings
[i
][0], invStrings
[i
-1][0]));
337 log_err("uprv_compareInvEbcdicAsAscii(%s, %s)=%hd is wrong\n",
338 invStrings
[i
][1], invStrings
[i
-1][1], (short)diff2
);