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