1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/******************************************************************** 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT: 327f654740f2a26ad62a5c155af9199af9e69b889claireho * Copyright (c) 1997-2010, International Business Machines Corporation and 4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved. 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/ 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * IntlTestCollator is the medium level test class for everything in the directory "collate". 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*********************************************************************** 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Modification history 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Date Name Description 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 02/14/2001 synwee Compare with cintltst and commented away tests 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* that are not run. 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru***********************************************************************/ 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h" 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_COLLATION && !UCONFIG_NO_FILE_IO 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uchar.h" 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/tstdtmod.h" 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h" 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ucol_tok.h" 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "tscoll.h" 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "dadrcoll.h" 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_BEGIN 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void U_CALLCONV deleteSeqElement(void *elem) { 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete((SeqElement *)elem); 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_END 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDataDrivenCollatorTest::DataDrivenCollatorTest() 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru: seq(StringCharacterIterator("")), 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatus(U_ZERO_ERROR), 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querusequences(status) 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru driver = TestDataModule::getTestDataModule("DataDrivenCollationTest", *this, status); 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sequences.setDeleter(deleteSeqElement); 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCA = (RuleBasedCollator*)Collator::createInstance("root", status); 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDataDrivenCollatorTest::~DataDrivenCollatorTest() 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete driver; 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete UCA; 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DataDrivenCollatorTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par */) 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(driver != NULL) { 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (exec) 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("TestSuite Collator: "); 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const DataMap *info = NULL; 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestData *testData = driver->createTestData(index, status); 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name = testData->getName(); 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(testData->getInfo(info, status)) { 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log(info->getString("Description", status)); 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(exec) { 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log(name); 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("---"); 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(""); 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru processTest(testData); 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete testData; 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name = ""; 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 766d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("collate/DataDrivenTest data not initialized!"); 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name = ""; 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDataDrivenCollatorTest::setTestSequence(const UnicodeString &setSequence, SeqElement &el) { 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru seq.setText(setSequence); 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return getNextInSequence(el); 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Parses the sequence to be tested 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDataDrivenCollatorTest::getNextInSequence(SeqElement &el) { 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru el.source.truncate(0); 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool quoted = FALSE; 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool quotedsingle = FALSE; 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 currChar = 0; 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(currChar != CharacterIterator::DONE) { 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru currChar= seq.next32PostInc(); 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!quoted) { 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_isWhitespace(currChar)) { 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch(currChar) { 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case CharacterIterator::DONE: 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x003C /* < */: 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru el.relation = Collator::LESS; 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru currChar = CharacterIterator::DONE; 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x003D /* = */: 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru el.relation = Collator::EQUAL; 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru currChar = CharacterIterator::DONE; 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x003E /* > */: 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru el.relation = Collator::GREATER; 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru currChar = CharacterIterator::DONE; 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x0027 /* ' */: /* very basic quoting */ 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru quoted = TRUE; 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru quotedsingle = FALSE; 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x005c /* \ */: /* single quote */ 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru quoted = TRUE; 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru quotedsingle = TRUE; 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru el.source.append(currChar); 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(currChar == CharacterIterator::DONE) { 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ILLEGAL_ARGUMENT_ERROR; 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Quote in sequence not closed!"); 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if(currChar == 0x0027) { 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru quoted = FALSE; 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru el.source.append(currChar); 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(quotedsingle) { 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru quoted = FALSE; 141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return seq.hasNext(); 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Reads the options string and sets appropriate attributes in collator 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDataDrivenCollatorTest::processArguments(Collator *col, const UChar *start, int32_t optLen) { 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *end = start+optLen; 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UColAttribute attrib; 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UColAttributeValue value; 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(optLen == 0) { 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru start = ucol_tok_getNextArgument(start, end, &attrib, &value, &status); 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(start != NULL) { 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru col->setAttribute(attrib, value, status); 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru start = ucol_tok_getNextArgument(start, end, &attrib, &value, &status); 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDataDrivenCollatorTest::processTest(TestData *testData) { 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Collator *col = NULL; 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *arguments = NULL; 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t argLen = 0; 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const DataMap *settings = NULL; 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const DataMap *currentCase = NULL; 174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode intStatus = U_ZERO_ERROR; 175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString testSetting; 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(testData->nextSettings(settings, status)) { 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru intStatus = U_ZERO_ERROR; 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // try to get a locale 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testSetting = settings->getString("TestLocale", intStatus); 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(intStatus)) { 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char localeName[256]; 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testSetting.extract(0, testSetting.length(), localeName, ""); 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru col = Collator::createInstance(localeName, status); 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Testing collator for locale "+testSetting); 186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Unable to instantiate collator for locale "+testSetting); 188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // if no locale, try from rules 192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru intStatus = U_ZERO_ERROR; 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testSetting = settings->getString("Rules", intStatus); 194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(intStatus)) { 195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru col = new RuleBasedCollator(testSetting, status); 196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Testing collator for rules "+testSetting); 198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 19927f654740f2a26ad62a5c155af9199af9e69b889claireho errln("Unable to instantiate collator for rules "+testSetting+" - "+u_errorName(status)); 200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("No collator definition!"); 20427f654740f2a26ad62a5c155af9199af9e69b889claireho return; 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t cloneSize = 0; 209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t* cloneBuf = NULL; 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedCollator* clone = NULL; 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(col != NULL){ 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedCollator* rbc = (RuleBasedCollator*)col; 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cloneSize = rbc->cloneBinary(NULL, 0, intStatus); 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru intStatus = U_ZERO_ERROR; 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cloneBuf = (uint8_t*) malloc(cloneSize); 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cloneSize = rbc->cloneBinary(cloneBuf, cloneSize, intStatus); 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru clone = new RuleBasedCollator(cloneBuf, cloneSize, UCA, intStatus); 218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(intStatus)){ 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Could not clone the RuleBasedCollator. Error: %s", u_errorName(intStatus)); 220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru intStatus= U_ZERO_ERROR; 221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // get attributes 223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testSetting = settings->getString("Arguments", intStatus); 224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(intStatus)) { 225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Arguments: "+testSetting); 226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru argLen = testSetting.length(); 227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru arguments = testSetting.getBuffer(); 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru processArguments(col, arguments, argLen); 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(clone != NULL){ 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru processArguments(clone, arguments, argLen); 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Couldn't process arguments"); 234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru intStatus = U_ZERO_ERROR; 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Start the processing 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(testData->nextCase(currentCase, status)) { 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString sequence = currentCase->getString("sequence", status); 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru processSequence(col, sequence); 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(clone != NULL){ 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru processSequence(clone, sequence); 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Couldn't instantiate a collator!"); 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete clone; 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(cloneBuf); 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete col; 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru col = NULL; 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDataDrivenCollatorTest::processSequence(Collator* col, const UnicodeString &sequence) { 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Collator::EComparisonResult relation = Collator::EQUAL; 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool hasNext; 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SeqElement *source = NULL; 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SeqElement *target = NULL; 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t j = 0; 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sequences.removeAllElements(); 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target = new SeqElement(); 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru setTestSequence(sequence, *target); 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sequences.addElement(target, status); 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru do { 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru relation = Collator::EQUAL; 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target = new SeqElement(); 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru hasNext = getNextInSequence(*target); 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(j = sequences.size(); j > 0; j--) { 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru source = (SeqElement *)sequences.elementAt(j-1); 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(relation == Collator::EQUAL && source->relation != Collator::EQUAL) { 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru relation = source->relation; 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(col, source->source, target->source, relation); 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sequences.addElement(target, status); 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru source = target; 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } while(hasNext); 289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_COLLATION */ 292