16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org********************************************************************** 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Copyright (C) 1998-2011, International Business Machines Corporation 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* and others. All Rights Reserved. 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org********************************************************************** 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* File cstrtest.c 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Modification History: 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Date Name Description 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 07/13/2000 Madhu created 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************* 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h" 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ucnv.h" 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cstring.h" 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uinvchar.h" 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cintltst.h" 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h" 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestAPI(void); 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid addCStringTest(TestNode** root); 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestInvariant(void); 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestCompareInvEbcdicAsAscii(void); 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid addCStringTest(TestNode** root) { 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestAPI, "tsutil/cstrtest/TestAPI"); 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestInvariant, "tsutil/cstrtest/TestInvariant"); 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestCompareInvEbcdicAsAscii, "tsutil/cstrtest/TestCompareInvEbcdicAsAscii"); 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestAPI(void) 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t intValue=0; 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char src[30]="HELLO THERE", dest[30]; 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const char *const abc="abcdefghijklmnopqrstuvwxyz", *const ABC="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *temp; 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i; 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Testing uprv_tolower() and uprv_toupper()\n"); 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<=26; ++i) { 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest[i]=uprv_tolower(abc[i]); 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(0!=strcmp(abc, dest)) { 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("uprv_tolower(abc) failed\n"); 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<=26; ++i) { 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest[i]=uprv_tolower(ABC[i]); 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(0!=strcmp(abc, dest)) { 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("uprv_tolower(ABC) failed\n"); 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<=26; ++i) { 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest[i]=uprv_toupper(abc[i]); 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(0!=strcmp(ABC, dest)) { 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("uprv_toupper(abc) failed\n"); 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<=26; ++i) { 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest[i]=uprv_toupper(ABC[i]); 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(0!=strcmp(ABC, dest)) { 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("uprv_toupper(ABC) failed\n"); 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_verbose("Testing the API in cstring\n"); 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org T_CString_toLowerCase(src); 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(uprv_strcmp(src, "hello there") != 0){ 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("FAIL: *** T_CString_toLowerCase() failed. Expected: \"hello there\", Got: \"%s\"\n", src); 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org T_CString_toUpperCase(src); 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(uprv_strcmp(src, "HELLO THERE") != 0){ 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("FAIL: *** T_CString_toUpperCase() failed. Expected: \"HELLO THERE\", Got: \"%s\"\n", src); 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org intValue=T_CString_stringToInteger("34556", 10); 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(intValue != 34556){ 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("FAIL: ****T_CString_stringToInteger(\"34556\", 10) failed. Expected: 34556, Got: %d\n", intValue); 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org intValue=T_CString_stringToInteger("100", 16); 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(intValue != 256){ 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("FAIL: ****T_CString_stringToInteger(\"100\", 16) failed. Expected: 256, Got: %d\n", intValue); 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i = T_CString_integerToString(src, 34556, 10); 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(uprv_strcmp(src, "34556") != 0 || i != 5){ 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("FAIL: ****integerToString(src, 34566, 10); failed. Expected: \"34556\", Got: %s\n", src); 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i = T_CString_integerToString(src, 431, 16); 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(uprv_stricmp(src, "1AF") != 0 || i != 3){ 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("FAIL: ****integerToString(src, 431, 16); failed. Expected: \"1AF\", Got: %s\n", src); 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i = T_CString_int64ToString(src, U_INT64_MAX, 10); 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(uprv_strcmp(src, "9223372036854775807") != 0 || i != 19){ 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("FAIL: ****integerToString(src, 9223372036854775807, 10); failed. Got: %s\n", src); 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i = T_CString_int64ToString(src, U_INT64_MAX, 16); 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(uprv_stricmp(src, "7FFFFFFFFFFFFFFF") != 0 || i != 16){ 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("FAIL: ****integerToString(src, 7FFFFFFFFFFFFFFF, 16); failed. Got: %s\n", src); 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_strcpy(src, "this is lower case"); 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(uprv_stricmp(src, "THIS is lower CASE") != 0){ 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("FAIL: *****uprv_stricmp() failed."); 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if((intValue=uprv_stricmp(NULL, "first string is null") )!= -1){ 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("FAIL: uprv_stricmp() where the first string is null failed. Expected: -1, returned %d\n", intValue); 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if((intValue=uprv_stricmp("second string is null", NULL)) != 1){ 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("FAIL: uprv_stricmp() where the second string is null failed. Expected: 1, returned %d\n", intValue); 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if((intValue=uprv_stricmp(NULL, NULL)) != 0){ 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("FAIL: uprv_stricmp(NULL, NULL) failed. Expected: 0, returned %d\n", intValue);; 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if((intValue=uprv_stricmp("", "")) != 0){ 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("FAIL: uprv_stricmp(\"\", \"\") failed. Expected: 0, returned %d\n", intValue);; 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if((intValue=uprv_stricmp("", "abc")) != -1){ 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("FAIL: uprv_stricmp(\"\", \"abc\") failed. Expected: -1, returned %d\n", intValue); 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if((intValue=uprv_stricmp("abc", "")) != 1){ 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("FAIL: uprv_stricmp(\"abc\", \"\") failed. Expected: 1, returned %d\n", intValue); 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org temp=uprv_strdup("strdup"); 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(uprv_strcmp(temp, "strdup") !=0 ){ 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("FAIL: uprv_strdup() failed. Expected: \"strdup\", Got: %s\n", temp); 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_free((char *)temp); 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_strcpy(src, "this is lower case"); 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(uprv_strnicmp(src, "THIS", 4 ) != 0){ 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("FAIL: *****uprv_strnicmp() failed."); 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if((intValue=uprv_strnicmp(NULL, "first string is null", 10) )!= -1){ 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("FAIL: uprv_strnicmp() where the first string is null failed. Expected: -1, returned %d\n", intValue); 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if((intValue=uprv_strnicmp("second string is null", NULL, 10)) != 1){ 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("FAIL: uprv_strnicmp() where the second string is null failed. Expected: 1, returned %d\n", intValue); 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if((intValue=uprv_strnicmp(NULL, NULL, 10)) != 0){ 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("FAIL: uprv_strnicmp(NULL, NULL, 10) failed. Expected: 0, returned %d\n", intValue);; 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if((intValue=uprv_strnicmp("", "", 10)) != 0){ 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("FAIL: uprv_strnicmp(\"\", \"\") failed. Expected: 0, returned %d\n", intValue);; 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if((intValue=uprv_strnicmp("", "abc", 10)) != -1){ 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("FAIL: uprv_stricmp(\"\", \"abc\", 10) failed. Expected: -1, returned %d\n", intValue); 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if((intValue=uprv_strnicmp("abc", "", 10)) != 1){ 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("FAIL: uprv_strnicmp(\"abc\", \"\", 10) failed. Expected: 1, returned %d\n", intValue); 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* test invariant-character handling */ 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTestInvariant() { 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* all invariant graphic chars and some control codes (not \n!) */ 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char invariantChars[]= 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\t\r \"%&'()*+,-./" 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "0123456789:;<=>?" 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "ABCDEFGHIJKLMNOPQRSTUVWXYZ_" 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "abcdefghijklmnopqrstuvwxyz"; 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar invariantUChars[]={ 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9, 0xd, 0x20, 0x22, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5f, 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char variantChars[]="\n!#$@[\\]^`{|}~"; 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar variantUChars[]={ 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0a, 0x21, 0x23, 0x24, 0x40, 0x5b, 0x5c, 0x5d, 0x5e, 0x60, 0x7b, 0x7c, 0x7d, 0x7e, 0 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar nonASCIIUChars[]={ 0x80, 0xa0, 0x900, 0xff51 }; 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar us[120]; 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char cs[120]; 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i, length; 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* make sure that all invariant characters convert both ways */ 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=sizeof(invariantChars); 1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_charsToUChars(invariantChars, us, length); 1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(u_strcmp(us, invariantUChars)!=0) { 1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("u_charsToUChars(invariantChars) failed\n"); 2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_UCharsToChars(invariantUChars, cs, length); 2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(strcmp(cs, invariantChars)!=0) { 2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("u_UCharsToChars(invariantUChars) failed\n"); 2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * make sure that variant characters convert from source code literals to Unicode 2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * but not back to char * 2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=sizeof(variantChars); 2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_charsToUChars(variantChars, us, length); 2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(u_strcmp(us, variantUChars)!=0) { 2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("u_charsToUChars(variantChars) failed\n"); 2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef NDEBUG 2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Test u_UCharsToChars(variantUChars) only in release mode because it will 2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * cause an assertion failure in debug builds. 2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_UCharsToChars(variantUChars, cs, length); 2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<length; ++i) { 2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(cs[i]!=0) { 2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("u_UCharsToChars(variantUChars) converted the %d-th character to %02x instead of 00\n", i, cs[i]); 2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Verify that invariant characters roundtrip from Unicode to the 2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * default converter and back. 2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverter *cnv; 2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode errorCode; 2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org cnv=ucnv_open(NULL, &errorCode); 2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode)) { 2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("unable to open the default converter\n"); 2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=ucnv_fromUChars(cnv, cs, sizeof(cs), invariantUChars, -1, &errorCode); 2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode)) { 2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ucnv_fromUChars(invariantUChars) failed - %s\n", u_errorName(errorCode)); 2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if(length!=sizeof(invariantChars)-1 || strcmp(cs, invariantChars)!=0) { 2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ucnv_fromUChars(invariantUChars) failed\n"); 2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=ucnv_toUChars(cnv, us, LENGTHOF(us), invariantChars, -1, &errorCode); 2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode)) { 2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ucnv_toUChars(invariantChars) failed - %s\n", u_errorName(errorCode)); 2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if(length!=LENGTHOF(invariantUChars)-1 || u_strcmp(us, invariantUChars)!=0) { 2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("ucnv_toUChars(invariantChars) failed\n"); 2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucnv_close(cnv); 2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* API tests */ 2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!uprv_isInvariantString(invariantChars, -1)) { 2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("uprv_isInvariantString(invariantChars) failed\n"); 2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!uprv_isInvariantUString(invariantUChars, -1)) { 2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("uprv_isInvariantUString(invariantUChars) failed\n"); 2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!uprv_isInvariantString(invariantChars+strlen(invariantChars), 1)) { 2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("uprv_isInvariantString(\"\\0\") failed\n"); 2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<(sizeof(variantChars)-1); ++i) { 2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(uprv_isInvariantString(variantChars+i, 1)) { 2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("uprv_isInvariantString(variantChars[%d]) failed\n", i); 2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(uprv_isInvariantUString(variantUChars+i, 1)) { 2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("uprv_isInvariantUString(variantUChars[%d]) failed\n", i); 2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<LENGTHOF(nonASCIIUChars); ++i) { 2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(uprv_isInvariantUString(nonASCIIUChars+i, 1)) { 2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("uprv_isInvariantUString(nonASCIIUChars[%d]) failed\n", i); 2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t getSign(int32_t n) { 2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(n<0) { 2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return -1; 2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if(n==0) { 2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 1; 2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void 3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTestCompareInvEbcdicAsAscii() { 3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const char *const invStrings[][2]={ 3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* invariant-character strings in ascending ASCII order */ 3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* EBCDIC native */ 3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { "", "" }, 3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { "\x6c", "%" }, 3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { "\xf0", "0" }, 3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { "\xf0\xf0", "00" }, 3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { "\xf0\xf0\x81", "00a" }, 3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { "\x7e", "=" }, 3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { "\xc1", "A" }, 3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { "\xc1\xf0\xf0", "A00" }, 3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { "\xc1\xf0\xf0", "A00" }, 3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { "\xc1\xc1", "AA" }, 3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { "\xc1\xc1\xf0", "AA0" }, 3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { "\x6d", "_" }, 3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { "\x81", "a" }, 3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { "\x81\xf0\xf0", "a00" }, 3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { "\x81\xf0\xf0", "a00" }, 3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { "\x81\x81", "aa" }, 3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { "\x81\x81\xf0", "aa0" }, 3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { "\x81\x81\x81", "aaa" }, 3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { "\x81\x81\x82", "aab" } 3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i; 3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=1; i<LENGTHOF(invStrings); ++i) { 3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t diff1, diff2; 3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* compare previous vs. current */ 3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org diff1=getSign(uprv_compareInvEbcdicAsAscii(invStrings[i-1][0], invStrings[i][0])); 3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(diff1>0 || (diff1==0 && 0!=uprv_strcmp(invStrings[i-1][0], invStrings[i][0]))) { 3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("uprv_compareInvEbcdicAsAscii(%s, %s)=%hd is wrong\n", 3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org invStrings[i-1][1], invStrings[i][1], (short)diff1); 3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* compare current vs. previous, should be inverse diff */ 3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org diff2=getSign(uprv_compareInvEbcdicAsAscii(invStrings[i][0], invStrings[i-1][0])); 3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(diff2!=-diff1) { 3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("uprv_compareInvEbcdicAsAscii(%s, %s)=%hd is wrong\n", 3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org invStrings[i][1], invStrings[i-1][1], (short)diff2); 3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 342