Index: source/test/cintltst/cucdtst.c |
diff --git a/source/test/cintltst/cucdtst.c b/source/test/cintltst/cucdtst.c |
index 75bbbe2559ee21ea2fc506c7f34a4ebdbac7a17a..b7ea2740440ccbb805ab1c25b764f0902cf43733 100644 |
--- a/source/test/cintltst/cucdtst.c |
+++ b/source/test/cintltst/cucdtst.c |
@@ -1,6 +1,6 @@ |
/******************************************************************** |
* COPYRIGHT: |
- * Copyright (c) 1997-2013, International Business Machines Corporation and |
+ * Copyright (c) 1997-2014, International Business Machines Corporation and |
* others. All Rights Reserved. |
********************************************************************/ |
/******************************************************************************* |
@@ -34,8 +34,7 @@ |
#include "usc_impl.h" |
#include "udatamem.h" /* for testing ucase_openBinary() */ |
#include "cucdapi.h" |
- |
-#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) |
+#include "cmemory.h" |
/* prototypes --------------------------------------------------------------- */ |
@@ -50,6 +49,7 @@ static void TestCodeUnit(void); |
static void TestCodePoint(void); |
static void TestCharLength(void); |
static void TestCharNames(void); |
+static void TestUCharFromNameUnderflow(void); |
static void TestMirroring(void); |
static void TestUScriptRunAPI(void); |
static void TestAdditionalProperties(void); |
@@ -104,7 +104,6 @@ parseUCDFile(const char *filename, |
/* test data ---------------------------------------------------------------- */ |
-static const UChar LAST_CHAR_CODE_IN_FILE = 0xFFFD; |
static const char tagStrings[] = "MnMcMeNdNlNoZsZlZpCcCfCsCoCnLuLlLtLmLoPcPdPsPePoSmScSkSoPiPf"; |
static const int32_t tagValues[] = |
{ |
@@ -185,6 +184,7 @@ void addUnicodeTest(TestNode** root) |
addTest(root, &TestControlPrint, "tsutil/cucdtst/TestControlPrint"); |
addTest(root, &TestIdentifier, "tsutil/cucdtst/TestIdentifier"); |
addTest(root, &TestCharNames, "tsutil/cucdtst/TestCharNames"); |
+ addTest(root, &TestUCharFromNameUnderflow, "tsutil/cucdtst/TestUCharFromNameUnderflow"); |
addTest(root, &TestMirroring, "tsutil/cucdtst/TestMirroring"); |
addTest(root, &TestUScriptCodeAPI, "tsutil/cucdtst/TestUScriptCodeAPI"); |
addTest(root, &TestHasScript, "tsutil/cucdtst/TestHasScript"); |
@@ -560,31 +560,31 @@ static void TestMisc() |
memset(icuVersion, 0, U_MAX_VERSION_STRING_LENGTH); |
- testSampleCharProps(u_isspace, "u_isspace", sampleSpaces, LENGTHOF(sampleSpaces), TRUE); |
- testSampleCharProps(u_isspace, "u_isspace", sampleNonSpaces, LENGTHOF(sampleNonSpaces), FALSE); |
+ testSampleCharProps(u_isspace, "u_isspace", sampleSpaces, UPRV_LENGTHOF(sampleSpaces), TRUE); |
+ testSampleCharProps(u_isspace, "u_isspace", sampleNonSpaces, UPRV_LENGTHOF(sampleNonSpaces), FALSE); |
testSampleCharProps(u_isJavaSpaceChar, "u_isJavaSpaceChar", |
- sampleSpaces, LENGTHOF(sampleSpaces), TRUE); |
+ sampleSpaces, UPRV_LENGTHOF(sampleSpaces), TRUE); |
testSampleCharProps(u_isJavaSpaceChar, "u_isJavaSpaceChar", |
- sampleNonSpaces, LENGTHOF(sampleNonSpaces), FALSE); |
+ sampleNonSpaces, UPRV_LENGTHOF(sampleNonSpaces), FALSE); |
testSampleCharProps(u_isWhitespace, "u_isWhitespace", |
- sampleWhiteSpaces, LENGTHOF(sampleWhiteSpaces), TRUE); |
+ sampleWhiteSpaces, UPRV_LENGTHOF(sampleWhiteSpaces), TRUE); |
testSampleCharProps(u_isWhitespace, "u_isWhitespace", |
- sampleNonWhiteSpaces, LENGTHOF(sampleNonWhiteSpaces), FALSE); |
+ sampleNonWhiteSpaces, UPRV_LENGTHOF(sampleNonWhiteSpaces), FALSE); |
testSampleCharProps(u_isdefined, "u_isdefined", |
- sampleDefined, LENGTHOF(sampleDefined), TRUE); |
+ sampleDefined, UPRV_LENGTHOF(sampleDefined), TRUE); |
testSampleCharProps(u_isdefined, "u_isdefined", |
- sampleUndefined, LENGTHOF(sampleUndefined), FALSE); |
+ sampleUndefined, UPRV_LENGTHOF(sampleUndefined), FALSE); |
- testSampleCharProps(u_isbase, "u_isbase", sampleBase, LENGTHOF(sampleBase), TRUE); |
- testSampleCharProps(u_isbase, "u_isbase", sampleNonBase, LENGTHOF(sampleNonBase), FALSE); |
+ testSampleCharProps(u_isbase, "u_isbase", sampleBase, UPRV_LENGTHOF(sampleBase), TRUE); |
+ testSampleCharProps(u_isbase, "u_isbase", sampleNonBase, UPRV_LENGTHOF(sampleNonBase), FALSE); |
- testSampleCharProps(u_isdigit, "u_isdigit", sampleDigits, LENGTHOF(sampleDigits), TRUE); |
- testSampleCharProps(u_isdigit, "u_isdigit", sampleNonDigits, LENGTHOF(sampleNonDigits), FALSE); |
+ testSampleCharProps(u_isdigit, "u_isdigit", sampleDigits, UPRV_LENGTHOF(sampleDigits), TRUE); |
+ testSampleCharProps(u_isdigit, "u_isdigit", sampleNonDigits, UPRV_LENGTHOF(sampleNonDigits), FALSE); |
- for (i = 0; i < LENGTHOF(sampleDigits); i++) { |
+ for (i = 0; i < UPRV_LENGTHOF(sampleDigits); i++) { |
if (u_charDigitValue(sampleDigits[i]) != sampleDigitValues[i]) { |
log_err("error: u_charDigitValue(U+04x)=%d != %d\n", |
sampleDigits[i], u_charDigitValue(sampleDigits[i]), sampleDigitValues[i]); |
@@ -722,7 +722,7 @@ static void TestMisc() |
{ 0xff3a, 37, -1 } |
}; |
- for(i=0; i<LENGTHOF(data); ++i) { |
+ for(i=0; i<UPRV_LENGTHOF(data); ++i) { |
if(u_digit(data[i].c, data[i].radix)!=data[i].value) { |
log_err("u_digit(U+%04x, %d)=%d expected %d\n", |
data[i].c, |
@@ -823,7 +823,7 @@ TestPOSIX() { |
mask=1; |
for(cl=0; cl<12; ++cl) { |
- for(i=0; i<LENGTHOF(posixData); ++i) { |
+ for(i=0; i<UPRV_LENGTHOF(posixData); ++i) { |
expect=(UBool)((posixData[i].posixResults&mask)!=0); |
if(posixClasses[cl].fn(posixData[i].c)!=expect) { |
log_err("u_%s(U+%04x)=%s is wrong\n", |
@@ -843,13 +843,13 @@ static void TestControlPrint() |
const UChar32 sampleNonPrintable[] = {0x200c, 0x009f, 0x001b}; |
UChar32 c; |
- testSampleCharProps(u_iscntrl, "u_iscntrl", sampleControl, LENGTHOF(sampleControl), TRUE); |
- testSampleCharProps(u_iscntrl, "u_iscntrl", sampleNonControl, LENGTHOF(sampleNonControl), FALSE); |
+ testSampleCharProps(u_iscntrl, "u_iscntrl", sampleControl, UPRV_LENGTHOF(sampleControl), TRUE); |
+ testSampleCharProps(u_iscntrl, "u_iscntrl", sampleNonControl, UPRV_LENGTHOF(sampleNonControl), FALSE); |
testSampleCharProps(u_isprint, "u_isprint", |
- samplePrintable, LENGTHOF(samplePrintable), TRUE); |
+ samplePrintable, UPRV_LENGTHOF(samplePrintable), TRUE); |
testSampleCharProps(u_isprint, "u_isprint", |
- sampleNonPrintable, LENGTHOF(sampleNonPrintable), FALSE); |
+ sampleNonPrintable, UPRV_LENGTHOF(sampleNonPrintable), FALSE); |
/* test all ISO 8 controls */ |
for(c=0; c<=0x9f; ++c) { |
@@ -897,37 +897,37 @@ static void TestIdentifier() |
const UChar32 sampleNonIDIgnore[] = {0x0075, 0x00a3, 0x0061}; |
testSampleCharProps(u_isJavaIDStart, "u_isJavaIDStart", |
- sampleJavaIDStart, LENGTHOF(sampleJavaIDStart), TRUE); |
+ sampleJavaIDStart, UPRV_LENGTHOF(sampleJavaIDStart), TRUE); |
testSampleCharProps(u_isJavaIDStart, "u_isJavaIDStart", |
- sampleNonJavaIDStart, LENGTHOF(sampleNonJavaIDStart), FALSE); |
+ sampleNonJavaIDStart, UPRV_LENGTHOF(sampleNonJavaIDStart), FALSE); |
testSampleCharProps(u_isJavaIDPart, "u_isJavaIDPart", |
- sampleJavaIDPart, LENGTHOF(sampleJavaIDPart), TRUE); |
+ sampleJavaIDPart, UPRV_LENGTHOF(sampleJavaIDPart), TRUE); |
testSampleCharProps(u_isJavaIDPart, "u_isJavaIDPart", |
- sampleNonJavaIDPart, LENGTHOF(sampleNonJavaIDPart), FALSE); |
+ sampleNonJavaIDPart, UPRV_LENGTHOF(sampleNonJavaIDPart), FALSE); |
/* IDPart should imply IDStart */ |
testSampleCharProps(u_isJavaIDPart, "u_isJavaIDPart", |
- sampleJavaIDStart, LENGTHOF(sampleJavaIDStart), TRUE); |
+ sampleJavaIDStart, UPRV_LENGTHOF(sampleJavaIDStart), TRUE); |
testSampleCharProps(u_isIDStart, "u_isIDStart", |
- sampleUnicodeIDStart, LENGTHOF(sampleUnicodeIDStart), TRUE); |
+ sampleUnicodeIDStart, UPRV_LENGTHOF(sampleUnicodeIDStart), TRUE); |
testSampleCharProps(u_isIDStart, "u_isIDStart", |
- sampleNonUnicodeIDStart, LENGTHOF(sampleNonUnicodeIDStart), FALSE); |
+ sampleNonUnicodeIDStart, UPRV_LENGTHOF(sampleNonUnicodeIDStart), FALSE); |
testSampleCharProps(u_isIDPart, "u_isIDPart", |
- sampleUnicodeIDPart, LENGTHOF(sampleUnicodeIDPart), TRUE); |
+ sampleUnicodeIDPart, UPRV_LENGTHOF(sampleUnicodeIDPart), TRUE); |
testSampleCharProps(u_isIDPart, "u_isIDPart", |
- sampleNonUnicodeIDPart, LENGTHOF(sampleNonUnicodeIDPart), FALSE); |
+ sampleNonUnicodeIDPart, UPRV_LENGTHOF(sampleNonUnicodeIDPart), FALSE); |
/* IDPart should imply IDStart */ |
testSampleCharProps(u_isIDPart, "u_isIDPart", |
- sampleUnicodeIDStart, LENGTHOF(sampleUnicodeIDStart), TRUE); |
+ sampleUnicodeIDStart, UPRV_LENGTHOF(sampleUnicodeIDStart), TRUE); |
testSampleCharProps(u_isIDIgnorable, "u_isIDIgnorable", |
- sampleIDIgnore, LENGTHOF(sampleIDIgnore), TRUE); |
+ sampleIDIgnore, UPRV_LENGTHOF(sampleIDIgnore), TRUE); |
testSampleCharProps(u_isIDIgnorable, "u_isIDIgnorable", |
- sampleNonIDIgnore, LENGTHOF(sampleNonIDIgnore), FALSE); |
+ sampleNonIDIgnore, UPRV_LENGTHOF(sampleNonIDIgnore), FALSE); |
} |
/* for each line of UnicodeData.txt, check some of the properties */ |
@@ -1189,7 +1189,7 @@ enumTypeRange(const void *context, UChar32 start, UChar32 limit, UCharCategory t |
return FALSE; |
} |
- count=LENGTHOF(test); |
+ count=UPRV_LENGTHOF(test); |
for(i=0; i<count; ++i) { |
if(start<=test[i][0] && test[i][0]<limit) { |
if(type!=(UCharCategory)test[i][1]) { |
@@ -1278,7 +1278,7 @@ enumDefaultsRange(const void *context, UChar32 start, UChar32 limit, UCharCatego |
if(type==U_UNASSIGNED || type==U_PRIVATE_USE_CHAR) { |
/* enumerate the intersections of defaultBidi ranges with [start..limit[ */ |
c=start; |
- for(i=0; i<LENGTHOF(defaultBidi) && c<limit; ++i) { |
+ for(i=0; i<UPRV_LENGTHOF(defaultBidi) && c<limit; ++i) { |
if((int32_t)c<defaultBidi[i][0]) { |
while(c<limit && (int32_t)c<defaultBidi[i][0]) { |
if(U_IS_UNICODE_NONCHAR(c) || u_hasBinaryProperty(c, UCHAR_DEFAULT_IGNORABLE_CODE_POINT)) { |
@@ -1939,6 +1939,35 @@ TestCharNames() { |
/* ### TODO: test error cases and other interesting things */ |
} |
+static void |
+TestUCharFromNameUnderflow() { |
+ // Ticket #10889: Underflow crash when there is no dash. |
+ UErrorCode errorCode=U_ZERO_ERROR; |
+ UChar32 c=u_charFromName(U_EXTENDED_CHAR_NAME, "<NO BREAK SPACE>", &errorCode); |
+ if(U_SUCCESS(errorCode)) { |
+ log_err("u_charFromName(<NO BREAK SPACE>) = U+%04x but should fail - %s\n", c, u_errorName(errorCode)); |
+ } |
+ |
+ // Test related edge cases. |
+ errorCode=U_ZERO_ERROR; |
+ c=u_charFromName(U_EXTENDED_CHAR_NAME, "<-00a0>", &errorCode); |
+ if(U_SUCCESS(errorCode)) { |
+ log_err("u_charFromName(<-00a0>) = U+%04x but should fail - %s\n", c, u_errorName(errorCode)); |
+ } |
+ |
+ errorCode=U_ZERO_ERROR; |
+ c=u_charFromName(U_EXTENDED_CHAR_NAME, "<control->", &errorCode); |
+ if(U_SUCCESS(errorCode)) { |
+ log_err("u_charFromName(<control->) = U+%04x but should fail - %s\n", c, u_errorName(errorCode)); |
+ } |
+ |
+ errorCode=U_ZERO_ERROR; |
+ c=u_charFromName(U_EXTENDED_CHAR_NAME, "<control-111111>", &errorCode); |
+ if(U_SUCCESS(errorCode)) { |
+ log_err("u_charFromName(<control-111111>) = U+%04x but should fail - %s\n", c, u_errorName(errorCode)); |
+ } |
+} |
+ |
/* test u_isMirrored() and u_charMirror() ----------------------------------- */ |
static void |
@@ -2077,11 +2106,11 @@ TestUScriptRunAPI() |
const RunTestData *testData; |
int32_t nRuns; |
} testDataEntries[] = { |
- {testData1, LENGTHOF(testData1)}, |
- {testData2, LENGTHOF(testData2)} |
+ {testData1, UPRV_LENGTHOF(testData1)}, |
+ {testData2, UPRV_LENGTHOF(testData2)} |
}; |
- static const int32_t nTestEntries = LENGTHOF(testDataEntries); |
+ static const int32_t nTestEntries = UPRV_LENGTHOF(testDataEntries); |
int32_t testEntry; |
for (testEntry = 0; testEntry < nTestEntries; testEntry += 1) { |
@@ -2426,8 +2455,7 @@ TestAdditionalProperties() { |
{ 0x10909, UCHAR_BIDI_CLASS, U_RIGHT_TO_LEFT }, |
{ 0x10fe4, UCHAR_BIDI_CLASS, U_RIGHT_TO_LEFT }, |
- { 0x0605, UCHAR_BIDI_CLASS, U_RIGHT_TO_LEFT_ARABIC }, |
- { 0x061c, UCHAR_BIDI_CLASS, U_RIGHT_TO_LEFT_ARABIC }, |
+ { 0x061d, UCHAR_BIDI_CLASS, U_RIGHT_TO_LEFT_ARABIC }, |
{ 0x063f, UCHAR_BIDI_CLASS, U_RIGHT_TO_LEFT_ARABIC }, |
{ 0x070e, UCHAR_BIDI_CLASS, U_RIGHT_TO_LEFT_ARABIC }, |
{ 0x0775, UCHAR_BIDI_CLASS, U_RIGHT_TO_LEFT_ARABIC }, |
@@ -2440,7 +2468,7 @@ TestAdditionalProperties() { |
{ 0x155A, UCHAR_BLOCK, UBLOCK_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS }, |
{ 0x1717, UCHAR_BLOCK, UBLOCK_TAGALOG }, |
{ 0x1900, UCHAR_BLOCK, UBLOCK_LIMBU }, |
- { 0x1AFF, UCHAR_BLOCK, UBLOCK_NO_BLOCK }, |
+ { 0x1CBF, UCHAR_BLOCK, UBLOCK_NO_BLOCK }, |
{ 0x3040, UCHAR_BLOCK, UBLOCK_HIRAGANA }, |
{ 0x1D0FF, UCHAR_BLOCK, UBLOCK_BYZANTINE_MUSICAL_SYMBOLS }, |
{ 0x50000, UCHAR_BLOCK, UBLOCK_NO_BLOCK }, |
@@ -2648,6 +2676,15 @@ TestAdditionalProperties() { |
{ 0xFF5B, UCHAR_BIDI_PAIRED_BRACKET_TYPE, U_BPT_OPEN }, |
{ 0xFF5D, UCHAR_BIDI_PAIRED_BRACKET_TYPE, U_BPT_CLOSE }, |
+ { -1, 0x700, 0 }, /* version break for Unicode 7.0 */ |
+ |
+ /* new character range with Joining_Group values */ |
+ { 0x10ABF, UCHAR_JOINING_GROUP, U_JG_NO_JOINING_GROUP }, |
+ { 0x10AC0, UCHAR_JOINING_GROUP, U_JG_MANICHAEAN_ALEPH }, |
+ { 0x10AC1, UCHAR_JOINING_GROUP, U_JG_MANICHAEAN_BETH }, |
+ { 0x10AEF, UCHAR_JOINING_GROUP, U_JG_MANICHAEAN_HUNDRED }, |
+ { 0x10AF0, UCHAR_JOINING_GROUP, U_JG_NO_JOINING_GROUP }, |
+ |
/* undefined UProperty values */ |
{ 0x61, 0x4a7, 0 }, |
{ 0x234bc, 0x15ed, 0 } |
@@ -2880,7 +2917,7 @@ TestNumericProperties(void) { |
UChar32 c; |
int32_t i, type; |
- for(i=0; i<LENGTHOF(values); ++i) { |
+ for(i=0; i<UPRV_LENGTHOF(values); ++i) { |
c=values[i].c; |
type=u_getIntPropertyValue(c, UCHAR_NUMERIC_TYPE); |
nv=u_getNumericValue(c); |
@@ -3068,7 +3105,7 @@ TestConsistency() { |
U_STRING_DECL(mathBlocksPattern, |
"[[:block=Mathematical Operators:][:block=Miscellaneous Mathematical Symbols-A:][:block=Miscellaneous Mathematical Symbols-B:][:block=Supplemental Mathematical Operators:][:block=Mathematical Alphanumeric Symbols:]]", |
- 1+32+46+46+45+43+1+1); /* +1 for NUL */ |
+ 214); |
U_STRING_DECL(mathPattern, "[:Math:]", 8); |
U_STRING_DECL(unassignedPattern, "[:Cn:]", 6); |
U_STRING_DECL(unknownPattern, "[:sc=Unknown:]", 14); |
@@ -3082,7 +3119,7 @@ TestConsistency() { |
U_STRING_INIT(mathBlocksPattern, |
"[[:block=Mathematical Operators:][:block=Miscellaneous Mathematical Symbols-A:][:block=Miscellaneous Mathematical Symbols-B:][:block=Supplemental Mathematical Operators:][:block=Mathematical Alphanumeric Symbols:]]", |
- 1+32+46+46+45+43+1+1); /* +1 for NUL */ |
+ 214); |
U_STRING_INIT(mathPattern, "[:Math:]", 8); |
U_STRING_INIT(unassignedPattern, "[:Cn:]", 6); |
U_STRING_INIT(unknownPattern, "[:sc=Unknown:]", 14); |
@@ -3327,7 +3364,7 @@ testFold(UChar32 c, int which, |
log_err("u_foldCase(U+%04lx, default)=U+%04lx != U+%04lx\n", (long)c, (long)c2, (long)simple); |
} |
if((which&CF_FULL)!=0) { |
- length2=u_strFoldCase(t, LENGTHOF(t), s, length, 0, &errorCode); |
+ length2=u_strFoldCase(t, UPRV_LENGTHOF(t), s, length, 0, &errorCode); |
if(length2!=fullLength || 0!=u_memcmp(t, full, fullLength)) { |
log_err("u_strFoldCase(U+%04lx, default) does not fold properly\n", (long)c); |
} |
@@ -3337,7 +3374,7 @@ testFold(UChar32 c, int which, |
log_err("u_foldCase(U+%04lx, turkic)=U+%04lx != U+%04lx\n", (long)c, (long)c2, (long)simple); |
} |
- length2=u_strFoldCase(t, LENGTHOF(t), s, length, U_FOLD_CASE_EXCLUDE_SPECIAL_I, &errorCode); |
+ length2=u_strFoldCase(t, UPRV_LENGTHOF(t), s, length, U_FOLD_CASE_EXCLUDE_SPECIAL_I, &errorCode); |
if(length2!=turkicFullLength || 0!=u_memcmp(t, turkicFull, length2)) { |
log_err("u_strFoldCase(U+%04lx, turkic) does not fold properly\n", (long)c); |
} |