X-Git-Url: https://git.saurik.com/apple/icu.git/blobdiff_plain/374ca955a76ecab1204ca8bfa63ff9238d998416..4388f060552cc537e71e957d32f35e9d75a61233:/icuSources/test/intltest/tscoll.cpp diff --git a/icuSources/test/intltest/tscoll.cpp b/icuSources/test/intltest/tscoll.cpp index c01aaa11..872a78b9 100644 --- a/icuSources/test/intltest/tscoll.cpp +++ b/icuSources/test/intltest/tscoll.cpp @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2004, International Business Machines Corporation and + * Copyright (c) 1997-2011, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -19,6 +19,7 @@ #if !UCONFIG_NO_COLLATION +#include "unicode/localpointer.h" #include "unicode/uchar.h" #include "unicode/ustring.h" @@ -27,7 +28,6 @@ #include "encoll.h" #include "frcoll.h" #include "decoll.h" -#include "dacoll.h" #include "escoll.h" #include "ficoll.h" #include "jacoll.h" @@ -39,16 +39,21 @@ #include "regcoll.h" #include "currcoll.h" #include "itercoll.h" -//#include "capicoll.h" // CollationCAPITest #include "tstnorm.h" #include "normconf.h" #include "thcoll.h" #include "srchtest.h" +#include "ssearch.h" #include "cntabcol.h" #include "lcukocol.h" #include "ucaconf.h" #include "svccoll.h" #include "cmemory.h" +#include "alphaindextst.h" +//#include "rndmcoll.h" + +// Set to 1 to test offsets in backAndForth() +#define TEST_OFFSETS 0 #define TESTCLASS(n,classname) \ case n: \ @@ -85,14 +90,18 @@ void IntlTestCollator::runIndexedTest( int32_t index, UBool exec, const char* &n TESTCLASS(14, LotusCollationKoreanTest); TESTCLASS(15, StringSearchTest); TESTCLASS(16, ContractionTableTest); +#if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION TESTCLASS(17, DataDrivenCollatorTest); +#endif TESTCLASS(18, UCAConformanceTest); TESTCLASS(19, CollationServiceTest); - - //TESTCLASS(n, CollationDanishTest); // removed by weiv - we have changed Danish collation TESTCLASS(20, CollationFinnishTest); // removed by weiv - we have changed Finnish collation - //TESTCLASS(n, CollationCAPITest); - + //TESTCLASS(21, RandomCollatorTest); // See ticket 5747 about reenabling this test. + TESTCLASS(21, SSearchTest); +#if !UCONFIG_NO_COLLATION && !UCONFIG_NO_NORMALIZATION + TESTCLASS(22, AlphabeticIndexTest); +#endif + default: name = ""; break; } } @@ -157,7 +166,7 @@ IntlTestCollator::doTestVariant(Collator* col, const UnicodeString &source, cons const UChar* trg = target.getBuffer(); UCollationResult compareResultIter = (UCollationResult)result; - if(1) { + { UCharIterator sIter, tIter; uiter_setString(&sIter, src, sLen); uiter_setString(&tIter, trg, tLen); @@ -205,7 +214,7 @@ IntlTestCollator::doTestVariant(Collator* col, const UnicodeString &source, cons } /* testing the partial sortkeys */ - if(1) { /*!QUICK*/ + { /*!QUICK*/ int32_t partialSizes[] = { 3, 1, 2, 4, 8, 20, 80 }; /* just size 3 in the quick mode */ int32_t partialSizesSize = 1; if(!quick) { @@ -261,13 +270,12 @@ IntlTestCollator::doTest(Collator* col, const UnicodeString &source, const Unico } UErrorCode status = U_ZERO_ERROR; - CollationElementIterator* c = ((RuleBasedCollator *)col)->createCollationElementIterator( source ); + LocalPointer c(((RuleBasedCollator *)col)->createCollationElementIterator(source)); logln("Testing iterating source: "+source); backAndForth(*c); c->setText(target, status); logln("Testing iterating target: "+target); backAndForth(*c); - delete c; } } @@ -382,8 +390,10 @@ UnicodeString &IntlTestCollator::prettify(const CollationKey &source, UnicodeStr for (i = 0; i < byteCount; i += 1) { + if (i != 0) { + target += " "; + } appendHex(bytes[i], 2, target); - target += " "; } target += "]"; @@ -395,7 +405,7 @@ void IntlTestCollator::backAndForth(CollationElementIterator &iter) { // Run through the iterator forwards and stick it into an array int32_t orderLength = 0; - int32_t *orders = getOrders(iter, orderLength); + LocalArray orders(getOrders(iter, orderLength)); UErrorCode status = U_ZERO_ERROR; // Now go through it backwards and make sure we get the same values @@ -407,6 +417,8 @@ void IntlTestCollator::backAndForth(CollationElementIterator &iter) while ((o = iter.previous(status)) != CollationElementIterator::NULLORDER) { + /*int32_t offset = */iter.getOffset(); + if (index == 0) { if(o == 0) { continue; @@ -414,28 +426,39 @@ void IntlTestCollator::backAndForth(CollationElementIterator &iter) // going backwards errln("Backward iteration returned a non ignorable after orders are exhausted"); break; + } } - } - if (o != orders[--index]) - { + + index -= 1; + if (o != orders[index].order) { if (o == 0) - index ++; - else - { - while (index > 0 && orders[--index] == 0) - { + index += 1; + else { + while (index > 0 && orders[--index].order == 0) { + // nothing... } - if (o != orders[index]) - { - errln("Mismatch at index %d: 0x%X vs 0x%X", index, - orders[index], o); - break; + + if (o != orders[index].order) { + errln("Mismatched order at index %d: 0x%0:8X vs. 0x%0:8X", index, + orders[index].order, o); + //break; + return; } } } + +#if TEST_OFFSETS + if (offset != orders[index].offset) { + errln("Mismatched offset at index %d: %d vs. %d", index, + orders[index].offset, offset); + //break; + return; + } +#endif + } - while (index != 0 && orders[index - 1] == 0) + while (index != 0 && orders[index - 1].order == 0) { index --; } @@ -468,8 +491,6 @@ void IntlTestCollator::backAndForth(CollationElementIterator &iter) } errln(""); } - - delete[] orders; } @@ -477,12 +498,13 @@ void IntlTestCollator::backAndForth(CollationElementIterator &iter) * Return an integer array containing all of the collation orders * returned by calls to next on the specified iterator */ -int32_t *IntlTestCollator::getOrders(CollationElementIterator &iter, int32_t &orderLength) +IntlTestCollator::Order *IntlTestCollator::getOrders(CollationElementIterator &iter, int32_t &orderLength) { int32_t maxSize = 100; int32_t size = 0; - int32_t *orders = new int32_t[maxSize]; + LocalArray orders(new Order[maxSize]); UErrorCode status = U_ZERO_ERROR; + int32_t offset = iter.getOffset(); int32_t order; while ((order = iter.next(status)) != CollationElementIterator::NULLORDER) @@ -490,27 +512,29 @@ int32_t *IntlTestCollator::getOrders(CollationElementIterator &iter, int32_t &or if (size == maxSize) { maxSize *= 2; - int32_t *temp = new int32_t[maxSize]; + Order *temp = new Order[maxSize]; - uprv_memcpy(temp, orders, size * sizeof(int32_t)); - delete[] orders; - orders = temp; + uprv_memcpy(temp, orders.getAlias(), size * sizeof(Order)); + orders.adoptInstead(temp); } - orders[size++] = order; + orders[size].order = order; + orders[size].offset = offset; + + offset = iter.getOffset(); + size += 1; } if (maxSize > size) { - int32_t *temp = new int32_t[size]; + Order *temp = new Order[size]; - uprv_memcpy(temp, orders, size * sizeof(int32_t)); - delete[] orders; - orders = temp; + uprv_memcpy(temp, orders.getAlias(), size * sizeof(Order)); + orders.adoptInstead(temp); } orderLength = size; - return orders; + return orders.orphan(); } #endif /* #if !UCONFIG_NO_COLLATION */