/*
******************************************************************************
*
-* Copyright (C) 2002-2003, International Business Machines
+* Copyright (C) 2002-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
* Tests of ustring.h Unicode string API functions.
*/
-#include "unicode/utypes.h"
#include "unicode/ustring.h"
-#include "unicode/uloc.h"
#include "unicode/ucnv.h"
#include "unicode/uiter.h"
#include "cintltst.h"
-#include "cucdtst.h"
#include <string.h>
-#include <stdlib.h>
#define LENGTHOF(array) (sizeof(array)/sizeof((array)[0]))
static void TestCountChar32(void);
static void TestUCharIterator(void);
static void TestUNormIterator(void);
+static void TestBadUNormIterator(void);
void addUStringTest(TestNode** root);
addTest(root, &TestCountChar32, "tsutil/custrtst/TestCountChar32");
addTest(root, &TestUCharIterator, "tsutil/custrtst/TestUCharIterator");
addTest(root, &TestUNormIterator, "tsutil/custrtst/TestUNormIterator");
-
- /* cstrcase.c functions, declared in cucdtst.h */
- addTest(root, &TestCaseLower, "tsutil/custrtst/TestCaseLower");
- addTest(root, &TestCaseUpper, "tsutil/custrtst/TestCaseUpper");
-#if !UCONFIG_NO_BREAK_ITERATION
- addTest(root, &TestCaseTitle, "tsutil/custrtst/TestCaseTitle");
-#endif
- addTest(root, &TestCaseFolding, "tsutil/custrtst/TestCaseFolding");
- addTest(root, &TestCaseCompare, "tsutil/custrtst/TestCaseCompare");
+ addTest(root, &TestBadUNormIterator, "tsutil/custrtst/TestBadUNormIterator");
}
/* test data for TestStringFunctions ---------------------------------------- */
/* test nothing */
}
+static void
+TestBadUNormIterator(void) {
+ /* test nothing, as well */
+}
+
#else
#include "unicode/unorm.h"
UChar32 c1, c2;
UErrorCode errorCode;
+ /* code coverage for unorm_it.c/unormIteratorGetIndex() */
+ if(
+ iter2->getIndex(iter2, UITER_START)!=0 ||
+ iter2->getIndex(iter2, UITER_LENGTH)!=UITER_UNKNOWN_INDEX
+ ) {
+ log_err("UNormIterator.getIndex() failed\n");
+ }
+
/* set into the middle */
iter1->move(iter1, middle, UITER_ZERO);
iter2->move(iter2, middle, UITER_ZERO);
return;
}
+ /* iterate backward */
+ do {
+ c1=iter1->previous(iter1);
+ c2=iter2->previous(iter2);
+ if(c1!=c2) {
+ log_err("%s->previous()=U+%04x != U+%04x=%s->previous() at %d\n", n1, c1, c2, n2, iter1->getIndex(iter1, UITER_CURRENT));
+ return;
+ }
+ } while(c1>=0);
+
/* back to the middle */
iter1->move(iter1, middle, UITER_ZERO);
iter2->move(iter2, middle, UITER_ZERO);
static void
testUNormIteratorWithText(const UChar *text, int32_t textLength, int32_t middle,
const char *name1, const char *n2) {
- UChar buffer[300];
+ UChar buffer[600];
char name2[40];
UCharIterator iter1, iter2, *iter;
0x6e, 0xd900, 0x6a, 0xdc00, 0xd900, 0xdc00, 0x61
};
- UChar longText[300];
+ UChar longText[600];
int32_t i, middle, length;
length=LENGTHOF(text);
testUNormIteratorWithText(text, length, length, "UCharIterEnd", "UNormIterEnd1");
/* test again, this time with an insane string to cause internal buffer overflows */
- middle=u_strchr(text, 0x327)-text; /* see comment at text[] */
+ middle=(int32_t)(u_strchr(text, 0x327)-text); /* see comment at text[] */
memcpy(longText, text, middle*U_SIZEOF_UCHAR);
for(i=0; i<150; ++i) {
longText[middle+i]=0x30a; /* insert many rings between 'A-ring' and cedilla */
}
memcpy(longText+middle+i, text+middle, (LENGTHOF(text)-middle)*U_SIZEOF_UCHAR);
-
length=LENGTHOF(text)+i;
- testUNormIteratorWithText(longText, length, length/2, "UCharIterLong", "UNormIterLong1");
+
+ /* append another copy of this string for more overflows */
+ memcpy(longText+length, longText, length*U_SIZEOF_UCHAR);
+ length*=2;
+
+ /* the first test of the following two starts at length/4, inside the sea of combining rings */
+ testUNormIteratorWithText(longText, length, length/4, "UCharIterLong", "UNormIterLong1");
testUNormIteratorWithText(longText, length, length, "UCharIterLongEnd", "UNormIterLongEnd1");
length=LENGTHOF(surrogateText);
- testUNormIteratorWithText(surrogateText, length, length/2, "UCharIterSurr", "UNormIterSurr1");
+ testUNormIteratorWithText(surrogateText, length, length/4, "UCharIterSurr", "UNormIterSurr1");
testUNormIteratorWithText(surrogateText, length, length, "UCharIterSurrEnd", "UNormIterSurrEnd1");
}
+static void
+TestBadUNormIterator(void) {
+#if !UCONFIG_NO_NORMALIZATION
+ UErrorCode status = U_ILLEGAL_ESCAPE_SEQUENCE;
+ UNormIterator *uni;
+
+ unorm_setIter(NULL, NULL, UNORM_NONE, &status);
+ if (status != U_ILLEGAL_ESCAPE_SEQUENCE) {
+ log_err("unorm_setIter changed the error code to: %s\n", u_errorName(status));
+ }
+ status = U_ZERO_ERROR;
+ unorm_setIter(NULL, NULL, UNORM_NONE, &status);
+ if (status != U_ILLEGAL_ARGUMENT_ERROR) {
+ log_err("unorm_setIter didn't react correctly to bad arguments: %s\n", u_errorName(status));
+ }
+ status = U_ZERO_ERROR;
+ uni=unorm_openIter(NULL, 0, &status);
+ if(U_FAILURE(status)) {
+ log_err("unorm_openIter() fails: %s\n", u_errorName(status));
+ return;
+ }
+ unorm_setIter(uni, NULL, UNORM_NONE, &status);
+ unorm_closeIter(uni);
+#endif
+}
+
#endif