/******************************************************************** * COPYRIGHT: * Copyright (c) 1997-2001, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ //=============================================================================== // // File apitest.cpp // // // // Created by: Helena Shih // // Modification History: // // Date Name Description // 2/5/97 aliu Added streamIn and streamOut methods. Added // constructor which reads RuleBasedCollator object from // a binary file. Added writeToFile method which streams // RuleBasedCollator out to a binary file. The streamIn // and streamOut methods use istream and ostream objects // in binary mode. // 6/30/97 helena Added tests for CollationElementIterator::setText, getOffset // setOffset and DecompositionIterator::getOffset, setOffset. // DecompositionIterator is made public so add class scope // testing. // 02/10/98 damiba Added test for compare(UnicodeString&, UnicodeString&, int32_t) //=============================================================================== #include "unicode/coll.h" #include "unicode/tblcoll.h" #include "unicode/coleitr.h" #include "unicode/sortkey.h" #include "apicoll.h" #include "unicode/chariter.h" #include "unicode/schriter.h" #include "unicode/ustring.h" #include "sfwdchit.h" #include "cmemory.h" void CollationAPITest::doAssert(UBool condition, const char *message) { if (!condition) { errln(UnicodeString("ERROR : ") + message); } } /* * Test Collator::createInstance(... version...) for some locale. Called by TestProperty(). */ static void TestOpenVersion(IntlTest &test, const Locale &locale) { UVersionInfo version1, version2; Collator *collator1, *collator2; UErrorCode errorCode; errorCode=U_ZERO_ERROR; collator1=Collator::createInstance(locale, errorCode); if(U_SUCCESS(errorCode)) { /* get the current version */ collator1->getVersion(version1); delete collator1; /* try to get that same version again */ collator2=Collator::createInstance(locale, version1, errorCode); if(U_SUCCESS(errorCode)) { collator2->getVersion(version2); if(0!=uprv_memcmp(version1, version2, sizeof(UVersionInfo))) { test.errln("error: Collator::createInstance(\"%s\", (%s collator)->getVersion()) returns a different collator\n", locale.getName(), locale.getName()); } delete collator2; } else { test.errln("error: Collator::createInstance(\"%s\", (%s collator)->getVersion()) fails: %s\n", locale.getName(), locale.getName(), u_errorName(errorCode)); } } } // Collator Class Properties // ctor, dtor, createInstance, compare, getStrength/setStrength // getDecomposition/setDecomposition, getDisplayName void CollationAPITest::TestProperty(/* char* par */) { UErrorCode success = U_ZERO_ERROR; Collator *col = 0; UVersionInfo minVersionArray = {0x01, 0x00, 0x00, 0x00}; UVersionInfo maxVersionArray = {0x01, 0x09, 0x09, 0x09}; UVersionInfo versionArray; int i = 0; logln("The property tests begin : "); logln("Test ctors : "); col = Collator::createInstance(Locale::ENGLISH, success); if (U_FAILURE(success)) { errln("Default Collator creation failed."); return; } col->getVersion(versionArray); for (i=0; i<4; ++i) { if (versionArray[i] < minVersionArray[i] || versionArray[i] > maxVersionArray[i]) { errln("Testing Collator::getVersion() failed - unexpected result received"); break; } } doAssert((col->compare("ab", "abc") == Collator::LESS), "ab < abc comparison failed"); doAssert((col->compare("ab", "AB") == Collator::LESS), "ab < AB comparison failed"); doAssert((col->compare("blackbird", "black-bird") == Collator::GREATER), "black-bird > blackbird comparison failed"); doAssert((col->compare("black bird", "black-bird") == Collator::LESS), "black bird > black-bird comparison failed"); doAssert((col->compare("Hello", "hello") == Collator::GREATER), "Hello > hello comparison failed"); /*start of update [Bertrand A. D. 02/10/98]*/ doAssert((col->compare("ab", "abc", 2) == Collator::EQUAL), "ab = abc with length 2 comparison failed"); doAssert((col->compare("ab", "AB", 2) == Collator::LESS), "ab < AB with length 2 comparison failed"); doAssert((col->compare("ab", "Aa", 1) == Collator::LESS), "ab < Aa with length 1 comparison failed"); doAssert((col->compare("ab", "Aa", 2) == Collator::GREATER), "ab > Aa with length 2 comparison failed"); doAssert((col->compare("black-bird", "blackbird", 5) == Collator::EQUAL), "black-bird = blackbird with length of 5 comparison failed"); doAssert((col->compare("black bird", "black-bird", 10) == Collator::LESS), "black bird < black-bird with length 10 comparison failed"); doAssert((col->compare("Hello", "hello", 5) == Collator::GREATER), "Hello > hello with length 5 comparison failed"); /*end of update [Bertrand A. D. 02/10/98]*/ logln("Test ctors ends."); logln("testing Collator::getStrength() method ..."); doAssert((col->getStrength() == Collator::TERTIARY), "collation object has the wrong strength"); doAssert((col->getStrength() != Collator::PRIMARY), "collation object's strength is primary difference"); logln("testing Collator::setStrength() method ..."); col->setStrength(Collator::SECONDARY); doAssert((col->getStrength() != Collator::TERTIARY), "collation object's strength is secondary difference"); doAssert((col->getStrength() != Collator::PRIMARY), "collation object's strength is primary difference"); doAssert((col->getStrength() == Collator::SECONDARY), "collation object has the wrong strength"); logln("testing Collator::setDecomposition() method ..."); col->setDecomposition(Normalizer::NO_OP); doAssert((col->getDecomposition() != Normalizer::DECOMP), "collation object's strength is secondary difference"); doAssert((col->getDecomposition() != Normalizer::DECOMP_COMPAT), "collation object's strength is primary difference"); doAssert((col->getDecomposition() == Normalizer::NO_OP), "collation object has the wrong strength"); UnicodeString name; logln("Get display name for the US English collation in German : "); logln(Collator::getDisplayName(Locale::US, Locale::GERMAN, name)); doAssert((name == UnicodeString("Englisch (Vereinigte Staaten)")), "getDisplayName failed"); logln("Get display name for the US English collation in English : "); logln(Collator::getDisplayName(Locale::US, Locale::ENGLISH, name)); doAssert((name == UnicodeString("English (United States)")), "getDisplayName failed"); #if 0 // weiv : this test is bogus if we're running on any machine that has different default locale than English. // Therefore, it is banned! logln("Get display name for the US English in default locale language : "); logln(Collator::getDisplayName(Locale::US, name)); doAssert((name == UnicodeString("English (United States)")), "getDisplayName failed if this is an English machine"); #endif delete col; col = 0; RuleBasedCollator *rcol = (RuleBasedCollator *)Collator::createInstance("da_DK", success); doAssert(rcol->getRules().length() != 0, "da_DK rules does not have length 0"); delete rcol; col = Collator::createInstance(Locale::FRENCH, success); if (U_FAILURE(success)) { errln("Creating French collation failed."); return; } col->setStrength(Collator::PRIMARY); logln("testing Collator::getStrength() method again ..."); doAssert((col->getStrength() != Collator::TERTIARY), "collation object has the wrong strength"); doAssert((col->getStrength() == Collator::PRIMARY), "collation object's strength is not primary difference"); logln("testing French Collator::setStrength() method ..."); col->setStrength(Collator::TERTIARY); doAssert((col->getStrength() == Collator::TERTIARY), "collation object's strength is not tertiary difference"); doAssert((col->getStrength() != Collator::PRIMARY), "collation object's strength is primary difference"); doAssert((col->getStrength() != Collator::SECONDARY), "collation object's strength is secondary difference"); logln("Create junk collation: "); Locale abcd("ab", "CD", ""); success = U_ZERO_ERROR; Collator *junk = 0; junk = Collator::createInstance(abcd, success); if (U_FAILURE(success)) { errln("Junk collation creation failed, should at least return default."); delete col; return; } delete col; col = Collator::createInstance(success); if (U_FAILURE(success)) { errln("Creating default collator failed."); delete junk; return; } doAssert(((RuleBasedCollator *)col)->getRules() == ((RuleBasedCollator *)junk)->getRules(), "The default collation should be returned."); Collator *frCol = Collator::createInstance(Locale::FRANCE, success); if (U_FAILURE(success)) { errln("Creating French collator failed."); delete col; delete junk; return; } doAssert((*frCol != *junk), "The junk is the same as the French collator."); Collator *aFrCol = frCol->clone(); doAssert((*frCol == *aFrCol), "The cloning of a French collator failed."); logln("Collator property test ended."); delete col; delete frCol; delete aFrCol; delete junk; /* test Collator::createInstance(...version...) */ TestOpenVersion(*this, ""); TestOpenVersion(*this, "da"); TestOpenVersion(*this, "fr"); TestOpenVersion(*this, "ja"); /* try some bogus version */ versionArray[0]=0; versionArray[1]=0x99; versionArray[2]=0xc7; versionArray[3]=0xfe; col=Collator::createInstance(Locale(), versionArray, success); if(U_SUCCESS(success)) { errln("error: ucol_openVersion(bogus version) succeeded"); delete col; } } void CollationAPITest::TestRuleBasedColl() { RuleBasedCollator *col1, *col2, *col3, *col4; UErrorCode status = U_ZERO_ERROR; UnicodeString ruleset1("&9 < a, A < b, B < c, C; ch, cH, Ch, CH < d, D, e, E"); UnicodeString ruleset2("&9 < a, A < b, B < c, C < d, D, e, E"); col1 = new RuleBasedCollator(ruleset1, status); if (U_FAILURE(status)) { errln("RuleBased Collator creation failed.\n"); return; } else { logln("PASS: RuleBased Collator creation passed\n"); } status = U_ZERO_ERROR; col2 = new RuleBasedCollator(ruleset2, status); if (U_FAILURE(status)) { errln("RuleBased Collator creation failed.\n"); return; } else { logln("PASS: RuleBased Collator creation passed\n"); } status = U_ZERO_ERROR; Locale locale("aa", "AA"); col3 = (RuleBasedCollator *)Collator::createInstance(locale, status); if (U_FAILURE(status)) { errln("Fallback Collator creation failed.: %s\n"); return; } else { logln("PASS: Fallback Collator creation passed\n"); } delete col3; status = U_ZERO_ERROR; col3 = (RuleBasedCollator *)Collator::createInstance(status); if (U_FAILURE(status)) { errln("Default Collator creation failed.: %s\n"); return; } else { logln("PASS: Default Collator creation passed\n"); } UnicodeString rule1 = col1->getRules(); UnicodeString rule2 = col2->getRules(); UnicodeString rule3 = col3->getRules(); doAssert(rule1 != rule2, "Default collator getRules failed"); doAssert(rule2 != rule3, "Default collator getRules failed"); doAssert(rule1 != rule3, "Default collator getRules failed"); col4 = new RuleBasedCollator(rule2, status); if (U_FAILURE(status)) { errln("RuleBased Collator creation failed.\n"); return; } UnicodeString rule4 = col4->getRules(); doAssert(rule2 == rule4, "Default collator getRules failed"); int32_t length4 = 0; uint8_t *clonedrule4 = col4->cloneRuleData(length4, status); if (U_FAILURE(status)) { errln("Cloned rule data failed.\n"); return; } free(clonedrule4); delete col1; delete col2; delete col3; delete col4; } void CollationAPITest::TestDecomposition() { UErrorCode status = U_ZERO_ERROR; Collator *en_US = Collator::createInstance("en_US", status), *el_GR = Collator::createInstance("el_GR", status), *vi_VN = Collator::createInstance("vi_VN", status); if (U_FAILURE(status)) { errln("ERROR: collation creation failed.\n"); return; } /* there is no reason to have canonical decomposition in en_US OR default locale */ if (vi_VN->getDecomposition() != Normalizer::DECOMP) { errln("ERROR: vi_VN collation did not have cannonical decomposition for normalization!\n"); } if (el_GR->getDecomposition() != Normalizer::DECOMP) { errln("ERROR: el_GR collation did not have cannonical decomposition for normalization!\n"); } if (en_US->getDecomposition() != Normalizer::NO_OP) { errln("ERROR: en_US collation had cannonical decomposition for normalization!\n"); } delete en_US; delete el_GR; delete vi_VN; } void CollationAPITest::TestSafeClone() { static const int CLONETEST_COLLATOR_COUNT = 3; Collator *someCollators [CLONETEST_COLLATOR_COUNT]; Collator *col; UErrorCode err = U_ZERO_ERROR; int index; UnicodeString test1("abCda"); UnicodeString test2("abcda"); /* one default collator & two complex ones */ someCollators[0] = Collator::createInstance(err); someCollators[1] = Collator::createInstance("ko", err); someCollators[2] = Collator::createInstance("ja_JP", err); /* change orig & clone & make sure they are independent */ for (index = 0; index < CLONETEST_COLLATOR_COUNT; index++) { col = someCollators[index]->safeClone(); if (col == 0) { errln("SafeClone of collator should not return null\n"); break; } col->setStrength(Collator::TERTIARY); someCollators[index]->setStrength(Collator::PRIMARY); col->setAttribute(UCOL_CASE_LEVEL, UCOL_OFF, err); someCollators[index]->setAttribute(UCOL_CASE_LEVEL, UCOL_OFF, err); doAssert(col->greater(test1, test2), "Result should be \"abCda\" >>> \"abcda\" "); doAssert(someCollators[index]->equals(test1, test2), "Result should be \"abcda\" == \"abCda\""); delete col; delete someCollators[index]; } } void CollationAPITest::TestHashCode(/* char* par */) { logln("hashCode tests begin."); UErrorCode success = U_ZERO_ERROR; Collator *col1 = 0; col1 = Collator::createInstance(Locale::ENGLISH, success); if (U_FAILURE(success)) { errln("Default collation creation failed."); return; } Collator *col2 = 0; Locale dk("da", "DK", ""); col2 = Collator::createInstance(dk, success); if (U_FAILURE(success)) { errln("Danish collation creation failed."); return; } Collator *col3 = 0; col3 = Collator::createInstance(Locale::ENGLISH, success); if (U_FAILURE(success)) { errln("2nd default collation creation failed."); return; } logln("Collator::hashCode() testing ..."); doAssert(col1->hashCode() != col2->hashCode(), "Hash test1 result incorrect" ); doAssert(!(col1->hashCode() == col2->hashCode()), "Hash test2 result incorrect" ); doAssert(col1->hashCode() == col3->hashCode(), "Hash result not equal" ); logln("hashCode tests end."); delete col1; delete col2; UnicodeString test1("Abcda"); UnicodeString test2("abcda"); CollationKey sortk1, sortk2, sortk3; UErrorCode status = U_ZERO_ERROR; col3->getCollationKey(test1, sortk1, status); col3->getCollationKey(test2, sortk2, status); col3->getCollationKey(test2, sortk3, status); doAssert(sortk1.hashCode() != sortk2.hashCode(), "Hash test1 result incorrect"); doAssert(sortk2.hashCode() == sortk3.hashCode(), "Hash result not equal" ); delete col3; } //---------------------------------------------------------------------------- // CollationKey -- Tests the CollationKey methods // void CollationAPITest::TestCollationKey(/* char* par */) { logln("testing CollationKey begins..."); Collator *col = 0; UErrorCode success=U_ZERO_ERROR; col = Collator::createInstance(Locale::ENGLISH, success); col->setStrength(Collator::TERTIARY); if (U_FAILURE(success)) { errln("Default collation creation failed."); return; } CollationKey sortk1, sortk2; UnicodeString test1("Abcda"), test2("abcda"); UErrorCode key1Status = U_ZERO_ERROR, key2Status = U_ZERO_ERROR; logln("Testing weird arguments"); col->getCollationKey(NULL, 0, sortk1, key1Status); // key gets reset here int32_t length; sortk1.getByteArray(length); doAssert(sortk1.isBogus() == FALSE && length == 0, "Empty string should return an empty collation key"); // bogus key returned here key1Status = U_ILLEGAL_ARGUMENT_ERROR; col->getCollationKey(NULL, 0, sortk1, key1Status); doAssert(sortk1.getByteArray(length) == NULL && length == 0, "Error code should return bogus collation key"); key1Status = U_ZERO_ERROR; logln("Use tertiary comparison level testing ...."); col->getCollationKey(test1, sortk1, key1Status); doAssert((sortk1.compareTo(col->getCollationKey(test2, sortk2, key2Status))) == Collator::GREATER, "Result should be \"Abcda\" >>> \"abcda\""); CollationKey sortk3(sortk2), sortkNew, sortkEmpty; sortkNew = sortk1; doAssert((sortk1 != sortk2), "The sort keys should be different"); doAssert((sortk1.hashCode() != sortk2.hashCode()), "sort key hashCode() failed"); doAssert((sortk2 == sortk3), "The sort keys should be the same"); doAssert((sortk1 == sortkNew), "The sort keys assignment failed"); doAssert((sortk1.hashCode() == sortkNew.hashCode()), "sort key hashCode() failed"); doAssert((sortkNew != sortk3), "The sort keys should be different"); doAssert(sortk1.compareTo(sortk3) == Collator::GREATER, "Result should be \"Abcda\" >>> \"abcda\""); doAssert(sortk2.compareTo(sortk3) == Collator::EQUAL, "Result should be \"abcda\" == \"abcda\""); doAssert(sortkEmpty.compareTo(sortk1) == Collator::LESS, "Result should be (empty key) <<< \"Abcda\""); doAssert(sortk1.compareTo(sortkEmpty) == Collator::GREATER, "Result should be \"Abcda\" >>> (empty key)"); doAssert(sortkEmpty.compareTo(sortkEmpty) == Collator::EQUAL, "Result should be (empty key) == (empty key)"); int32_t cnt1, cnt2, cnt3, cnt4; uint8_t* byteArray1 = 0; byteArray1 = sortk1.toByteArray(cnt1); uint8_t* byteArray2 = 0; byteArray2 = sortk2.toByteArray(cnt2); /* this is a bad test since it is dependent on the version of uca data, which changes will remove it. const char sortk2_compat[] = { // this is a 1.8 sortkey 0x17, 0x19, 0x1B, 0x1D, 0x17, 0x01, 0x08, 0x01, 0x08, 0x00 }; */ const uint8_t* byteArray3 = 0; byteArray3 = sortk1.getByteArray(cnt3); const uint8_t* byteArray4 = 0; byteArray4 = sortk2.getByteArray(cnt4); CollationKey sortk4(byteArray1, cnt1), sortk5(byteArray2, cnt2); CollationKey sortk6(byteArray3, cnt3), sortk7(byteArray4, cnt4); /* doAssert(memcmp(byteArray2, sortk2_compat, strlen(sortk2_compat)) == 0, "Binary format for 'abcda' sortkey different!"); */ doAssert(sortk1.compareTo(sortk4) == Collator::EQUAL, "CollationKey::toByteArray(sortk1) Failed."); doAssert(sortk2.compareTo(sortk5) == Collator::EQUAL, "CollationKey::toByteArray(sortk2) Failed."); doAssert(sortk4.compareTo(sortk5) == Collator::GREATER, "sortk4 >>> sortk5 Failed"); doAssert(sortk1.compareTo(sortk6) == Collator::EQUAL, "CollationKey::getByteArray(sortk1) Failed."); doAssert(sortk2.compareTo(sortk7) == Collator::EQUAL, "CollationKey::getByteArray(sortk2) Failed."); doAssert(sortk6.compareTo(sortk7) == Collator::GREATER, "sortk6 >>> sortk7 Failed"); logln("Equality tests : "); doAssert(sortk1 == sortk4, "sortk1 == sortk4 Failed."); doAssert(sortk2 == sortk5, "sortk2 == sortk5 Failed."); doAssert(sortk1 != sortk5, "sortk1 != sortk5 Failed."); doAssert(sortk1 == sortk6, "sortk1 == sortk6 Failed."); doAssert(sortk2 == sortk7, "sortk2 == sortk7 Failed."); doAssert(sortk1 != sortk7, "sortk1 != sortk7 Failed."); delete [] byteArray1; byteArray1 = 0; delete [] byteArray2; byteArray2 = 0; sortk3 = sortk1; doAssert(sortk1 == sortk3, "sortk1 = sortk3 assignment Failed."); doAssert(sortk2 != sortk3, "sortk2 != sortk3 Failed."); logln("testing sortkey ends..."); col->setStrength(Collator::SECONDARY); doAssert(col->getCollationKey(test1, sortk1, key1Status).compareTo( col->getCollationKey(test2, sortk2, key2Status)) == Collator::EQUAL, "Result should be \"Abcda\" == \"abcda\""); delete col; } //---------------------------------------------------------------------------- // Tests the CollatorElementIterator class. // ctor, RuleBasedCollator::createCollationElementIterator(), operator==, operator!= // void CollationAPITest::TestElemIter(/* char* par */) { logln("testing sortkey begins..."); Collator *col = 0; UErrorCode success = U_ZERO_ERROR; col = Collator::createInstance(Locale::ENGLISH, success); if (U_FAILURE(success)) { errln("Default collation creation failed."); return; } UnicodeString testString1("XFILE What subset of all possible test cases has the highest probability of detecting the most errors?"); UnicodeString testString2("Xf_ile What subset of all possible test cases has the lowest probability of detecting the least errors?"); logln("Constructors and comparison testing...."); CollationElementIterator *iterator1 = ((RuleBasedCollator*)col)->createCollationElementIterator(testString1); CharacterIterator *chariter=new StringCharacterIterator(testString1); CollationElementIterator *coliter=((RuleBasedCollator*)col)->createCollationElementIterator(*chariter); // copy ctor CollationElementIterator *iterator2 = ((RuleBasedCollator*)col)->createCollationElementIterator(testString1); CollationElementIterator *iterator3 = ((RuleBasedCollator*)col)->createCollationElementIterator(testString2); UTextOffset offset = iterator1->getOffset(); if (offset != 0) { errln("Error in getOffset for collation element iterator\n"); return; } iterator1->setOffset(6, success); if (U_FAILURE(success)) { errln("Error in setOffset for collation element iterator\n"); return; } iterator1->setOffset(0, success); int32_t order1, order2, order3; doAssert((*iterator1 == *iterator2), "The two iterators should be the same"); doAssert((*iterator1 != *iterator3), "The two iterators should be different"); doAssert((*coliter == *iterator1), "The two iterators should be the same"); doAssert((*coliter == *iterator2), "The two iterators should be the same"); doAssert((*coliter != *iterator3), "The two iterators should be different"); order1 = iterator1->next(success); if (U_FAILURE(success)) { errln("Somehow ran out of memory stepping through the iterator."); return; } doAssert((*iterator1 != *iterator2), "The first iterator advance failed"); order2 = iterator2->getOffset(); doAssert((order1 != order2), "The order result should not be the same"); order2 = iterator2->next(success); if (U_FAILURE(success)) { errln("Somehow ran out of memory stepping through the iterator."); return; } doAssert((*iterator1 == *iterator2), "The second iterator advance failed"); doAssert((order1 == order2), "The order result should be the same"); order3 = iterator3->next(success); if (U_FAILURE(success)) { errln("Somehow ran out of memory stepping through the iterator."); return; } doAssert((CollationElementIterator::primaryOrder(order1) == CollationElementIterator::primaryOrder(order3)), "The primary orders should be the same"); doAssert((CollationElementIterator::secondaryOrder(order1) == CollationElementIterator::secondaryOrder(order3)), "The secondary orders should be the same"); doAssert((CollationElementIterator::tertiaryOrder(order1) == CollationElementIterator::tertiaryOrder(order3)), "The tertiary orders should be the same"); order1 = iterator1->next(success); order3 = iterator3->next(success); if (U_FAILURE(success)) { errln("Somehow ran out of memory stepping through the iterator."); return; } doAssert((CollationElementIterator::primaryOrder(order1) == CollationElementIterator::primaryOrder(order3)), "The primary orders should be identical"); doAssert((CollationElementIterator::tertiaryOrder(order1) != CollationElementIterator::tertiaryOrder(order3)), "The tertiary orders should be different"); order1 = iterator1->next(success); order3 = iterator3->next(success); doAssert((CollationElementIterator::secondaryOrder(order1) != CollationElementIterator::secondaryOrder(order3)), "The secondary orders should not be the same"); doAssert((order1 != CollationElementIterator::NULLORDER), "Unexpected end of iterator reached"); iterator1->reset(); iterator2->reset(); iterator3->reset(); order1 = iterator1->next(success); if (U_FAILURE(success)) { errln("Somehow ran out of memory stepping through the iterator."); return; } doAssert((*iterator1 != *iterator2), "The first iterator advance failed"); order2 = iterator2->next(success); if (U_FAILURE(success)) { errln("Somehow ran out of memory stepping through the iterator."); return; } doAssert((*iterator1 == *iterator2), "The second iterator advance failed"); doAssert((order1 == order2), "The order result should be the same"); order3 = iterator3->next(success); if (U_FAILURE(success)) { errln("Somehow ran out of memory stepping through the iterator."); return; } doAssert((CollationElementIterator::primaryOrder(order1) == CollationElementIterator::primaryOrder(order3)), "The primary orders should be the same"); doAssert((CollationElementIterator::secondaryOrder(order1) == CollationElementIterator::secondaryOrder(order3)), "The secondary orders should be the same"); doAssert((CollationElementIterator::tertiaryOrder(order1) == CollationElementIterator::tertiaryOrder(order3)), "The tertiary orders should be the same"); order1 = iterator1->next(success); order2 = iterator2->next(success); order3 = iterator3->next(success); if (U_FAILURE(success)) { errln("Somehow ran out of memory stepping through the iterator."); return; } doAssert((CollationElementIterator::primaryOrder(order1) == CollationElementIterator::primaryOrder(order3)), "The primary orders should be identical"); doAssert((CollationElementIterator::tertiaryOrder(order1) != CollationElementIterator::tertiaryOrder(order3)), "The tertiary orders should be different"); order1 = iterator1->next(success); order3 = iterator3->next(success); if (U_FAILURE(success)) { errln("Somehow ran out of memory stepping through the iterator."); return; } doAssert((CollationElementIterator::secondaryOrder(order1) != CollationElementIterator::secondaryOrder(order3)), "The secondary orders should not be the same"); doAssert((order1 != CollationElementIterator::NULLORDER), "Unexpected end of iterator reached"); doAssert((*iterator2 != *iterator3), "The iterators should be different"); //test error values success=U_UNSUPPORTED_ERROR; Collator *colerror=NULL; colerror=Collator::createInstance(Locale::ENGLISH, success); if (colerror != 0 || success == U_ZERO_ERROR){ errln("Error: createInstance(UErrorCode != U_ZERO_ERROR) should just return and not create an instance\n"); } int32_t position=coliter->previous(success); if(position != CollationElementIterator::NULLORDER){ errln((UnicodeString)"Expected NULLORDER got" + position); } coliter->reset(); coliter->setText(*chariter, success); if(!U_FAILURE(success)){ errln("Expeceted error"); } iterator1->setText((UnicodeString)"hello there", success); if(!U_FAILURE(success)){ errln("Expeceted error"); } delete chariter; delete coliter; delete iterator1; delete iterator2; delete iterator3; delete col; logln("testing CollationElementIterator ends..."); } // Test RuleBasedCollator ctor, dtor, operator==, operator!=, clone, copy, and getRules void CollationAPITest::TestOperators(/* char* par */) { UErrorCode success = U_ZERO_ERROR; UnicodeString ruleset1("< a, A < b, B < c, C; ch, cH, Ch, CH < d, D, e, E"); UnicodeString ruleset2("< a, A < b, B < c, C < d, D, e, E"); RuleBasedCollator *col1 = new RuleBasedCollator(ruleset1, success); if (U_FAILURE(success)) { errln("RuleBasedCollator creation failed."); return; } success = U_ZERO_ERROR; RuleBasedCollator *col2 = new RuleBasedCollator(ruleset2, success); if (U_FAILURE(success)) { errln("The RuleBasedCollator constructor failed when building with the 2nd rule set."); return; } logln("The operator tests begin : "); logln("testing operator==, operator!=, clone methods ..."); doAssert((*col1 != *col2), "The two different table collations compared equal"); *col1 = *col2; doAssert((*col1 == *col2), "Collator objects not equal after assignment (operator=)"); success = U_ZERO_ERROR; Collator *col3 = Collator::createInstance(Locale::ENGLISH, success); if (U_FAILURE(success)) { errln("Default collation creation failed."); return; } doAssert((*col1 != *col3), "The two different table collations compared equal"); Collator* col4 = col1->clone(); Collator* col5 = col3->clone(); doAssert((*col1 == *col4), "Cloned collation objects not equal"); doAssert((*col3 != *col4), "Two different table collations compared equal"); doAssert((*col3 == *col5), "Cloned collation objects not equal"); doAssert((*col4 != *col5), "Two cloned collations compared equal"); const UnicodeString& defRules = ((RuleBasedCollator*)col3)->getRules(); RuleBasedCollator* col6 = new RuleBasedCollator(defRules, success); if (U_FAILURE(success)) { errln("Creating default collation with rules failed."); return; } doAssert((((RuleBasedCollator*)col3)->getRules() == col6->getRules()), "Default collator getRules failed"); success = U_ZERO_ERROR; RuleBasedCollator *col7 = new RuleBasedCollator(ruleset2, Collator::TERTIARY, success); if (U_FAILURE(success)) { errln("The RuleBasedCollator constructor failed when building with the 2nd rule set with tertiary strength."); return; } success = U_ZERO_ERROR; RuleBasedCollator *col8 = new RuleBasedCollator(ruleset2, Normalizer::NO_OP, success); if (U_FAILURE(success)) { errln("The RuleBasedCollator constructor failed when building with the 2nd rule set with Normalizer::NO_OP."); return; } success = U_ZERO_ERROR; RuleBasedCollator *col9 = new RuleBasedCollator(ruleset2, Collator::PRIMARY, Normalizer::DECOMP_COMPAT, success); if (U_FAILURE(success)) { errln("The RuleBasedCollator constructor failed when building with the 2nd rule set with tertiary strength and Normalizer::NO_OP."); return; } // doAssert((*col7 == *col8), "The two equal table collations compared different"); doAssert((*col7 != *col9), "The two different table collations compared equal"); doAssert((*col8 != *col9), "The two different table collations compared equal"); logln("operator tests ended."); delete col1; delete col2; delete col3; delete col4; delete col5; delete col6; delete col7; delete col8; delete col9; } // test clone and copy void CollationAPITest::TestDuplicate(/* char* par */) { UErrorCode status = U_ZERO_ERROR; Collator *col1 = Collator::createInstance(Locale::ENGLISH, status); if (U_FAILURE(status)) { logln("Default collator creation failed."); return; } Collator *col2 = col1->clone(); doAssert((*col1 == *col2), "Cloned object is not equal to the orginal"); UnicodeString ruleset("< a, A < b, B < c, C < d, D, e, E"); RuleBasedCollator *col3 = new RuleBasedCollator(ruleset, status); doAssert((*col1 != *col3), "Cloned object is equal to some dummy"); *col3 = *((RuleBasedCollator*)col1); doAssert((*col1 == *col3), "Copied object is not equal to the orginal"); delete col1; delete col2; delete col3; } void CollationAPITest::TestCompare(/* char* par */) { logln("The compare tests begin : "); Collator *col = 0; UErrorCode success = U_ZERO_ERROR; col = Collator::createInstance(Locale::ENGLISH, success); if (U_FAILURE(success)) { errln("Default collation creation failed."); return; } UnicodeString test1("Abcda"), test2("abcda"); logln("Use tertiary comparison level testing ...."); doAssert((!col->equals(test1, test2) ), "Result should be \"Abcda\" != \"abcda\""); doAssert((col->greater(test1, test2) ), "Result should be \"Abcda\" >>> \"abcda\""); doAssert((col->greaterOrEqual(test1, test2) ), "Result should be \"Abcda\" >>> \"abcda\""); col->setStrength(Collator::SECONDARY); logln("Use secondary comparison level testing ...."); doAssert((col->equals(test1, test2) ), "Result should be \"Abcda\" == \"abcda\""); doAssert((!col->greater(test1, test2) ), "Result should be \"Abcda\" == \"abcda\""); doAssert((col->greaterOrEqual(test1, test2) ), "Result should be \"Abcda\" == \"abcda\""); col->setStrength(Collator::PRIMARY); logln("Use primary comparison level testing ...."); doAssert((col->equals(test1, test2) ), "Result should be \"Abcda\" == \"abcda\""); doAssert((!col->greater(test1, test2) ), "Result should be \"Abcda\" == \"abcda\""); doAssert((col->greaterOrEqual(test1, test2) ), "Result should be \"Abcda\" == \"abcda\""); logln("The compare tests end."); delete col; } void CollationAPITest::TestGetAll(/* char* par */) { int32_t count; const Locale* list = Collator::getAvailableLocales(count); for (int32_t i = 0; i < count; ++i) { UnicodeString locName, dispName; log("Locale name: "); log(list[i].getName()); log(" , the display name is : "); logln(list[i].getDisplayName(dispName)); } } void CollationAPITest::TestSortKey() { UErrorCode status = U_ZERO_ERROR; /* this is supposed to open default date format, but later on it treats it like it is "en_US" - very bad if you try to run the tests on machine where default locale is NOT "en_US" */ Collator *col = Collator::createInstance(Locale::ENGLISH, status); if (U_FAILURE(status)) { errln("ERROR: Default collation creation failed.: %s\n", u_errorName(status)); return; } if (col->getStrength() != Collator::TERTIARY) { errln("ERROR: default collation did not have UCOL_DEFAULT_STRENGTH !\n"); } /* Need to use identical strength */ col->setAttribute(UCOL_STRENGTH, UCOL_IDENTICAL, status); uint8_t key2compat[] = { /* 1.8.1 key.*/ 0x19, 0x1B, 0x1D, 0x1F, 0x19, 0x01, 0x0A, 0x01, 0x0A, 0x01, 0x92, 0x93, 0x94, 0x95, 0x92, 0x00 }; UChar test1[6] = {0x41, 0x62, 0x63, 0x64, 0x61, 0}, test2[6] = {0x61, 0x62, 0x63, 0x64, 0x61, 0}, test3[6] = {0x61, 0x62, 0x63, 0x64, 0x61, 0}; uint8_t sortkey1[64]; uint8_t sortkey2[64]; uint8_t sortkey3[64]; logln("Use tertiary comparison level testing ....\n"); CollationKey key1; col->getCollationKey(test1, u_strlen(test1), key1, status); CollationKey key2; col->getCollationKey(test2, u_strlen(test2), key2, status); CollationKey key3; col->getCollationKey(test3, u_strlen(test3), key3, status); doAssert(key1.compareTo(key2) == Collator::GREATER, "Result should be \"Abcda\" > \"abcda\""); doAssert(key2.compareTo(key1) == Collator::LESS, "Result should be \"abcda\" < \"Abcda\""); doAssert(key2.compareTo(key3) == Collator::EQUAL, "Result should be \"abcda\" == \"abcda\""); int32_t keylength = 0; doAssert(strcmp((const char *)(key2.getByteArray(keylength)), (const char *)key2compat) == 0, "Binary format for 'abcda' sortkey different!"); col->getSortKey(test1, sortkey1, 64); col->getSortKey(test2, sortkey2, 64); col->getSortKey(test3, sortkey3, 64); const uint8_t *tempkey = key1.getByteArray(keylength); doAssert(memcmp(tempkey, sortkey1, keylength) == 0, "Test1 string should have the same collation key and sort key"); tempkey = key2.getByteArray(keylength); doAssert(memcmp(tempkey, sortkey2, keylength) == 0, "Test2 string should have the same collation key and sort key"); tempkey = key3.getByteArray(keylength); doAssert(memcmp(tempkey, sortkey3, keylength) == 0, "Test3 string should have the same collation key and sort key"); col->getSortKey(test1, 5, sortkey1, 64); col->getSortKey(test2, 5, sortkey2, 64); col->getSortKey(test3, 5, sortkey3, 64); tempkey = key1.getByteArray(keylength); doAssert(memcmp(tempkey, sortkey1, keylength) == 0, "Test1 string should have the same collation key and sort key"); tempkey = key2.getByteArray(keylength); doAssert(memcmp(tempkey, sortkey2, keylength) == 0, "Test2 string should have the same collation key and sort key"); tempkey = key3.getByteArray(keylength); doAssert(memcmp(tempkey, sortkey3, keylength) == 0, "Test3 string should have the same collation key and sort key"); UnicodeString strtest1(test1); col->getSortKey(strtest1, sortkey1, 64); UnicodeString strtest2(test2); col->getSortKey(strtest2, sortkey2, 64); UnicodeString strtest3(test3); col->getSortKey(strtest3, sortkey3, 64); tempkey = key1.getByteArray(keylength); doAssert(memcmp(tempkey, sortkey1, keylength) == 0, "Test1 string should have the same collation key and sort key"); tempkey = key2.getByteArray(keylength); doAssert(memcmp(tempkey, sortkey2, keylength) == 0, "Test2 string should have the same collation key and sort key"); tempkey = key3.getByteArray(keylength); doAssert(memcmp(tempkey, sortkey3, keylength) == 0, "Test3 string should have the same collation key and sort key"); logln("Use secondary comparision level testing ...\n"); col->setStrength(Collator::SECONDARY); col->getCollationKey(test1, u_strlen(test1), key1, status); col->getCollationKey(test2, u_strlen(test2), key2, status); col->getCollationKey(test3, u_strlen(test3), key3, status); doAssert(key1.compareTo(key2) == Collator::EQUAL, "Result should be \"Abcda\" == \"abcda\""); doAssert(key2.compareTo(key3) == Collator::EQUAL, "Result should be \"abcda\" == \"abcda\""); tempkey = key2.getByteArray(keylength); doAssert(memcmp(tempkey, key2compat, keylength - 1) == 0, "Binary format for 'abcda' sortkey different!"); col->getSortKey(test1, sortkey1, 64); col->getSortKey(test2, sortkey2, 64); col->getSortKey(test3, sortkey3, 64); tempkey = key1.getByteArray(keylength); doAssert(memcmp(tempkey, sortkey1, keylength) == 0, "Test1 string should have the same collation key and sort key"); tempkey = key2.getByteArray(keylength); doAssert(memcmp(tempkey, sortkey2, keylength) == 0, "Test2 string should have the same collation key and sort key"); tempkey = key3.getByteArray(keylength); doAssert(memcmp(tempkey, sortkey3, keylength) == 0, "Test3 string should have the same collation key and sort key"); col->getSortKey(test1, 5, sortkey1, 64); col->getSortKey(test2, 5, sortkey2, 64); col->getSortKey(test3, 5, sortkey3, 64); tempkey = key1.getByteArray(keylength); doAssert(memcmp(tempkey, sortkey1, keylength) == 0, "Test1 string should have the same collation key and sort key"); tempkey = key2.getByteArray(keylength); doAssert(memcmp(tempkey, sortkey2, keylength) == 0, "Test2 string should have the same collation key and sort key"); tempkey = key3.getByteArray(keylength); doAssert(memcmp(tempkey, sortkey3, keylength) == 0, "Test3 string should have the same collation key and sort key"); col->getSortKey(strtest1, sortkey1, 64); col->getSortKey(strtest2, sortkey2, 64); col->getSortKey(strtest3, sortkey3, 64); tempkey = key1.getByteArray(keylength); doAssert(memcmp(tempkey, sortkey1, keylength) == 0, "Test1 string should have the same collation key and sort key"); tempkey = key2.getByteArray(keylength); doAssert(memcmp(tempkey, sortkey2, keylength) == 0, "Test2 string should have the same collation key and sort key"); tempkey = key3.getByteArray(keylength); doAssert(memcmp(tempkey, sortkey3, keylength) == 0, "Test3 string should have the same collation key and sort key"); logln("testing sortkey ends..."); delete col; } void CollationAPITest::TestMaxExpansion() { UErrorCode status = U_ZERO_ERROR; UChar ch = 0; UChar supplementary[2] = {0xD800, 0xDC00}; uint32_t sorder = 0; uint32_t temporder = 0; UnicodeString rule("&a < ab < c/aba < d < z < ch"); RuleBasedCollator coll(rule, status); UnicodeString str(ch); CollationElementIterator *iter = coll.createCollationElementIterator(str); while (ch < 0xFFFF && U_SUCCESS(status)) { int count = 1; uint32_t order; int32_t size = 0; ch ++; str.setCharAt(0, ch); iter->setText(str, status); order = iter->previous(status); /* thai management */ if (order == 0) order = iter->previous(status); while (U_SUCCESS(status) && ((uint32_t)iter->previous(status) != UCOL_NULLORDER)) { count ++; } size = coll.getMaxExpansion(order); if (U_FAILURE(status) || size < count) { errln("Failure at codepoint %d, maximum expansion count < %d\n", ch, count); } } /* testing for exact max expansion */ ch = 0; while (ch < 0x61) { uint32_t order; int32_t size; str.setCharAt(0, ch); iter->setText(str, status); order = iter->previous(status); size = coll.getMaxExpansion(order); if (U_FAILURE(status) || size != 1) { errln("Failure at codepoint %d, maximum expansion count < %d\n", ch, 1); } ch ++; } ch = 0x63; str.setTo(ch); iter->setText(str, status); temporder = iter->previous(status); if (U_FAILURE(status) || coll.getMaxExpansion(temporder) != 3) { errln("Failure at codepoint %d, maximum expansion count != %d\n", ch, 3); } ch = 0x64; str.setTo(ch); iter->setText(str, status); temporder = iter->previous(status); if (U_FAILURE(status) || coll.getMaxExpansion(temporder) != 1) { errln("Failure at codepoint %d, maximum expansion count != %d\n", ch, 3); } str.setTo(supplementary, 2); iter->setText(str, status); sorder = iter->previous(status); if (U_FAILURE(status) || coll.getMaxExpansion(sorder) != 2) { errln("Failure at supplementary codepoints, maximum expansion count < %d\n", 2); } /* testing jamo */ ch = 0x1165; str.setTo(ch); iter->setText(str, status); temporder = iter->previous(status); if (U_FAILURE(status) || coll.getMaxExpansion(temporder) > 3) { errln("Failure at codepoint %d, maximum expansion count > %d\n", ch, 3); } delete iter; /* testing special jamo &a<\u1160 */ rule = CharsToUnicodeString("\\u0026\\u0071\\u003c\\u1165\\u002f\\u0071\\u0071\\u0071\\u0071"); RuleBasedCollator jamocoll(rule, status); iter = jamocoll.createCollationElementIterator(str); temporder = iter->previous(status); if (U_FAILURE(status) || iter->getMaxExpansion(temporder) != 6) { errln("Failure at codepoint %d, maximum expansion count > %d\n", ch, 5); } delete iter; } void CollationAPITest::TestDisplayName() { UErrorCode error = U_ZERO_ERROR; Collator *coll = Collator::createInstance("en_US", error); if (U_FAILURE(error)) { errln("Failure creating english collator"); return; } UnicodeString name; UnicodeString result; coll->getDisplayName(Locale::CANADA_FRENCH, result); Locale::CANADA_FRENCH.getDisplayName(name); if (result.compare(name)) { errln("Failure getting the correct name for locale en_US"); } coll->getDisplayName(Locale::SIMPLIFIED_CHINESE, result); Locale::SIMPLIFIED_CHINESE.getDisplayName(name); if (result.compare(name)) { errln("Failure getting the correct name for locale zh_SG"); } delete coll; } void CollationAPITest::TestAttribute() { UErrorCode error = U_ZERO_ERROR; Collator *coll = Collator::createInstance(error); if (U_FAILURE(error)) { errln("Creation of default collator failed"); return; } coll->setAttribute(UCOL_FRENCH_COLLATION, UCOL_OFF, error); if (coll->getAttribute(UCOL_FRENCH_COLLATION, error) != UCOL_OFF || U_FAILURE(error)) { errln("Setting and retrieving of the french collation failed"); } coll->setAttribute(UCOL_FRENCH_COLLATION, UCOL_ON, error); if (coll->getAttribute(UCOL_FRENCH_COLLATION, error) != UCOL_ON || U_FAILURE(error)) { errln("Setting and retrieving of the french collation failed"); } coll->setAttribute(UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, error); if (coll->getAttribute(UCOL_ALTERNATE_HANDLING, error) != UCOL_SHIFTED || U_FAILURE(error)) { errln("Setting and retrieving of the alternate handling failed"); } coll->setAttribute(UCOL_ALTERNATE_HANDLING, UCOL_NON_IGNORABLE, error); if (coll->getAttribute(UCOL_ALTERNATE_HANDLING, error) != UCOL_NON_IGNORABLE || U_FAILURE(error)) { errln("Setting and retrieving of the alternate handling failed"); } coll->setAttribute(UCOL_CASE_FIRST, UCOL_LOWER_FIRST, error); if (coll->getAttribute(UCOL_CASE_FIRST, error) != UCOL_LOWER_FIRST || U_FAILURE(error)) { errln("Setting and retrieving of the case first attribute failed"); } coll->setAttribute(UCOL_CASE_FIRST, UCOL_UPPER_FIRST, error); if (coll->getAttribute(UCOL_CASE_FIRST, error) != UCOL_UPPER_FIRST || U_FAILURE(error)) { errln("Setting and retrieving of the case first attribute failed"); } coll->setAttribute(UCOL_CASE_LEVEL, UCOL_ON, error); if (coll->getAttribute(UCOL_CASE_LEVEL, error) != UCOL_ON || U_FAILURE(error)) { errln("Setting and retrieving of the case level attribute failed"); } coll->setAttribute(UCOL_CASE_LEVEL, UCOL_OFF, error); if (coll->getAttribute(UCOL_CASE_LEVEL, error) != UCOL_OFF || U_FAILURE(error)) { errln("Setting and retrieving of the case level attribute failed"); } coll->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, error); if (coll->getAttribute(UCOL_NORMALIZATION_MODE, error) != UCOL_ON || U_FAILURE(error)) { errln("Setting and retrieving of the normalization on/off attribute failed"); } coll->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_OFF, error); if (coll->getAttribute(UCOL_NORMALIZATION_MODE, error) != UCOL_OFF || U_FAILURE(error)) { errln("Setting and retrieving of the normalization on/off attribute failed"); } coll->setAttribute(UCOL_STRENGTH, UCOL_PRIMARY, error); if (coll->getAttribute(UCOL_STRENGTH, error) != UCOL_PRIMARY || U_FAILURE(error)) { errln("Setting and retrieving of the collation strength failed"); } coll->setAttribute(UCOL_STRENGTH, UCOL_SECONDARY, error); if (coll->getAttribute(UCOL_STRENGTH, error) != UCOL_SECONDARY || U_FAILURE(error)) { errln("Setting and retrieving of the collation strength failed"); } coll->setAttribute(UCOL_STRENGTH, UCOL_TERTIARY, error); if (coll->getAttribute(UCOL_STRENGTH, error) != UCOL_TERTIARY || U_FAILURE(error)) { errln("Setting and retrieving of the collation strength failed"); } coll->setAttribute(UCOL_STRENGTH, UCOL_QUATERNARY, error); if (coll->getAttribute(UCOL_STRENGTH, error) != UCOL_QUATERNARY || U_FAILURE(error)) { errln("Setting and retrieving of the collation strength failed"); } coll->setAttribute(UCOL_STRENGTH, UCOL_IDENTICAL, error); if (coll->getAttribute(UCOL_STRENGTH, error) != UCOL_IDENTICAL || U_FAILURE(error)) { errln("Setting and retrieving of the collation strength failed"); } delete coll; } void CollationAPITest::TestVariableTopSetting() { UErrorCode status = U_ZERO_ERROR; UChar vt[256] = { 0 }; Collator *coll = Collator::createInstance(status); uint32_t oldVarTop = coll->getVariableTop(status); vt[0] = 0x0041; uint32_t newVarTop = coll->setVariableTop(vt, 1, status); if((newVarTop & 0xFFFF0000) != (coll->getVariableTop(status) & 0xFFFF0000)) { errln("Didn't set vartop properly\n"); } coll->setVariableTop(oldVarTop, status); uint32_t newerVarTop = coll->setVariableTop(UnicodeString(vt, 1), status); if((newVarTop & 0xFFFF0000) != (newerVarTop & 0xFFFF0000)) { errln("Didn't set vartop properly from UnicodeString!\n"); } delete coll; } void CollationAPITest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par */) { if (exec) logln("TestSuite CollationAPITest: "); switch (index) { case 0: name = "TestProperty"; if (exec) TestProperty(/* par */); break; case 1: name = "TestOperators"; if (exec) TestOperators(/* par */); break; case 2: name = "TestDuplicate"; if (exec) TestDuplicate(/* par */); break; case 3: name = "TestCompare"; if (exec) TestCompare(/* par */); break; case 4: name = "TestHashCode"; if (exec) TestHashCode(/* par */); break; case 5: name = "TestCollationKey"; if (exec) TestCollationKey(/* par */); break; case 6: name = "TestElemIter"; if (exec) TestElemIter(/* par */); break; case 7: name = "TestGetAll"; if (exec) TestGetAll(/* par */); break; case 8: name = "TestRuleBasedColl"; if (exec) TestRuleBasedColl(/* par */); break; case 9: name = "TestDecomposition"; if (exec) TestDecomposition(/* par */); break; case 10: name = "TestSafeClone"; if (exec) TestSafeClone(/* par */); break; case 11: name = "TestSortKey"; if (exec) TestSortKey(); break; case 12: name = "TestMaxExpansion"; if (exec) TestMaxExpansion(); break; case 13: name = "TestDisplayName"; if (exec) TestDisplayName(); break; case 14: name = "TestAttribute"; if (exec) TestAttribute(); break; case 15: name = "TestVariableTopSetting"; if (exec) TestVariableTopSetting(); break; default: name = ""; break; } }